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
具体线路连接:
这里
2.4.3 GY521
MPU-60X0是世界上第一款集成 6 轴MotionTracking设备。它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器 DMP( DigitalMotion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。
关于MPU6050的工作原理、以及重要寄存器这里就不做介绍了。网上很多大神都介绍的很清楚,大家可以浏览一下。
参考:点击查看
就算不看也不影响大家解决上面的问题。
2.4.4 DMP库的移植
主要就是移植下面的几个文件,文件会和源码工程文件一起发给大家,网上自己下载的需要更改,这里给的已经更改好了。
移植步骤:
(1)将存放上面文件的DMP文件夹复制到STM32工程文件的HAREWARE(存放配置文件的目录,不同的工程可能名字不一样)文件夹下
(2)设置路径(按序号依次点击)
关于IIC的文件和MPU6050的文件,按照步骤(1)(2)同样操作既可。确保都完成路径添加。
(3)引入文件
IIC和MPU6050的文件也是上面同样的操作,确保所有的文件都被引入如下图所示
(4)到此,DMP移植的相关文件都完成了,下面就是引用头文件开始使用了。
2.4.5 MPU6050硬件初始化
(1)首先,主函数引入头文件
(2)初始化
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速度控制