欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32复习笔记(十六)MPU6050六轴传感器

程序员文章站 2022-04-18 20:01:29
...

声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照正点原子的视频和文档的实际顺序梳理,转载请注明出处。

作者:sumjess

适用:这个视频我已经看过3遍了,总会有忘记的,所以来写这本书的随手笔记,记录重点、易忘点。该博客可以当做字典,也可以当做笔记。

目前内容:MPU6050六轴传感器

 

、什么是MPU6050?

       MPU6050InvenSense公司推出的全球首款整合性6轴运动处理组件,内带3轴陀螺仪和3轴加速度传感器,并且含有一个第二IIC接口,可用于连接外部磁力传感器,利用自带数字运动处理器(DMP: Digital Motion Processor)硬件加速引擎,通过主IIC接口,可以向应用端输出完整的9轴姿态融合演算数据。

       有了DMP,我们可以使用InvenSense公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度

二、MPU6050的特点:

①自带数字运动处理( DMP: Digital Motion Processing ),可以输出6轴或9轴(需外接磁传感器)姿态解算数据。

②集成可程序控制,测量范围为±250±500±1000±2000°/sec 3轴角速度感测器(陀螺仪)

集成可程序控制,范围为±2g±4g±8g±16g3轴加速度传感器  

④自带数字温度传感器

⑤可输出中断(interrupt),支持姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、high-G中断、零动作感应、触击感应、摇动感应功能 

⑥自带1024字节FIFO,有助于降低系统功耗

⑦高达400KhzIIC通信接口

⑧超小封装尺寸:4x4x0.9mmQFN

三、MPU6050框图:

STM32复习笔记(十六)MPU6050六轴传感器

四、MPU6050初始化:

①初始化IIC接口。

②复位MPU6050由电源管理寄存器1(0X6B)控制。

③设置角速度传感器和加速度传感器的满量程范围。由陀螺仪配置寄存器(0X1B)和加速度传感器配置寄存器(0X1C)设置

④设置其他参数。配置中断,由中断使能寄存器(0X38)控制;设置AUX IIC接口,由户控制寄存器(0X6A)控制;设置FIFO,由FIFO使能寄存器(0X23)控制;陀螺仪采样率 ,由采样率分频寄存器(0X19)控制;设置数字低通滤波器,由配置寄存器(0X1A)控制。

⑤设置系统时钟。由电源管理寄存器1(0X6B)控制。一般选择x轴陀螺PLL作为时钟源,以获得更高精度的时钟

⑥使能角速度传感器(陀螺仪)和加速度传感器。由电源管理寄存器2(0X6C)控制

初始化完成,即可读取陀螺仪、加速度传感器和温度传感器的数据了!!

五、寄存器介绍:

(1)电源管理寄存器10X6B):

STM32复习笔记(十六)MPU6050六轴传感器

STM32复习笔记(十六)MPU6050六轴传感器

(2)陀螺仪配置寄存器0X1B):

STM32复习笔记(十六)MPU6050六轴传感器

该寄存器我们只关心FS_SEL[1:0]这两个位,用于设置陀螺仪的满量程范围:0,±250°/S1,±500°/S2,±1000°/S3,±2000°/S;我们一般设置为3,即±2000°/S,因为陀螺仪的ADC16位分辨率,所以得到灵敏度为:65536/4000=16.4LSB/(°/S)

(3)加速度传感器配置寄存器0X1C):

STM32复习笔记(十六)MPU6050六轴传感器

    该寄存器我们只关心AFS_SEL[1:0]这两个位,用于设置加速度传感器的满量程范围:0,±2g1,±4g2,±8g3,±16g;我们一般设置为0,即±2g,因为加速度传感器的ADC也是16位,所以得到灵敏度为:65536/4=16384LSB/g

(4)FIFO使能寄存器0X23):

STM32复习笔记(十六)MPU6050六轴传感器

    该寄存器用于控制FIFO使能,在简单读取传感器数据的时候,可以不用FIFO,设置对应位为0即可禁止FIFO,设置为1,则使能FIFO

    注意加速度传感器的3个轴,全由1个位(ACCEL_FIFO_EN)控制,只要该位置1,则加速度传感器的三个通道都开启FIFO

(5)陀螺仪采样率分频寄存器0X19):

STM32复习笔记(十六)MPU6050六轴传感器

    该寄存器用于设置MPU6050的陀螺仪采样频率,计算公式为:

