一、准备工作
主芯片采用是安信可科技的ESF-12F模组(内置ESP8266芯片),使用GPIO模拟I2C驱动MPU6050,i2c驱动部分可直接参考官方例程中的i2c_master.c文件,(附件提供)亲测没问题。注意点:明确MPU6050的从设备地址,可根据设计的硬件引脚AD0接电平来取值,AD0接GND,slave_addr为0x68,AD0接3.3v,slave_addr为0x68。
DMP库(MPU6050自带的数字运动处理器)具体介绍就不啰嗦了,就是MPU6050可以将原始六轴数据直接换算除四元数从而计算除欧拉角,得到yaw,roll,pitch。DMP库源代码原本是在MSP430芯片上做的,这里我们可以移植过来。(附件提供),这里直接使用正点原子MPU6050例程中移植到STM32F4系列上的DMP库(重命名eMPL)进行修改适配ESP-12F。DMP库中mpu_dmp_init初始化中对MPU6050重新配置,注意点:原本为0x68,需不需要更改根据你的i2c写函数。
主要修改的文件有inv_mpu_dmp_motion_driver.c,inv_mpu_dmp_motion_driver.h,inv_mpu.c,inv_mpu.h这几个文件,独立的文件需要自己配置Makefile,这里就不说明,可自行操作。
二、移植修改
从inv_mpu_dmp_motion_driver.c改起,inv_mpu_dmp_motion_driver.h不用更改.
inv_mpu_dmp_motion_driver.c修改点:
1、右边的user_main.h都包含了所需的头文件,根据自己项目头文件名称自己#include。
2、更改对应宏定义函数名。
然后是inv_mpu.c以及inv_mpu.h,
inv_mpu.c修改点:
1、跟上面的文件修改项一样,替换头文件,不过注意的是STM32系列上支持#include
2、同样是替换对应函数的宏定义。
3、在mpu_dmp_init(void)函数处理过程,配置MPU6050参数,以及加载dmp固件所需要的处理时间较久,我的工程文件是在NONOS-SDK-3.0.0版本下,默认是开启软硬看门狗,底层设计者为了系统的稳定性,以应对多冲突的操作环境。这里不进行看门狗操作操作的话,由于该函数运行时间久会触发到软件看门狗复位(有软件+硬件看门狗的情况下,一个程序段如果运行时间超过 1600 ms,即有可能会触发软件看门狗复位,若超过 3200 ms 则一定会触发复位),所以需要引入system_soft_wdt_stop(),system_soft_wdt_restart()搭配来使用防止还没执行完成就触发看门狗。
4、mpu_dmp_get_data(float *pitch,float *roll,float *yaw)函数中也用到看门狗操作,以及上面提到的自写数学函数(附件提供)
inv_mpu.h修改点:
1、替换包含一些uint8,uint16等定义头文件。
截至,关于DMP库的移植部分都修改完毕,开始准备使用了。
三、调用使用
1、调用MPU6050的初始化配置,以及dmp库使用初始化。
2、 调用读取MPU6050六轴原始数据,以及姿态解算数据。注意点:如下框图,如果只读取一次mpu_dmp_get_data(&pitch,&roll,&yaw)会返回-2,原因在于FIFO溢出,使用循环读取得以解决,在STM32上一次读取即可。
四、结尾总结
以上操作步骤主要是点明几个关键点,一些添加DMP库文件等细碎操作不作说明,可自行百度,望理解。以上移植到ESP-12F上使用正常,可正确解算出三轴的姿态角,由于工程应用不属于高精度领域,所以不对数据再进行数据优化处理。如有高人发现错误务必批评指正,留言告知。
最后留一张MPU6050放置静止时解算出的数值,yaw会有偏移属于正常现象,需要辅助矫正。
上述附件文件下载地址:
官方DMP库资料:https://download.csdn.net/download/guohengsheng3882/11215101
自写数学处理函数:https://download.csdn.net/download/guohengsheng3882/11215115
ESP-12F驱动MUP6050以及DMP移植:https://download.csdn.net/download/guohengsheng3882/11215120
测试DEMO工程:https://download.csdn.net/download/guohengsheng3882/12330600