MPU6050的原理讲解

主要讲解

1、加速度
2、陀螺仪
3、磁力计

本博主其实也是从别的资料上看的,然后觉得内容很好理解,于是决定在这分享出来

一、加速度计

标题

加速度计顾名思义,就是测量加速度的那么,我们如何认识这个加速度呢?在此用一个盒子形 状的立方体来做模型,认识加速度,如下,盒子内的图像。
在这里插入图片描述

如果我们把盒子形状的立方体 放在一个没引力场的地方,球会保持在盒子的中间.你可以想 象,这个盒子是在外太空,远离任何天体,很难找到这样的地方,就想象飞船轨道围绕地球 飞,一切都是在失重状态下。那么六个壁面感受到的压力都是0.
如果我们突然将立方体向左侧移动(我们加快加速,1G =9.8米/ S ^ 2),皮球打在了 墙上X-。然后,我们测量球适用于在X轴上的壁和输出-1g值的压力。如下图

在这里插入图片描述
注意:加速度计反应的加速向量与当前的受力方向是相反的,所以上图小球受到右墙壁给小球向左的一个力,而小球的加速度的向量方向却是向右的

如果我们把这个小盒子拿来放在地球上,那么小球会落在Z-壁面上,并会为1G的底壁施加一 个力,在下面的图片所示:

在这里插入图片描述
在这种情况下,框不动,但我们仍然可以得到Z轴的读数-1G。球在墙壁上的压力造成的引 力场。
到目前为止,我们已经分析了单个轴加速度计的输出,这是你会得到一个单轴加速度计。 三轴加速度计的真正价值,即是他们可以同时检测到所有三个轴的惯性力。让我们回到我 们的盒模型,并让旋转45度在右边的框中。球会触及两面墙:Z和X-在下面的图片所示:
在这里插入图片描述
x 和 z 轴受到值的0.71是不是任意的? 它们实际上是一个近似SQRT(1/2).要知道当盒子 只受重力场时,x2+Y2+z^2 =1g 这将变得更加清晰,为大家介绍一下我们的下一个样 子的加速度计。
在之前的盒子模型中,我们有固定的引力场及旋转。在刚刚说明的两个例子中,我们分析 了2个不同的输出框位置,而力矢量保持不变。这更有利于了解加速度计如何与外部交互, 并显示当前读数。
在这里插入图片描述
请看一下上面的模型,这是一个新的模型代替刚刚的盒子立方体。试想一下,在新模型中 的每个轴是垂直于盒子的壁面。向量R是加速度计测量(从上面的例子或这两者的组合,它 可以是引力场或惯性力)的力矢量。接收时,Ry,R Z与上的X,Y,Z轴的R矢量投影。请注 意下面的关系式:

R ^ 2 = RX ^ 2 + RY ^ 2 + RZ ^ 2 (公式1)

请记住,早一点我告诉你,SQRT(1/2)的值不是随机的〜0.71。如果您将上述公式中,回 顾我们的引力场为1 g后,我们可以验证:

1 ^ 2 =(-SQRT(1/2))^ 2 + 0 ^ 2 +(-SQRT(1/2))^ 2

简单地通过代以R = 1时,接收= SQRT(1/2)时,Ry = 0,RZ = SQRT(1/2)在方程

经过以上的理论分析我们越来越接近现实生活中的加速度计。 值RX,RY,RZ实际上是呈线性关系对应到真正的现实加速度计的x轴 y轴 z轴.

在此提出一个问题, 加速度计如何将这些信息告诉我们?

目前市面上的加速度计从输出上区分为两种,一种是数字的,另一种是模拟 的.miniAHRS 使用的是MPU6050三轴加速度计,是I2C接口的数字传感器.通过特定的命令 可以配置加速度的量程,并将内部ADC的转换结果读出来.

现在,我们有我们的加速度计的读数,以LSB为单位的,它仍然不是g(9.8米/秒^ 2),需要最后的转换,我们要知道加速度计灵敏度,通常表示为LSB /g。比方说当我们 选择2g的量程时,对应的灵敏度= 16384 LSB/ G 。为了得到最终的力值,单位为g,我们 用下面的公式:

RX = ADCRx /灵敏度 也就是说 当x轴的计数为ADCRx 时,那么对应的加速度值就是 (ADCRx/16384)g

回到加速度向量模型,将相关角度符号补上,如下图
在这里插入图片描述

