rt-thead-studio 中实现 MPU6050基于DMP中断读取数据

2023-10-27

rt-thead-studio 中实现 MPU6050基于DMP中断读取数据

目录

前言

本文基于rt-thead-studio 闪灯的工程,使用 mpu6050 和 内部的 mpl高级特性库, 直接读出并计算3轴的转角,性能稳定。

MPU6050具备中断寄存器,有助于精准获取数据。本文将使用 art_pi 配置FIFO中断,从而通过 int 控制中断时间。

mpl高级特性库问题

目前 mpl 高级库只支持 stm32 系列 mcu,因为 MotionDriver 只提供了 mpl 的预编译库,没开源

example 中使用了的 mpl 库,所以非 stm32 系列 mcu 无法运行

一、基于开发板创建闪灯工程

创建成功后,正常编译通过下载蓝灯闪烁。

二、添加 外设 i2c

在这里插入图片描述

运行命令: list_device ,显示 I2C3 设备已经存在。

在这里插入图片描述

三、添加 package - 参考 MotionDriver2RTT

添加package

在这里插入图片描述

修改属性,添加库文件libmplmpu ,详细配置使能 sample。 编译后出错,error: conflicting types for 'run_self_test'

motion_driver_example.c 中添加 函数 定义:

uint8_t run_self_test(void);
uint8_t mpu_mpl_get_data(void);

继续编译,出错 :

../packages/MotionDriver2RTT-latest/examples/motion_driver_example.c:295:9: error: conflicting types for 'mpu_mpl_get_data'
 uint8_t mpu_mpl_get_data(float *pitch,float *roll,float *yaw)
         ^
../packages/MotionDriver2RTT-latest/examples/motion_driver_example.c:44:9: note: previous declaration of 'mpu_mpl_get_data' was here
 uint8_t mpu_mpl_get_data(void);

修改44 行的定义: uint8_t mpu_mpl_get_data(float *pitch,float *roll,float *yaw);

编译,出错 :

/ld.exe: cannot find -llibmpllib

提示找不到库文件,按照下图修改库文件名称和位置:

在这里插入图片描述

再进行编译,提示重复定义:board/drv_mpu.c:15: multiple definition of mpu_init

修改 drv_mpu.c 中的 函数为静态: static int mpu_init(void)

修改使用 i2c3 设备: #define RT_MPU_DEVICE_NAME "i2c3"

编译成功,运行发现:

在1个tick的定时过程中,运行一段时间一定会内存溢出,读取的数据隔几次之后就会出现FIFO溢出错误,读的频率快了之后就会出现FIFO数据和要读取的数据长度不匹配(应该是读取的太快了,转换的数据还没来得及放到FIFO里)错误。

在这里插入图片描述

四、 修改MPU6050 FIFO中断配置

首先在MPU6050初始化函数中配置好中断,这里不用添加配置,因为本来已经配置好了 int 低电平中断。

MPU6050触发的是STM32的外部中断,此处使用的是PA15的外部中断,因为是低电平触发。

#define EVENT_MD_LOOP		(1<<0)
#define EVENT_PRINT		    (1<<1)
#define MPU6050_INT_PIN GET_PIN(A, 15)
static struct rt_event event_motion;

static void mpu6050_int_callback()
{
    rt_event_send(&event_motion, EVENT_MD_LOOP);
}

static void mpu6050_int_pin_init(void)
{
    rt_pin_mode(MPU6050_INT_PIN, PIN_MODE_INPUT_PULLUP);
    rt_pin_attach_irq(MPU6050_INT_PIN, PIN_IRQ_MODE_FALLING, mpu6050_int_callback, RT_NULL);
    rt_pin_irq_enable(MPU6050_INT_PIN, PIN_IRQ_ENABLE);
}

void motion_loop(float *pitch,float *roll,float *yaw)
{
    mpu_mpl_get_data(pitch,roll,yaw);
}

static struct rt_timer timer_motion;
static struct rt_event event_motion;

static void timer_motion_update(void* parameter)
{
    rt_event_send(&event_motion, EVENT_PRINT);
}

void print_motion(float *pitch,float *roll,float *yaw)
{
    char str[48];
    sprintf(str,"pitch=%0.1f\troll=%0.1f\tyaw=%0.1f",*pitch,*roll,*yaw);
    LOG_I(str);
}

在 motion_init中,启动 motion_entry 线程; 开启中断,当有 int 产生,进行一次mpu_mpl_get_data 获取数据。同时开启定时器,定时发送打印事件。

