【自学嵌入式:stm32单片机】MPU6050

MPU6050

MPU6050简介

  • MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
  • 3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度
  • 3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度

image

MPU6050参数

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

  • 加速度计满量程选择:±2、±4、±8、±16(g,重力加速度)

  • 陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec,每秒旋转了多少度)

  • 可配置的数字低通滤波器

  • 可配置的时钟源

  • 可配置的采样分频

  • I2C从机地址:1101000(AD0=0),1101001(AD0=1)

硬件电路

image

引脚 功能
VCC、GND 电源
SCL、SDA I2C通信引脚
XCL、XDA 主机I2C通信引脚
AD0 从机地址最低位
INT 中断信号输出

AD0引脚是从机地址的最低位

MPU6050框图

时钟和传感器

image
左上角是时钟系统,有时钟输入脚CLKIN和时钟输出脚CLKOUT,我们一般使用内部时钟,在刚才的硬件电路中,CLKIN直接接GND,CLKOUT没有引出,灰色的部分就是芯片内部的传感器,其中包括XYZ轴的加速度计,XYZ轴的陀螺仪,另外这个芯片还内置了一个温度传感器,这么多传感器,本质上相当于一个可变电阻,经过ADC模数转换,转换完成之后,这些传感器的数统一都放到数据寄存器中,我们读取数据寄存器就能得到传感器测量的值了,这个芯片内部的转换,都是全自动进行的,就类似我门之前学的AD连续转换+DMA转运,每个ADC输出,对应16位的数据寄存器,不存在数据覆盖的问题,我们配置好转换频率之后,每个数据就自动以我们设置的频率刷新到数据寄存器,我们需要数据的时候,直接来读就行了
image

传感器的自测单元

如上图,每个传感器都有自测单元,这部分是用来验证芯片好坏的,当启动自测后,芯片内部会模拟一个外力施加在传感器上,这个外力导致传感器数据会比平时大一些,如要自测,先使能自测,读出数据,再使能自测,读取数据,两个数据一相减,得到的数据叫自测相应,这个自测响应在芯片手册中给了一个范围,如果一个自测响应在这个范围内说明没问题,如果不在,就说明芯片可能坏了,使用的话就要小心点。
image

电荷泵

如上图,这个是电荷泵,或者叫充电泵,CPOUT引脚需要外接一个电容,电容在芯片手册中有说明,电荷泵是一种升压电路,OLED屏幕也是。
image
如上图,通过快速切换电源和电容的串并联(电容不断充放电),实现升压,然后再加一个电源滤波,就能进行平稳地升压,这就是电荷泵的升压原理。

在这里,由于陀螺仪内部是需要一个高电压支持的,所以设计了一个电荷泵进行升压,这个升压过程是自动的,不需要我们操作。
image

寄存器和通信接口

如上图,右边这一大部分就是寄存器和通信接口部分了,中断状态寄存器(Interrupt Status Register),可以控制内部的哪些事件到中断引脚的输出;

先入先出寄存器(FIFO),可以对数据流进行缓存。

配置寄存器(Config Registers),可以对内部的各个电路进行配置。

传感器寄存器(Sensor Register),也就是数据寄存器,存储了各个传感器的数据。

工厂校准(Factory Calibration),这个意思就是内部的传感器都进行了校准

数字运动处理器(Digital Motion Processor,简称DMP)是芯片内部自带的一个姿态解算的硬件算法,配合官方的DMP库,可以进行姿态解算

帧同步(FSYNC),暂时用不到。

image
image

如上图,上面是通信接口部分,就是从机的I2C和SPI通信接口,用于和STM32通信。
image

如上图,是主机的I2通信接口,用于和MPU6050扩展的设备进行通信。

Serial Interface Bypass Mux是接口旁路选择器,就是一个开关,如果拨到上面,辅助的I2C引脚就和正常的I2C引脚接到一起,这样两路总线就合在一起了,STM32在此时可以控制所有设备,STM32就是“大哥”,MPU6050和这个扩展设备都是STM32的“小弟”;如果拨到下面,辅助的I2C引脚就由MPU6050控制,两条I2C总线独立分开,这时STM32是MPU6050的“大哥”,MPU6050又是扩展设备的大哥。

image

如上图,这里是供电的部分

这个芯片的I2C频率最大可达400KHz,如果发射的I2C通信信号超过这个频率,那这个芯片可能因为跟不上信号而无法通信

常用寄存器

image
采样频率分频器SMPLRT_DIV
配置寄存器CONFIG
陀螺仪配置寄存器GYRO_CONFIG
加速度计配置寄存器ACCEL_CONFIG
下面这一大块是数据寄存器
image
下面是加速度计XYZ轴的数据:
image
下面是温度传感器的数据:
image
下面是陀螺仪XYZ轴的数据:
image

上面这些寄存器,_L表示低8位,_H表示高8位

