ICM42688 同时提供三轴加速度和三轴角速度。当前工程已经包含寄存器驱动、MSPM0G35XX I²C 适配、静止标定、坐标映射和 Fusion 姿态融合,但默认构建没有启用它。
| 文档属性 | 内容 |
|---|---|
| 文档编号 | TI-CAR-07 |
| 设备 | ICM42688 六轴 IMU |
| BSP | BSP/Src/ICM42688.c |
| 应用层 | APP/Src/ICM42688_App.c |
| 当前状态 | ICM42688_ENABLE = 0U,默认不初始化、不登记任务 |
1. 三层结构
ICM42688 寄存器驱动 ↓ 原始六轴 / 量程换算MSPM0G35XX I²C 与中断适配 ↓ 采样状态坐标映射、静止标定、Fusion ↓roll / pitch / yaw 与诊断状态BSP 不直接依赖某一辆车的姿态用途,而是通过传输函数和延时函数访问总线。应用层提供 MSPM0G35XX 的 I²C 实现,并把传感器坐标变换到车体坐标。
2. 底层驱动做了什么
icm42688_init() 的关键步骤为:
- 校验设备、HAL、地址、量程、输出速率与超时参数。
- 写设备软复位。
- 读取
WHO_AM_I并核对期望值。 - 配置加速度计和陀螺仪量程、输出速率。
- 按配置启用 INT2 数据就绪。
- 打开加速度计与陀螺仪低噪声模式。
- 等待电源状态稳定后标记初始化成功。
任一步失败都会返回明确状态,而不是继续产生看似正常的零数据。ICM42688_AppState_t 还保存最近错误、错误次数、样本数和中断次数。
3. I²C 适配如何控制失败
ICM42688_App_Transfer() 使用 MSPM0G35XX DriverLib 完成寄存器写入和读取,并检查 NACK、仲裁丢失、总线异常与超时。接收长度与参数也在发起传输前验证。
它采用轮询等待,但每条等待路径都有超时。对于非抢占式调度器,这比无限等待安全;不过一次超时仍会占用当前任务执行窗口,因此启用后应实测最坏耗时是否影响 5 ms 循迹和 10 ms 控制任务。
4. 原始数据如何换成物理量
icm42688_read_raw() 连续读取 12 字节,并按大端格式解码为三轴加速度和三轴角速度。icm42688_scale_sample() 再根据当前量程换成 g 和 °/s。
驱动默认配置在代码中为:
| 项目 | 当前默认 |
|---|---|
| I²C 地址 | AD0 低地址 |
| 加速度量程 | ±4 g |
| 陀螺仪量程 | ±500 °/s |
| 传感器输出速率 | 两者 1 kHz |
| I²C 事务超时 | 10 ms |
| INT2 数据就绪 | 开启 |
传感器内部输出速率为 1 kHz,不代表应用层以 1 kHz 运行。当前 IMU 任务周期配置为 20 ms,即应用更新口径为 50 Hz;两者必须区分。
5. 传感器坐标到车体坐标
安装方向会改变三轴含义。ICM42688_App_MapToBody() 通过轴选择和正负号宏,把传感器 X/Y/Z 映射为车体前、左、上三个方向。
传感器坐标 ──轴交换/符号修正──> 车体坐标坐标映射错误时,静止加速度方向、转弯时 yaw 符号和俯仰/横滚都会混乱。不要靠修改融合参数补偿安装方向错误。
6. 上电静止标定
姿态尚未有效时,应用先判断设备是否静止:
- 三轴角速度都低于配置阈值。
- 加速度模长落在接近 1 g 的配置区间。
只有连续满足静止条件的样本才参与陀螺仪零偏平均;一旦运动,累计清零并重新开始。当前标定时长由 3 秒和 20 ms 采样周期共同换算为样本数。
这是一种启动零偏标定,不等同于完整温漂标定。若环境温度变化明显,仍需额外的长期测试与补偿模型。
7. Fusion 如何得到姿态
代码引入 xioTechnologies Fusion 的 AHRS 与 Bias 模块。标定完成后,每次更新:
- 用
FusionBiasUpdate()估计并扣除陀螺仪偏置。 - 按实际 tick 间隔设置融合采样周期。
- 调用无磁力计更新,将陀螺仪与加速度计融合。
- 把四元数转换为 roll、pitch、yaw。
没有磁力计时,roll 和 pitch 可利用重力方向约束,yaw 缺少绝对航向参考,会随陀螺零偏逐渐漂移。因此它适合短时姿态观测,但不能天然替代绝对航向传感器。
8. 中断与周期任务怎样配合
ICM42688 的 GPIO 中断只设置 Flag_IMU_Ready 并累计中断次数。Task_IMU() 周期调用 ICM42688_App_Update(),读取中断状态、原始六轴、物理量和姿态。
即使没有观察到数据就绪标志,当前更新函数仍会尝试读取样本。启用前应验证:
- INT2 电平与边沿配置是否匹配硬件。
- 中断计数与应用采样计数的关系。
- I²C 超时和错误计数是否增长。
- 任务周期内的实际执行时间。
9. 如何真正启用
代码层需要同时满足:
empty.syscfg中 I²C 与 IMU GPIO 配置正确。ICM42688_ENABLE改为1U。Task_Init()完成 ICM 初始化并登记 IMU 任务。Interrupt_Init()打开对应数据就绪中断。- OLED 或串口观察初始化、样本、错误与姿态状态。
- 最后才让控制应用消费姿态值。
如果只把宏打开就直接把 yaw 接入转向闭环,风险很高。应先完成静态、缓慢旋转、往返转动和长时间漂移测试。
10. 当前证据分级
| 结论 | 证据状态 |
|---|---|
| ICM42688 BSP 文件与寄存器流程存在 | 已由代码确认 |
| SysConfig 中存在 IMU I²C/GPIO 实例 | 已由配置确认 |
| 应用层包含标定、Fusion 和状态对象 | 已由代码确认 |
| 默认构建执行 IMU 任务 | 否,启用宏为 0 |
| 当前循迹控制使用 yaw | 否,未发现应用消费链 |
| 当前硬件精度与漂移指标 | 待实测确认 |
本篇总结
- ICM42688 已形成“寄存器驱动—I²C 适配—量程换算—标定—Fusion”的完整代码结构。
- 应用层区分原始值、物理量、姿态有效性和错误状态,并提供车体坐标映射。
- 当前模块默认关闭,也没有进入循迹控制链;它是待验证、可接入能力。
- 无磁力计融合的 yaw 会漂移,启用前必须建立静态、动态和长期实测记录。
上一篇:06|五路循迹模块
下一篇:08|人机交互与可观测性