ICM42607:基于 STM32 与 Mahony 算法的六轴姿态解算项目

可用于快速搭建基于 STM32 的六轴姿态测量模块,实时输出横滚、俯仰和偏航角。项目通过 SPI 读取 ICM-42607-P,采用 Mahony 滤波解算姿态,上电自动陀螺零偏标定,定时器 100Hz 采样,串口 10Hz 输出角度,支持 CMake 构建。【此简介由AI生成】

Branch1Tags0
FilesLast commitLast update
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
2 months ago
3 months ago
3 months ago

ICM42607 — STM32F103C8T6 + ICM-42607-P 六轴姿态解算

基于 STM32F103C8T6(72MHz)通过 SPI1 读取 ICM-42607-P 六轴 IMU,使用 Mahony 滤波解算姿态角,经 USART1 实时输出横滚 / 俯仰 / 偏航角。

功能特性

  • SPI1 读取 ICM-42607-P(加速度计 ±4g / 陀螺仪 ±2000dps / ODR 100Hz),驱动见 Core/BSP/ICM42607.c
  • Mahony 姿态解算(加速度计单位 g、陀螺仪单位 rad/s,符合算法要求),见 Core/BSP/mahony.c
  • 上电自动陀螺零偏标定(模块静止约 5 秒,无需手动校准)
  • TIM4 定时器驱动 100Hz 采样 + 解算,主循环 10Hz 串口输出 R / P / Y 角度(0.1° 分辨率)
  • 标定后偏航漂移实测约 0.1°/50s(无磁力计,长时间仍会缓慢漂移)

硬件需求与接线

器件 引脚 说明
ICM-42607-P PA5 → SCK,PA6 ← MISO,PA7 → MOSI,PB0 → CS SPI1,Mode 0
ICM-42607-P 供电 3V3 / GND
USART1 PA9 (TX) / PA10 (RX) 115200-8N1,姿态角输出
调试器 PA13/PA14 (SWD) ST-Link / J-Link / DAP

常见 F103C8T6 最小系统板("蓝板")即可直接使用。

软件架构

TIM4 中断 (1ms)
  └─ 每 10 次 → ICM42607_ReadData(&imu)       ← 100Hz 读传感器
             └─ Mahony_update(&filter, dt=0.01) ← 100Hz 姿态解算
主循环 (10Hz)
  └─ 串口打印 filter.roll / pitch / yaw

上电运行流程:

  1. 打印初始化诊断行(WHO_AM_I 校验、寄存器回读)
  2. 静默约 5 秒 —— 陀螺零偏标定(期间模块必须静止,无串口输出属正常)
  3. 开始以 10Hz 打印姿态角:R +12.3 P -5.6 Y +45.0 deg

工程结构

ICM42607/
├── Core/
│   ├── BSP/                # 自定义驱动: ICM42607.c/.h, mahony.c/.h
│   ├── Inc/                # CubeMX 生成头文件
│   └── Src/                # CubeMX 生成源码 + main.c
├── Drivers/                # STM32F1xx HAL 库 + CMSIS (自包含)
├── cmake/                  # CMake 工具链文件 + CubeMX 子构建
├── CMakeLists.txt
├── CMakePresets.json       # 已配置 Debug / Release 等 preset
├── ICM52607.ioc            # STM32CubeMX 工程
├── STM32F103XX_FLASH.ld    # 链接脚本
└── startup_stm32f103xb.s   # 启动文件

构建方式

一、CMake 构建(CLion / VSCode / 命令行)

环境准备(三种方式通用)

  1. 安装 STM32CubeCLT(官网,含 arm-none-eabi-gcc、CMake、Ninja、OpenOCD、STM32CubeProgrammer)
    • 或分别安装:GNU Arm Embedded Toolchain + CMake ≥ 3.22 + Ninja
  2. 将工具链 bin 目录加入 PATH(cmake/gcc-arm-none-eabi.cmake 从 PATH 查找 arm-none-eabi-)

