MPU6050的陀螺仪和加速度计的寄存器数据可以传输到MPU6050的数字运动处理器(DMP),经过DMP的融合处理就可以得到四元数,再用几个公式把四元数转换一下,就可以得到四旋翼的姿态角了。应美盛官方提供了DMP库函数,复杂的数据融合处理就可以有官方提供的库函数去完成,我们要做的就是将官方的库函数移植到我们自己的工程中来,今天的内容就是如何移植官方的DMP库。
首先,需要到官方网站或在网上搜索,下载我们需要的DMP官方库文件,小马哥四轴中用的库是:DMP官方库5.0_msp430版
DMP库移植步骤:
第一步:将官方库中的 .h文件以及 .c文件复制到我们的工程下面,路径为:DMP官方库5.0_msp430版 → core → drive → eMPL 。
第二步:将库文件添加到我们的工程中:
第三步:打开inv_mpu.c并运行工程,当然此时工程运行是通不过的;
第四步:阅读inv_mpu.c开头处的英文注释:
意思是注释中列出的函数必须按照注释中的函数形式来定义,最重要的是I2C的读写函数和延时函数,它们的函数参数的个数,参数的类型都必须和注释中一样;
第五步:将我们的I2C的读写函数以及延时函数以宏定义的方式添加到inv_mpu.c文件中,具体修改如下:
将:
注:修改之前需在前面添加宏定义 #define MOTION_DRIVER_TARGET_MSP430
这段代码修改为:
Noto:
1)这三个函数名MoniI2C_WriteSomeDataToSlave,MoniI2C_ReadSomeDataFromSlave,delay_ms需要跟自己写的I2C源文件和延时函数源文件中的函数名一致;
2)get_ms函数是获得时间戳的,我们没用,需要在inv_mpu.c这个源文件的前面写一个空函数代替原来的msp430_get_clock_ms:
get_ms需定义成这样:void get_ms(unsigned long *count) {}
因为get_ms函数在inv_mpu_dmp_motion_driver.c文件中也会用到,所以需要在inv_mpu.h申明一下void get_ms:void get_ms(unsigned long *count);
第六步:注释掉下面的代码:
第七步:用printf函数代替日志输出函数:
修改为:
第八步:在inv_mpu.c的开头处添加一个宏定义:#define MPU6050
因为这个DMP库不仅支持MPU6050,还支持MOU6500,MPU9150,MPU9250,我们使用的是MPU6050,所以添加MPU6050的宏定义。
第九步:修改inv_mpu.h头文件中的这个结构体:
修改为:
第十步:修改下面的结构体:
(1)寄存器结构体
图中所示的这种结构体初始化方式MDK keil不支持,因为这种结构体定义方式是GUN C(c语言的一种标准)里面的方式。
需要修改成下面这种形式:
(2) 以同样的方式修改hw_s hw 结构体
(3) 以同样的方式修改test_s test结构体:
(4) 以同样的方式修改gyro_state_s st结构体
现在这个结构体有三个参数:
但是,右键Go to Definition一下,查看这个结构体的原型:
会发现这个结构体有四个元素,第三个元素是芯片的配置,而芯片的配置会在MPU6050_init函数中进行,所以在这里把个元素初始化为0,修改为下面的形式:
第十一步:运行一下工程,会发现其中有这个一个警告:warning: #223-D: function "reg_int_cb" declared implicitly
我们没有用reg_int_cb,所以双击这个警告,定位到警告在文件中所在的地方,把这一句注释掉即可:
第十二歩:注释掉磁力计部分代码,因为我们的MPU6050没有接磁力计(注释掉磁力计相关的整个函数,这里的截图只截取了一部分代码):
第十三步:运行代码,会发现还有一个错误与其他文件inv_mpu_dmp_motion_driver相关的,我们找到这个文件,先把这个文件的所有内容注释掉,再编译一下工程,此时,0错误,0警告。
第十四步:虽然0错误,0警告了,但还有需要修改的地方:
(1)需注释掉gyro_reg_s 机构体中的3行代码:
这3行代码,在库中没有初始化。
(2)找到 int mpu6050_init(struct int_param_s *int_param)函数,去掉这个函数的形参,修改为:int mpu6050_init(void),记得头文件中该函数的参数也要修改。
因为这个函数的参数是下面条件判断语句的参数:
这两行代码不用,我们在第十一步已经把这两行代码注释了,所以mpu6050_init函数也就不需要参数了。
到这里inv_mpu文件就移植好了。
第十五歩:打开inv_mpu_dmp_motion_driver.c文件,和前面一样,在文件的开头添加宏定义:#define MOTION_DRIVER_TARGET_MSP430,然后修改下面的代码:
修改为:
第十六步:按第十步同样的方式修改结构体
修改dmp_s结构体
修改为:
第十七歩:运行工程,会有这么个警告function "__no_operation" declared implicitly,这是MSP430的空操作,直接把这行代码注释掉就好了。
第十八歩:运行工程,确定是否是0警告,0错误。如果是0警告,0错误,就说明DMP库已经一直好了。
今天就写这些了。
能力有限,如果有写的不合适的地方,欢迎大家多多指正。如果有兴趣,也可以一起交流,互相学习。 (微信号 :c18093458455)
文章评论(0条评论)
登录后参与讨论