零基础制作两轮自平衡小车


layout: wiki

title: 传感器数据采集实验

作者:Songyimiao

本章,我们介绍当下最流行的一款六轴(三轴加速度 +三轴角速度(陀螺仪))传感器: MPU-6050,该传感器广泛用于四轴飞行器、平衡小车和空中鼠标等设计,具有非常广泛的应用范围。MWbalancedSTC15两轮自平衡小车自带了MPU-6050传感器。本章我们将使用STC15来驱动MPU-6050,读取其原始数据,并结合虚拟示波器Serial Digital Scope显示波形,教大家如何使用这款功能强大的六轴传感器。

MPU-6050基础介绍

MPU-6050是InvenSense公司推出的全球首款整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了安装空间。

MPU-6050内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个第二 IIC 接口,可用于连接外部磁力传感器,并利用自带的数字运动处理器(DMP: Digital Motion Processor)硬件加速引擎,通过主IIC接口,向应用端输出完整的9轴融合演算数据。有了DMP,我们可以使用 InvenSense 公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度。

MPU6050 的特点包括:

  • ① 以数字形式输出 6 轴或 9 轴(需外接磁传感器)的旋转矩阵、四元数(quaternion)、欧 拉角格式(Euler Angle forma)的融合演算数据(需 DMP 支持)
  • ② 具有 131 LSBs/° /sec 敏感度与全格感测范围为± 250、± 500、± 1000 与± 2000° /sec 的 3 轴角速度感测器(陀螺仪)
  • ③ 集成可程序控制,范围为± 2g、± 4g、± 8g 和± 16g 的 3 轴加速度传感器
  • ④ 移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移
  • ⑤ 自带数字运动处理(DMP: Digital Motion Processing)引擎可减少 MCU 复杂的融合演算 数据、感测器同步化、姿势感应等的负荷
  • ⑥ 内建运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求
  • ⑦ 自带一个数字温度传感器
  • ⑧ 带数字输入同步引脚(Sync pin)支持视频电子影相稳定技术与 GPS
  • ⑨ 可程序控制的中断(interrupt),支持姿势识别、摇摄、画面放大缩小、滚动、快速下降 中断、 high-G 中断、零动作感应、触击感应、摇动感应功能
  • ⑩ VDD 供电电压为 2.5V± 5%、 3.0V± 5%、 3.3V± 5%; VLOGIC 可低至 1.8V± 5%
  • ⑪ 陀螺仪工作电流: 5mA,陀螺仪待机电流: 5uA;加速器工作电流: 500uA,加速器省 电模式电流: 40uA@10Hz
  • ⑫ 自带 1024 字节 FIFO,有助于降低系统功耗
  • ⑬ 高达 400Khz 的 IIC 通信接口
  • ⑭ 超小封装尺寸: 4x4x0.9mm( QFN)

MPU6050 传感器的检测轴如图所示:

MPU6050 的内部框图如图所示:

其中, SCL和 SDA 是连接 MCU 的 IIC 接口, MCU 通过这个 IIC 接口来控制 MPU-6050, 另外还有一个 IIC 接口: AUX_CL 和 AUX_DA,这个接口可用来连接外部从设备,比如磁传感 器,这样就可以组成一个九轴传感器。 VLOGIC 是 IO 口电压,该引脚最低可以到 1.8V,我们 一般直接接 VDD 即可。 AD0 是从 IIC 接口(接 MCU)的地址控制引脚,该引脚控制 IIC 地址 的最低位。如果接 GND,则 MPU6050 的 IIC 地址是: 0X68,如果接 VDD,则是 0X69,注意: 这里的地址是不包含数据传输的最低位的(最低位用来表示读写)!! 在MWbalancedSTC15上, AD0 是接 GND 的,所以 MPU6050 的 IIC 地址是 0X68(不 含最低位)。

1) 初始化 IIC 接口

MPU-6050 采用 IIC 与 STC15 通信,所以我们需要先初始化与 MPU6050 连接的 SDA 和 SCL 数据线。不了解IIC的同学点击这里学习:传送门。

