在Rtthread studio下使用mpl库输出欧拉角

环境:Rtthread studio 编辑器,stm32f103vet6微控制器,icm206086轴传感器,mpl运动处理库(mpu9250、mpu6050移植类似,此处以icm20608为例)

1、首先新建rtthread 项目

控制台引脚根据自己情况设置,这里设置的是串口3。

编译下载,串口能输出打印信息。

2、使用rtthread i2c驱动框架。

在配置界面选中“软件模拟i2c”、“ulog日志,libc库,posix”。(ulog日志方便输出打印信息,mpl将用到libc库,posix)。

在board.h根据自身情况里配置如下:

我这里使用的I2C2,   PE5->SCL  PE6->SDA。我的硬件板上I2C1定义了为时钟芯片总线。

3、新建文件夹

工程中新建文件夹device(用于存放自己编写的驱动文件),device下新建文件夹MPL(用于存放MPL相关的库文件)。device下新建icm20608文件夹(用于存放icm20608芯片配置函数及i2c封装给mpl库的接口函数),具体文件夹及文件位置可更具自己编写习惯新建。(如果编译找不到文件,注意在工程配置中添加文件包含路径)。

4、编写icm20608.h及icm20608.c文件,检查器件IC20608及i2c2总线是否有问题

直接复制原子哥的icm20608.h及icm20608.c,sys.h(sys.h里的数据类型简写定义还是很好用的,为了减少mpl移植麻烦,粗暴保留sys.h到工程内)文件到icm20608文件夹下。并做适当修改。主要修改I2C实现函数,因为此处使用的是rtthread的i2c驱动框架。

修改int ICM20608_Init(void)如下:(做一些打印,方便查看是否配置成功)

修改4个i2c封装函数,用rtthread驱动框架的i2c接口函数实现。

将初始化函数MSH到打印台。

然后编译下载,检查I2C总线及icm20608器件是否有问题。

说明i2c2总线注册成功。如果未注册成功,需要检查I2C2的引脚配置及设备查找名称是否定义为“i2c2”。

 

运行ICM20608初始化的时候,发现器件ID地址不是0xAF,此处没关系,查阅资料ICM20608的器件根据版本不同,可能是0xAF或者0xAE。我的icm20608器件地址为0xae,程序里相应改为0XAE就可以了。

通过以上配置及测试,基本的I2C总线及器件已经确认没问题了,接下来进行mpl库的移植。

6、移植MPL库文件

直接复制原子哥潘多拉开发板移植好的MPL库文件到device/MPL目录下,并按照原子哥keil例程的包含路径,给rtthread studio 添加MPL库的包含路径。

编译发现很多错误和警告

先针对错误进行修改。修改log_stm32.c文件。注释掉#include "usart.h"。

并在drv_icm20608.c中重定义fputc函数

修改inv_icm20608.c文件,注释掉#include "myiic.h"   ,#include "icm20608.h",#include "delay.h",新添包含文件如下:

并修改inv_icm20608.c文件中的宏定义如下:

注释掉inv_icm20608.c文件中函数u8 mpu_mpl_init(void)中的IIC_Init();

进行编译,没啥错误。

 

在drv_icm20608.c中创建线程,初始化mpl库并进行欧拉角的读取。

编译后发现5个error.

原因是找不到

inv_enable_quaternion();   

inv_enable_9x_sensor_fusion();

inv_enable_fast_nomot();  

 inv_enable_gyro_tc();这几个函数,在rtthread studio 全局搜索,也没发现这几个函数。经过查找资料,原来这个函数被封装在libmollib.lib压缩文件里。

MPL库文件是我们从原子哥例程中直接copy过来的,用的是keil编辑器,stm32l4芯片M4内核,使用的是armcc编译工具链。而我们使用的是rtthread编辑器,gcc编译工具链,stm32f103芯片M3内核。

找到gcc4.9.3目录下的m3内核的压缩文件,将工程中的现有压缩文件替换掉。

并设置rtthread studio 对此压缩文件进行编译。(配置参考连接:https://club.rt-thread.org/ask/question/427453.html

配置如下:

在keil环境下移植,还需要全局宏定义 ICM20608,EMPL

在rtthread studio下,我们在sys.h里面宏定义ICM20608,EMPL,并在mltypes里包含sys.h头文件。

7、编译下载,输出欧拉角

最后进行编译下载

输出了角速度、加速度、欧拉角。

7、最后上传工程代码,在我的资源里哈哈。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
根据引用\[1\],DMP是一个硬件模块,内置了MPU9250芯片,只能获取加速度计和陀螺仪的数据。因此,DMP只支持基于加速度计和陀螺仪数据的算法特性,其他类型的数据无法使用DMP。 根据引用\[2\],如果不使用断,每次读取MPL一次后需要进行复位操作,这可能是由于延时函数导致总体时间过长。使用断后,连续读取1000次数据只需要5秒多的时间,这基本上是最快的方法。 根据引用\[3\],MPU-9250和ICM-20948芯片可以在1.8V的VDDIO下工作,无需重新设计电源。如果已经将VDDIO限制在1.71V到1.95V范围内,可以直接替换MPU9250为ICM-20948,无需进行任何板/设计更改。需要注意的是,在通电时不支持将SCL/SCLK和nCS引脚保持低电平,如果使用这种方法,需要在初始化之前使用PWR_管理_1寄存器进行软件重置。 综上所述,关于mpu9250mpl的具体问题,需要提供更多的信息才能给出详细的回答。 #### 引用[.reference_title] - *1* *3* [STM32入门笔记(02):MPU6050、MPU9250、ICM20948及姿态解算(SPL函数版)](https://blog.csdn.net/Naiva/article/details/123847174)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [关于MPU9250的六轴DMP和九轴MPL](https://blog.csdn.net/Fei_Yang_YF/article/details/94307921)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YANGSAI123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值