目录
MPU6050常见问题的分析与处理
本文主要针对STM32使用MPU6050过程中产生的问题进行分析和处理,部分内容也适用于其他单片机。本文基于MPU6050自带的DMP算法。文章内容对于MPU6050调试过程有一定的帮助。
1.IIC驱动
STM32的硬件IIC是存在一定问题的,初始化MPU6050时可能导致初始化失败,所以推荐使用软件IIC。
2.MPU6050的摆放
默认情况下相对于载体坐标系而言,绕x轴旋转为横滚(roll),绕y轴旋转是俯仰角(pitch),绕z轴旋转是偏航(yaw)。注意是绕。
如果把MPU6050看成一架飞机,摆动机翼是横滚角,上下摆动机头是俯仰角,左右摆动机头是偏航角。
下图摆放方式是错误的
下图的摆放方式才是正确的,如上文描述可知。
注意图2.2(上方第二张图),是指默认情况下。在官方的DMP驱动中有这样一段代码
static signed char gyro_orientation[9] = { 1, 0, 0,
0, 1, 0,
0, 0, 1};
这个是MPU6050的坐标矩阵,可根据实际摆放的位置修改此矩阵。如果不修改这个矩阵,需要按照图2.2摆放,不然数值肯定是错误的。
3.MPU6050初始化
MPU6050初始化有可能会卡死。可参考正点原子的例程,实测没什么问题。
MPU6050 DMP 是带有自检功能的
run_self_test();
run_self_test 这个函数用于自检,MPU6050会以初始状态作为欧拉角的0度,不管有没有放平MPU6050都会以初始状态作为欧拉角的0度,初始化之后MPU6050会稍微校准一下,那么前几秒的数据是可以适当舍弃的。
虽然MPU6050会稍微校准,但是初始化时一定要放平。如果不放平大概率报错。当然也有可能成功,但是MPU6050校准的数据会有偏差。
4.MPU6050偏航角(yaw)零飘
MPU6050的偏航角是不正常的,即使静止不动也会跳动。这个纯粹是硬件问题,就算算法怎么牛逼也解决不了。只能外加磁力计解决,也可以直接使用MPU9250,这个是自带磁力计的。使用时注意不要和电机靠太近,磁场很容易受到干扰。
5.MPU6050万向节锁
默认Z-Y-X顺序下,不知道大家有没有发现这个问题。当MPU6050只转动俯仰角,俯仰角接近90度或者等于90度时,偏航角的角度会发生很大的偏差。那么这个就是万向节锁,此时如果比作一架飞机,当飞机垂直90度向上时,按照Z-Y-X顺序无论怎么改变方向飞机都只能向上飞。
所以不要让俯仰角垂直,这样可以减少bug。
结语
本文如果不对或者需要改进的地方欢迎指出。