关于MPU9250的六轴DMP和九轴MPL

1,974 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

 九轴MPL刷新的最快频率应该是200HZ,直接出三个欧拉角--偏航、俯仰、翻滚(可以查看四元素),三轴加速度、角速度、磁力值和温度都能读,有单独的读取函数,读出来的都是原始值,还要处理(例程正点原子的实验_ MPU9250九轴传感器实验,用的不是中断,是一直读取,不过也挺快),用的是I2C,如果想用SPI,只需换一下底层即可参考SPI读取MPU9250数据

如果不用中断总是出现每次读取MPL一次后要复位一次(mpu_reset_fifo),这里面有延时函数造成总体时间过长,不知道为什么(应该是仿真造成的时间不连续进而引起MPL自动判断出现异常情况进行重启),用了中断(9250有中断引脚)后,连续读取1000次数据,用时5秒多,基本上最快了

DMP和MPL的库不一样,官方没开源,有的函数比如  inv_enable_9x_sensor_fusion();是无法查看具体内容的,KEIL跳转不过去的,属于内部引用函数

MPL运行后必须先将磁力计8字校准才能调用出MPL的数据,否则是六轴的MPL,数据虽然比DMP要准,实测一小时偏不了0.1度,当然DMP要比不用DMP准(不用算法的话),六轴MPL的数据每次开机不管载体朝向那,数值都是固定的;九轴虽然也是每次重启数据都是0,但是8字校准完成后数据就是相对地球的位置方向角度了,波动比较大,注意是波动不是漂移,大概有4、5度,但是不管过多长时间都是围绕某个值波动,不会漂移,可以用一个中值滤波或滑动平均滤波处理一下

磁力计校准完成后,函数inv_build_compass(compass,0,sensor_timestamp); //把磁力计值发给MPL   中compass会置为3,如果有强磁场干扰或者未校准会置0

磁力计如果收到的外界磁场过大时,九轴MPL会自动切换为六轴

也可以不用MPL,手动IMU融合,有算法更直观但是占用运算资源,参考IMU姿态融合或者椭球拟合的原理或者AHRS算法

x-IMU的融合代码

移植I2C程序引脚时,注意除了修改引脚的名字位置,还要修改输入输出方向stm32的IO口寄存器配置

例如以下几句

#define MPU_SDA_IN()  {GPIOB->CRH&=0X0FFFFFFF;GPIOB->CRH|=8<<28;}
#define MPU_SDA_OUT() {GPIOB->CRH&=0X0FFFFFFF;GPIOB->CRH|=7<<28;}

#define IIC_SCL    PBout(13) //SCL         
#define IIC_SDA    PBout(15) //SDA                  
#define MPU_READ_SDA   PBin(15)  //输入SDA            

移植中可能用到的函数

\