方式 1:CLion(推荐,参考 keysking 的教程)

CLion 已内置嵌入式开发支持,适合图形化编辑 + 一键下载调试:

  1. File → Open 选择项目文件夹,CLion 自动识别 CMakeLists.txt
  2. Settings → Build, Execution, Deployment → Toolchains:新建工具链,Compiler 选择 arm-none-eabi-gcc
  3. Settings → Embedded Development:配置 OpenOCD 路径与 ST-Link 接口
  4. 选择 Debug 构建配置,编译后可通过 OpenOCD Download & Run 直接烧录调试

参考:keysking 图文教程《用 clion 和 stm32cube 开发 stm32》 及《【干货】CLion开发STM32轻松搞定!》《【CLion+STM32】拒绝报错,搞懂CMake才能真的爽!》系列视频;keysking 的完整入门路径见《keysking的STM32教程》。

方式 2:VSCode

  1. 安装扩展:CMake Tools、Cortex-Debug、串口监视器(如 Serial Monitor)
  2. CMake Tools 会自动识别仓库内的 CMakePresets.json,选择 Debug preset,工具链指向 arm-none-eabi
  3. 构建后配置 launch.json 使用 Cortex-Debug + OpenOCD 烧录调试(interface/stlink.cfg + target/stm32f1x.cfg)
  4. 打开串口监视器(115200)查看姿态角输出

方式 3:命令行(适合熟悉工具链的操作者)

# 1. 配置 + 构建
cmake --preset Debug
cmake --build build/Debug

# 产物: build/Debug/ICM52607.elf (+ .map)
# 如需 .bin: arm-none-eabi-objcopy -O binary build/Debug/ICM52607.elf ICM52607.bin

# 2. 烧录 (任选其一, 需要连接 ST-Link 等调试器)
STM32_Programmer_CLI -c port=SWD -w build/Debug/ICM52607.elf -v
# openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "program build/Debug/ICM52607.elf verify reset exit"
# st-flash write build/Debug/ICM52607.elf

二、Keil MDK 构建

本仓库默认使用 CMake 构建系统,Keil 需要从 .ioc 重新生成工程:

  1. 安装 Keil MDK 5 + 器件支持包(Keil.STM32F1xx_DFP)
  2. 用 STM32CubeMX 打开 ICM52607.ioc,Project Manager 中 Toolchain/IDE 选择 MDK-ARM,Generate Code
  3. 打开生成的 ICM52607.uvprojx,手动添加 BSP 文件:
    • 新建分组(如 "BSP"),添加 Core/BSP/ICM42607.c、Core/BSP/mahony.c
    • Options → C/C++ → Include Paths 添加 Core\BSP(否则找不到头文件)
  4. 编译(ARM Compiler 6)→ Options → Debug 选择调试器 → 烧录运行

重新生成代码时,main.c 等文件中 USER CODE BEGIN/END 区块内(初始化、定时器回调、打印逻辑)及 Core/BSP/ 目录(CubeMX 不认识的自定义目录)均不会被覆盖,可放心生成。


注意事项

  • 标定时必须静止:上电后 5 秒为陀螺零偏标定(Mahony_CalibrateGyro),期间移动会导致标定值错误
  • yaw 会缓慢漂移:无磁力计,偏航角无绝对参考,长时间使用建议外接磁力计(如 AK09916)或定期重新标定
  • 串口输出:115200-8N1,R/P/Y 单位度(deg)
  • 修改传感器量程时需同步修改 ICM42607.h 中的灵敏度常数(8192 LSB/g、16.4 LSB/dps),否则姿态解算会出错

参考

Introduction

可用于快速搭建基于 STM32 的六轴姿态测量模块,实时输出横滚、俯仰和偏航角。项目通过 SPI 读取 ICM-42607-P,采用 Mahony 滤波解算姿态,上电自动陀螺零偏标定,定时器 100Hz 采样,串口 10Hz 输出角度,支持 CMake 构建。【此简介由AI生成】

Customize your domain