void motion_entry(void *parameter)
{
	......
	/*添加mpu int 中断回调
     * MPU_Write_Byte(MPU_INT_EN_REG,0X01); //开启FIFO中断
     * MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);   //INT引脚低电平有效
     */
    mpu6050_int_pin_init();

    /* register timer event */
    rt_timer_init(&timer_motion, "timer_motion",
                    timer_motion_update,
                    RT_NULL,
                    100,
                    RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);
    rt_timer_start(&timer_motion);

    while(1)
	{
		res = rt_event_recv(&event_motion, EVENT_MD_LOOP | EVENT_PRINT, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
								RT_WAITING_FOREVER, &recv_set);
		
		if(res == RT_EOK){
			if(recv_set & EVENT_MD_LOOP){
				motion_loop(&pitch, &roll ,&yaw);
			}
			else if(recv_set & EVENT_PRINT){
                print_motion(&pitch, &roll, &yaw);
            }
		}
	}
}

五、配置DMP采样时长

在MPU6050初始化函数中配置

MPU_Set_Rate(200); //设置采样率为200Hz

在DMP初始化函数中配置

res = mpu_set_sample_rate(200); //设置采样率
if(res)
	return 3;

res = dmp_set_fifo_rate(200); //设置DMP输出速率(最大不超过200Hz)
if(res)
	return 7;   

此处将采样率设置为200HZ,那么采样时间就是1/200=5ms
根据公式T = 1 / f
实际上采样频率是根据DMP频率,如果两个频率不同最终也以DMP的为主。

用示波器查看 INT输出,可看到周期是10ms ,可以在程序中编写下降沿中断,读取 fifo

缺省DEFAULT_MPU_HZ 为 100

演示结果显示输出结果相当稳定:

在这里插入图片描述

式T = 1 / f
实际上采样频率是根据DMP频率,如果两个频率不同最终也以DMP的为主。

用示波器查看 INT输出,可看到周期是10ms ,可以在程序中编写下降沿中断,读取 fifo

缺省DEFAULT_MPU_HZ 为 100

演示结果显示输出结果相当稳定.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rt-thead-studio 中实现 MPU6050基于DMP中断读取数据 的相关文章

  • 机器学习之——单变量线性回归

    线性回归 线性回归 Linear Regression 作为Machine Learning 整个课程的切入例子确实有独到的地方 以简单的例子为出发点 将学习任务的主干串起来 问题的建模可以简单如下图所示 线性回归可以分为单变量线性回归 L
  • media sdk 性能优化

    https software intel com sites default files m 2 0 a 7 9 28439 Intel Media SDK E4 B9 8B E4 BC 98 E5 8C 96 E6 8A 80 E6 9C

