一、MPU6050简介
MPU6050是一个6轴姿态传感器(3轴加速度计和3轴陀螺仪传感器),可以测量芯片自身X、Y、Z轴的加速度、角度参数,通过数据融合,可以得到姿态角。
二、简介分析
1.常见的姿态传感器以及它的组成部分:
2.姿态角(欧拉角):
简单地描述以飞机为例,飞机机身对应三个轴的夹角,机头下倾或者上仰,这个轴的夹角叫俯仰(pitch)。飞机机身左翻滚或者右翻滚,这个轴的夹角叫做滚转(roll),飞机机身向左转向或者向右转向,这个轴的夹角叫做偏航(raw)。
所以欧拉角就是表述姿态的一个参数。为了保持飞机的姿态平稳,必须要得到一个精确且稳定的欧拉角。一种传感器不能获得精确且稳定的欧拉角,要获得精确稳定的欧拉角,需要多个传感器进行数据融合。常见的数据融合算法有互补滤波、卡尔曼滤波等。
3. X、Y、Z轴的定义:
横向的是x轴,纵向的是Y轴,垂直与芯片的是Z轴。
4.加速度计:
以下图为例,中间是一个具有一定质量,左右有弹簧的小滑块,小滑块移动时,滑块上的电位器也跟着移动,通过电位器的电压,就能够知道滑块的加速度值。
这个加速度计实际上是一个弹簧测力计,根据牛顿第二定律F=ma,想要测量加速度a,只需要找一个单位质量的物体,测量它所受的力F就行了。
在MPU6050中,X、Y、Z轴都具有一个加速度计,以下面的图为例,假设芯片里有6个测力的秤组成一个正方体,正方体内部放一个大小正好的单位质量小球,小球压在一个面上,就会产生对应轴的数据输出。如果压在上面为正值,压在下面为负值,6个面测的力就是3个轴的加速度值。
加速度计具有静态稳定性,不具有动态稳定性。假设芯片向左倾斜放置,底面和左面都受力,求一个三角函数,就能得到向左的倾角。但是这个倾角只有在静态时生效。因为加速度分重力加速度和运动加速度,如果此时芯片运动起来,这个三角函数的倾角就会受运动加速度的影响。(向前加速运动时,芯片的底面和左面也受力,无法判断芯片的状态是向左倾斜放置还是向前加速。)
5.陀螺仪传感器:
陀螺仪:一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的。
如图所示,中间是一个有一定质量的旋转轮,外面是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。)两种方式本质上没有什么区别。
四、硬件电路
硬件电路包含3个部分,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总线独立分开。
六、寄存器操作
1.采样频率分频器
这个寄存器可以配置采样频率的分频系数,分频越小,内部的AD转换就越快。数据寄存器刷新就越快。陀螺仪输出率就是陀螺仪时钟。陀螺仪时钟/这个寄存器指定的分频系数=采样频率。
2.配置寄存器
配置寄存器主要分为两个部分:外部同步设置和低通滤波设置:
外部同步设置主要是配置外部帧同步(FSYNC)引脚采样和数字,这里不做配置。
低通滤波器可以让输出数据更加平滑,配置滤波器参数越大,输出的抖动越小。
3.陀螺仪配置寄存器
高3位是XYZ轴的自测使能位,中间2位是满量程选择位,后面3位没用到。
自测响应=自测使能时的数据-自测使能时的数据。
MPU6050的自测响应的范围如下图所示,在此范围内表示通过自测。
满量程选择:量程越大范围越广,量程越小分辨率越高。在上面的参数介绍中已经有所说明。
4.加速度计配置寄存器
加速度寄存器的配置与陀螺仪寄存器配置基本上是一个逻辑。
5.加速度计测量寄存器
只读,可以通过这些数据寄存器读取最新的加速度计测量值。
想读取哪个参数,只需要读取对应的数据寄存器即可。XYZ轴的加速度值都是16位的有符号数,以二进制补码的方式存储。读出高8位和低8位,使用int16类型,高位左移8位,或上低位数据,就可以得到数据了。
6. 温度测量寄存器
温度传感器的使用与加速度计寄存器基本相同,可以通过读取寄存器值来获取温度。
7.陀螺仪测量寄存器
陀螺仪数据寄存器和加速度计测量寄存器也是同样的用法,只需要读取相应的寄存器就可以获得相应的测量数值。数据的存储方式还是16位的有符号数,以二进制补码的方式存储。
8.电源管理寄存器1
Bit7设备复位,这一位写1,所有寄存器都恢复到默认值。
Bit6睡眠模式,这一位写1,芯片睡眠,进入低功耗。
Bit5循环模式,这一位写1,芯片进入低功耗,过一段时间,启动一次,唤醒的频率由下面电源管理寄存器的Bit7和Bit6决定。
Bit3温度传感器失能,写1之后,禁用内部的温度传感器。
Bit2-0,选择系统的时钟来源。可选择:内部晶振、X/Y/Z轴陀螺仪晶振,外部引脚的两个方波,一般选择内部晶振或者陀螺仪晶振。建议使用陀螺仪晶振,更加精确。
9.电源管理寄存器2
Bit5-Bit0,可以分别控制6个轴进入待机模式,如果只需要部分轴的数据,可以让其他轴待机,这样比较省电。
Bit7-Bit6,是上面电源管理寄存器1的循环模式的唤醒频率。
注意:可以使用此寄存器将单个加速度计和陀螺仪轴置于待机模式。如果设备使用陀螺仪轴作为时钟源,并且该轴处于待机状态,时钟源将自动更改为内部8MHz振荡器。
10.ID号寄存器
ID号不可修改,中间6位固定为110100,最高位和最低为都是0,读出寄存器,值固定为0x68。
实际上ID号就是I2C的地址,但是有区别的是,I2C地址可以通过AD0引脚进行配置,这里的AD号最低位是不随AD0引脚的变化而变化的。
注意
所有的寄存器上电默认值都是0x00,除了107号(电源管理寄存器1),上电默认0x40,117号寄存器(ID号),上电默认0x68。
电源管理寄存器1默认0x40,表示睡眠模式,所以在操作MPU6050之前,要先解除睡眠,否则操作其他寄存器是无效的。
参考
- 参考手册:MPU6050的产品规格和寄存器手册
网盘链接:MPU6050的产品规格和寄存器手册 提取码:qscd - 参考视频:江协科技 MPU6050简介