0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MPU6050简介及rt-thread软件包使用

RTThread物联网操作系统 来源:小飞哥玩嵌入式 作者:Embedded小飞哥 2022-06-17 10:42 次阅读

小伙伴们大家好,好久不更新RT-Thread实战笔记啦,今天来搞一搞MPU6050,话不多说,淦!

本章源码获取

欢迎在“小飞哥嵌入式”公众号后台回复“MPU6050”即可获取本教程源码

MPU6050简介

某宝买的,吃灰许久了...59c8a9bc-ed64-11ec-ba43-dac502259ad0.png

有钱,不想受那鸟气的,看这个,自己画一个,对比价格,我劝你买个吧,知道自己行就行了...

典型用法:

59f8f928-ed64-11ec-ba43-dac502259ad0.png5a09f110-ed64-11ec-ba43-dac502259ad0.png

可在官网下载最新芯片手册和寄存器映射和描述,参看:MPU6050 官网

5a1666ac-ed64-11ec-ba43-dac502259ad0.png

基本功能:

MPU-60X0是世界上第一款集成 6 轴MotionTracking设备。它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器 DMP( DigitalMotion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其 I2C或SPI接口输出一个9轴的信号( SPI接口仅在MPU-6000可用)。MPU-60X0也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器

MPU-60X0对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250, ±500, ±1000, ±2000°/秒( dps),加速度计可测范围为±2, ±4,±8, ±16g。

一个片上1024字节的FIFO,有助于降低系统功耗。和所有设备寄存器之间的通信采用 400kHz的 I2C接口或 1MHz的 SPI接口( SPI仅MPU-6000可用)。对于需要高速传输的应用, 对寄存器的读取和中断可用 20MHz的SPI。另外,片上还内嵌了一个温度传感器和在工作环境下仅有±1%变动的振荡器。芯片尺寸4×4×0.9mm,采用QFN封装(无引线方形封装),可承受最大 10000g的冲击,并有可编程的低通滤波器

关于电源, MPU-60X0可支持 VDD范围 2.5V±5%, 3.0V±5%,或 3.3V±5%。另外MPU-6050还有一个 VLOGIC引脚,用来为 I2C输出提供逻辑电平。VLOGIC电压可取1.8±5%或者VDD。

5a289534-ed64-11ec-ba43-dac502259ad0.png

系统结构图:

5a3c018c-ed64-11ec-ba43-dac502259ad0.png

通信接口

MPU-60X0使用 SPI(仅MPU-6000)或 I2C 串行通信至系统处理器接口。与系统处理器通信时,MPU-60X0始终充当从属设备。LSB的 I2C 从地址的地址由引脚9(AD0)设置(一般接地),本次采用的是IIC的通讯方式,顺便学习一下rt-thread的IIC设备驱动。

六轴,代表的是它内置了一个三轴 MEMS 陀螺仪、一个三轴 MEMS 加速度计,一个数字运动处理引擎(DMP)。它还有用于第三方的数字传感器接口的辅助 I2C 串行接口,比如当辅助 I2C 串行接口连接到一个三轴磁力计,MPU6050 能提供一个完整的九轴融合输出到其主 I2C 端口

下图标明了传感器的参考坐标系( XYZ组成右手系)以及 3个测量轴和旋转方向。

旋转的正向可用右手螺旋定则判断

5a4bbece-ed64-11ec-ba43-dac502259ad0.png

数字运动处理器(DMP):

DMP就是MPU6050内部的运动引擎,全称Digital Motion Processor,直接输出四元数,可以减轻外围微处理器的工作负担且避免了繁琐的滤波和数据融合。Motion Driver是Invensense针对其运动传感器的软件包,并非全部开源,核心的算法部分是针对ARM处理器和MSP430处理器编译成了静态链接库,适用于MPU6050、MPU6500、MPU9150、MPU9250等传感器。

FIFO

MPU-60X0包含一个可通过串行接口访问的1024字节FIFO寄存器。FIFO配置寄存器决定哪个数据写入FIFO。可能的选择包括陀螺仪数据,加速计数据,温度读数,辅助传感器读数和 FSYNC 输入。FIFO 计数器跟踪 FIFO 中包含的有效数据字节数。FIFO寄存器支持突发读取。中断功能可用于确定新数据何时可用。

MPU6050的涉及的东西还是很多的,小飞哥也只是简单了解了一些,小伙伴们可以查看手册或者百度,很多优秀的介绍,就不再啰嗦啦

rt-thread软件包使用

硬件连接

小飞哥使用的是ART-PI及ART-PI扩展板(12月份即将开源发布)

5a59b4d4-ed64-11ec-ba43-dac502259ad0.png

使用到的引脚为:

MCU MPU6050
3.3V VCC
GND GND
PI2 SDA
PI1 SCL

小伙伴们可以还根据自己的MCU及使用到的引脚,模拟的IIC,自己看着选就可以啦5a754122-ed64-11ec-ba43-dac502259ad0.png

硬件连接OK

软件编写

介绍2两种方式,一种是使用rt-thread平台软件包获取MPU6050的数据,自己解算,另一种就是移植DMP库进行解算,小飞哥用的是移植的DMP库来解算的。

  • rtt软件包使用

选择MPU6050软件包5a8a2d26-ed64-11ec-ba43-dac502259ad0.png

5a989302-ed64-11ec-ba43-dac502259ad0.png然后选择模拟IIC,可以使用IIC3,也可以使用其他的,和软件包选用的统一就OK了

5aae4fa8-ed64-11ec-ba43-dac502259ad0.png

设置完成之后,ctrl+S保存即可,软件包自动就下载添加进来了

5abf4f10-ed64-11ec-ba43-dac502259ad0.png

接下来编写读取函数,直接调用已经封装好的接口即可

先注册设备,初始化

i2c_bus=(structmpu6xxx_device*)mpu6xxx_init(MPU6050_I2C_BUS_NAME,MPU6050_ADDR);//初始化MPU6050,测量单位为角速度,加速度while(count++)

mpu6xxx_set_param(i2c_bus,MPU6XXX_ACCEL_RANGE,MPU6XXX_GYRO_RANGE_2000DPS);//陀螺仪范围配置
mpu6xxx_set_param(i2c_bus,MPU6XXX_ACCEL_RANGE,MPU6XXX_ACCEL_RANGE_2G);//加速度计,一般设置为±2G
mpu6xxx_set_param(i2c_bus,MPU6XXX_SAMPLE_RATE,50);//采样频率
mpu6xxx_set_param(i2c_bus,MPU6XXX_DLPF_CONFIG,25);//数字低通滤波器设置,一般为1/2采样率

然后调用接口:

mpu6xxx_get_gyro(i2c_bus,&gyro);
sprintf(str,"gyro.x=%d
",gyro.x);
rt_kprintf(str);

sprintf(str,"gyro.y=%d
",gyro.y);
rt_kprintf(str);

sprintf(str,"gyro.z=%d
",gyro.z);
rt_kprintf(str);


mpu6xxx_get_accel(i2c_bus,&accel);

sprintf(str,"accel.x=%d
",accel.x);
rt_kprintf(str);
sprintf(str,"accel.y=%d
",accel.y);
rt_kprintf(str);
sprintf(str,"accel.z=%d
",accel.z);
rt_kprintf(str);

运行结果:

5ada6b38-ed64-11ec-ba43-dac502259ad0.png

来看一下,这两个函数的内部封装:

/**
*Thisfunctiongetsthedataofthegyroscope,unit:deg/10s
*Heredeg/10smeans10timeshigherprecisionthandeg/s.
*
*@paramdevthepointerofdevicedriverstructure
*@paramgyrothepointerof3axesstructureforreceivedata
*
*@returnthereadingstatus,RT_EOKreprensentsreadingthedatasuccessfully.
*/
rt_err_tmpu6xxx_get_gyro(structmpu6xxx_device*dev,structmpu6xxx_3axes*gyro)
{
structmpu6xxx_3axestmp;
rt_uint16_tsen;
rt_err_tres;

res=mpu6xxx_get_gyro_raw(dev,&tmp);
if(res!=RT_EOK)
{
returnres;
}

sen=MPU6XXX_GYRO_SEN>>dev->config.gyro_range;

gyro->x=(rt_int32_t)tmp.x*100/sen;
gyro->y=(rt_int32_t)tmp.y*100/sen;
gyro->z=(rt_int32_t)tmp.z*100/sen;

returnRT_EOK;
}
/**
*Thisfunctiongetsthedataoftheaccelerometer,unit:mg
*
*@paramdevthepointerofdevicedriverstructure
*@paramaccelthepointerof3axesstructureforreceivedata
*
*@returnthereadingstatus,RT_EOKreprensentsreadingthedatasuccessfully.
*/
rt_err_tmpu6xxx_get_accel(structmpu6xxx_device*dev,structmpu6xxx_3axes*accel)
{
structmpu6xxx_3axestmp;
rt_uint16_tsen;
rt_err_tres;

res=mpu6xxx_get_accel_raw(dev,&tmp);
if(res!=RT_EOK)
{
returnres;
}

sen=MPU6XXX_ACCEL_SEN>>dev->config.accel_range;

accel->x=(rt_int32_t)tmp.x*1000/sen;
accel->y=(rt_int32_t)tmp.y*1000/sen;
accel->z=(rt_int32_t)tmp.z*1000/sen;

returnRT_EOK;
}

还有获取磁力计、温度的接口,就不再一一列举了,拿到的数据我们可以进行手动解算。

  • 移植DMP解算

使用DMP包的话跟rtt的MPU6050的软件包就没有很大关系了,只需要IIC接口就可以了

首先把DMP库文件放到我们的工程中,包含路径到我们的工程中

5aeddd94-ed64-11ec-ba43-dac502259ad0.png5aff43c2-ed64-11ec-ba43-dac502259ad0.png

然后就需要编写与DMP库对接的接口了,下面几个是需要我们实现的

5b1a77dc-ed64-11ec-ba43-dac502259ad0.png
rt_uint8_tMPU_Write_Len(rt_uint8_taddr,rt_uint8_treg,rt_uint8_tlen,rt_uint8_t*databuf)
{
rt_int8_tres=0;
#ifdefRT_USING_I2C
structrt_i2c_msgmsgs;
rt_uint8_tbuf[50]={0};
#endif
buf[0]=reg;

for(inti=0;i1]=databuf[i];
}

if(i2c_bus->bus->type==RT_Device_Class_I2CBUS)
{
msgs.addr=i2c_bus->i2c_addr;/*slaveaddress*/
msgs.flags=RT_I2C_WR;/*writeflag*/
msgs.buf=buf;/*Senddatapointer*/
msgs.len=len+1;

if(rt_i2c_transfer((structrt_i2c_bus_device*)i2c_bus->bus,&msgs,1)==1)
{
res=RT_EOK;
}
else
{
res=-RT_ERROR;
}
}
}

;i++)>
rt_uint8_tMPU_Read_Len(rt_uint8_taddr,rt_uint8_treg,rt_uint8_tlen,rt_uint8_t*buf)
{
rt_int8_tres=0;
#ifdefRT_USING_I2C
structrt_i2c_msgmsgs[2];
#endif
#ifdefRT_USING_SPI
rt_uint8_ttmp;
#endif
if(i2c_bus->bus->type==RT_Device_Class_I2CBUS)
{
msgs[0].addr=i2c_bus->i2c_addr;/*Slaveaddress*/
msgs[0].flags=RT_I2C_WR;/*Writeflag*/
msgs[0].buf=®/*Slaveregisteraddress*/
msgs[0].len=1;/*Numberofbytessent*/

msgs[1].addr=i2c_bus->i2c_addr;/*Slaveaddress*/
msgs[1].flags=RT_I2C_RD;/*Readflag*/
msgs[1].buf=buf;/*Readdatapointer*/
msgs[1].len=len;/*Numberofbytesread*/

if(rt_i2c_transfer((structrt_i2c_bus_device*)i2c_bus->bus,msgs,2)==2)
{
res=RT_EOK;
}
else
{
res=-RT_ERROR;
}
}

returnres;
}

初始化部分我们改为下面这样,只注册IIC设备就行了,其他的配置在DMP中完成:

i2c_bus=(structmpu6xxx_device*)mpu6xxx_init(MPU6050_I2C_BUS_NAME,MPU6050_ADDR);//初始化MPU6050,测量单位为角速度,加速度while(count++)

/*
mpu6xxx_set_param(i2c_bus,MPU6XXX_ACCEL_RANGE,MPU6XXX_GYRO_RANGE_2000DPS);//陀螺仪范围配置
mpu6xxx_set_param(i2c_bus,MPU6XXX_ACCEL_RANGE,MPU6XXX_ACCEL_RANGE_2G);//加速度计,一般设置为±2G
mpu6xxx_set_param(i2c_bus,MPU6XXX_SAMPLE_RATE,50);//采样频率
mpu6xxx_set_param(i2c_bus,MPU6XXX_DLPF_CONFIG,25);//数字低通滤波器设置,一般为1/2采样率
*/

while(mpu_dmp_init())
{
rt_thread_mdelay(500);
rt_kprintf("
MPU6050Error
");
}
rt_kprintf("
MPU6050OK
");

DMP初始化成功

5b315588-ed64-11ec-ba43-dac502259ad0.png

获取结算后的数据:

floatpitch,roll,yaw;//欧拉角

if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{
sprintf(str,"pitch=%.1f
",pitch);
rt_kprintf(str);

sprintf(str,"roll=%.1f
",roll);
rt_kprintf(str);

sprintf(str,"yaw=%.1f
",yaw);
rt_kprintf(str);


/*
temp=MPU_Get_Temperature();//得到温度值

sprintf(str,"temp=%.1f
",temp);
rt_kprintf(str);

MPU_Get_Accelerometer(&aacx,&aacy,&aacz);//得到加速度传感器数据
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);//得到陀螺仪数据
*/
}
5b42a504-ed64-11ec-ba43-dac502259ad0.png

至此就结束了,使用库的解算是挺方便的,自己解算其中涉及的计算还是挺麻烦的,本章就不再介绍啦,欢迎做过的小伙伴投稿给我哦!

原文标题:RT-Thread实战笔记|MPU6050使用详解及DMP姿态解算

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19259

    浏览量

    229647
  • 软件包
    +关注

    关注

    0

    文章

    104

    浏览量

    11590
  • MPU6050
    +关注

    关注

    39

    文章

    307

    浏览量

    71361
  • RT-Thread
    +关注

    关注

    31

    文章

    1285

    浏览量

    40077

原文标题:RT-Thread实战笔记|MPU6050使用详解及DMP姿态解算

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RT-Thread记录(十八、SHT21与24C02软件包

    本文学习测试一下几款典型设备的 RT-Thread I2C软件包
    的头像 发表于 07-08 11:07 3396次阅读
    <b class='flag-5'>RT-Thread</b>记录(十八、SHT21与24C02<b class='flag-5'>软件包</b>)

    介绍RT-Thread软件包

    学习要点介绍 RT-Thread软件包简介 nRF24L01 软件包的使用,讲解如何使用此软件包将数据正确发送和接收;学习线程间的通信
    发表于 07-27 06:07

    STM32F103C8使用RT-Thread软件包系统读取MPU6050数据的方法

    STM32F103C8 使用RT-Thread软件包系统读取MPU6050  已经使用了一段时间的RTT了,最近看到RTT的微信公众号经常推送软件包的内容,今天就试一下吧。
    发表于 02-10 06:15

    求解mpu6050软件包搜索不到了

    请问一下mpu6050软件包搜索不到了,有什么方法可以去解决吗
    发表于 07-12 11:34

    RT-Thread 软件包介绍

    RT-Thread 软件包介绍软件包的目的软件包在高级语言中非常常见,很多高级语言都有对应的软件包平台,比如 Python 的 PyPi,R
    发表于 05-21 19:38 5552次阅读

    RT-Thread软件包定义和使用

    RT-Thread软件包是运行于RT-Thread物联网操作系统平台上,面向不同应用领域的通用软件组件 。RT-Thread 同时提供了开放
    的头像 发表于 05-21 11:29 1w次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>软件包</b>定义和使用

    RT-Thread社区上有哪些优秀的软件包

    SX12XX 软件包是基于 semtech 官网 Firmware Drivers V2.1.0代码库的移植实现,目前只支持 SX1278 LoRa设备。该软件包在原代码库功能的基础上,对接 RT-Thread SPI 设备驱动
    的头像 发表于 04-03 15:35 7628次阅读

    MPU6050简介

    MPU6050简介什么是MPU6050MPU6050的特点MPU6050框图MPU6050初始化MPU6
    发表于 12-06 11:51 76次下载
    <b class='flag-5'>MPU6050</b><b class='flag-5'>简介</b>

    STM32F103C8 使用RT-Thread软件包系统读取MPU6050

    STM32F103C8 使用RT-Thread软件包系统读取MPU6050  已经使用了一段时间的RTT了,最近看到RTT的微信公众号经常推送软件包的内容,今天就试一下吧。
    发表于 12-06 14:36 12次下载
    STM32F103C8 使用<b class='flag-5'>RT-Thread</b><b class='flag-5'>软件包</b>系统读取<b class='flag-5'>MPU6050</b>

    2022 RT-Thread全球技术大会:RT-Thread软件包

    RT-Thread在2022年上半年新增几十个软件包:rtt-rust、LuatOS、gui-guider-demo。
    的头像 发表于 05-27 14:12 1052次阅读
    2022 <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>RT-Thread</b><b class='flag-5'>软件包</b>

    RT-Thread全球技术大会:恩智浦新增100+软件包

    RT-Thread全球技术大会:恩智浦新增100+软件包,支持了很多有用的功能。             审核编辑:彭静
    的头像 发表于 05-27 14:26 954次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:恩智浦新增100+<b class='flag-5'>软件包</b>

    RT-Thread在线软件包改为本地软件包的方法

    RT-Thread软件包,使用时需要手动通过 ENV 工具 更新到 本地的 packages 目录,并且 packages 目录默认不参与 Git 工程管理,软件包多了,偶尔需要更改软件包
    的头像 发表于 08-11 15:02 1210次阅读
    <b class='flag-5'>RT-Thread</b>在线<b class='flag-5'>软件包</b>改为本地<b class='flag-5'>软件包</b>的方法

    RT-Thread使用cjson软件包发送64位长整型数据

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源为0.2.2,rt-thread版本为4.1.1,cjson软件包使
    的头像 发表于 10-11 15:09 916次阅读
    <b class='flag-5'>RT-Thread</b>使用cjson<b class='flag-5'>软件包</b>发送64位长整型数据

    RT-Thread中Agile Modbus软件包的使用方法

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源为0.2.2,Agile Modbus软件包版本为v1.1.2。工程使用上一篇
    的头像 发表于 10-11 15:37 2667次阅读
    <b class='flag-5'>RT-Thread</b>中Agile Modbus<b class='flag-5'>软件包</b>的使用方法

    RT-Thread中mymqtt软件包的使用方法

    在上一篇文章 RT-Thread中Lan8720和lwip协议栈的使用的工程基础上添加mymqtt软件包。 使能mqtt example和mqtt test,保存,等待下载更新软件包
    的头像 发表于 10-13 10:44 974次阅读
    <b class='flag-5'>RT-Thread</b>中mymqtt<b class='flag-5'>软件包</b>的使用方法