最后是:
image
电源管理寄存器PWR_MGMT_1,PWR_MGMT_2
器件ID号寄存器WHO_AM_I

采样频率分频器SMPRT_DIV

image
这个寄存器可以配置采样频率的分频系数,简单来说就是,分频越小,内部的AD转换就越快,数据寄存器刷新就越快,反之就越慢,采样频率公式:
Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV)
Sample Rate是采样频率,Gyroscope Output Rate是陀螺仪输出时钟频率(这里是以陀螺仪时钟为例子,也可以用外部时钟),SMPLRT_DIV是采样分频
不使用低通滤波器时,陀螺仪时钟为8KHz,使用滤波器,时钟就是1KHz

配置寄存器CONFIG

image
配置寄存器内部有两部分,EXT_SYNC_SET是外部同步设置,DLPF_CFG是低通滤波器配置。
image

上图表种是低通滤波器的参数,这个低通滤波器可以让输出数据更加平滑,配置滤波器参数越大,输出数据抖动就越小,0是不使用低通滤波器,陀螺仪时钟为8KHz,之后使用了低通滤波器,陀螺仪时钟就是1KHz,最后一行参数7是保留位,没有用到。

陀螺仪配置寄存器GYRO_CONFIG

image

该寄存器高3位XG-ST,YG_ST,ZG_ST是XYZ轴的自测使能位,中间2位FS_SEL是满量程选择位,后面3位没用到
自测公式:
Self-test response(自测响应) = Sensor output with self-test enabled(自测使能时的数据) – Sensor output without self test enabled(自测失能时的数据)

上电后先使能自测,读取数据,再失能自测,读取数据,两者相减,得到自测响应。
在另一个讲电气特性的手册里找到自测响应的范围
image

如果在这个范围里,芯片就通过了自检,之后正常使用即可。
然后是满量程选择FS_SEL,如下图中的表格:
image

量程越大,分辨率越小,量程越小,分辨率越高

加速度计配置寄存器ACCEL_CONFIG

image
高3位XA_ST,YA_ST,ZA_ST是自测使能位,中间2位AFS_SEL是满量程选择,低3位ACCEL_HPF是配置高通滤波器。

加速度计数据寄存器

image
这些寄存器只读,想要读取对应轴的加速度,就需要读取这些寄存器的值,其中:
image
这些是二进制的有符号数,以二进制补码的方式存储,我们读出高8位和低8位,高位左移8次,或上低位数据,最后再存在一个int16_t的变量里。

温度传感器

image

陀螺仪数据

image

温度传感器和陀螺仪数据寄存器都是只读的,都是用和上面读数据一样的方法读数据

电源管理寄存器1

image
高1位BIT7,DEVICE_RESET设备复位,这一位写1,所有寄存器都恢复到默认值
BIT6,SLEEP睡眠模式,这一位写1,芯片睡眠,芯片不工作,进入低功耗
BIT5,CYCLE,这一位写1,设备进入低功耗,过一段时间,启动一次,并且唤醒的频率由电源管理寄存器2的高2位LP_WAKE_CTRL决定,这个模式比较省电
image
BIT3,TEMP_DIS温度传感器失能,写1之后,禁用内部的温度传感器
最后3位CLKSEL,用来选择系统时钟来源,如下表:
image
这个图中的表分别是1是内部晶振,2-3是XYZ轴陀螺仪晶振,4和5是外部引脚的两个方波,一般我们选择内部晶振或者陀螺仪晶振,手册推荐选择陀螺仪晶振,因为陀螺仪的晶振更加精确。

电源管理寄存器2

image
BIT5-BIT0可以分别控制6个轴进入待机模式,如果只需要部分轴的数据,可以让其他轴待机,这一比较省电

ID号寄存器

image
此寄存器是只读寄存器,ID号不可修改,ID号中间这6位(BIT5-BIT1),固定为110100,实际上这个ID号就是I2C通信的地址,它的最高位和最低为,其实都是0,那读出这个寄存器,值就固定为0x68,AD0引脚的值,并不反映在这个寄存器上,这个I2C地址,可以通过AD0引脚进行配置,但是,这里的ID号的最低位,是不随AD0引脚变化而变化的,读出ID号,始终都是0x68,当然这个ID号也不是非要和I2C地址一样,只是它这样设计了而已。

【注】一般来说,所有的寄存器,上电默认值都是0x00,只有下面这两个寄存器上电后不是默认0x00:
image
117号寄存器就是ID号寄存器,默认0x68,107号寄存器是电源管理寄存器1,默认0x40,也就是次高位为1,次高位是SLEEP,所以这个芯片上电默认就是睡眠模式,在操作这个芯片之前,要先记得解除睡眠,否则操作其他寄存器是无效的。

posted @ 2025-08-21 18:23  秦瑞迁  阅读(105)  评论(0)    收藏  举报