MPU6050 超详细读取数据步骤

您所在的位置:网站首页 螺旋仪是啥 MPU6050 超详细读取数据步骤

MPU6050 超详细读取数据步骤

2024-07-14 21:27| 来源: 网络整理| 查看: 265

目录

零、软件I2C配置

一、MPU6050硬件部分

二、MPU6050软件部分。

👉👉👉完整程序编写步骤:

0、MPU6050.h文件内容:

1、新建MPU6050.c和MPU6050.h文件:

2、写MPU6050寄存器函数

2、1写单个字节:

2、2连续写多个字节:

3、读MPU6050寄存器函数

3、1读单个字节:

3、2连续读多个字节:

4、将2个字节转换成1个有符号半字,用来处理寄存器的高低位数据函数:

5、读取MPU6050设备ID函数(不要这个函数也是可以的):

6、读取加速度计原始数值函数:

7、读取陀螺仪原始数值函数:

8、线性标度变换函数(用来将原始数据转换成我们需要的):

 8.1推荐用原始数据除灵敏度来求加速度角速度。公式: 加(角)速度值 = 原始数据 / 灵敏度

9、读取转换后加速度计数值函数:

10、读取转换后的陀螺仪数值函数:

11、初始化MPU6050函数:

12、最后在主程序中调用两个读取函数:

👉最后观察现象:

👉也可通过串口发送到VOFA+,可以更加直观的观察数据的变化:

零、软件I2C配置

一、MPU6050硬件部分

二、MPU6050软件部分。

👉👉👉完整程序编写步骤:

0、MPU6050.h文件内容: #ifndef __MPU6050_H #define __MPU6050_H #define MPU6050_ADDRESS 0xD0 //MPU6050的I2C从机地址 #define MPU6050_SMPLRT_DIV 0x19 //采样频率分频器 #define MPU6050_CONFIG 0x1A //配置 #define MPU6050_GYRO_CONFIG 0x1B //陀螺仪配置 #define MPU6050_ACCEL_CONFIG 0x1C //加速度计配置 #define MPU6050_ACCEL_XOUT_H 0x3B //加速度计X轴高位 #define MPU6050_ACCEL_XOUT_L 0x3C //加速度计X轴底位 #define MPU6050_ACCEL_YOUT_H 0x3D //加速度计Y轴高位 #define MPU6050_ACCEL_YOUT_L 0x3E //加速度计Y轴底位 #define MPU6050_ACCEL_ZOUT_H 0x3F //加速度计Z轴高位 #define MPU6050_ACCEL_ZOUT_L 0x40 //加速度计Z轴底位 #define MPU6050_TEMP_OUT_H 0x41 //温度测量值高位 #define MPU6050_TEMP_OUT_L 0x42 //温度测量值低位 #define MPU6050_GYRO_XOUT_H 0x43 //陀螺仪X轴高位 #define MPU6050_GYRO_XOUT_L 0x44 //陀螺仪X轴低位 #define MPU6050_GYRO_YOUT_H 0x45 //陀螺仪Y轴高位 #define MPU6050_GYRO_YOUT_L 0x46 //陀螺仪Y轴低位 #define MPU6050_GYRO_ZOUT_H 0x47 //陀螺仪Z轴高位 #define MPU6050_GYRO_ZOUT_L 0x48 //陀螺仪Z轴低位 #define MPU6050_PWR_MGMT_1 0x6B //电源管理1 #define MPU6050_PWR_MGMT_2 0x6C //电源管理2 #define MPU6050_WHO_AM_I 0x75 //设备ID void MPU6050_Init(void); //初始化 uint8_t MPU6050_GetID(void); //读取ID void MPU6050_GetACCEL(int16_t *ACCEL_Array); //读取加速度计原始数据 void MPU6050_GetGYRO(int16_t *GYRO_Array); //读取陀螺仪原始数据 void MPU6050_GetAccel_Value(float *Accel_Value); //读取转换后的加速度计数值 void MPU6050_GetGyro_Value(float *Gyro_Value); //读取转换后的陀螺仪数值 #endif

1、新建MPU6050.c和MPU6050.h文件:

---------------------------------------------------------------------------------------------------------------------------------

2、写MPU6050寄存器函数 2、1写单个字节:

