MPU6050

参考链接:MPU6050 6轴姿态传感器的分析与使用(一)-CSDN博客
常见滤波算法及其实现:https://blog.csdn.net/Thmos_vader/article/details/140743117

个人学习笔记,如有侵权,联系删除,转载请标明出处;

简介

  • MPU6050是一个6轴姿态传感器(3轴加速度计和3轴陀螺仪传感器);

  • 可测量芯片自身X、Y、Z轴的加速度、角度参数,通过数据融合,可以得到姿态角。

X、Y、Z轴的定义

横向的是x轴,纵向的是Y轴,垂直与芯片的是Z轴

在这里插入图片描述

姿态角(欧拉角)

飞机机身对应三个轴的夹角

  • 俯仰(pitch):飞机机身对应三个轴的夹角,机头下倾或者上仰;

  • 滚转(roll): 飞机机身左翻滚或者右翻滚;

  • 偏航(raw): 飞机机身向左转向或者向右转向;

在这里插入图片描述

欧拉角就是表述姿态的一个参数

  • 保持飞机的姿态平稳,必须要得到一个精确且稳定的欧拉角;

  • 一种传感器无法获得精确且稳定的欧拉角,要获得精确稳定的欧拉角,需要多个传感器进行数据融合;

  • 常见的数据融合算法有互补滤波、卡尔曼滤波等;


硬件组成

常见的姿态传感器

在这里插入图片描述

加速度计
  • 静态稳定性,不具有动态稳定性(运动加速度)
以下图为例,中间是一个具有一定质量,左右有弹簧的小滑块,
小滑块移动时,滑块上的电位器也跟着移动,通过电位器的电压,就能够知道滑块的加速度值。

这个加速度计实际上是一个弹簧测力计,根据牛顿第二定律F=ma,
想要测量加速度a,只需要找一个单位质量的物体,测量它所受的力F就行了。

在这里插入图片描述

在MPU6050中,X、Y、Z轴都具有一个加速度计,
以下面的图为例,假设芯片里有6个测力的秤组成一个正方体,
正方体内部放一个大小正好的单位质量小球,小球压在一个面上,就会产生对应轴的数据输出;
如果压在上面为正值,压在下面为负值,6个面测的力就是3个轴的加速度值。

在这里插入图片描述

陀螺仪传感器
  • 一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的。
  • 动态稳定性
如图所示,中间是一个有一定质量的旋转轮,外面是3个轴的平衡环,
当中间的旋转轮高速旋转时,根据角动量守恒原理,这个旋转轮具有保持它原有角动量的趋势。
这个趋势可以保持旋转轴方向不变,当外部物体转动时,内部的旋转轴方向不会转动。

这会在平衡环连接处产生角度偏差,如果在连接处放一个电位器,
测量电位器的电压,就能得到角度了;

在这里插入图片描述

但是MPU6050陀螺仪,并不能直接测量角度。
芯片内部的陀螺仪测量的时角速度,分别表示了此时芯片绕X、Y、Z轴旋转的角速度。
对角速度进行积分,就可以得到角度。

通过角速度积分得到的角度也有局限性,
当物体静止时,角速度会因为噪声无法完全归零,经过积分的累积,
噪声会导致计算出来的角速度产生缓慢的偏移。但是这个角度不会受物体运动的影响。

加速度计具有静态稳定性,陀螺仪具有动态稳定性,特性互补。取长补短,进行互补滤波,可得稳定姿态角


MPU6050参数

  • 16位ADC采集传感器的模拟信号,量化范围:-32768~32767。

  • 加速度计满量程范围选择:±2、±4、±8、±16(g) g表示重力加速度1g=9.8m/s²

  • 陀螺仪满量程选择:±250、±500、±1000、±2000(°/sec) 每秒钟旋转了多少度
    (如果测量的物体运动非常剧烈,可以把满量程选择大一些,如果运动比较平缓,可以选择更小的量程,这样分辨率会更大。)

  • 可配置的数字低通滤波器
    (在这个芯片可以配置寄存器来选择对输出的数据进行低通滤波)

  • 可配置的时钟源和可配置的采样分频
    (为AD转换和芯片内部其他电路提供时钟,控制分频系数,可以控制AD转化的快慢。)

  • I2C从机地址:当AD0=0时,地址为1101000,当AD0=1时,地址为1101001,AD0是板子引出来的引脚,可以调节I2C从机地址的最低位。
    (16位表示时,有两种方式,①是把1101000转成16进制0x68,但是因为还有一位读写位,一般使用(0x68<<1)|读写位。读1写0。②把0x68左移一位后的数据当作从机地址,也就是0xD0,再或上读写位。写就发送0xD0,读就发送0xD1。)两种方式本质无区别。