2)复位 MPU-6050

这一步让 MPU-6050 内部所有寄存器恢复默认值,通过对电源管理寄存器 1( 0X6B)的 bit7 写 1 实现。 复位后, 电源管理寄存器 1 恢复默认值(0X40),然后必须设置该寄存器为 0X00, 以唤醒 MPU6050,进入正常工作状态。

3)设置角速度传感器(陀螺仪)和加速度传感器的满量程范围

这一步,我们设置两个传感器的满量程范围(FSR),分别通过陀螺仪配置寄存器( 0X1B) 和加速度传感器配置寄存器( 0X1C)设置。我们一般设置陀螺仪的满量程范围为± 2000dps, 加速度传感器的满量程范围为± 2g。

4)设置其他参数

这里,我们还需要配置的参数有:关闭中断、关闭 AUX IIC 接口、禁止 FIFO、设置陀螺 仪采样率和设置数字低通滤波器( DLPF)等。本章我们不用中断方式读取数据,所以关闭中断, 然后也没用到 AUX IIC 接口外接其他传感器,所以也关闭这个接口。分别通过中断使能寄存器 ( 0X38)和用户控制寄存器( 0X6A)控制。 MPU-6050 可以使用 FIFO 存储传感器数据,不过 本章我们没有用到,所以关闭所有 FIFO 通道,这个通过 FIFO 使能寄存器( 0X23)控制,默 认都是 0(即禁止 FIFO),所以用默认值就可以了。陀螺仪采样率通过采样率分频寄存器( 0X19) 控制,这个采样率我们一般设置为 50 即可。数字低通滤波器(DLPF)则通过配置寄存器( 0X1A) 设置,一般设置 DLPF 为带宽的 1/2 即可。

5)配置系统时钟源并使能角速度传感器和加速度传感器

系统时钟源同样是通过电源管理寄存器 1( 0X1B)来设置,该寄存器的最低三位用于设置 系统时钟源选择,默认值是 0(内部 8M RC 震荡),不过我们一般设置为 1,选择 x 轴陀螺 PLL 作为时钟源,以获得更高精度的时钟。同时,使能角速度传感器和加速度传感器,这两个操作 通过电源管理寄存器 2( 0X6C)来设置,设置对应位为 0 即可开启。

至此, MPU6050 的初始化就完成了,可以正常工作了(其他未设置的寄存器全部采用默认 值即可),接下来,我们就可以读取相关寄存器,得到加速度传感器、角速度传感器和温度传感 器的数据了。不过,我们先简单介绍几个重要的寄存器。

首先,我们介绍电源管理寄存器 1,该寄存器地址为 0X6B,各位描述如图所示:

其中, DEVICE_RESET 位用来控制复位,设置为 1,复位 MPU6050,复位结束后, MPU 硬件自动清零该位。 SLEEEP 位用于控制 MPU6050 的工作模式,复位后,该位为 1,即进入了 睡眠模式(低功耗),所以我们要清零该位,以进入正常工作模式。 TEMP_DIS 用于设置是否 使能温度传感器,设置为 0,则使能。最后 CLKSEL[2:0]用于选择系统时钟源,选择关系如表 所示:

默认是使用内部 8M RC 晶振的,精度不高,所以我们一般选择 X/Y/Z 轴陀螺作为参考的 PLL 作为时钟源,一般设置 CLKSEL=001 即可。

接着,我们看陀螺仪配置寄存器,该寄存器地址为: 0X1B,各位描述如图所示:

该寄存器我们只关心 FS_SEL[1:0]这两个位,用于设置陀螺仪的满量程范围: 0,± 250° /S; 1,± 500° /S; 2,± 1000° /S; 3,± 2000° /S;我们一般设置为 3,即± 2000° /S,因为陀螺 仪的 ADC 为 16 位分辨率,所以得到灵敏度为: 65536/4000=16.4LSB/(° /S)。 接下来,我们看加速度传感器配置寄存器,寄存器地址为: 0X1C,各位描述如图所示:

