014、陀螺仪原理与数据读取
从一次炸机说起
去年夏天,我在调试一架四轴穿越机。飞控板是自研的STM32F405方案,IMU用的是MPU6050。PID参数调了三天,悬停稳得像块石头,我信心满满地推了全油门做翻滚动作。结果飞机在空中突然抽搐了一下,然后像喝醉了一样斜着栽进草丛。炸机后检查日志,发现陀螺仪数据在翻滚过程中出现了连续三个采样点的“跳变”——Z轴角速度从正常的320°/s瞬间跳到-150°/s,然后又跳回正常值。飞控以为飞机在反向旋转,输出了一组完全错误的控制量。
这个坑让我花了整整一周去排查。最后发现,问题出在SPI读取时序上——我在读取陀螺仪数据时,没有正确处理数据就绪中断,导致读到了寄存器更新过程中的“脏数据”。从那以后,我对陀螺仪的数据读取流程有了刻骨铭心的理解。
陀螺仪到底在测什么
很多人以为陀螺仪测的是“角度”,这是初学者最容易犯的概念错误。陀螺仪输出的原始数据是角速度,单位通常是°/s(度每秒)或rad/s。它告诉你的是“当前时刻,绕某个轴转得有多快”,而不是“已经转了多少度”。
要得到角度,必须对角速度做时间积分。这个积分过程,就是飞控算法里最基础的姿态解算环节。但积分会累积误差——哪怕零点零几度的微小偏差,经过几秒积分后都会变成几度的角度误差。这就是为什么所有飞控都需要用加速度计和磁力计来“修正”陀螺仪的漂移。
MPU6050内部是一个MEMS结构,利用科里奥利效应工作。简单理解:内部有一个高速振动的质量块,当芯片旋转时,质量块会受到一个垂直于振动方向和旋转轴方向的力,这个力的大小与角速度成