# IMU-Position **Repository Path**: sspemail/imu-position ## Basic Information - **Project Name**: IMU-Position - **Description**: 常用陀螺仪即常用姿态解算算法 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-07-24 - **Last Updated**: 2026-07-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 项目名称 ========= 这是一个基于 STM32F411 的 IMU 姿态解算演示工程(包含 MPU6050 / GY-85 两类传感器驱动与两种算法实现: Euler 与 Mahony)。工程使用 HAL + CMake 构建,显示使用 OLED(用于在板上显示 roll/pitch/yaw)。\ 本项目主要基于Clion开发,Keil使用方法见减少末尾 主要功能 --------- - 从 I2C 读取加速度计、陀螺仪(以及 GY-85 的磁力计)数据 - 两种姿态解算算法:基于欧拉的互补融合(Euler)与 Mahony 滤波器 - 陀螺零偏自动标定函数 - 在 OLED 上实时显示 roll / pitch / yaw 主控芯片 --------- - MCU: STM32F411CEUx - I2C 外设: I2C1(在 `mpu6050.ioc` 中配置,`PB6` = SCL,`PB7` = SDA) 仓库中相关关键文件 ------------------- - 传感器与解算总入口:`Core/BSP/sensor.h`、`Core/BSP/sensor.c` - MPU 系列驱动:`Core/BSP/MPU6050.h`、`Core/BSP/MPU6050.c` - GY-85 驱动(ADXL345 + ITG3200 + HMC5883L):`Core/BSP/GY_85.h`、`Core/BSP/GY_85.c` - 算法:`Core/Algorithms/Euler.c` / `Core/Algorithms/Euler.h`,`Core/Algorithms/Mahony.c` / `Core/Algorithms/Mahony.h` - 主程序:`Core/Src/main.c`(初始化、定时器启动、OLED 显示与主循环) - CMake Presets:`CMakePresets.json`(方便使用 `cmake --preset` 构建) 如何切换传感器与算法 --------------------- 当前工程通过编译时宏在 `Core/BSP/sensor.h` 中选择要使用的传感器与算法。打开该文件可以看到类似: ```c // 使用什么传感器 #define MPU6050 0 //mpu6050&mpu500 #define GY85 1 // // 使用什么算法 #define Euler 0 #define Mahony 1 ``` 编译时切换方法(推荐): - 如果想使用 MPU6050:在 `sensor.h` 中将 `#define MPU6050 1`、`#define GY85 0`。 - 如果想使用 GY-85:将 `#define GY85 1`、`#define MPU6050 0`。 - 切换算法:把 `Euler` 或 `Mahony` 对应宏设为 `1`,另一个设为 `0`。 例:使用 MPU6050 且运行 Mahony: ```c #define MPU6050 1 #define GY85 0 #define Euler 0 #define Mahony 1 ``` 实现细节说明: - 传感器读取逻辑位于 `Core/BSP/sensor.c` 的 `IMU_ReadData()`,根据宏选择调用 `GY85_ReadData()` 或 `MPU6500_GetData()`。 - 姿态更新在 `IMU_update()` 中按宏选择调用 `Euler_update()` 或 `Mahony_update()`。 - `IMU_update()` 在 `TIM9` 的周期中断(在 `sensor.c` 的 `HAL_TIM_PeriodElapsedCallback`)被调用(代码中假设周期 10 ms,即 100 Hz)。 - 陀螺标定通过 `IMU_calibration()` 执行,源码中默认会调用 `*_CalibrateGyroOffset(100, 5)`(采样 100 次,间隔 5 ms)。 如何在运行时切换(建议) ------------------------- 目前切换由宏控制(编译时)。如果需要在运行时选择传感器或算法,可以做如下修改: - 在 `sensor.h` 中添加运行时变量,例如 `extern uint8_t use_sensor; extern uint8_t use_algo;`。 - 在 `sensor.c` 中把 `#if GY85` / `#if MPU6050` 改为运行时判断 `if (use_sensor == SENSOR_GY85) { ... } else { ... }`。 - 同理将算法选择由 `#if Euler` / `#if Mahony` 改成 `if (use_algo == ALGO_MAHONY) ...`。 接线说明(传感器 ↔ STM32F411) -------------------------------- 本工程使用 I2C1(从 `mpu6050.ioc` 可见)并将 I2C1 的引脚配置为: - STM32F411 PB6 (I2C1_SCL) -> SCL - STM32F411 PB7 (I2C1_SDA) -> SDA - STM32F411 3.3V -> VCC (传感器 VCC 3.3V) - STM32F411 GND -> GND 注意:请确保传感器电源为 3.3V,避免直接用 5V 给传感器或 MCU 引脚供电。 GY-85 模块(板载 ADXL345、ITG3200、HMC5883L)地址(源码中以 8-bit 左移表示): - ADXL345 (accel) 7-bit: 0x53 -> 8-bit (<<1) = 0xA6 (在代码中为 `GY85_ACCEL_ADDR`) - ITG3200 (gyro) 7-bit: 0x68 -> 8-bit = 0xD0 (在代码中为 `GY85_GYRO_ADDR`) - HMC5883L (mag) 7-bit: 0x1E -> 8-bit = 0x3C (在代码中为 `GY85_MAG_ADDR`) MPU6500(MPU6050 兼容) 地址:源码中以 8-bit 地址 `0xD0` 作为 I2C 操作地址(7-bit 地址为 0x68)。 (请根据你的编程器/固件烧录工具调整命令) 运行时注意事项与调试 ------------------- - 程序中定时器 TIM9 用于周期性调用 `IMU_update()`(样例假设 10ms)。如果修改定时器频率,相应地调整 `IMU_update()` 中的 dt(当前源码中写死为 0.01f)。 - 若显示异常,请先检查 I2C 总线硬件连接(SCL/SDA 与上拉电阻)和传感器电源。 - 在 `Core/BSP/MPU6050.c` 可看到当前加速度计/陀螺计的配置(如量程:ACCEL_CONFIG、GYRO_CONFIG)。若需修改量程请调整相应寄存器写入值并同步 `GetData` 中的缩放系数。 常见修改点提示 ---------------- - 想把算法切换为运行时选择:修改 `sensor.c`,增加全局选择变量并用 `if` 替代 `#if` 条件编译。 - 想增加新的传感器:实现与 `IMU_Data_t` 结构兼容的读取函数,并在 `IMU_ReadData()` 中添加选择逻辑。 # Keil使用方法 - 打开mpu6050.ioc 选择Keil并生成代码 - 将BSP和Algorithms里面的代码加入到工程中