MPU6050

1 简介

MPU6050是一款六轴(三轴加速度计+三轴陀螺仪)传感器

  • 加速度计

1 加速度计 用于分析在空间坐标XYZ轴上承受的压力求加速度值,加速度计基本原理是牛顿第二定律
2 通过积分加速度信号:一次积分得到速度,二次积分得到位移,这种积分过程会导致误差累积,尤其是在存在噪声或干扰的情况下,因此长时间积分得到的位移值可能不准确。
3 自由落体加速度(重力加速度)1g = 9.8m/s^2
4 静态稳定 运动加速度影响不准确 动态不稳定

  • 陀螺仪

1 角速度计测量XYZ三轴的角速度值,通过参考轴间的距离得到角速度,
2 角速度积分转换为角度
3 静态不稳定 动态稳定 两者进行互补滤波

MPU6050含有一个第二IIC接口,可用于连接外部磁力计为九轴和气压计为十轴

MPU6050自带数字运动处理器(DMP)通过主IIC接口,可以向CPU提供四元数,CPU可利用四元数得到欧拉角:航向角(yaw) 横滚角(roll) 俯仰角(pitch)

  • 结构框图
    在这里插入图片描述

2 寄存器详解

2.1 电源管理寄存器1(0x6B)

在这里插入图片描述
在这里插入图片描述

bit7:控制复位,设置为1 硬件自动清零该位。
bit6:控制工作模式,1,睡眠模式(低功耗),0,正常工作模式  
bit5:循环模式 0不循环
bit3:设置是否使能温度传感器,1 使能,0 不使能
CLKSEL[2:0]:选择系统时钟源,选择 001 

2.2 电源管理寄存器2(0x6C)

在这里插入图片描述

bit7、bit6 :
用于控制低功耗时的唤醒频率
剩下6:分别控制加速度陀螺仪的xyz轴是否进入待机模式 全给0 不待机

2.3 采样率分频(0x19)

在这里插入图片描述

采样频率 = 陀螺仪输出频率(配置寄存器的FS:1KHz) /1 + SMPLRT_DIV )

SMPLRT_DIV 为 采样频率的一半: 如设置采样频率 50hz 则 带宽为 25Hz (带入配置寄存器)

就有公式:50 = 1000/(1+19)

2.4 配置寄存器1(0x1A)

在这里插入图片描述
在这里插入图片描述

配置寄存器 是设置 数字低通滤波器(DLPF)加速度和陀螺仪的 带宽、输出频率

bit0、bit1、bit2位
当我们 选择 带宽为 25Hz 的时候 会接近 100 这个时候 输出频率为 1KHz

2.5 陀螺仪配置寄存器(0x1B)

在这里插入图片描述

bit765位  自测 选0
bit4位、bit3位
00,±250°/S
01,±500°/S
01,±1000°/S
11,±2000°/S
一般设置为 0x18,因为陀螺仪的 ADC 为 16 位分辨率,所以得到灵敏度为:65536/4000=16.4LSB/(°/S)

2.6 加速度配置寄存器(0x1C)

在这里插入图片描述

bit765位  自测 选0
bit4位、bit3位
00, ±2g
01,±4g
10,±8g
11,±16g
bit210位  高通滤波器 不用0
我们一般设置为 0x18,因为加速度传感器的ADC 也是 16 位,所以得到灵敏度为:65536/32=2048LSB/g。

2.7 陀螺仪数据输出寄存器(0x43~0x48)

在这里插入图片描述

 输出 X/Y/Z三轴的数据,高字节在前

2.8 加速度数据输出寄存器(0x3B~0x40)

在这里插入图片描述

 输出 X/Y/Z三轴的数据,高字节在前

2.9 温度数据输出寄存器(0x3B~0x40)

在这里插入图片描述

418位,428位

公式

最终温度 = 36.53 + 读寄存器的温度值 / 340

2.10 FIFO 使能寄存器(0x23)

在这里插入图片描述

0 禁止使用FIFO; 1 使能FIFO

加速度传感器 由bit3位 控制

陀螺仪传感器 由bit4位,bit5位,bit6位 分别控制

3 DMP 数字运动处理器

InvenSense 提供了一个 MPU6050 的嵌入式运动驱动库,结合 MPU6050 的 DMP,可以将我们的原始数据,直接转换成四元数输出

使用 MPU6050 的 DMP 输出的四元数是 q30 格式的,q30 是一个常量:1073741824,即 2 的 30 次方,也就是浮点数放大了 2 的 30 次方倍。在换算成欧拉角之前,必须先将其转换为浮点数,除以 2 的 30 次方,然后再进行计算


