[其他产品] MPU6050的自检校验参数如何调整?

[复制链接]
私藏人间 发表于 2025-8-25 16:50 | 显示全部楼层 |阅读模式
MPU6050的自检校验参数如何调整?
zhuotuzi 发表于 2025-8-26 21:21 | 显示全部楼层
MPU6050的自检功能并不是简单地返回一个“通过/不通过”的信号。它的过程如下:

启动自检:通过配置相应的寄存器,启动加速度计和/或陀螺仪的自检模式。

内部激励:启动后,芯片内部会产生一个电场(对于加速度计)或一个电压(对于陀螺仪),这个激励会模拟一个特定的运动输入。

加速度计:静电力会模拟一个约 250 mg 的加速度输入。

陀螺仪:电压会模拟一个约 80 dps (度/秒) 的角速度输入。

读取输出:传感器会测量这个“自我产生”的激励所产生的输出值。

计算偏差:将自测模式下的输出值与正常模式下(无激励)的输出值进行比较,得到的差值就是“自检响应值”。
zhuotuzi 发表于 2025-8-26 21:21 | 显示全部楼层
你需要通过I2C读取相应的寄存器来获取原始数据。

配置自检寄存器(0x1B和0x1C)

加速度计自检:寄存器 ACCEL_CONFIG (0x1C) 的最高3位(bit7, bit6, bit5)。

陀螺仪自检:寄存器 GYRO_CONFIG (0x1B) 的最高3位(bit7, bit6, bit5)。

将这几位设置为 1 即可启用对应轴的自检。

注意:通常建议同时启用三个轴(即设置 0xE0),或者全部禁用(0x00)。

读取数据

启用自检后,等待一小段时间(例如100ms)让输出稳定。

然后像平常一样,从 ACCEL_OUT (0x3B 开始) 和 GYRO_OUT (0x43 开始) 寄存器读取自检模式下的输出值。

同时,你还需要在正常模式(自检禁用) 下读取一次输出值。

计算自检响应值

自检响应 (STR) = | 自测模式输出 - 正常模式输出 |
zhuotuzi 发表于 2025-8-26 21:21 | 显示全部楼层
如何“调整”或判断——与出厂值比较
这是最关键的一步。你计算出的自检响应值(STR)不能直接使用,必须与芯片内部存储的出厂自检基准值(Factory Trim Values) 进行比较。

获取出厂修正值(FT)

这些值存储在MPU6050的只读寄存器 SELF_TEST_X (0x0D), SELF_TEST_Y (0x0E), SELF_TEST_Z (0x0F), SELF_TEST_A (0x10) 中。

这些值不是直接的物理量,需要按照芯片手册里的公式进行转换。

判断自检是否通过(核心公式)
芯片手册提供了判断公式。简化理解如下:

计算出的 STR 应该在出厂值 FT 的一个允许范围内。

这个范围通常是:FT * 0.5 < STR < FT * 1.5 或有一个更精确的基于百分比(例如±14%)的公式。

具体精确公式如下(来自官方手册):

加速度计判断公式:
%Change = (STR - FT) / FT
如果 %Change 的值在 -14% 到 +14% 之间,则自检通过。

陀螺仪判断公式:
%Change = (STR - FT) / FT
如果 %Change 的值在 -14% 到 +14% 之间,则自检通过。

如果所有轴的偏差都在这个范围内,说明传感器性能良好,在规格之内。
zhuotuzi 发表于 2025-8-26 21:22 | 显示全部楼层
  1. // 1. 读取并保存出厂修正值 FT(从0x0D到0x10)
  2. uint8_t self_test_data[4];
  3. i2c_read(MPU6050_ADDR, 0x0D, self_test_data, 4);
  4. // 将self_test_data中的原始数据按照手册公式解析成实际的FT值(这个过程稍复杂,需要位操作和计算)
  5. float ft_ax = ...; // 计算X加速度计的FT
  6. float ft_ay = ...; // 计算Y加速度计的FT
  7. // ... 以此类推

  8. // 2. 读取正常模式下的输出值
  9. i2c_write(MPU6050_ADDR, 0x1B, 0x00); // 禁用陀螺仪自检
  10. i2c_write(MPU6050_ADDR, 0x1C, 0x00); // 禁用加速度计自检
  11. delay(100);
  12. float gyro_normal_x = ...; // 读取正常陀螺仪X值
  13. float accel_normal_x = ...; // 读取正常加速度计X值
  14. // ... 读取Y和Z

  15. // 3. 启用自检并读取自检模式输出值
  16. i2c_write(MPU6050_ADDR, 0x1B, 0xE0); // 启用所有陀螺仪轴自检
  17. i2c_write(MPU6050_ADDR, 0x1C, 0xE0); // 启用所有加速度计轴自检
  18. delay(100); // 等待稳定
  19. float gyro_selftest_x = ...; // 读取自检陀螺仪X值
  20. float accel_selftest_x = ...; // 读取自检加速度计X值
  21. // ... 读取Y和Z

  22. // 4. 计算自检响应值 STR
  23. float str_gyro_x = fabs(gyro_selftest_x - gyro_normal_x);
  24. float str_accel_x = fabs(accel_selftest_x - accel_normal_x);
  25. // ... 计算Y和Z

  26. // 5. 与出厂值FT比较判断
  27. float change_gyro_x = (str_gyro_x - ft_gyro_x) / ft_gyro_x;
  28. if (change_gyro_x > 0.14 || change_gyro_x < -0.14) {
  29.     Serial.println("Gyro X FAIL!");
  30. } else {
  31.     Serial.println("Gyro X PASS!");
  32. }
  33. // ... 判断其他轴
复制代码
zhuotuzi 发表于 2025-8-26 21:23 | 显示全部楼层
“调整”的真正含义:对于开发者来说,“调整”意味着根据自检结果决定是否信任这块芯片。如果自检失败,通常意味着传感器可能已经损坏(例如跌落冲击),你应该更换它,而不是试图用软件去“校准”或“补偿”这个错误。

复杂的FT值计算:从寄存器读取出厂修正值并转换为实际用于比较的 FT 值的过程比较繁琐,需要仔细阅读芯片手册第8页和第9页的“SELF TEST”章节,里面有详细的公式和例子。很多现有的开源库(如Jeff Rowberg的I2CdevLib)已经实现了这个功能,可以直接参考。

自检不是日常校准:自检功能用于生产测试或系统启动时诊断,不应在每次上电时都使用。日常使用中,你需要的是进行陀螺仪和加速度计的零偏校准(通常是在静止状态下采集大量样本求平均值作为偏移量)。

温度影响:自检响应值会受温度影响,最好在室温下进行。
zhuotuzi 发表于 2025-8-26 21:24 | 显示全部楼层
调整MPU6050的自检参数,实质上是按照官方提供的算法,将自检得到的响应值与芯片出厂时存储的基准值进行比较,并判断其偏差是否在允许范围内(±14%)。这个过程是验证传感器健康状态的手段,而非修改其内部参数。如果自检失败,最可靠的方法是更换传感器。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

50

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部