# IMU **Repository Path**: GKoSon/imu ## Basic Information - **Project Name**: IMU - **Description**: STM32F103C8T6小板+淘宝LSM6DS3TR-C + QMC5883P - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-20 - **Last Updated**: 2026-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IMU惯性测量单元驱动程序 本项目是基于STM32F103C8T6微控制器的惯性测量单元(IMU)驱动程序,支持LSM6DS3TR六轴传感器(加速度计+陀螺仪)和QMC5883P三轴磁力计,可实现姿态角(Roll/Pitch/Yaw)的解算。 ## 硬件连接 | 模块 | 接口 | 引脚 | |-----|------|------| | LSM6DS3TR | SPI1 | SCK:PA5, MISO:PA6, MOSI:PA7, CS:PA4 | | QMC5883P | I2C1 | SCL:PB6, SDA:PB7 | | 调试输出 | USART1 | TX:PA9 , RX:PA10 | ![1779253760158](images/README/1779253760158.png) ## 支持的传感器 - **LSM6DS3TR**: STMicroelectronics 6轴IMU传感器(3轴加速度计+3轴陀螺仪) - **QMC5883P**: QMC5883P三轴磁力计 ## 核心功能 ### 1. 传感器驱动 - `dev_lsm6ds3tr.c`: LSM6DS3TR SPI接口驱动 - `dev_qmc5883p.c`: QMC5883P I2C接口驱动 ### 2. 姿态解算 - 使用Mahony算法融合加速度计和陀螺仪数据 - 磁力计数据用于航向角(Yaw)校正 - 输出Roll(横滚)、Pitch(俯仰)、Yaw(航向)角度 - 参考:https://differ-tech.pages.dev/df-open-class-inertial-mecanum-car-control/assets/pages/lesson7-imu-attitude.html ### 3. 数据输出 - 支持匿名助手协议数据回传 - 0x01: 加速度计/陀螺仪原始数据 - 0x02: 磁力计数据 - 0x03: 姿态角数据 ## API说明 ### 初始化函数 ```c // 初始化LSM6DS3TR void lsm6ds3tr_c_fifo_init(void); // 初始化QMC5883P void app_qmc5883p_init(void); ``` ### 数据更新 ```c // 更新姿态角 void UpdateAttitude(ICM20602_Data_TypeDef raw, float mag[3], ICM20602_Attitude_TypeDef *angle); ``` ### 姿态数据类型 ```c typedef struct { float Roll; // 横滚角 float Pitch; // 俯仰角 float Yaw; // 航向角 } ICM20602_Attitude_TypeDef; ``` ## 使用示例 ### 1. 初始化传感器 ```c // 在main函数中调用 app_qmc5883p_init(); // 初始化磁力计 // LSM6DS3TR在中断处理中初始化 ``` ### 2. 获取姿态数据 ```c ICM20602_Attitude_TypeDef angle; // 在定时器中断或主循环中调用 UpdateAttitude(rawAccelGyro, magData, &angle); // angle.Roll - 横滚角 // angle.Pitch - 俯仰角 // angle.Yaw - 航向角 ``` ### 3. 数据回传 ```c // 回传加速度计/陀螺仪数据 show_out_0x01(accel[3], gyro[3]); // 回传磁力计数据 show_out_0x02(magX, magY, magZ, temp, status); // 回传姿态角 show_out_0x03(roll, pitch, yaw); ``` ## 配置参数 在`imu.h`中可以修改以下参数: | 参数 | 说明 | 默认值 | |-----|------|-------| | Kp | 比例增益 | 0.5f | | Ki | 积分增益 | 0.001f | | IMU_ODR | 数据输出率 | 100Hz | | halfT | 半采样周期 | 0.5f/DT | ## Dependencies - STM32F1xx HAL库 - CMSIS DSP库(用于数据处理) ## 注意事项 1. 确保LSM6DS3TR的SPI通信正常,检查CS片选信号 2. QMC5883P使用I2C地址0x0D 3. 首次使用时建议进行磁力计校准 4. 姿态解算需要合理的采样周期,建议使用定时器中断 ## 协议格式 ### 0x01 - 传感器原始数据 - 帧头: 0xAA 0xAF 0x01 长度 - 数据: AccX, AccY, AccZ, GyrX, GyrY, GyrZ - 校验和 ### 0x02 - 磁力计数据 - 帧头: 0xAA 0xAF 0x02 长度 - 数据: MagX, MagY, MagZ, Temp, Status - 校验和 ### 0x03 - 姿态角数据 - 帧头: 0xAA 0xAF 0x03 长度 - 数据: Roll, Pitch, Yaw - 校验和 ## 技术细节-SPI 本项目SPI1 + IIC1都是MX直接配置的 没有任何手动修改 感觉很easy 但是当移植其他MCU就非常需要搞懂这些基础细节 >软件:代码回到第二次提交 专注于SPI的第一次通信 读ID 本质是MCU发8F FF MCU收FF 6A >硬件:逻辑分析仪接4根线看波形 ![1779331723041](images/README/1779331723041.png) 逻辑分析仪上位机配置也是和代码完全对应的 方便自动解码 并且需要注意接GND 否则2M 8M还好到18M就暴露问题了 ![1779331907550](images/README/1779331907550.png) SPI基础知识 https://mp.weixin.qq.com/s/zS2Xosf8hTyBEiNj0RcVMg STM32编码风格:**发一个再收一个** ``` static int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp, uint16_t len){ reg |= 0x80; HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(handle, ®, 1, 1000); HAL_SPI_Receive(handle, bufp, len, 1000); HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET); return 0; } ``` 效果图如下 ![1779334176647](images/README/1779334176647.png) STM32编码风格:(我更推荐)**发两个收两个** ``` static int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp, uint16_t len){ uint8_t tx[2]={0X8F,0XFF}; uint8_t rx[2]={0}; HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(handle, tx, rx,2, 1000); HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET); return 0; } ``` 效果图如下 ![1779334265992](images/README/1779334265992.png) 结论:后者更体现全双工的特点 更好理解!SPI是全双工 发一个必定会收一个的! 额外说明 CLK波形 鼠标放在上面 上位机右上角展示的就是SPI的速率 都是18M (芯片手册是保证10M的 这里太猛了 成功了嘛) ![1779334397489](images/README/1779334397489.png) 新唐MCU测试 2M的SPI 源码:官方U32 ![1779334453900](images/README/1779334453900.png) 搞个视频和文章一起 搞懂4个模式 软件对比 分析仪设置对比 新唐MCU继续测试 修改U8 不要U32 (可以配置SPI寄存器位宽的)测试 也好!! ![1779334496659](images/README/1779334496659.png)