MPU6050
MPU6050简介
- MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角(欧拉角),常应用于平衡车、飞行器等需要检测自身姿态的场景。
欧拉角就是飞机机身相对于初始3个轴的夹角
- 飞机机头下倾或上仰,这个轴的夹角叫做俯仰,Pitch
- 飞机机身左翻滚或者右翻滚,这个轴的夹角叫做滚转,Roll
- 飞机机身保持水平,机头向左转向或者向右转向,这个轴的夹角叫做偏航,Yaw
欧拉角就表达了飞机此时的姿态,飞机是上仰还是下倾,向左倾斜还是向右倾斜,通过欧拉角都能清晰地表示出来。
- 3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度
水平的虚线是感应轴线,中间是一个具有一定质量、可以左右滑动的小滑块,然后左右各有一个弹簧顶着它,可以想象的到,如果我们把这个东西拿在手上,来回晃,中间这个小滑块就会左右移动,去压缩或拉伸两边的弹簧,当滑块移动时,就会带动上面的电位器滑动,电位器起始就是一个分压电阻, 然后我们测量电位器输出的电压,就能得到小滑块所受的加速度值了,这个加速度计,实际上就是一个弹簧测力计,根据牛顿第二定律,F=ma,我们像测量这个加速度a,就可以找一个单位质量的物体,测量它所受的力F,就行了。
在芯片中,XYZ3个轴,分别都有这样一个测力计。这里还可以这样理解,可以想象一下,这个芯片里面,有6个测力的秤,组成一个正方体,然后正方体内部,放置一个大小正好的单位质量小球,这个小球压在哪个秤面上,就会产生对应一个轴的数据输出,比如小球压Z轴方向的下面这个面,就是Z轴的正值,小球压Z轴方向的上面这个面,就是Z轴的负值。对向的两个面一组,一面为正值,一面为负值,那正方体6个面所测的力就是3个轴的加速度值。
比如你把芯片水平放在地球上,那就只有底面测力计收到小球的压力,所以此时数据输出就是XY轴输出为0,Z轴输出1个g的加速度值,,如果此时芯片正处于自由落体,那就是所有面都不受力,此时XYZ轴的数据输出都为0,如果芯片此时向左倾斜放置,那就是底面和左面都受力。
- 3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度
绕Z轴的角度,也就是偏航角,它的漂移无法通过加速度计进行修正。
加速度计、陀螺仪、磁力计,任何一种传感器都不能获得精确且稳定的欧拉角,要想获得精确且稳定的欧拉角,就必须进行数据融合,把这几种传感器的数据结合起来,综合多种传感器的数据,去长补短,这样才能获得精确且稳定的欧拉角,常见的数据融合算法,一般有互补滤波、卡尔曼滤波等。
如果在芯片里再集成一个3轴的磁场传感器,测量XYZ的磁场强度,那就叫做9轴姿态传感器,如果再集成一个气压传感器,测量气压大小,那就叫做10轴姿态传感器,一般气压值反映的是高度信息,海拔越高,气压越低,所以气压计是单独测量垂直地面的高度信息的。
6轴:3轴加速度和3轴角速度
9轴:3轴加速度、3轴角速度和3轴磁场强度
10轴:3轴加速度、3轴角速度、3轴磁场强度和1个气压强度
MPU6050参数
-
16位ADC采集传感器的模拟信号,量化范围:-32768~32767(16位有符号数,会分为两个字节进行存储),对各个模拟参量进行量化。
-
加速度计满量程选择:±2、±4、±8、±16(g 重力加速度)(16位AD值达到最大时,对应的物理量具体是多少,由满量程范围决定)
-
陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec 角速度)
满量程选的越小,测量分辨率越高。
满量程选的越大,测量范围越大。
-
可配置的数字低通滤波器(输出数据抖动太剧烈,就可以加一点低通滤波,使输出变得平缓一些)
-
可配置的时钟源
-
可配置的采样分频(时钟源通过分频器的分频,可以为AD转换和内部其他电路提供时钟,控制分频系数,就可以控制AD转换的快满了)
-
I2C从机地址:1101000(AD0=0)1101001(AD0=1)
从机地址,在程序中用16进制表示的话,一般会有两种表示方式,以1101 000为例
- 单纯把这7位二进制数转换为16进制 110 1000 -> 0x68,把0x68当作从机地址,在发送第一个字节时,要先把0x68左移1位,再按位或上读写位,读1写0
- 把0x68左移1位后的数据,当作从机地址,0x68左移1位之后,是0xD0,把0xD0当作从机地址,这种表示方式,是把读写位也融入到从机地址里了,0xD0是写地址,0xD1是读地址
硬件电路
供电逻辑
- MPU6050芯片的VDD供电是2.375~3.46V,属于3.3V供电的设备,不能直接接5V,所以为了扩大供电的范围,就加了个3.3V的稳压器,输入端电压VCC_5V可以在3.3V到5V之间,然后经过3.3V的稳压器,输出稳定的3.3V电压,给芯片端供电。
- 只要3.3V有电,电源指示灯就会亮起。
引脚 | 功能 |
---|---|
VCC、GND | 电源 |
SCL、SDA | I2C通信引脚 |
XCL、XDA | 主机I2C通信引脚 |
AD0 | 从机地址最低位 |
INT | 中断信号输出 |
引脚定义
- SCL和SDA,模块已经内置了两个4.7K的上拉电阻,所以直接把SCL和SDA接在GPIO口即可,不需要额外接上拉电阻。
- XCL和XDA,对模块进行扩展,通常用于外接磁力计或者气压计,MPU6050的主机接口可以直接访问这些扩展芯片的数据,把这些扩展芯片的数据读取到MPU6050里面,在MPU6050中有DMP单元,进行数据融合和姿态解算。
- AD0 从机地址最低位 (内置了一个下拉电阻,默认弱下拉到低电平)
- 接低电平 7位从机地址就是 1101000 (引脚悬空的话就是电平)
- 接高电平 7位从机地址就是 1101001 (可以将AD0直接引到VCC,强上拉至高电平)
- INT 可以配置芯片内部的一些事件,来触发中断引脚的输出,比如数据准备完毕,I2C主机错误等。
内部框图
- 经过ADC转换完成后,这些传感器的数据统一都放到数据寄存器中,我们读取数据寄存器就能得到传感器测量的值了,MPU6050内部的转换,都是全自动进行的。
- 自测单元,用于检测芯片好坏。
- 电荷泵,需要外接一个电容,升压电路。
- Interrupt Status Register 中断状态寄存器。
- FIFO 先入先出寄存器,可以对数据流进行缓存。
- Config Registers 配置寄存器,可以对内部的各个电路进行配置。
- Sensor Registers 传感器寄存器,也就是数据寄存器,存储了各个传感器的数据。
- Digital Motion Processor(DMP)数字运动处理器,是芯片内部自带的一个姿态解算的硬件算法,配合官方的DMP库可以进行姿态解算。
- FSYNC 帧同步。
- Serial Interface Bypass Mux 接口旁路选择器,就是一个开关
- 如果拨到上面,辅助的I2C引脚就和正常的I2C引脚接在一起,这样两路总线就合在一起了,STM32可以控制所有设备
- 如果拨到下面,辅助的I2C引脚就由MPU6050控制,两条I2C总线独立分开,STM32控制MPU6050,MPU6050控制扩展设备