采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)

    这里陀螺仪的输出频率,是1Khz或者8Khz,与数字低通滤波器(DLPF)的设置有关,当DLPF_CFG=0/7的时候,频率为8Khz,其他情况是1Khz。而且DLPF滤波频率一般设置为采样率的一半。采样率,我们假定设置为50Hz,那么SMPLRT_DIV=1000/50-1=19

(6)配置寄存器0X1A):

STM32复习笔记(十六)MPU6050六轴传感器

(7)电源管理寄存器20X6C):

STM32复习笔记(十六)MPU6050六轴传感器

    该寄存器的LP_WAKE_CTRL用于控制低功耗时的唤醒频率,本例程用不到。剩下的6位,分别控制加速度和陀螺仪的x/y/z轴是否进入待机模式,这里我们全部都不进入待机模式,所以全部设置为0 即可。

(8)加速度传感器数据输出寄存器0X3B~0X40):

STM32复习笔记(十六)MPU6050六轴传感器

       加速度传感器数据输出寄存器总共由6个寄存器组成,输出X/Y/Z三个轴的加速度传感器值,高字节在前,低字节在后。

(9)陀螺仪数据输出寄存器0X43~0X48):

STM32复习笔记(十六)MPU6050六轴传感器

       陀螺仪数据输出寄存器总共由6个寄存器组成,输出X/Y/Z三个轴的陀螺仪传感器数据,高字节在前,低字节在后。

(10)温度传感器数据输出寄存器0X41~0X42):

STM32复习笔记(十六)MPU6050六轴传感器

    通过读取0X41(高8位)和0X42(低8位)寄存器得到,温度换算公式为:

Temperature = 36.53 + regval/340

    其中,Temperature为计算得到的温度值,单位为℃,regval为从0X410X42读到的温度传感器值。

六、DMP的使用:

    通过前面的学习,我们可以正常读取MPU6050的加速度传感器、陀螺仪和温度传感器的数据,但是实际使用的时候(比如做四轴),我们更希望得到姿态数据,即欧拉角:航向角(yaw)、横滚角(roll)和俯仰角(pitch)。

要得到欧拉角数据,就得利用我们的原始数据,进行姿态融合解算,这个比较复杂,知识点比较多,初学者不易掌握。而MPU6050自带了数字运动处理器,即DMP,并且,InvenSense提供了一个MPU6050的嵌入式运动驱动库,结合MPU6050DMP,可以将我们的原始数据,直接转换成四元数输出,而得到四元数之后,就可以很方便的计算出欧拉角,从而得到yawrollpitch

    使用内置的DMP可以大大简化代码设计,MCU不用进行姿态解算过程,大大降低了MCU的负担,从而有更多的时间去处理其他事件,提高系统实时性。

    InvenSense提供的MPU6050运动驱动库是基于MSP430的,我们需要将其移植一下,才可以用到STM32上面。官方原版驱动在光盘à增值资料àALIENTEK 产品资料àATK-MPU6050六轴传感器模块àMPU6050参考资料àDMP资料

        Embedded_MotionDriver_5.1.rar

        Embedded Motion Driver V5.1.1 API 说明.pdf

        Embedded Motion Driver V5.1.1 教程.pdf

STM32复习笔记(十六)MPU6050六轴传感器

    MPU6050 DMP输出的是姿态解算后的四元数,采用q30格式,也就是放大了230次方,我们要得到欧拉角,就得做一个转换,代码如下:

      q0=quat[0] / q30;	//q30格式转换为浮点数
      q1=quat[1] / q30;
      q2=quat[2] / q30;
      q3=quat[3] / q30; 
      //计算得到俯仰角/横滚角/航向角
      pitch=asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; //俯仰角
      roll=atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;//横滚角
      yaw=atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;	   //航向角

quat[0]~quat[3]:是MPU6050DMP解算后的四元数,q30格式。

q30:是一个常量:1073741824,即230次方。

57.3:是弧度转换为角度,即180/π,这样结果就是以度(°)为单位的。

七、重要函数

1MPU6050 IIC接口驱动代码

2MPU_Init函数

3MPU_Get_Gyroscope函数

4MPU_Get_Accelerometer函数

5MPU_Get_Temperature函数

 

1DMP移植相关代码

        i2c_writei2c_readdelay_msget_ms.

2 mpu_dmp_init函数

3 mpu_dmp_get_data函数