硬件电路

三个部分:MPU-6050芯片,8针的排针,LDO低压差线性稳压器

在这里插入图片描述

  • SDA/SCL已经内置了两个上拉电阻,在接线的时候,直接把SCL和SDA接在GPIO口就行了。SDA/SCL、XDA/XCL通讯引脚分别为两组I2C信号线。当模块与外部主机通讯时,使用SDA/SCL,如与STM32芯片通讯; 而XDA/XCL则用于MPU6050芯片与其它I2C传感器通讯时使用,例如使用它与磁场传感器连接,MPU6050模块可以把从主机SDA/SCL接收的数据或命令通过XDA/XCL引脚转发到磁场传感器中。 但实际上这种功能比较鸡肋,控制麻烦且效率低,一般会直接把磁场传感器之类的I2C传感器直接与MPU6050挂载在同一条总线上(即都连接到SDA/SCL),使用主机直接控制。

  • AD0引脚是从机地址的最低位,接低电平的话,7位的从机地址是1101000,接高电平的话,7位从机地址是1101001,有一个电阻默认下拉到低电平了,所以引脚悬空是接低电平,想接高电平,可以把AD0直接引到VCC,拉到高电平。

  • INT是中断信号输出引脚:可以配置芯片内部的一些事件,来触发中断输出,比如数据准备好了,I2C主机错误等。另外芯片内部还内置了一些小功能,比如自由落体检测、零运动检测、运动检测等,这些信号都可以触发INT引脚产生电平跳变。

  • LDO这部分是供电的逻辑,VDD供电是2.375-3.46V,不能直接接5V,为了扩大供电范围,加了3.3V的稳压器,输入端VCC-5V可以在3.3V到5V之间;


内部框图

在这里插入图片描述

  • 时钟:在硬件电路上,我们可以看到有时钟的接口。不过我们一般使用内部时钟。

  • 加速度计、陀螺仪、温度传感器,相当于可变电阻,通过分压后输出模拟电压,通过ADC进行模数转换,转换完成后,数据放到传感器寄存器中。每个ADC输出对应16位的数据寄存器,不存在数据覆盖的问题,配置好转换频率之后,每个数据会自动以我们设置的刷新频率刷新到数据寄存器。

  • 自测:每个传感器有一个自测单元,当启动自测后,芯片内部会模拟一个外力施加在传感器上。可以先使能自测,读取数据,再失能自测,读取数据,两个数据一相减,得到的数据叫自测响应。芯片手册有自测响应的范围,在范围内表示芯片无问题。

  • 充电泵:CPOUT引脚需要外接一个电容,电荷泵是一个升压电路。假设并联电路5V的电源给一个电容充电,充完后,接成串联电路,电路电压变成10V了。并联充电,串联放电,后续再加一个电源滤波,就能进行平稳升压了。由于陀螺仪内部需要高电压支持,所以设置了一个电荷泵升压。

  • 中断状态寄存器:控制内部的哪些事件到中断引脚的输出。

  • FIFO先入先出寄存器:可以对数据流进行缓存。

  • 配置寄存器:可以对内部的各个电路进行配置。

  • 传感器寄存器:也是数据寄存器,存储了传感器的数据。

  • 工厂校准:内部的寄存器都进行了工厂校准。

  • 数字运动处理器(DMP):芯片内部自带的姿态解算的硬件算法,配合官方的DMP库可以进行姿态解算。

  • 通讯接口部分:上面的8、9、23、24就是从机的I2C和SPI通信接口,用于和STM32通讯,下面一部分7、6是主机的I2C通信接口,用于和MPU6050扩展设备进行通讯。接口旁路选择器,如果拨到上面,辅助的I2C通讯引脚就和正常的I2C接到一起,STM32就可以控制所有设备。如果拨到下面, 辅助的I2C引脚就由MPU6050控制,两条I2C总线独立分开。