该寄存器我们只关心 AFS_SEL[1:0]这两个位,用于设置加速度传感器的满量程范围: 0, ± 2g; 1,± 4g; 2,± 8g; 3,± 16g;我们一般设置为 0,即± 2g,因为加速度传感器的 ADC 也是 16 位,所以得到灵敏度为: 65536/4=16384LSB/g。

接下来,我看看 FIFO 使能寄存器,寄存器地址为: 0X1C,各位描述如图所示:

该寄存器用于控制 FIFO 使能,在简单读取传感器数据的时候,可以不用 FIFO,设置对应 位为 0 即可禁止 FIFO,设置为 1,则使能 FIFO。注意加速度传感器的 3 个轴,全由 1 个位 ( ACCEL_FIFO_EN)控制,只要该位置 1,则加速度传感器的三个通道都开启 FIFO 了。 接下来,我们看陀螺仪采样率分频寄存器,寄存器地址为: 0X19,各位描述如图所示:

该寄存器用于设置 MPU6050 的陀螺仪采样频率,计算公式为:

采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)

这里陀螺仪的输出频率,是 1Khz 或者 8Khz,与数字低通滤波器( DLPF)的设置有关, 当 DLPF_CFG=0/7 的时候,频率为 8Khz,其他情况是 1Khz。而且 DLPF 滤波频率一般设置为 采样率的一半。采样率,我们假定设置为 50Hz,那么 SMPLRT_DIV=1000/50-1=19。 接下来,我们看配置寄存器,寄存器地址为: 0X1A,各位描述如图所示:

这里,我们主要关心数字低通滤波器( DLPF)的设置位,即: DLPF_CFG[2:0],加速度计 和陀螺仪,都是根据这三个位的配置进行过滤的。 DLPF_CFG 不同配置对应的过滤情况如表所示:

这里的加速度传感器,输出速率( Fs)固定是 1Khz,而角速度传感器的输出速率( Fs), 则根据 DLPF_CFG 的配置有所不同。一般我们设置角速度传感器的带宽为其采样率的一半,如 前面所说的,如果设置采样率为 50Hz,那么带宽就应该设置为 25Hz,取近似值 20Hz,就应该 设置 DLPF_CFG=100。

接下来,我们看电源管理寄存器 2,寄存器地址为: 0X6C,各位描述如图所示:

该寄存器的 LP_WAKE_CTRL 用于控制低功耗时的唤醒频率,本章用不到。剩下的 6 位, 分别控制加速度和陀螺仪的 x/y/z 轴是否进入待机模式,这里我们全部都不进入待机模式,所以 全部设置为 0 即可。

接下来,我们看看陀螺仪数据输出寄存器,总共有 6 个寄存器组成,地址为: 0X43~0X48, 通过读取这 6 个寄存器,就可以读到陀螺仪 x/y/z 轴的值,比如 x 轴的数据,可以通过读取 0X43 (高 8 位)和 0X44(低 8 位)寄存器得到,其他轴以此类推。

同样,加速度传感器数据输出寄存器,也有 8 个,地址为: 0X3B~0X40,通过读取这 8 个 寄存器,就可以读到加速度传感器 x/y/z 轴的值,比如读 x 轴的数据,可以通过读取 0X3B(高 8 位)和 0X3C(低 8 位)寄存器得到,其他轴以此类推。

最后,温度传感器的值,可以通过读取 0X41(高 8 位)和 0X42(低 8 位)寄存器得到, 温度换算公式为:

Temperature = 36.53 + regval/340

其中, Temperature 为计算得到的温度值,单位为℃, regval 为从 0X41 和 0X42 读到的温度 传感器值。

关于 MPU6050 的基础介绍,我们就介绍到这。

对上咱们的代码:

依次初始化,就这么简单。

我们可以将传感器的数值发送到上位机方便查看,这里我们用虚拟示波器Serial Digital Scope。

不知道怎么用虚拟示波器Serial Digital Scope,点这里:传送门