#include "stm32f10x.h" // Device header #include "MyI2C.h" #include "MPU6050.h" /** * 函数功能:MPU6050写1个寄存器 * 入口参数:Reg: 需要操作的MPU6050地址 * 入口参数:Data:需要写入的数据 * 返 回 值:无 */ void MPU6050_WriteReg(uint8_t Reg, uint8_t Data) { /*发送从机地址*/ MyI2C_Start(); //I2C起始 MyI2C_SendByte(MPU6050_ADDRESS); //发送MPU6050地址 0xD0 第0位为0是写操作,1是读操作 MyI2C_ReceiveAck(); //接收应答,我这里只接收,不作处理。 /*发送需要写操作的寄存器*/ MyI2C_SendByte(Reg); MyI2C_ReceiveAck(); /*发送需要写入的数据*/ MyI2C_SendByte(Data); MyI2C_ReceiveAck(); MyI2C_Stop(); //I2C终止 } 2、2连续写多个字节:

/** * 函数功能:MPU6050写多个字节 * 入口参数:BufAddress:寄存器首地址 * 入口参数:BufData :数据首地址 * 入口参数:Length :写入的字节数量 * 返 回 值:无 */ void MPU6050_WriteBuf(uint8_t BufAddress, uint8_t *BufData, uint8_t Length) { uint8_t i; //for循环次数变量 MyI2C_Start(); //起始 MyI2C_SendByte(MPU6050_ADDRESS | 0x00); //发送从机地址 | 写模式 MyI2C_ReceiveAck(); //接收应答 MyI2C_SendByte(BufAddress); //发送寄存器首地址 MyI2C_ReceiveAck(); //接收应答 for (i = 0; i < Length; i++) { MyI2C_SendByte(BufData[i]); //连续写入数据 MyI2C_ReceiveAck(); //接收应答 } MyI2C_Stop(); //停止 }

3、读MPU6050寄存器函数 3、1读单个字节:

/** * 函数功能:读取MPU6050寄存器里的数据 * 入口参数:Reg:需要读取的寄存器地址 * 返 回 值:读取到的数据 */ uint8_t MPU6050_ReadReg(uint8_t Reg) { uint8_t Reg_Data; //定义保存读取到的数据变量 /*发送从机地址*/ MyI2C_Start(); //I2C起始 MyI2C_SendByte(MPU6050_ADDRESS); //MPU6050默认地址:0xD0 MyI2C_ReceiveAck(); //接收MPU6050应答位 /*发送需要读取的寄存器地址*/ MyI2C_SendByte(Reg); MyI2C_ReceiveAck(); /*发送读取模式*/ MyI2C_Start(); //I2C起始 MyI2C_SendByte(MPU6050_ADDRESS | 0x01); //发送MPU6050地址0xD0 | 0x01 (第0位为0是写操作,1是读操作) MyI2C_ReceiveAck(); /*开始读取从机数据*/ Reg_Data = MyI2C_ReceiveByte(); //读取MPU6050的数据 MyI2C_SendAck(1); //读取完成后,应答位给1(非应答) MyI2C_Stop(); //I2C终止 return Reg_Data; //返回读取到的数据 } 3、2连续读多个字节:

/** * 函数功能:连续读MPU6050寄存器 * 入口参数:BufAddress:寄存器首地址 * 入口参数:BufData :接收数据首地址 * 入口参数:Length :读取寄存器的数量 */ void MPU6050_ReadBuf(uint8_t BufAddress, uint8_t *BufData, uint8_t Length) { uint8_t i; //for循环次数变量 MyI2C_Start(); //起始 MyI2C_SendByte(MPU6050_ADDRESS | 0x00); //发送从机地址 | 写模式 MyI2C_ReceiveAck(); //接收应答 MyI2C_SendByte(BufAddress); //发送寄存器地址 MyI2C_ReceiveAck(); //接收应答 MyI2C_Start(); //起始 MyI2C_SendByte(MPU6050_ADDRESS | 0x01); //发送从机地址 | 读模式 MyI2C_ReceiveAck(); //接收应答 /*连续读取数据*/ for (i = 0; i < Length; i++) { BufData[i] = MyI2C_ReceiveByte(); //把数据存放在i指向的变量 if( i < (Length - 1) ) { MyI2C_SendAck(0); //发送应答 } else { MyI2C_SendAck(1); //最后一个要发送非应答 } } MyI2C_Stop(); //停止 }

4、将2个字节转换成1个有符号半字,用来处理寄存器的高低位数据函数: /** * 函数功能:将2个字节转换成1个有符号半字,用来处理寄存器的高低位数据。 * 入口参数:DataL:低位字节 * 入口参数:DataH: 高位字节 * 返 回 值:转换完成后的有符号数据 */ int16_t MPU6050_Byte_to_HalfWord(uint8_t DataL, uint8_t DataH) { int16_t Data; Data = (DataH


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3