寄存器操作

采样频率分频器

配置采样频率的分频系数,分频越小,内部的AD转换就越快,数据寄存器刷新就越快;

陀螺仪输出率就是陀螺仪时钟,陀螺仪时钟/这个寄存器指定的分频系数=采样频率;

在这里插入图片描述

配置寄存器

外部同步设置和低通滤波设置

  • 外部同步设置主要是配置外部帧同步(FSYNC)引脚采样和数字,这里不做配置。

  • 低通滤波器可以让输出数据更加平滑,配置滤波器参数越大,输出的抖动越小。

在这里插入图片描述

陀螺仪配置寄存器

高3位是XYZ轴的自测使能位,中间2位是满量程选择位,后面3位没用到;

在这里插入图片描述
在这里插入图片描述

自测响应=自测使能时的数据-自测使能时的数据;

MPU6050的自测响应的范围如下图所示,在此范围内表示通过自测;

满量程选择:量程越大范围越广,量程越小分辨率越高;

在这里插入图片描述

加速度计配置寄存器

在这里插入图片描述

加速度寄存器的配置与陀螺仪寄存器配置基本上是一个逻辑

加速度计测量寄存器
  • 只读,可以通过这些数据寄存器读取最新的加速度计测量值,想读取哪个参数,只需要读取对应的数据寄存器即可;

  • XYZ轴的加速度值都是16位的有符号数,以二进制补码的方式存储;

  • 读出高8位和低8位,使用int16类型,高位左移8位,或上低位数据,就可以得到数据;

在这里插入图片描述

温度测量寄存器

温度传感器的使用与加速度计寄存器基本相同,可以通过读取寄存器值来获取温度

在这里插入图片描述

陀螺仪测量寄存器

陀螺仪数据寄存器和加速度计测量寄存器也是同样的用法,只需要读取相应的寄存器就可以获得相应的测量数值。数据的存储方式还是16位的有符号数,以二进制补码的方式存储

在这里插入图片描述

电源管理寄存器1

Bit7设备复位,这一位写1,所有寄存器都恢复到默认值。
Bit6睡眠模式,这一位写1,芯片睡眠,进入低功耗。
Bit5循环模式,这一位写1,芯片进入低功耗,过一段时间,启动一次,唤醒的频率由下面电源管理寄存器的Bit7和Bit6决定。
Bit3温度传感器失能,写1之后,禁用内部的温度传感器。
Bit2-0,选择系统的时钟来源。可选择:内部晶振、X/Y/Z轴陀螺仪晶振,外部引脚的两个方波,一般选择内部晶振或者陀螺仪晶振。建议使用陀螺仪晶振,更加精确;

在这里插入图片描述

电源管理寄存器2

Bit5-Bit0,可以分别控制6个轴进入待机模式,如果只需要部分轴的数据,可以让其他轴待机,这样比较省电。
Bit7-Bit6,是上面电源管理寄存器1的循环模式的唤醒频率

在这里插入图片描述

注意:可以使用此寄存器将单个加速度计和陀螺仪轴置于待机模式。如果设备使用陀螺仪轴作为时钟源,并且该轴处于待机状态,时钟源将自动更改为内部8MHz振荡器;

ID号寄存器

ID号不可修改,中间6位固定为110100,最高位和最低为都是0,读出寄存器,值固定为0x68。
实际上ID号就是I2C的地址,但是有区别的是,I2C地址可以通过AD0引脚进行配置,这里的AD号最低位是不随AD0引脚的变化而变化;

在这里插入图片描述

注意

所有的寄存器上电默认值都是0x00,除了107号(电源管理寄存器1),上电默认0x40,117号寄存器(ID号),上电默认0x68。
电源管理寄存器1默认0x40,表示睡眠模式,所以在操作MPU6050之前,要先解除睡眠,否则操作其他寄存器是无效的;

值固定为0x68。
实际上ID号就是I2C的地址,但是有区别的是,I2C地址可以通过AD0引脚进行配置,这里的AD号最低位是不随AD0引脚的变化而变化;

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