原创 STM32系列之四旋翼(五) 官方DMP库的移植

2017-8-29 15:09 7863 22 22 分类: MCU/ 嵌入式

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条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
22
关闭 站长推荐上一条 /5 下一条