//四元数转换浮点数,进行计算
q0 = quat[0] / q30; 
q1 = quat[1] / q30;
q2 = quat[2] / q30;
q3 = quat[3] / q30; 

//输出的数据是 弧度 格式。转换为角度57.3  
//计算得到俯仰角/横滚角/航向角
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; //航向角

4 遇到的问题

4.1 自检不通过,run_self_test(); 返回8

遇到 自检不通过时,一步步排查 。当我们排查到:

	result = mpu_run_self_test(gyro, accel);
	if (result == 0x3) 
	{

发现返回此函数返回值,result不对,了解这个函数返回值含义

int mpu_run_self_test(long *gyro, long *accel)
这段注释解释了一个触发传感器自检的函数。自检过程会返回一个掩码,用于指示哪些传感器通过了自检,哪些未通过。
其中,第 0 位表示陀螺仪,第 1 位表示加速度计,第 2 位表示磁罗盘。
注释中还提到目前 MPU6500 不支持硬件自检,但仍然可以通过此函数获取加速度计和陀螺仪的偏移。
另外,为了保证自检的准确性,调用此函数时设备应该处于面朝上或面朝下的状态,即 z 轴与重力平行。
函数会返回一个结果掩码,用于表示哪些传感器未通过自检,哪些通过了。

我们现在知道了,result值 0 位表示陀螺仪,第 1 位表示加速度计,第 2 位表示磁罗盘。

4.1解决方式

按照我的经历的问题的解决方式有以下:

第一种、result值为2,表示磁罗盘出现问题,需要把6050水平放置,这样校验会通过

第二种、自己设计的PCB,自己焊接、自己写程序,即使6050水平放置,result依旧返回2,我重新焊接MPU6050芯片,就好了

第三种、以上方式就不行,最后绝招,注释掉自检函数,不用他,陀螺仪加速计依旧能用,代价是,上电参数值不对,需要10s时间进行校准

### 如何从MPU6050传感器中读取FIFO数据 为了有效地从MPU6050传感器读取FIFO(First In First Out)缓冲区的数据,理解该设备的工作原理及其配置至关重要。MPU6050是一款集成三轴加速度计和三轴陀螺仪的运动处理单元,支持通过I²C接口通信。 #### 配置MPU6050以启用FIFO功能 要使能FIFO并从中读取数据,需先初始化MPU6050设置必要的寄存器位: - 设置`USER_CTRL`寄存器中的`FIFO_EN`位来开启FIFO。 - 使用`FIFO_EN`寄存器选择哪些传感器数据应被写入到FIFO队列里。 - 调整采样率以及DLPF滤波频率等参数可以优化性能[^1]。 #### 示例代码:读取FIFO数据 下面是一个简单的Arduino程序片段用于配置MPU6050并将FIFO中的原始数据打印出来: ```cpp #include <Wire.h> #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // MPU control/status vars bool dmpReady = false; // set true if DMP init was successful uint8_t mpuIntStatus; uint8_t devStatus; void setup() { Serial.begin(9600); Wire.begin(); Wire.setClock(400000); // 加快速度至400kHz // 初始化MPU6050 mpu.initialize(); // 测试连接 if (!mpu.testConnection()) { while (1) { } } // 开启DMP特性 devStatus = mpu.dmpInitialize(); mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // 启动DMP mpu.setDMPEnabled(true); } void loop() { int fifoCount; uint8_t fifoBuffer[64]; // 获取中断状态和其他信息 mpuInterrupt = digitalRead(INT_PIN); if (mpuInterrupt) { mpu.resetFIFO(); // 清除任何旧的数据 // 检查是否有足够的新数据可用 fifoCount = mpu.getFIFOCount(); if (fifoCount >= 42 && fifoCount % 42 == 0) { mpu.getFIFOBytes(fifoBuffer, 42); // 解析FIFO包... mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); // 打印角度值 Serial.print("y:"); Serial.print(ypr[YAW] * 180/M_PI); Serial.print(", p:"); Serial.print(ypr[PITCH] * 180/M_PI); Serial.print(", r:"); Serial.println(ypr[ROLL] * 180/M_PI); } else { // 如果没有完整的帧,则清除FIFO以防溢出 mpu.resetFIFO(); } } } ``` 此段代码展示了如何利用MPU6050库函数完成基本的FIFO操作流程,包括初始化、获取字节数组形式的数据,并解析成有用的信息如四元数或欧拉角表示的姿态估计结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值