方向余弦

我们感兴趣的是向量R 和 X、Y、Z轴之间的角度,将它们定义为 Axr Ayr Azr. 可以看到 由R 和Rx 组成的直角三角形: COS(Axr)= RX / R 依此类推:
COS(Ayr)= RY / R
COS(Azr)= RZ / R
可以得到 R = SQRT(RX ^ 2 + RY ^ 2 + RZ ^ 2)
我们发现 当使用 arccos() 反余弦 :
Axr = arccos(RX / R)
Ayr = arccos(RY / R)
Azr = arccos(RZ / R)
已以通过很多公式解释加速度计模型。我们也会很快解释陀螺仪 以及如何用加速度计和陀 螺仪的数据进行整合,以得到更精确的角度估计。
在这之前 我们先来看看更有用的公式:
cosX = cos(Axr) = Rx / R
cosY = cos(Ayr) = Ry / R
cosZ = cos(Azr) = Rz / R
这三个公式通常被称为方向余弦。你可以轻松地验证: SQRT(cosX ^ 2 + COSY ^ 2 + cosZ ^ 2)= 1
这个属性可以避免监视R矢量的模(长度)。很多时候,我们只对惯性矢量方向感兴趣,对 矢量进行规范化对简化程序运算很有意义

重力向量

我们暂且从理论分析回到现实的传感器输出中,当水平放置MPU6050,只有Z轴感受到重力向 量,它将输出1g。对应的ADC值就是16384 (2g的量程)。
此时,R就是重力向量, Rx=0. Ry=0. Rz = R =1g.
满足 R ^ 2 = RX ^ 2 + RY ^ 2 + RZ ^ 2 得到重力向量与各个轴的夹角
Axr = arccos(RX / R) = 90度
Ayr = arccos(RY / R) = 90度
Azr = arccos(RZ / R) = 0 度

加速度计的标定

当MPU6050水平放置时,理论上Z轴感受到重力 将读出16384。同时X 轴和Y轴的读数将是0. 可实际并不是这样的。这是由于每个芯片在制作时都不一样,数据手册上的都是理论的 值,真正的芯片在水平时Z轴可能并不是16384.我们需要找到当各个轴在0g重力时的计数, 1g时的读数,以及-1g时的读数,得到一个补偿值,在每次读取ADC结果后都进行补偿。
这 个过程我们称之为标定。用数学公式表示为:
ADCx = K*Gx + Offset
ADCx 传感器输出
Gx 真实的加速值
Offset 加速度为0g时传感器的输出
K 标度因数

二、陀螺仪

陀螺仪是测试角速度的传感器,也有人把角速度说成角速率,说的是一样的物理量。拿电 机做例子,当我们说一个电机10转每秒。一转是360度,那么它的主轴在一秒内转过3600 度。也就是说这个电机在转动时的角速度是3600dps.dps 就是dergee per second 度每秒 (或者写成 deg/s).

MPU6050 集成了三轴的陀螺仪.角速度全格感测范围为±250、±500、±1000与± 2000°/sec (dps).当选择量程为±250dps的时候,将会得到分辩率为131LSB/(º/s).也就 是当载体在X+轴转动1dps时,ADC将输出131.
在这里插入图片描述
回到加速度向量模型,将相关角度符号补上,如下图:
在这里插入图片描述

陀螺仪测量什么?

MPU6050带有三个陀螺仪,每个陀螺仪各自负责检测相应轴的转动速度,也就是检测围绕 各个轴转动的速度。像三轴的陀螺仪将同时检测 X Y Z轴的旋转。

由上面这个模型图,首先我们定义:

Rxz - 是R向量在XZ平面上的投影
Ryz - 是R向量在XY平面上的投影
Rxz和Rz所形成的直角三角形,利用勾股定理,我们得到:
Rxz ^ 2 = RX ^ 2 + RZ ^ 2,和同样:
Ryz ^ 2 = RY ^ 2 + RZ ^ 2 还要注意的是:

R ^ 2 = RXZ ^ 2 + Ry^ 2,这可以来自从公式1和上面的等式,或它可以是来自于由R和Ryz
R ^ 2 = Ryz ^ 2 + Rx^ 2 形成的直角三角

我们不会在本文中使用这些公式,只是让读者认识到所有值之间的关系。 同时我们将定义Z轴和Rxz 、RyZ之间的夹角。

