1.MPU6050简介
- MPU6050是一个6轴姿态传感器可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
- 3轴加速度计(Accelerometer:测量X、Y、Z轴的加速度
- 3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度
在XZ轴,这个芯片内部都分别布置了一个加速度计,中间图为加速度计的结构图,其中水平的这个虚线是感应轴线,中间是一个具有一定质量、可以左右滑动的小滑块,然后左右各有一个弹簧顶着它,中间这个小滑块就会左右移动,去压缩或拉伸两边的弹簧,当滑块移动时,就会带动上面的电位器滑动,当滑块移动时,就会带动上面的电位器滑动,这个电位器其实就是一个分压电阻,然后我们测量电位器输出的电压,就能得到小滑块所受的加速度值了
这个加速度计,实际上就是一个弹簧测力计,根据牛顿第二定律,F=ma,我们想测量这个加速度a,就可以找一个单位质量的物体,测量它所受的力F,就行了
加速度计具有静态稳定性,不具有动态稳定性
这就是陀螺仪的机械模型,中间是一个有一定质量的旋转轮,外面是3个轴的平环,当中间这个旋转轮高速旋转时,根据角动量守恒的原理,这个旋转轮具有保持它原有角动量的趋势,这个趋势可以保持旋转轴方向不变,当你外部物体的方向转动时,内部的旋转轴方向并不会转动,这就会在平衡环连接处产生角度偏差,如果我们在连接处放一个旋转的电位器,测量电位器的电压,就能得到旋转的角度了,陀螺仪具有动态稳定性,不具有静态稳定性
2.MPU6050参数
- 16位ADC采集传感器的模拟信号,量化范围:-32768~32767
- 加速度计满量程选择:+2、±4、±8、±16(g)
- 陀螺仪满量程选择:±250、+500、±1000、+2000(°/sec)
- 可配置的数字低通滤波器
- 可配置的时钟源
- 可配置的采样分频
- 12C从机地址:1101000 (AD0=0) 0x68<<1 或 0xD0 写
- 1101001 (AD0=1)
所以你之后看到有地方说0xD0是MPU6050的从机地址,那它就是融入了读写位的从机地址
如果你看到有地方说0x68是MPU6050的从机地址,这种方式就是直接把7位地址转换十六进制得到的,在实际发送第一个字节时,不要忘了先左移1位,再或上读写位
3.硬件电路
右边这个MPU6050的芯片,芯片本身引脚非常多,包括时钟、12C通信引脚、供电、帧同步等等,不过这里有很多引脚我们都用不到,还有一些引脚,是这个芯片最小系统里的固定连接
然后看左下角,引出来的引脚,有VCC和GND,这两个引脚是电源供电,然后SCL和SDA,这两个引脚是12C通信的引脚,右图可以看到SCL和SDA,模块已经内置了两个4.7K的上拉电阻了,所以我们在接线的时候,直接把SCL和SDA接在GPIO口就行了,不需要再在外面另外接上拉电阻了,接着下面,还有XCL和XDA,这两个是芯片里面的主机12C通信引脚,设计这两个引脚是为了扩展芯片功能,
之前我们说过,MPU6050是一个6轴姿态传感器,但是只有加速度计和陀螺仪的6个轴,融合出来的姿态角是有缺陷的,这个缺陷就是绕Z轴的角度,也就是偏航角,它的漂移无法通过加速度计进行纠正,这就像是让你坐在车里,不看任何窗户,然后让你辨别当前车子的行驶方向,短时间内,你可以通过陀螺仪得知方向的变化,从而确定变化后的行驶方向,但是时间一长,车子到处转弯,你没有稳定的参考了,就肯定会迷失方向,所以这时候,你就要带个指南针在身边,提供长时间的稳定偏航角进行参考,来对陀螺仪感知的方向进行纠正,这就是9轴姿态传感器多出的磁力计的作用,
XCL和XDA,通常就是用于外接磁力计或者气压计,当接上磁力计或气压计之后,MPU6050的主机接口可以直接访问这些扩展芯片的数据,把这些扩展芯片的数据读取到MPU6050里面,在MPU6050里面会有DMP单元,进行数据融合和姿态解算,当然,如果你不需要MPU6050的解算功能的话,也可以把这个磁力计或者气压计直接挂载在SCL和SDA这条总线上,因为12C本来就可以挂载多设备,这就是XCL和XDA的用途
AD0引脚,它是从机地址的最低位,接低电平的话,7位从机地址就是1101000,接高电平的话,7位从机地址就是1101001,这里电路中,有一个电阻,默认弱下拉到候电平了所以引脚悬空的话,就是低电平,如果想接高电平,可以把AD0直接引到VCC,强上拉至高电平
INT中断信号输出,可以配置芯片内部的一些事件,来触发中断引脚的输出,比如数据准备好了、12C主机错误等,另外芯片内部还内置了一些实用的小功能,比如自由落体检测、运动检测、零运动检测等,这些信号都可以触发INT引脚产生电平跳变,需要的话可以进行中断信号的配置
然后看一下左上角的这个LDO,这部分是供电的逻辑,这个MPU6050芯片的VDD供电是2.375-3.46V,属于是3.3V供电的设备,不能直接接5V,所以为了扩大供电范围,这个模块的设计者就加了个3.3V的稳压器,输入端电压VCC 5V可以在3.3V型5V之间,然后经过3.3V的稳压器,输出稳定的3.3V电压,给芯片端供电,后面是电源指示灯,只要3.3V端有电,电源指示灯就会亮,所以这一块需不需要,可以根据你的项目要求来
4.MPU6050框图
左上角的是时钟系统,有时钟输入脚和输出脚,不过我们般使用内部时钟,
然后,下面这些灰色的部分,就是芯片内部的传感器,其中包括XZ轴的加速度计,X轴的陀螺仪,另外这个芯片还内置了一个温度传感器,你要是想用它来测量温度,也是没问题的,那这么多传感器,本质上也都相当于可变电阻,通过分压后,输出模拟电压,然后通过ADC,进行模数转换,转换完成之后,这些传感器的数据统 都放到数据寄存器中,我们读取数据寄存器就能得到传感器测量的值了
这个芯片内部的转换,都是全自动进行的,就类似我们之前学的AD连续转换+DMA转运,每个ADC输出,对应16位的数据寄存器,不存在数据覆盖的问题,我们配置好转换频率之后,每个数据就自动以我们设置的频率刷新到数据寄存器,我们需要数据的时候,直接来读就行了,其他的都不用管
接着,这每个传感器都有个自测单元(左侧部分),这部分是用来验证芯片好坏的,当启动自测后,芯片内部会模拟一个外力施加在传感器上,这个外力导致传感器数据会比平时大一些,那如何进行自测呢,我们可以先使能自测,读取数据,再失能自测,读取数据,两个数据一相滅,得到的数据叫自测响应,这个自测响应,芯片手册里给出了一个范围,如果自测响应在这个范围内,就说明芯片没问题,如果不在,就说明芯片可能坏了,使用的话就要小心点,这个是自测的功能
然后下面这个东西,是电荷泵,或者叫充电泵,CPOUT引脚需要外接一个电容,什么样的电容,这个在手册里有说明,电荷泵是一种升压电路,在其他电路也有出现过,比如我们用的这个OLED屏幕里面就有电荷泵进行升压
升压原理:比如我有个电池,电压是5V,然后我再来个电容,首先电池和电容并联,电池给电容充电,充满之后,电容是不是也相当于一个5V的电池了 ,然后我再修改电路的接法,把电池和电容串联起来,电池5V,电容也是5V,这样输出就是10V的电压了,是不是凭空就把电池电压升高至两倍了啊,不过由于这个电容电荷比较少,用一下就不行了,所以这个并联、串联的切换速度要快,趁电容还没放电完,就要及时并联充电,这样 直持续,并联充电,串联放电,并联充电,联放电,然后后续再加个电源滤波,就能进行平稳的升压了,这就是电荷泵的升压原理
由于陀螺仪内部是需要一个高电压支持的,所以这里设计了一个电荷泵进行升压,当然这个升压过程是自动的,不需要我们管
右边一大块,就是寄存器和通信接口部分了,
- 中断状态寄存器,可以控制内部的哪些事件到中断引脚的输出,
- FIFO,是先入先出寄存器,可以对数据流进行缓存,
- 配置寄存器,可以对内部的各个电路进行配置,
- 传感器寄存器,也就是数据寄存器,存储了各个传感器的数据,
- 工厂校准,这个意思就是内部的传感器都进行了校准
然后右边这个数字运动处理器,简称DMP,是芯片内部自带的一个姿态解算的硬件算法,配合官方的DMP库,可以进行姿态解算,因为姿态解算还是比较难的,而且算法也很复杂,所以如果使用了内部的DMP进行姿态解算,姿态解算就会方便一些
这个FSYNC,是帧同步,我们用不到
最后上面这块,就是通信接口部分了,上面一部分就是从机的12C和SPI通信接口,用于和STM32通信,下面这一部分是主机的12C通信接口,用于和MPU6050扩展的设备进行通信,这里有个接口旁路选择器,就是一个开关,如果拨到上面,辅助的12C引脚就和I常的12C引脚接到一起,这样两路总线就合在一起了,STM32可以控制所有设备,如果拨到下面,辅助的I2C引脚就由MPU6050控制,两条12C总线独立分开,这时STM32是MPU6050的大哥,MPU6050又是扩展设备的大哥
然后最后,下面这里是供电的部分