一、概念介绍

 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初始化步骤: 

  1. 初始化IIC接口
  2. 复位MPU6050: 这一步让 MPU6050 内部所有寄存器恢复默认值,通过对电源管理寄存器 1(0X6B)的bit7写 1 实现。复位后,电源管理寄存器 1 恢复默认值(0X40),然后必须设置该寄存器为 0X00,以唤醒 MPU6050,进入正常工作状态。
  3. 设置角速度传感器(陀螺仪)和加速度传感器的满量程范围:分别通过陀螺仪配置寄存器(0X1B)加速度传感器配置寄存器(0X1C)设置。我们一般设置陀螺仪的满量程范围为±2000dps,加速度传感器的满量程范围为±2g
  4. 设置其他参数:我们还需要配置的参数有:关闭中断、关闭 AUX IIC 接口、禁止 FIFO、设置陀螺仪采样率和设置数字低通滤波器(DLPF)等
  5. 配置系统时钟源:系统时钟源同样是通过电源管理寄存器 1(0X6B)来设置,该寄存器的最低三位用于设置系统时钟源选择,默认值是 0(内部 8M RC 震荡),不过我们一般设置为 1,选择 x 轴陀螺 PLL作为时钟源,以获得更高精度的时钟。
  6. 使能角速度传感器和加速度传感器:这两个操作通过电源管理寄存器 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屏幕显示俯仰角、翻滚角和航偏角。

        本文代码:https://download.csdn.net/download/sssxlxwbwz/72603752

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