随机推荐

  • SQLServer开启远程连接

    一 在需要被远程连接的电脑客户端中打开命令提示符输入 ipconfig 找到IPV4地址 二 在SQLServer配置管理器中找到端口 三 1 打开 控制面板 2 打开 系统和安全 3 打开 WindowDefender防火墙 4 打开 高
  • C#中 Console方法介绍

    一般情况下 我们用来输入信息的方法主要是用到如下四个 1 console log 用于输出普通信息 2 console info 用于输出提示性信息 3 console error 用于输出错误信息 4 console warn 用于输出警
  • 20世纪最好的十大算法、算法笔记(2008-11-15 22:16:57、2011-04-21 19:29:05)

    Algorithm 算法 一词与9世纪的阿拉伯学者al Khwarizmi有关 他写的书 al jabr w al muqabalah 代数学 演变成为现在中学的代数教科书 Ad Khwarizmi强调求解问题的有条理的步骤 20世纪最好的
  • 启动虚拟机异常(完整版)——如果已在 BIOS/固件设置中禁用 Intel VT-x,或主机自更改此设置后从未重新启动,则Intel VT-x处于禁用状态

    创建了Linux虚拟机 点击 开机 之后 报了这个错误 笔记本电脑 我的 联想天逸 笔记本电脑 许多键与其他的 比如 华硕笔记本电脑 不同 想在操作系统中按F2 要Fn加 减音量 才有F2的功能 我将这个思想带到 启动BIOS 中 害惨了我
  • vue 使用 wangeditor 富文本编辑器

    wangeditor 是一个轻量级 web 富文本编辑器 配置方便 使用简单 1 安装 wangeditor 终端安装 wangeditor 库 yarn add wangeditor editor 或者 npm install wange
  • 腾讯云数据库CDB技术演进之路

    IT168 专稿 本文根据 2016 第八届系统架构师大会 微信搜索SACC2013 关注系统架构师大会公众号 现场演讲嘉宾程彬老师分享内容整理而成 录音整理及文字编辑IT168 田晓旭 老鱼 嘉宾简介 程彬 腾讯基础架构部数据库研发负责人
  • SQLSERVR 转换为数字类型numeric时出现算数溢出错误

    SQLSERVR 转换为数字类型numeric时出现算数溢出错误 情况一 在SQLSERVER中 关于数据的计算可能会导致出现如下的错误 遇到这类问题 一般都是由于结果超过了这个字段的长度 个字段的属性的概念 create table T1
  • 教你怎么用Vulnhub来搭建环境

    0x01 前言 Vulnhub它是一个提供各种漏洞环境的平台 里面大部分的环境是要用VMware或者VirtualBox打开运行的 如果只是练习一些常见的漏洞可以看我另外两篇用Docker来搭建各种漏洞靶场 妈妈再也不用担心我没有靶场练习了
  • 递归实现全排列

    设 R r1 r2 rn 是需要排列的 N 个元素 Ri R ri 设集合 中的元素 全排列记 为 Perm X ri Perm X 表示在 全排列 Perm X 的每一个排列前加上前缀 ri 得到的全排列 例如在 Perm X 的排列为
  • [java]java使用AES加密解密 ,AES-128/192/256-ECB加密模式

    直接上代码 是在springboot下直接test的 import org apache commons codec binary Base64 import org junit Test import org junit runner R
  • 【Linux 驱动篇(四)】设备树

    文章目录 一 什么是设备树 二 DTS DTB 和 DTC 三 DTS 语法 1 dtsi 头文件 2 设备节点 3 标准属性 3 1 compatible 属性 3 2 model 属性 3 3 status 属性 3 4 address
  • 4种线程池详解

    要配置一个线程池是比较复杂的 尤其是对于线程池的原理不是很清楚的情况下 很有可能配置的线程池不是较优的 因此在Executors类里面提供了一些静态工厂 生成一些常用的线程池 文章目录 ExecutorService概述 newSingle
  • HttpComponents(Apache HttpComponents Client 4.1.3)通过代理访问网页的设置方法

    HttpClient httpclient new DefaultHttpClient 这里是设置代理服务器的地方 HttpHost proxy new HttpHost 10 10 228 43 808 http httpclient g
  • win7 升级到 win10

    摘要 项目上遇到一个问题 客户提供一个软件在设备上点击运行后 转圈加载下就没有下文了 但是其他的软件又能正常运行 尝试了漏洞修护 系统修护 兼容性运行 管理员运行 32位兼容性进程检测等方式都不行 只能采取将win7升级到win10一试 在
  • vue学习,v-for不渲染

    最近在学习vue 使用axios v for做个搜索天气的小练习 发现只有第一次搜索有数据 改变数组后vue for不渲染 但使用console log可以看到数据确实更新了 使用this forceUpdate 这个不起作用 没办法了 只
  • Python实现桶排序

    Python实现桶排序 一 桶排序简介 桶排序 Bucket sort 是一种通过分桶和合并实现的排序算法 又被称为箱排序 桶排序先将数据分到有限数量的桶里 然后对每一个桶内的数据进行排序 桶内排序可以使用任何一种排序算法 如快速排序 最后
  • JVM系列(九) 垃圾收集器之 Serial / Serial Old

    回收期演变及概览 前面我们讲了很多 垃圾收集的原理和知识点 下面我们针对各种垃圾收集器进行JVM调优 JVM调优其实都是根据对应的垃圾收集器特性而去做调整和优化 不同垃圾收集器的产生总体可以划分为几个阶段 第一阶段 单线程收集时代 Seri
  • 【Unity粒子系统】

    转自 https blog csdn net m0 37679113 article details 75893700 接下来的图片就是Unity2017 1 0f3 编辑器中的粒子系统模块 了解粒子系统 必须先了解每一个属性都代表了什么
  • 程序员为什么被叫做“码农”,我来和大家聊一聊

    在现代社会 计算机技术和互联网行业的迅速发展 使得程序员这个职业在人们心中越来越受到重视 然而 与此同时 也出现了一些对于程序员职业的误解和偏见 今天我就想和小伙伴们一起聊聊这个有趣的话题 程序员被叫做 码农 名字的由来 让大家更加了解程序
  • rt-thead-studio 中实现 MPU6050基于DMP中断读取数据

    rt thead studio 中实现 MPU6050基于DMP中断读取数据 目录 文章目录 rt thead studio 中实现 MPU6050基于DMP中断读取数据 目录 toc 前言 mpl高级特性库问题 一 基于开发板创建闪灯工程