MPU6050使用I2C通讯,配置STM32引脚,图为STM32F103。轮询模式只需要配置PB6:I2C_SDA,PB7_SCL,分别接MPU6050模块的对应引脚。中断模式还要接一个GPIO口至模块INT引脚。
注意I2C speed mode 一定要选择高速模式,时钟速度400kHz。
其它的配置都按自己需求再调整。
库是先找到的别人的再修改,文件在链接中:https://github.com/Heimerdingerzzz/MPU6050
主要就是使用HAL库里的I2C函数改写了以下俩个文件,使用的时候注意替换就没什么问题。
麻烦比较多的是MPU6050模块的使用,首先模块可以输出原始温度、加速度、角速度数据,基本原理就是角度等于角速度的时间积分,更详细的原理说明可以参考这篇文章《Arduino教程:MPU6050的数据获取、分析与处理》:https://zhuanlan.zhihu.com/p/20082486?columnSlug=devymex
如果要解算出角度信息,一种方法使用各种数据融合和滤波算法软件方法解析出俯仰、偏航、滚转的角度变换,另一种则是使用MPU6050的Digital Motion Processor数字运动处理器(DMP)直接读取欧拉角数据。移植这几个文件:
这里容易遇见的几个问题:
1.AD0接GND或是接VDD器件的I2C地址是不同的(0x68\0x69),进而,Read\Write命令的地址也是不同的,注意根据自己需求进行区分。
2.mpu_dmp_init初始化自检不通过:常见原因有:5V电源和GND未正确接入,DMP输出频率过高,初始状态倾角较大。解决办法:电源的问题,调整至正确接线就行了,如果一直是FIFO的问题,可减低DMP频率(最高200Hz,将至50Hz以下),还有就算如前文中说的,如果I2C速度使用的是标准速度100KHz,这里也需要调整为高速模式即400Khz。由于使用参考坐标系,若初始状态大于设定的阈值,也可能造成自检不通过,因此初始化时需要将模块置于基本平衡的状态。当然,如果跳过自检可以读取正常数据,那也可以注释掉部分自检过程。
3.Q30 ,Q16格式的转换。Qn定点数格式数据,定点数xq为浮点数乘2的n次方。Qn定点数xq转换为浮点数x相应的也要除以2的n次方。
4.可以通过set_bias函数设置一个固定的初始参考方向。另外模块有漂移的问题,并且随着时间积累,需要注意矫正。