基于 STM32 的自主开发四旋翼无人机飞行控制系统,支持姿态自稳、气压计定高、无线遥控等功能。
本项目共经历了三代硬件迭代,从使用开源固件到完全自主开发飞控软件:
| 版本 | MCU | 固件方案 | 状态 |
|---|---|---|---|
| 第一版 | STM32H743VIT6 | APM 开源固件 | 已完成 |
| 第二版 | STM32H743VIT6 | APM 开源固件 | 已完成 |
| 第三版 | STM32F103C8T6 | 自主开发飞控 | 进行中 |
- MCU: STM32H743VIT6 (ARM Cortex-M7, 400MHz, 2MB Flash)
- 固件:APM (ArduPilot) 开源飞控固件
- 状态:已完成打板焊接,成功烧录 APM 固件并实现飞控链接
- 地面站界面:[APM 固件页面](Demo/APM 固件页面.png)
- MCU: STM32F103C8T6 (ARM Cortex-M3, 72MHz, 64KB Flash)
- 固件:自主开发飞控软件 (基于 FreeRTOS)
- 状态:PCB 已下单 (因春节假期尚未发货),元器件已备齐,固件已编写完成待调试
- 设计思路:从使用开源固件转向自主开发,旨在深入理解飞控系统的核心算法,包括姿态解算、PID 控制、传感器融合等关键技术
第一版分电板
第二版分电板
第一版飞控板
第二版飞控板
第三版飞控板
- 姿态自稳飞行:MPU6050 六轴传感器,四元数姿态解算
- 气压计定高:SPL06-001 高精度气压计,高度测量精度 ±0.5m
- 无线遥控:nRF24L01 2.4GHz 无线模块,ANO_DT 通讯协议
- LED 状态指示:连接状态、飞行状态可视化
- 蜂鸣器提示:解锁、模式切换、失控报警音频反馈
- 电机控制:4 路 PWM 输出,支持好盈天行者 40A 电调
| 模式 | 说明 | 进入条件 |
|---|---|---|
| IDLE | 怠速/未解锁 | 上电默认状态 |
| NORMAL | 姿态自稳模式 | 解锁成功后进入 |
| FIX_HEIGHT | 定高模式 | AUX1 < 1450 或 AUX1 > 1550 |
| FAIL | 失控保护 | 遥控器失联 |
- 油门摇杆推到最大 (≥1900) 保持 1 秒
- 油门摇杆拉到最小 (≤1100) 保持 1 秒
- 解锁完成,电机怠速旋转,蜂鸣器长鸣提示
- 油门 (右摇杆) 推到最下
- 长按校准按键直到灯光闪烁
- 重复一次
| 通道 | 摇杆/按键 | 范围 | 说明 |
|---|---|---|---|
| THR (油门) | 右摇杆上下 | 1000-2000 | 控制飞行器高度 |
| YAW (偏航) | 右摇杆左右 | 1000-2000 | 控制飞行器旋转 |
| PIT (俯仰) | 左摇杆上下 | 1000-2000 | 控制飞行器前后 |
| ROL (横滚) | 左摇杆左右 | 1000-2000 | 控制飞行器左右 |
| 按键 | 功能 | 说明 |
|---|---|---|
| 前按键 | PIT +10 | 俯仰通道增加 10 |
| 后按键 | PIT -10 | 俯仰通道减少 10 |
| 左按键 | AUX1 +10 | 辅助通道 1 增加 10 |
| 右按键 | AUX1 -10 | 辅助通道 1 减少 10 |
graph TB
subgraph FreeRTOS["FreeRTOS 实时操作系统"]
F["flight_task (6ms/优先级 3)
MPU6050 读取、姿态解算、PID 计算、电机输出"]
C["com_task (6ms/优先级 2)
nRF24L01 接收、ANO_DT 协议、解锁逻辑、状态机"]
L["led_task (100ms/优先级 1)
LED1/2 连接指示、LED3/4 状态指示"]
B["baro_task (24ms/优先级 2)
SPL06-001 读取、高度计算、定高 PID"]
end
drone/
├── SoftWare/
│ ├── Flight_Control/ # 飞控固件 (STM32F103)
│ │ ├── Application/ # 应用层 (飞行控制、遥控接收)
│ │ ├── common/ # 通用算法 (PID、滤波、姿态解算)
│ │ ├── interface/ # 硬件驱动层 (电机、传感器、LED)
│ │ ├── Core/ # HAL 库
│ │ ├── FreeRTOS/ # 实时操作系统
│ │ └── doc/ # 技术文档
│ ├── Remoter_Control/ # 遥控器固件
│ ├── Test/ # 测试程序
│ └── 开源飞控/ # 参考资料 (APM/Pixhawk)
├── Hardware/
│ ├── 第一版/ # 初版原理图/PCB
│ ├── 第二版/ # 当前版本
│ ├── 第三版/ # 改进版本
│ └── datasheet/ # 元器件数据手册
├── Demo/ # 演示图片与视频
├── 机架/ # 机架相关资料
└── Learning/ # 学习资料
flowchart TD
RC["遥控器 TX"] --> NRF["nRF24L01 RX"]
NRF --> COM["com_task
解析 ANO_DT 协议"]
COM --> RCDATA["rc_data 全局数据"]
RCDATA --> FT["flight_task
6ms 周期"]
RCDATA --> SM["状态机处理
解锁/模式"]
RCDATA --> BT["baro_task
24ms 周期"]
FT --> MPU["MPU6050 读取"]
MPU --> QUAT["四元数姿态解算"]
QUAT --> MIX["电机混合控制输出"]
SM --> LED["LED/蜂鸣器指示"]
BT --> SPL["SPL06 高度"]
SPL --> HPID["定高 PID 输出"]
QUAT --> MIX
HPID --> MIX
MIX --> PWM["TIMx PWM"]
PWM --> ESC["电调"]
ESC --> MOTOR["电机"]
| 任务 | 周期 | 优先级 | 功能 |
|---|---|---|---|
| flight_task | 6ms | 3 | MPU6050 读取、姿态解算、PID 计算、电机输出 |
| com_task | 6ms | 2 | nRF24L01 接收、ANO_DT 协议解析、解锁逻辑、状态机 |
| led_task | 100ms | 1 | LED1/2 连接指示、LED3/4 状态指示 |
| baro_task | 24ms | 2 | SPL06-001 读取、高度计算、定高 PID |
| 模块 | 文件 | 功能 |
|---|---|---|
| 飞行控制 | Application/App_flight.c | 姿态解算、PID 控制、电机混合 |
| 遥控接收 | Application/App_receive_data.c | nRF24L01 驱动、ANO_DT 协议、状态机 |
| 任务调度 | Application/App_freeRTOS_Task.c | FreeRTOS 任务创建与调度 |
| PID 算法 | common/Com_pid.c | 增量式 PID 控制器 |
| 滤波算法 | common/Com_filter.c | 低通滤波、卡尔曼滤波 |
| 姿态解算 | common/Com_imu.c | 四元数姿态解算 |
| 电机驱动 | interface/Int_motor.c | TIMx PWM 输出、电调控制 |
| 传感器驱动 | interface/Int_mpu6050.c, Int_spl06.c | I2C 传感器驱动 |
| 无线驱动 | interface/Int_nRF24L01.c | SPI 无线模块驱动 |
| 指示驱动 | interface/Int_led.c, Int_buzzer.c | LED、蜂鸣器控制 |
飞控采用串级 PID控制,外环控制角度,内环控制角速度:
期望角度 → [角度 PID] → 期望角速度 → [角速度 PID] → 电机输出
| 控制环 | 参数 | kp | ki | kd | 说明 |
|---|---|---|---|---|---|
| 俯仰角 | pitch_pid | -7.00 | 0.00 | 0.00 | 外环 - 角度控制 |
| gyro_y_pid | 3.00 | 0.00 | 0.50 | 内环 - 角速度控制 | |
| 横滚角 | roll_pid | -7.00 | 0.00 | 0.00 | 外环 - 角度控制 |
| gyro_x_pid | 3.00 | 0.00 | 0.50 | 内环 - 角速度控制 | |
| 偏航角 | yaw_pid | -3.00 | 0.00 | 0.00 | 外环 - 角度控制 |
| gyro_z_pid | -5.00 | 0.00 | 0.00 | 内环 - 角速度控制 | |
| 定高 | height_pid | -0.60 | 0.00 | -0.20 | 气压计高度控制 |
-
先调内环(角速度环):
- 逐步增大
kd直到响应快速且无超调 - 如有静差可加入少量
ki
- 逐步增大
-
再调外环(角度环):
- 逐步增大
kp直到响应迅速 - 一般不需要
ki和kd
- 逐步增大
-
定高 PID:
- 先调
kp使高度跟踪响应快速 - 加入
kd抑制超调
- 先调
注意:参数符号与电机混合控制公式相关,修改时需注意方向
stateDiagram-v2
[*] --> 上电
上电 --> IDLE
IDLE --> NORMAL: 解锁成功<br/>(油门最大 1 秒→最小 1 秒)<br/>长蜂鸣
NORMAL --> IDLE: 失控恢复
NORMAL --> FIX_HEIGHT: AUX1<1450 或>1550<br/>进入定高<br/>双蜂鸣
FIX_HEIGHT --> NORMAL: 1450≤AUX1≤1550<br/>退出定高<br/>单短蜂鸣
NORMAL --> FAIL: 失控<br/>(连续失联>300ms)
FIX_HEIGHT --> FAIL: 失控<br/>(连续失联>300ms)
FAIL --> IDLE: 系统重置
note right of FAIL
连续报警
每 500ms 一次
end note
| 切换 | 条件 | 蜂鸣器反馈 |
|---|---|---|
| IDLE → NORMAL | 油门最大 (≥1900) 保持 1 秒 → 最小 (≤1100) 保持 1 秒 | 长蜂鸣 (500ms) |
| NORMAL → FIX_HEIGHT | AUX1 < 1450 或 AUX1 > 1550 | 双蜂鸣 (2×100ms) |
| FIX_HEIGHT → NORMAL | 1450 ≤ AUX1 ≤ 1550 | 单短蜂鸣 (100ms) |
| ANY → FAIL | 遥控器连续失联超过 300ms | 连续报警 (每 500ms 一次) |
| FAIL → IDLE | 系统重置 | 无 |
| 组件 | 型号 | 说明 |
|---|---|---|
| MCU | STM32F103C8T6 | ARM Cortex-M3, 72MHz, 64KB Flash |
| IMU | MPU6050 | 6 轴陀螺仪 + 加速度计,I2C1 接口 |
| 气压计 | SPL06-001 | 高精度气压/温度传感器,I2C2 接口 |
| 无线 | nRF24L01 | 2.4GHz 无线收发,SPI1 接口 |
| 电调 | 好盈天行者 40A | 支持 2-6S 锂电池,PWM 信号控制 |
flowchart TB
subgraph 机架 ["X 型四旋翼布局"]
direction TB
M1["M1 左上前 - TIM3_CH1 (PA6) - 逆时针 CCW"]
M3["M3 右上前 - TIM2_CH2 (PA1) - 顺时针 CW"]
M2["M2 左下前 - TIM4_CH4 (PB9) - 顺时针 CW"]
M4["M4 右下前 - TIM1_CH3 (PA8) - 逆时针 CCW"]
end
Front[前方] -.-> M1
Front -.-> M3
M1 --- M2
M3 --- M4
LJI X500-X4机架
| 组件 | 型号 | 参数 |
|---|---|---|
| 电机 | 朗宇2212 无刷电机 | 920KV, 1000W 最大功率 |
| 电调 | 好盈天行者 30A | 2-6S LiPo, 持续 30A |
| 螺旋桨 | 1147 桨 | 正反桨配对 |
| 电池 | 3S LiPo | 11.1V, 2200mAh, 25C |
| 机架商品图 | 机架实物图 |
|---|---|
![]() |
![]() |
更多机架图片见 机架/商品图/ 和 机架/实物图/ 目录。
flowchart LR
subgraph 飞控板 ["飞控板 LED 布局"]
direction TB
subgraph 前部 ["前部 - 连接状态"]
LED1[LED1]
LED2[LED2]
end
subgraph 后部 ["后部 - 飞行状态"]
LED3[LED3]
LED4[LED4]
end
end
Front[前方] -.-> 前部
后部 -.-> Rear[后方]
| 状态 | LED1/2 (前) | LED3/4 (后) | 蜂鸣器 |
|---|---|---|---|
| IDLE | 连接时常亮 | 慢闪 (500ms 周期) | 无声 |
| NORMAL | 常亮 | 快闪 (200ms 周期) | 解锁时长鸣 |
| FIX_HEIGHT | 常亮 | 常亮 | 进出时提示音 |
| FAIL | 熄灭 | 熄灭 | 连续报警 |
详细状态说明见 系统状态说明
- 连接 3S 锂电池,蜂鸣器短鸣提示上电
- 观察 LED 状态,等待 LED1/2 常亮 (遥控器连接成功)
- 执行解锁流程 (油门最大 1 秒 → 最小 1 秒)
- 蜂鸣器长鸣表示解锁成功,电机怠速旋转
通过 UART2 (PA2/PA3) 输出调试信息,波特率 115200:
================================
Flight Control System Started
================================
MCU: STM32F103C8T6 @ 72MHz
FreeRTOS Heap: 3072 bytes
Sensors: MPU6050 (I2C1), SPL06 (I2C2)
================================
Flight: UNLOCKED
Flight: FIX_HEIGHT, alt=12 m
| 文档 | 说明 |
|---|---|
| 飞控系统 README | 飞控固件详细说明 |
| 系统状态说明 | 状态切换逻辑和指示说明 |
| ANO_DT 通讯协议 | 无线通讯协议文档 |














