dmp文件查看表空间_STM32 MPU6050数据获取(IIC + DMP)

3fa24d5a3ce3dba9c1cd96f452984d0d.png

2.4 STM32 MPU6050数据获取(IIC + DMP)

本篇文章主要针对廉价的MPU6050模块。我们这里完成了MPU6050的数据获取、零偏自动设置、温漂抑制。这里提供源码工程文件,供大家下载,在公众号:小白学移动机器人,发送:MPU6050,即可获得

2.4.1 解决的问题

DMP库的移植(文件已被更改过,更好的移植)

MPU6050数据的获取(通过DMP获取的四元数,做姿态解算)

零偏自动校准(实现DMP方式上电既是0角度)

有效的温漂抑制(针对yaw值无法滤波的情况,使用特殊的方法,实现原本4分钟漂1度,到30分钟漂一度的改变)

2.4.2 实现工具

STM32F103单片机、GY521六轴模块、keil5

7fac23dc1eeb946531f15228d357c692.png

具体线路连接:

这里

2.4.3 GY521

MPU-60X0是世界上第一款集成 6 轴MotionTracking设备。它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器 DMP( DigitalMotion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。

关于MPU6050的工作原理、以及重要寄存器这里就不做介绍了。网上很多大神都介绍的很清楚,大家可以浏览一下。

参考:点击查看

就算不看也不影响大家解决上面的问题。

2.4.4 DMP库的移植

主要就是移植下面的几个文件,文件会和源码工程文件一起发给大家,网上自己下载的需要更改,这里给的已经更改好了。

a2f189489561c6376abf8f20d77098ba.png

移植步骤:

(1)将存放上面文件的DMP文件夹复制到STM32工程文件的HAREWARE(存放配置文件的目录,不同的工程可能名字不一样)文件夹下

b7169901229f82d8843f285887dadb65.png

(2)设置路径(按序号依次点击)

f0403cf72f22be28d0d2dfbc1ee292f7.png

关于IIC的文件和MPU6050的文件,按照步骤(1)(2)同样操作既可。确保都完成路径添加。

a3503c00e5f0218d9727f38c85231e78.png

(3)引入文件

157c4c1798f08a0e93d4d4c3f06bf3a6.png

b080478725b01f6b839461f35f4f5482.png

IIC和MPU6050的文件也是上面同样的操作,确保所有的文件都被引入如下图所示

01d93cdc15a6d9c6005d811fcf0a9fcc.png

(4)到此,DMP移植的相关文件都完成了,下面就是引用头文件开始使用了。

2.4.5 MPU6050硬件初始化

(1)首先,主函数引入头文件

db05d38f08297d5b378dcccbacbc272f.png

(2)初始化

c8640d9cde4dc973acf1b15f477bbbe3.png

2.4.6 IIC初始化

IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

设备上的串行数据线SDA接口电路应该是双向的,输出电路用于向总线上发送数据,输入电路用于接收总线上的数据。而串行时钟线也应是双向的,作为控制总线数据传送的主机,一方面要通过SCL输出电路发送时钟信号,另一方面还要检测总线上的SCL电平,以决定什么时候发送下一个时钟脉冲电平;作为接受主机命令的从机,要按总线上的SCL信号发出或接收SDA上的信号,也可以向SCL线发出低电平信号以延长总线时钟信号周期。

总线空闲时,因各设备都是开漏输出,上拉电阻Rp使SDA和SCL线都保持高电平。任一设备输出的低电平都将使相应的总线信号线变低,也就是说:各设备的SDA是“与”关系,SCL也是“与”关系。

IIC

其他的IIC读取和写入函数在例程中已完成,我们主要的工作是将任意两端口配置为IIC的SDA和SCL.

2.4.7 MPU6050初始化

/**************************实现函数********************************************

2.4.8 DMP初始化

/**************************************************************************

此函数主要是对DMP进行初始化,如果想要了解每个函数具体是初始化的什么内容,请看printf函数输出的内容即可。

我们主要讲陀螺仪是如何进行开机校准,或者设置开机不校准。将目光放到run_self_test();这个函数,这是用来设置校准的函数.

static 

这样的话,mpu6050校准的过程就明确了.

如果不需要开机校准,可以是if(result==0x03)这个条件不满足,不进入处理,或者将陀螺仪 加速度计的基准设置函数set_bias不执行即可.

如果需要开机校准,保证整个校准流程正常执行就行.

2.4.9 MPU6050数据获取以及温漂抑制

温漂随时间近似线性,不做处理的时候,大概3-4分钟yaw就飘1度。根据采集一段时间数据,计算单位时间内yaw漂移的量,根据时间变化,将对应的漂移量减掉,这样我们就可以得到,半小时只偏差1度的效果,这样已经满足大部分场景了。

(1) main.c

/*===================================================================

(2) 外部中断,根据时间累积温漂

#include 

(3)getAngle函数

/**************************************************************************

2.4.10 总结

本篇文章基本上实现了(IIC+DMP+零偏校准+温漂大幅度抑制),对于ROS小车yaw的精度我们已经实现了。到这里,我们就已经完成了,ROS小车底层的大部分代码,下面剩下STM32与ROS通信。

参考:

MEMS陀螺仪如何进行信号温漂补偿:点击查看

MPU6050 6轴陀螺仪的使用与校准:点击查看

系列文章

搭建ROS小车真的难吗?

ROS小车软件结构以及控制流程

STM32电机PWM控制

STM32电机测速(正交霍尔编码器)

STM32电机PID速度控制

c4f72d637eefd1855432822411a0cafe.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值