移植MotionDriver到RTT
这个移植花费了我好多时间…
本来是想使用mpu6xxx的软件包的,但是得到的数据抖动太厉害了
在网上找到了两种得到稳定的数据的方法
DMP
Kalman滤波
看到DMP的效果更好,就选择DMP的方案
了解到 InvenSense 公司提供的 MotionDriver 可以用DMP的方式读取mpu,就开始移植 MotionDriver 这个库
本项目的地址 https://github.com/greedyhao/MotionDriver2RTT
移植步骤
简单的说,就是把 core/driver/eMPL/inv_mpu.c 这个文件中需要使用到的函数实现就行了
这个文件中也有相关说明
/* The following functions must be defined for this platform:* i2c_write(unsigned char slave_addr, unsigned char reg_addr,* unsigned char length, unsigned char const *data)* i2c_read(unsigned char slave_addr, unsigned char reg_addr,* unsigned char length, unsigned char *data)* delay_ms(unsigned long num_ms)* get_ms(unsigned long *count)* reg_int_cb(void (*cb)(void), unsigned char port, unsigned char pin)* labs(long x)* fabsf(float x)* min(int a, int b)*/
不过实际需要实现的只有 i2c_write i2c_read delay_ms get_ms,以及 core/driver/stm32L/log_stm32.c 下的 log_i 与 log_e 的底层函数
#define i2c_write imu_i2c_write_regs
#define i2c_read imu_i2c_read_regs
#define delay_ms thread_mdelay
#define get_ms get_tick_count
#define log_i MPL_LOGI
#define log_e MPL_LOGE
#define min(a,b) ((a<b)?a:b)
#define labs(n) (((n) < 0) ? (-(n)) : (n))
i2c的实现
struct rt_mpu_device *mpu_dev;
通过 mpu_dev 这个全局指针来保存mpu设备的相关信息
不过全局指针的方式进行i2c通信不知道会不会不太好,暂时没有其他方式实现
rt_err_t imu_i2c_write_regs(unsigned char slave_addr, unsigned char reg_addr, unsigned short length, const unsigned char *data_ptr)
{...if (!rt_mpu_write_reg(mpu_dev, reg_addr, length, data_ptr)){res = RT_EOK;}...
}rt_err_t imu_i2c_read_regs(unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char *data)
{... if (!rt_mpu_read_regs(mpu_dev, reg_addr, length, data)){res = RT_EOK;}...
}
因为 rt-thread 的i2c接口和 MotionDriver 中需要的i2c接口不一致,就写了个中间层适配,从 MotionDriver 的i2c接口传入的 slave_addr 直接使用 mpu_dev 中的地址,这样就可以使用 rt-thread 的 i2c设备框架了
i2c驱动的实现很重要,不然这个库没办法用的,遇到问题先检查i2c驱动的实现
其他函数
其他的函数都可以使用 rt-thread 系统中自带函数
遇到问题
fifo overflow
卡在这个问题好久,偶然间从网上了解到,DMP程序要考虑到DMP数据的输出速率
本项目中设置的是100Hz,读取的速度也要相对应,不然就会overflow
为了防止溢出,我直接加大了fifo的大小,并加快了读取速度
效果图
现在数据稳得一批
个人博客
公众号:greedyhao
移植MotionDriver到RTT相关推荐
- RTTHREAD软件包目录
RTTHREAD软件包目录 这边统计下RTTHREAD软件包的各项内容 IOT 包名 技术标签 依赖平台 备注 abup_fota OTA TCP/UDP 本软件包是用于 Abup FOTA 升级的固 ...
- RTTHREAD 软件包目录(实时更新)
RTTHREAD 软件包目录 ai 包名 作者 license 备注 elapack wuhanstudio MIT 嵌入式线性代数库,兼容 matlab libann wuhanstudio MIT ...
- RTT之创建工程模板
文章目录 一.下载RT_Thread Nano源码 二.安装RT_Thread Package 三.移植RTT 1.拷贝RT_Thread Package到裸机工程根目录 2.介绍RT-Thread目 ...
- 【专题教程第4期】SEGGER的J-Scope波形上位机软件,HSS模式简单易用,无需额外资源,也不需要写目标板代码
说明: 1.在实际项目中,很多时候,我们需要将传感器或者ADC的数值以波形的形式显示.通常的解决办法是用串口上位机,USB接口上位机或者MDK的逻辑分析仪功能,使用这三种方式都比较繁琐.本期专题为大家 ...
- Segger RTT深度使用说明-移植-Jlink rtt viewer显示-输出到Secure CRT
简介 RTT( Real Time Terminal)是SEGGER公司新出的可以在嵌入式应用中与用户进行交互的实时终端.J-Link驱动4.90之后的版本都支持RTT.RTT既可以从MCU上输出信息 ...
- RT-thread基础移植//依据rtt实战学习记录
主要任务有以下几点: 任务 1:BSP 跑起来 任务 2:完成报警模块 任务 3:完成按键模块 任务 4:完成温湿度传感器的驱动 和明显各个任务是层层递进的,并且有易到难,今天是第一天,由于上课的原因 ...
- 移植RTT使用cubeMx配置后出现 cannot open source input file stm32f1xx_hal_exti.h: No such file or directory
问题原因: 因为官方的f1HAL库存在没有"stm32f1xx_hal_exti.h"文件, 解决办法: 从cubuMx生成的工程内部复制一个"stm32f1xx_hal ...
- RTT 使用menuconfig 和cubeMux 在移植过来的模板工程上增加一个串口2
1.在board目录下Kconfig文件中增加如下内容 打开CubeMX_Config下的CubeMX_Config.ioc的cubeMx工程 a;使能串口1: b;使能外部时钟,设置时钟树: 1工程 ...
- 关于精英版stm32从模板工程移植RTT Spi驱动打开后编译不过的处理办法
移植成功后天健SPI驱动代码,出现编译不过,编译器提示 SPI_HandleTypeDef 类型未定义 解决办法是: 打开下图中文件中的宏定义即可
- 【RTT】移植:LVGL 8.0.2
开发板:潘多拉开发板 系统版本:v4.0.3 LVGL版本:8.0.2 注:这篇文章就简单记录下编译成功,跑了一个 demo 的过程,至于是否完全移植成功,不确定哈,毕竟 LVGL 还 ...
最新文章
- 0x16.基本数据结构 — Trie树(字典树)+ A C 自 动 机
- Delphi编写后台监控软件
- StringBuilder的构造方法和append方法
- 小白带你入坑xamarin系列之环境搭建和准备
- oracle 快捷 企业,Oracle自治数据库提供APEX 20.1,助企业快速构建应用
- 过度扩容 A股“虚胖”
- 举例说明语言接触会造成哪些结果_语言学概论全真模拟演练(二)
- 腾讯,360,华为等应用市场相继发布适配公告,发力安卓P版本
- c语言switch编写个人所得税,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
- mcal rtm_RTM的完整形式是什么?
- arcmap新手教程_ArcGIS入门教程(1)——ArcMap应用基础
- 海量图标矢量图免费下载【来自阿里】
- 三款MikroTik家用和小型办公网路由器
- 计算机时间单位,时间计算机单位之间的换算
- win10安装SVN失败问题汇总
- CobaltStrike逆向学习系列(15):CS功能分析-BOF
- python(进阶篇)——自动化操作Excel(xlrd和xlwt)
- border-radius简介
- 金蝶云之家APP产品分析报告
- ARM SIMD 指令集:NEON 简介