# AHRS **Repository Path**: harry1990/AHRS ## Basic Information - **Project Name**: AHRS - **Description**: STM32 的AHRS算法,加速度陀螺仪为MPU6050,地磁传感器为HMS5883 - **Primary Language**: C - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 49 - **Forks**: 15 - **Created**: 2015-04-06 - **Last Updated**: 2025-10-29 ## Categories & Tags **Categories**: hardware **Tags**: None ## README # AHRS - 姿态航向参考系统 ## 项目简介 AHRS(Attitude and Heading Reference System)是一个基于STM32F10x微控制器的姿态航向参考系统。该系统通过融合多个传感器数据,实现高精度的姿态测量和航向估计,适用于无人机、机器人、导航设备等应用场景。 ## 主要特性 - **多传感器融合**: 集成MPU6050六轴传感器、HMC5883L三轴磁力计和BMP085气压计 - **高级算法**: 采用DCM(方向余弦矩阵)算法和卡尔曼滤波进行姿态解算 - **传感器校准**: 支持加速度计和磁力计自动校准 - **实时通信**: 通过UART串口输出姿态数据和原始传感器数据 - **多种工作模式**: 支持传感器校准模式和正常运行模式 ## 硬件要求 ### 主控芯片 - STM32F10x系列微控制器(推荐STM32F103) - 工作频率: 72MHz(9倍PLL倍频) ### 传感器模块 - **MPU6050**: 六轴运动处理传感器 - 三轴陀螺仪 - 三轴加速度计 - I2C接口 - **HMC5883L**: 三轴数字磁罗盘 - 三轴磁力计 - I2C接口 - **BMP085**: 数字气压传感器 - 气压测量 - 温度测量 - I2C接口 ### 外设接口 - USART1: 串口通信,用于数据输出和命令接收 - I2C: 传感器通信接口 - GPIO: LED指示灯(LED1-LED4) ## 软件架构 ### 目录结构 ``` AHRS/ ├── Source/ # 源代码文件 │ ├── MPU6050.c/.h # MPU6050驱动 │ ├── hmc.c/.h # HMC5883L驱动 │ ├── bmp085.c/.h # BMP085驱动 │ ├── IIC.c/.h # I2C通信接口 │ ├── ins.c/.h # 惯性导航算法 │ ├── Matrix.c/.h # 矩阵运算库 │ ├── acc_comp.c/.h # 加速度计补偿 │ ├── System_Config.c/.h # 系统配置 │ └── stm32f10x_it.c # 中断处理 ├── Libraries/ # STM32标准外设库 │ ├── CMSIS/ # ARM Cortex-M3核心支持 │ └── STM32F10x_StdPeriph_Driver/ # STM32外设驱动 ├── Debug/ # 编译输出文件 ├── settings/ # IAR工程设置 └── main_ins.c # 主程序入口 ``` ### 核心模块 #### 1. 传感器驱动模块 - **MPU6050驱动**: 读取加速度和陀螺仪数据 - **HMC5883L驱动**: 读取磁场数据 - **BMP085驱动**: 读取气压和温度数据 #### 2. 算法模块 - **DCM算法**: 方向余弦矩阵姿态解算 - **卡尔曼滤波**: 传感器数据融合和滤波 - **矩阵运算**: 支持矩阵加减、乘法、转置、求逆等运算 #### 3. 校准模块 - **加速度计校准**: 多种补偿算法(acc_comp, acc_comp2, acc_comp3等) - **磁力计校准**: 磁场干扰补偿 - **陀螺仪校准**: 零偏校准 ## 编译与烧录 ### 开发环境 - **IDE**: IAR Embedded Workbench for ARM - **工程文件**: AHRS.eww(双击打开) ### 编译步骤 1. 打开IAR EWARM 2. 加载工程文件`AHRS.eww` 3. 选择Debug配置 4. 点击"Make"或按F7编译 ### 烧录 1. 连接ST-Link或J-Link调试器 2. 点击"Download and Debug"或按Ctrl+D 3. 程序将自动烧录到MCU ## 使用说明 ### 初始化流程 系统上电后,通过串口发送命令字节来选择工作模式: ```c // 在串口上发送命令 0x05 - 进入传感器校准模式 0x23 - 进入正常运行模式 ``` ### 工作模式 #### 1. 传感器校准模式(命令: 0x05) - 系统会持续输出原始传感器数据 - 输出格式: `ax ay az mx my mz\r\n` - 用于收集校准数据和验证传感器工作状态 #### 2. 正常运行模式(命令: 0x23) - 执行MPU6050校准 - 启动定时器中断 - 开始姿态解算 - 实时输出姿态角度(俯仰、横滚、航向) ### 串口通信 **通信参数**: - 波特率: 根据`USART1_Config`配置(需查看具体代码) - 数据位: 8位 - 停止位: 1位 - 校验位: 无 **数据格式**: - 运动数据: 包含加速度、角速度、磁场数据 - 姿态数据: 包含偏航角、俯仰角、横滚角、高度等 ### LED指示 系统提供4个LED指示灯(LED1-LED4)用于状态指示: - LED控制通过GPIO的PB8、PB9、PE0、PE1实现 - 可根据需要在代码中自定义LED指示功能 ## 算法说明 ### DCM算法 方向余弦矩阵(Direction Cosine Matrix)算法用于姿态解算: - 使用陀螺仪数据进行姿态更新 - 使用加速度计数据进行重力矢量修正 - 使用磁力计数据进行航向修正 ### 卡尔曼滤波 - 融合多个传感器数据 - 降低测量噪声影响 - 提供最优姿态估计 ### 矩阵运算 提供完整的矩阵运算库: - `MatrixMultiply`: 矩阵乘法 - `MatrixTranspose`: 矩阵转置 - `MatrixInverse`: 矩阵求逆 - `MatrixSub`: 矩阵减法 - `UD`: UD分解 ## 配置说明 ### 系统时钟 - 使用PLL 9倍频 - 系统时钟: 72MHz(8MHz外部晶振 × 9) ### I2C配置 传感器通过I2C接口连接: - MPU6050地址: 0x69 - HMC5883L地址: 0x1E - BMP085: I2C接口 ### 定时器配置 系统使用定时器中断进行周期性数据采集和处理。 ## 注意事项 1. **传感器安装**: 确保传感器坐标轴与载体坐标系对齐 2. **校准环境**: 校准时应在无磁干扰、静止的环境中进行 3. **电源稳定**: 确保供电稳定,避免电压波动影响传感器读数 4. **I2C上拉**: I2C总线需要外部上拉电阻(通常2.2kΩ-10kΩ) 5. **初始姿态**: 系统启动时应保持水平静止状态 ## 许可证 本项目采用开源许可证,详见[LICENSE](LICENSE)文件。 ## 参考资料 - [STM32F10x参考手册](https://www.st.com/resource/en/reference_manual/cd00171190.pdf) - [MPU6050数据手册](https://invensense.tdk.com/products/motion-tracking/6-axis/mpu-6050/) - [HMC5883L数据手册](https://cdn-shop.adafruit.com/datasheets/HMC5883L_3-Axis_Digital_Compass_IC.pdf) - [BMP085数据手册](https://cdn-shop.adafruit.com/datasheets/BMP085_DataSheet_Rev.1.0_01July2008.pdf) ## 贡献 欢迎提交Issue和Pull Request来改进本项目。 ## 联系方式 如有问题或建议,请通过GitHub Issues联系。 --- **最后更新**: 2025年10月