- MPU6050
MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度
3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度
ADC和数据存储
- 16位ADC :MPU6050集成了16位的ADC,用于将模拟信号转换为数字信号,量化范围为-32768到32767。
- 量化过程 :ADC将模拟信号转换为数字信号,并以两个字节进行存储。
加速度计满量程示例:
±16g:
读取的ADC值为最大值32768时,对应实际加速度为16g。
ADC值为32768的一半(16384)时,对应加速度为8g。
±2g:
读取的ADC值为最大值32768时,对应实际加速度为2g。
ADC值为32768的一半(16384)时,对应加速度为1g。
满量程选择
- 剧烈运动 :选择较大的满量程,确保测量范围足够大。
- 平缓运动 :选择较小的满量程,提升测量分辨率精度。
测量分辨率:
- 满量程越小,测量分辨率越高,测量越精细。
- 满量程越大,测量范围越广。
- ADC值与加速度值呈线性关系,可以通过乘一个系数从ADC值计算出实际加速度。
I2C从机地址配置
二进制地址转换为十六进制:
以从机地址1101000为例。
把7位二进制数1101000转换为十六进制,即分割低4位和高3位:0110 1000,转换后为0x68。
I2C时序中的地址格式:
在I2C通信时,需要发送7位从机地址1101000加上1位读写位。
认为0x68是从机地址,需要将0x68左移1位,再加上读写位(0或1)。
转换步骤:
将0x68左移1位:1101 0000(即0xD0)。
再与读写位(0或1)进行或操作:(0x68 << 1) | 0 或 (0x68 << 1) | 1。
实际应用:
写操作时,从机地址为0xD0。
读操作时,从机地址为0xD1。
硬件电路
2.代码实现
PB6---------SCL
PB7---------SDA
GND---------AD0
2.1读取mpu6050数据并转换成角速度和角度
遇到一个奇怪的现象,用HAL库直接读取I2C数据,第一次的mpu6050数据是正确的,while(1)循环读取,第二次及以后出现错误。
用引脚模拟I2C通讯,while(1)循环读取正确。
2.2 mpu6050简单校准
【STM32+cubemx】0027 HAL库开发:MPU6050陀螺仪和加速度计数据的获取和校准_cubemx陀螺仪-CSDN博客
一般来说,MEMS(微机电系统)器件由于制造工艺精度问题,都会存在一定的误差。上图是静止在水平面的条件下测试得到的数值。可见,水平静止的情况下,陀螺仪输出应该为0,加速度计Z轴输出应为1g。所以出现了较大误差。
1.陀螺仪校准
陀螺仪的校准相对简单。在静止的情况下,将多个采样的平均值作为偏置值。测量后减去这个零偏即为真实值。若存在零偏,即使在静止的情况下,得出的数据会认为正在旋转,随着时间累积会出现较大误差。
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| const float gyro_offest[3] = {-0.96,0.902,-1.05}; pRogy->x -= gyro_offest[0]; pRogy->y -= gyro_offest[1]; pRogy->z -= gyro_offest[2]; //校准 |
2.加速度计校准
加速度计校准可建立以下数学模型。
陀螺仪加速度计MPU6050程序与校准方法_mpu6050校准-CSDN博客
2.3 mpu6050使用Dmp
STM32F103HAL库移植MPU6050的DMP库_empl库-CSDN博客
原始数据的读取对于MPU6050的使用而言只是第一步,要想取得俯仰角(pitch),横滚角(roll),航偏角(yaw)的数据,还需要使用官方给出的DMP库或者卡尔曼滤波。
通过百度网盘分享的文件:0812
链接:https://pan.baidu.com/s/1LE2MlbJsbt6H7kmD2dAPnw?pwd=1tnx
提取码:1tnx
--来自百度网盘超级会员V2的分享