ESP32学习:MPU6050
一、概念介绍1. MPU6050基础介绍MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了安装空间。MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个第二 IIC 接口,可用于连接外部磁力传感器,并利用自带的数字运动处理器(DMP: Digital Motion Pro
一、概念介绍
1. MPU6050基础介绍
MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了安装空间。
MPU6050 内部整合了 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 中断、零动作感应、触击感应、摇动感应功能
- 自带 1024 字节 FIFO,有助于降低系统功耗
- 高达 400Khz 的 IIC 通信接口
- 超小封装尺寸:4x4x0.9mm(QFN)
MPU6050传感器的检测轴如下图所示:
2. MPU6050模块使用
MPU6050模块
MPU6050和MCU之间的连接采用IIC接口(SCL和SDA),MCU 通过这个 IIC 接口来控制 MPU6050,另外还有一个 IIC 接口:AUX_CL 和 AUX_DA,这个接口可用来连接外部从设备,比如磁传感器,这样就可以组成一个九轴传感器。AD0 是从 IIC 接口(接MCU)的地址控制引脚,该引脚控制 IIC 地址的最低位。如果接 GND,则 MPU6050 的 IIC 地址是:0X68,如果接 VDD,则是 0X69
MPU6050初始化步骤:
- 初始化IIC接口
- 复位MPU6050: 这一步让 MPU6050 内部所有寄存器恢复默认值,通过对电源管理寄存器 1(0X6B)的bit7写 1 实现。复位后,电源管理寄存器 1 恢复默认值(0X40),然后必须设置该寄存器为 0X00,以唤醒 MPU6050,进入正常工作状态。
- 设置角速度传感器(陀螺仪)和加速度传感器的满量程范围:分别通过陀螺仪配置寄存器(0X1B)和加速度传感器配置寄存器(0X1C)设置。我们一般设置陀螺仪的满量程范围为±2000dps,加速度传感器的满量程范围为±2g
- 设置其他参数:我们还需要配置的参数有:关闭中断、关闭 AUX IIC 接口、禁止 FIFO、设置陀螺仪采样率和设置数字低通滤波器(DLPF)等
- 配置系统时钟源:系统时钟源同样是通过电源管理寄存器 1(0X6B)来设置,该寄存器的最低三位用于设置系统时钟源选择,默认值是 0(内部 8M RC 震荡),不过我们一般设置为 1,选择 x 轴陀螺 PLL作为时钟源,以获得更高精度的时钟。
- 使能角速度传感器和加速度传感器:这两个操作通过电源管理寄存器 2(0X6C)来设置,设置对应位为 0 即可开启。
3. 寄存器介绍
4. DMP使用介绍
通过上一节介绍的寄存器,我们可以正常读取到加速度传感器、陀螺仪和温度传感器的数据,但是在实际使用的时候,我们更希望得到的是姿态数据,即欧拉角:航向角(yaw)、横滚角(roll)和俯仰角(pitch)。
要得到欧拉角数据,就得利用我们的原始数据,进行姿态融合解算,这个比较复杂,知识点比较多,初学者 不易掌握。而 MPU6050 自带了数字运动处理器,即 DMP,并且,InvenSense提供了一个 MPU6050 的嵌入式运动驱动库,结合 MPU6050 的 DMP,可以将我们的原始数据,直接转换成四元数输出,而得到四元数之后,就可以很方便的计算出欧拉角,从而得到 yaw、roll 和 pitch。
使用MPU6050 的DMP 输出的四元数是q30 格式的,也就是浮点数放大了2 的30 次方倍。在换算成欧拉角之前,必须先将其转换为浮点数,也就是除以 2 的 30 次方,然后再进行计算,计算公式为:
q0=quat[0] / q30; //q30 格式转换为浮点数
q1=quat[1] / q30;
q2=quat[2] / q30;
q3=quat[3] / q30;
//计算得到俯仰角/横滚角/航向角
pitch=asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; //俯仰角
roll=atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; //横滚角
yaw=atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3; //航向角
其中 quat[0]~ quat[3]是 MPU6050 的 DMP 解算后的四元数,q30 格式,所以要除以一个 2的 30 次方,其中 q30 是一个常量:1073741824,即 2 的 30 次方,然后带入公式,计算出欧拉角。
二、代码编写
MPU6050驱动,主要初始化配置代码如下:
/**
* @brief MPU-6050 initial
*/
uint8_t MPU_Init()
{
uint8_t res = 0;
//初始化ESP32硬件I2C
I2C_Init();
//复位MPU6050, 寄存器0x6B bit7写1实现
MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0x80);
vTaskDelay(100 / portTICK_RATE_MS);
//唤醒MPU6050
MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0x00);
//设置陀螺仪满量程,2000dps
MPU_Set_Gyro_FSR(3);
//设置加速度计满量程范围
MPU_Set_Accel_FSR(0);
//设置采样率
MPU_Set_Rate(200);
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引脚低电平有效
MPU_Read_Byte(MPU_DEVICE_ID_REG, &res);
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(200); //设置采样率为50Hz
}else
return 1;
return 0;
}
结果显示如下:
三、结束
本文介绍了MPU6050的使用,并通过ESP32驱动MPU6050模块,通过MPU6050自带的DMP计算并在OLED屏幕显示俯仰角、翻滚角和航偏角。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)