《⼿把⼿教你学STM32》—MPU6050六轴传感器实验 预备知识(基于STM32开发板(正点原⼦))
1、MPU6050简介
1.1、MPU6050简介-什么是MPU6050?
MPU6050是InvenSense公司推出的全球⾸款整合性6轴运动处理组件,内带3轴陀螺仪和3轴加速度传感器,并且含有⼀个第 ⼆IIC接⼝,可⽤于连接外部磁⼒传感器,利⽤⾃带数字运动处理器(DMP: Digital Motion Processor)硬件加速引擎,通过主IIC接⼝,可以向应⽤端输出完整的9轴姿态融合演算数据。
有了DMP,我们可以使⽤InvenSense公司提供的运动处理资料库,⾮常⽅便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时⼤⼤降低了开发难度。
1.2、MPU6050简介-MPU6050的特点
①⾃带数字运动处理( DMP: Digital Motion Processing ),可以输出6轴或9轴(需外接磁传感器)姿态解算数据。
②集成可程序控制,测量范围为±250、±500、±1000与±2000°/sec 的3轴⾓速度感测器(陀螺仪)
③集成可程序控制,范围为±2g、±4g、±8g和±16g的3轴加速度传感器
④⾃带数字温度传感器
⑤可输出中断(interrupt),⽀持姿势识别、摇摄、画⾯放⼤缩⼩、滚动、快速下降中断、high-G中断、零动作感应、触击感应、摇动感应功能排石床
⑥⾃带1024字节FIFO,有助于降低系统功耗
⑦⾼达400Khz的IIC通信接⼝
⑧超⼩封装尺⼨:4x4x0.9mm(QFN)
1.3、MPU6050简介-MPU6050框图
AD0=0->地址=0X68
AD0=1->地址=0X69(F4板⼦上已经设置到AD0=0) 1.4、MPU6050简介-MPU6050初始化(后⾯再继续粘贴程序)
①初始化IIC接⼝。
②复位MPU6050。由电源管理寄存器1(0X6B)控制。 ③设置⾓速度传感器和加速度传感器的满量程范围。由陀螺仪配置寄存器(0X1B)和加速度传感器配置寄存器(0X1C)设置。
④设置其他参数。配置中断,由中断使能寄存器(0X38)控制;设置AUX IIC接⼝,由户控制寄存器(0X6A)控制;设置FIFO,
接线排由FIFO使能寄存器(0X23)控制;陀螺仪采样率,由采样率分频寄存器(0X19)控制;设置数字低通滤波器,由配置寄存器(0X1A)控制。
⑤设置系统时钟。由电源管理寄存器1(0X6B)控制。⼀般选择x轴陀螺PLL作为时钟源,以获得更⾼精度的时钟。
⑥使能⾓速度传感器(陀螺仪)和加速度传感器。由电源管理寄存器2(0X6C)控制
1.5、MPU6050简介-寄存器介绍
电源管理寄存器1(0X6B)
DEVICE_RESE=1,复位MPU6050,复位完成后,⾃动清零。
SLEEP=1,进⼊睡眠模式;SLEEP=0,正常⼯作模式。
TEMP_DIS,⽤于设置是否使能温度传感器,设置为0,则使能
CLKSEL[2:0],⽤于选择系统时钟源,如右表所⽰:
CLKSEL[2:0]时钟源
000内部8M RC晶振
001PLL,使⽤X轴陀螺作为参考
010PLL,使⽤Y轴陀螺作为参考
011PLL,使⽤Z轴陀螺作为参考
100PLL,使⽤外部32.768Khz作为参考
101PLL,使⽤外部19.2Mhz作为参考
110保留
111关闭时钟,保持时序产⽣电路复位状态
陀螺仪配置寄存器(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使能寄存器(0X23)
该寄存器⽤于控制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[2:0]加速度传感器
Fs=1Khz
⾓速度传感器
(陀螺仪)
带宽(Hz)延迟(ms)带宽(Hz)延迟(ms)Fs(Khz)
00026002560.988
001184 2.0188 1.91焙烧炉
01094 3.098 2.81
01144 4.942 4.81
100218.5208.31
1011013.81013.41
110519.0518.61
111保留保留8电源管理寄存器2(0X6C)
该寄存器的LP_WAKE_CTRL⽤于控制低功耗时的唤醒频率,本例程⽤不到。剩下的6位,分别控制加速度和陀螺仪的x/y/z轴是否进⼊待机模式,这⾥我们全部都不进⼊待机模式,所以全部设置为:0 ,即可。
加速度传感器数据输出寄存器(0X3B~0X40)
加速度传感器数据输出寄存器总共由6个寄存器组成,输出X/Y/Z三个轴的加速度传感器值,⾼字节在前,低字节在后。
陀螺仪数据输出寄存器(0X43~0X48)
陀螺仪数据输出寄存器总共由6个寄存器组成,输出X/Y/Z三个轴的陀螺仪传感器数据,⾼字节在前,低字节在后。
温度传感器数据输出寄存器(0X41~0X42)
通过读取0X41(⾼8位)和0X42(低8位)寄存器得到,温度换算公式为:
Temperature = 36.53 + regval/340
其中,Temperature为计算得到的温度值,单位为℃,regval为从0X41和0X42读到的温度传感器值。
相关程序
硬件连接STM32F4
1. 初始化MPU6050
//初始化MPU6050
//返回值:0,成功
// 其他,错误代码
u8 MPU_Init(void)
全自动电脑针织机{
u8 res;
IIC_Init();//初始化IIC总线
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位MPU6050
delay_ms(100);
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //唤醒MPU6050
MPU_Set_Gyro_Fsr(3); //陀螺仪传感器,±2000dps
MPU_Set_Accel_Fsr(0); //加速度传感器,±2g
MPU_Set_Rate(50); //设置采样率50Hz
MPU_Write_Byte(MPU_INT_EN_REG,0X00); //关闭所有中断
MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭
MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //关闭FIFO
MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT引脚低电平有效
res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
if(res==MPU_ADDR)//器件ID正确
{
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); //设置CLKSEL,PLL X轴为参考
MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //加速度与陀螺仪都⼯作
MPU_Set_Rate(50); //设置采样率为50Hz
}else return 1;
return 0;
}
2.设置MPU6050陀螺仪传感器满量程范围
//设置MPU6050陀螺仪传感器满量程范围
//fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
//返回值:0,设置成功
// 其他,设置失败
u8 MPU_Set_Gyro_Fsr(u8 fsr)
{
return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//设置陀螺仪满量程范围
}
3.设置MPU6050加速度传感器满量程范围
//设置MPU6050加速度传感器满量程范围
//fsr:0,±2g;1,±4g;2,±8g;3,±16g
//返回值:0,设置成功
// 其他,设置失败
u8 MPU_Set_Accel_Fsr(u8 fsr)
{
return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//设置加速度传感器满量程范围}
4.设置MPU6050的数字低通滤波器