1. 项目背景与核心目标
去年夏天我在深圳华强北淘到一批STM32F405芯片,正好手头有闲置的无人机配件,于是萌生了复刻经典开源无人机项目的想法。这个项目不同于市面上常见的玩具级无人机,它需要实现完整的飞控算法、传感器融合和遥控通信功能,对硬件设计和软件调试都是不小的挑战。
我选择复刻的是基于STM32的无人机项目2.0版本,相比前代主要升级了以下几点:
- 采用更强大的STM32F405RG作为主控(168MHz主频,192KB RAM)
- 增加MPU6050+MS5611传感器组合实现6轴IMU+气压计
- 支持PPM/SBUS两种遥控信号输入方式
- 移植Cleanflight开源固件
提示:选择F4系列而非F1系列是因为需要浮点运算单元(FPU)来高效处理飞控算法,实测F405的运算速度比F103快3倍以上。
2. 硬件设计与关键组件选型
2.1 主控板电路设计
主控板采用四层PCB设计,关键部分包括:
-
电源管理电路
- 输入电压范围:2S-4S锂电(7.4V-16.8V)
- 采用MP2307DN降压芯片生成5V和3.3V
- 每路电源都配有LC滤波和TVS二极管保护
-
STM32最小系统
- 外部8MHz晶振+32.768kHz RTC晶振
- BOOT0/1引脚通过跳线帽设置
- SWD调试接口引出所有关键信号
-
传感器接口
- MPU6050通过I2C1连接(SCL/PB6, SDA/PB7)
- MS5611通过I2C2连接(SCL/PB10, SDA/PB11)
- 所有I2C线路都上拉4.7kΩ电阻
2.2 电机驱动方案
选用BLHeli_32电调配合2205无刷电机,配置要点:
- PWM频率设置为24kHz(高于人耳听觉范围)
- 启用双向DShot协议(DShot600)
- 电机转向通过BLHeliSuite软件配置
实测参数对比:
| 参数 | 普通PWM | OneShot125 | DShot300 | DShot600 |
|---|---|---|---|---|
| 响应延迟(ms) | 12 | 5 | 2 | 1 |
| 抗干扰性 | 差 | 一般 | 好 | 优秀 |
2.3 遥控接收机连接
支持两种接收模式:
-
PPM模式(PPM SUM)
- 接线:RC_IN引脚(PA8)
- 配置:50Hz刷新率,8通道
-
SBUS模式(反相信号)
- 接线:USART6_RX(PC7)
- 需要74HC14施密特触发器整形信号
注意:SBUS信号是反相逻辑,直接连接会导致无法解码,必须通过反相器或软件反相处理。
3. 软件环境搭建与固件移植
3.1 开发工具链配置
-
安装ARM GCC工具链
bash复制sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi -
配置OpenOCD调试环境
bash复制
openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg -
编译Cleanflight固件
makefile复制
make TARGET=STM32F405 make flash
3.2 关键参数配置
在CLI中设置的核心参数:
bash复制# 传感器配置
set acc_hardware = MPU6050
set baro_hardware = MS5611
set mag_hardware = NONE
# PID控制器参数
set pid_controller = MWREWRITE
set p_pitch = 40
set i_pitch = 30
set d_pitch = 23
set p_roll = 40
set i_roll = 30
set d_roll = 23
set p_yaw = 85
set i_yaw = 45
set d_yaw = 0
# 接收机配置
set serialrx_provider = SBUS
set sbus_inversion = ON
3.3 传感器校准流程
-
加速度计校准
- 将无人机水平放置在桌面上
- 在Cleanflight配置工具中点击"Calibrate Accelerometer"
- 依次完成6面旋转校准(各面停留2秒)
-
陀螺仪校准
- 保持无人机绝对静止
- 点击"Calibrate Gyro"
- 等待进度条完成(约10秒)
-
气压计校准
bash复制# 在CLI中执行 calibrate baro
4. 飞行测试与参数整定
4.1 基础测试步骤
-
电机转向测试
- 卸下螺旋桨
- 在电机标签中逐个测试电机转向
- 错误转向通过BLHeliSuite调整
-
遥控通道映射验证
- 检查每个通道的响应方向和范围
- 必要时调整rxrange参数:
bash复制
rxrange 0 1000 2000
-
首次离地测试
- 保持油门在最低位
- 缓慢推油门至约25%
- 观察无人机姿态调整反应
4.2 PID调参经验
通过多次实测总结的调参技巧:
-
P值(比例项)
- 太小:响应迟钝,修正缓慢
- 太大:产生振荡,电机过热
- 调试方法:每次增加5,观察悬停状态
-
I值(积分项)
- 消除稳态误差
- 风大时适当增加
- 典型值范围:20-50
-
D值(微分项)
- 抑制快速变化
- 值过高会导致电机噪声增大
- 建议从P值的50%开始调整
4.3 常见问题排查
-
无人机向左前方漂移
- 检查加速度计校准
- 确认重心位置是否居中
- 调整trim或微调PID
-
SBUS信号丢失
- 检查信号反相设置
- 测量RX引脚电压(应为3.3V)
- 尝试降低波特率
-
电机异常发热
- 检查PID参数是否过大
- 确认PWM频率设置正确
- 测试单个电机负载电流(正常约2A@50%油门)
5. 项目优化与扩展方向
5.1 硬件改进方案
-
增加GPS模块(Ublox M8N)
- 接线:USART3(PB10/PB11)
- 配置协议:NMEA 115200bps
-
添加OLED状态显示屏
- 使用I2C接口的0.96寸OLED
- 显示电压、姿态、GPS状态等信息
-
升级到STM32H743
- 主频提升至400MHz
- 支持双精度浮点运算
- 需重新设计电源电路
5.2 软件功能扩展
-
实现光流定点
- 添加PMW3901光流传感器
- 修改位置估计算法
- 配置参数:
bash复制set opflow_hardware = PMW3901 set opflow_scale = 110
-
添加数据黑匣子
- 使用SD卡存储飞行数据
- 配置采样率:
bash复制set blackbox_rate_num = 1 set blackbox_rate_denom = 1
-
移植Betaflight固件
- 更先进的PID控制器
- 支持动态滤波调整
- 需要调整引脚定义
这个项目最让我惊喜的是STM32F4的实时性能,在启用FPU和DSP指令集后,整个控制循环仅需150μs,这意味着我们可以实现8kHz的陀螺仪采样率。有个小技巧分享:在焊接MPU6050时,一定要先焊好接地引脚,否则容易因静电损坏传感器。