Axz - Rxz和Z轴间的夹角
Ayz - Ryz和Z轴间的夹角
现在看看,从这个模型中,陀螺仪测量什么?

上述的说明,已经知道陀螺仪测量角度的变化率.为了解释这一点,让我们假设,我们已经 测量围绕Y轴的旋转角(这将是Axz角)在时刻t0,我们将其定义为Axz0,接下来,我们测 量这个角度是在稍后的时间t1是Axz1。变化率将被计算如下:

RateAxz =(Axz1 - Axz0)/(t1 - t0)

如果Axz单位是度,并以秒为时间单位,那么RateAxz将以deg / s表示。

MPU6050并不会以 deg / s 单位输出,我们需要在读完后进行转换。先来看看各个量程对 应的灵敏度。

在这里插入图片描述

从ADC值到dps

通过I2C接口读出来的转换结果ADC值,并不是以度每秒为单位。一般按以下公式进行转 换:

Anglerate = ADCrate /灵敏度

以量程为±1000º/s为例,说明如何转换。假设读取x轴的ADC值为200,从上表中得知在 ±1000º/s下的灵敏度为32.8LSB/(º/s) 。根据上面的公式:

Anglerate = 200/32.8 = 6.09756º/s

这就是说,MPU6050检测到模块正在以约6度每秒的速度绕X轴(或者叫在YZ平面上)旋转. ADC值并不都是正的,请注意,当出现负数时,意味着该设备从现有的正方向相反的方向旋转

  • 29
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
这段程序是用于初始化 MPU6050 传感器的函数。下面是对程序的逐行解释: 1. `u8 MPU6050_Init(void)`:定义了一个返回类型为 `u8` 的函数 `MPU6050_Init`,没有传入参数。 2. `u8 res;`:定义了一个变量 `res`,类型为 `u8`,用于存储返回值。 3. `IIC_Init();`:调用函数 `IIC_Init()`,用于初始化 IIC 总线。 4. `MPU6050_Write_Byte(MPU6050_PWR_MGMT1_REG,0X80);`:向 MPU6050 的控制寄存器 `MPU6050_PWR_MGMT1_REG` 写入数据 `0X80`,将传感器从休眠状态唤醒。 5. `delay_ms(100);`:延时 100 毫秒。 6. `MPU6050_Write_Byte(MPU6050_PWR_MGMT1_REG,0X00);`:向控制寄存器写入数据 `0X00`,将传感器设置为正常工作模式。 7. `MPU6050_Set_Gyro_Fsr(3);`:设置陀螺仪的量程为 2000°/s。 8. `MPU6050_Set_Accel_Fsr(0);`:设置加速度计的量程为 2g。 9. `MPU6050_Set_Rate(50);`:设置采样率为 50Hz。 10. `MPU6050_Write_Byte(MPU6050_INT_EN_REG,0X00);`:禁用 MPU6050 的中断功能。 11. `MPU6050_Write_Byte(MPU6050_USER_CTRL_REG,0X00);`:配置 MPU6050 的用户控制寄存器。 12. `MPU6050_Write_Byte(MPU6050_FIFO_EN_REG,0X00);`:禁用 MPU6050 的 FIFO 缓冲区。 13. `MPU6050_Write_Byte(MPU6050_INTBP_CFG_REG,0X80);`:配置 MPU6050 的中断/旁路寄存器。 14. `res=MPU6050_Read_Byte(MPU6050_DEVICE_ID_REG);`:从 MPU6050 设备 ID 寄存器中读取数据,并将其赋值给变量 `res`。 15. `if(res==MPU6050_ADDR)`:如果变量 `res` 的值等于 `MPU6050_ADDR`,执行下面的代码块。 16. `MPU6050_Write_Byte(MPU6050_PWR_MGMT1_REG,0X01);`:向控制寄存器写入数据 `0X01`,设置传感器为唤醒状态。 17. `MPU6050_Write_Byte(MPU6050_PWR_MGMT2_REG,0X00);`:配置传感器的电源管理 2 寄存器。 18. `MPU6050_Set_Rate(50);`:再次设置采样率为 50Hz。 19. `else return 1;`:如果变量 `res` 的值不等于 `MPU6050_ADDR`,返回值为 1,并结束函数。 20. `return 0;`:返回值为 0,表示初始化成功。 这个函数的作用是初始化 MPU6050 传感器,并返回一个状态值,0 表示初始化成功,1 表示初始化失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值