MPU6050

1 简介

MPU6050是一款六轴(三轴加速度+三轴角速度 )传感器

工作原理:
1、加速度计分析在XYZ轴上承受的压力求加速度值
	静止时,XY为0,Z为1g(球对物体的引力产生的加速度叫重力加速度9.8m/s)
	静态稳定 
	运动加速度影响不准确
	动态不稳定
2、角速度计测量XYZ三轴的角速度值,通过参考轴间的距离得到角速度,角速度积分转换为角度	
	静态不稳定 动态稳定
两者进行互补滤波

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时间进行校准

  • 11
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值