本文已参与「新人创作礼」活动,一同敞开创作之路。

九轴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

移植中或许用到的函数

\