本项目是一个基于 STM32G031G8U 的仿生蝴蝶扑翼控制固件,实现了从 ELRS/CRSF 遥控接收、4 路磁编码器角度采集,到四路空心杯电机 PWM 驱动与 PID 闭环控制的完整链路。
当前工程使用 STM32 HAL + 裸机轮询调度方式实现,主要目标是完成仿生蝴蝶四翼机构的多模式扑翼控制与基础安全保护。
- 基于 USART1 + DMA + 空闲中断 接收并解析 ELRS/CRSF 遥控数据
- 基于 ADC1 + DMA 采集 4 路角度反馈信号
- 基于 TIM2 / TIM3 输出 4 路双向 PWM,驱动四个空心杯电机
- 基于位置式 PID 实现四路电机闭环角度控制
- 支持多种控制模式:
Mode 0:中立/复位模式Mode 1:姿态锁定模式Mode 2:扫描/扑翼模式
- 集成基础安全逻辑:
- 遥控信号丢失保护
- 编码器健康检测
- 电机堵转保护
- STM32G031G8U
- Cortex-M0+
- 64KB Flash
- 8KB SRAM
- 系统时钟:
HSI 16MHz + PLL = 64MHz
-
USART1
PB6-> TXPB7-> RX- 波特率:
420000 - 用于接收 ELRS 接收机 输出的 CRSF 数据
-
ADC1 + DMA
PA0 / PA1 / PA6 / PA7- 4 路角度采样输入
-
TIM2 PWM
PA15 / PB3 / PA2 / PA3- 对应 2 路电机双通道输出
-
TIM3 PWM
PB4 / PB5 / PB0 / PB1- 对应另外 2 路电机双通道输出
项目的主控制流程如下:
ELRS遥控器
-> ELRS接收机
-> USART1 CRSF数据解析
-> 通道映射
-> 目标角生成
-> ADC采集编码器角度
-> PID计算
-> TIM2/TIM3 PWM输出
-> 四路电机驱动扑翼机构
工程采用较直接的分层组织方式:
Core/
STM32CubeMX 生成的外设初始化代码
User/App/
业务控制逻辑
- motor_app.c
- encoder_app.c
- elrs_app.c
User/Driver/
设备驱动与控制底层
- motor_bsp.c
- encoder_bsp.c
- elrs_bsp.c
User/Module/
通用功能模块
- pid/
User/
调度器与公共头文件
- Scheduler.c
- Mydefine.h
-
User/Scheduler.c- 简单裸机周期调度器
- 当前以
10ms周期运行编码器采集与电机控制任务
-
User/Driver/elrs_bsp.c- CRSF 帧接收与通道解包
- 将遥控输入映射为
Yaw / Pitch / Roll / Mode / Switch等控制量
-
User/Driver/encoder_bsp.c- 4 路 ADC 采样
- 角度中点标定与归一化处理
- 编码器卡死/噪声等健康检测
-
User/Driver/motor_bsp.c- 四路位置式 PID
- 目标角就近展开
- 双通道 PWM 输出控制
-
User/App/motor_app.c- 扑翼模式逻辑
- 扫描轨迹生成
- 遥控失联保护、堵转保护联动
根据当前代码实现,主要使用以下通道:
| 通道 | 说明 | 当前用途 |
|---|---|---|
| CH1 | Yaw | 左右转向控制 |
| CH2 | midpoint | 中位微调 |
| CH3 | Pitch | 已解析,当前主要为预留量 |
| CH4 | Roll | 已解析,当前主要为预留量 |
| CH5 | Switch | 电机总使能 |
| CH6 | Mode | 模式切换 |
- Keil MDK-ARM
- 工程文件:
MDK-ARM/hudie_fly_01.uvprojx - CubeMX 配置文件:
hudie_fly_01.ioc
- 使用 Keil 打开
MDK-ARM/hudie_fly_01.uvprojx - 选择目标
hudie_fly_01 - 执行 Build
- 连接下载器后烧录到 STM32G031G8U
Core/和Drivers/目录主要为 CubeMX / HAL 生成代码MDK-ARM/hudie_fly_01/目录下大多是构建产物,如.axf、.o、.map、.hex
仓库内已包含若干说明文档,可配合源码阅读:
- 工程结构简单,便于快速调试
- 控制链路完整,适合做扑翼控制实验
- 已加入基础保护逻辑,便于联调和排障
- 当前为裸机周期调度,不是 RTOS 架构
- 遥控通道中
Pitch / Roll已解析,但现阶段未完全参与核心扑翼控制 - PID 参数、中点标定值与机构装配状态强相关,需要结合实物继续整定
如果后续上传到 GitHub,建议优先提交以下内容:
Core/Drivers/User/docs/MDK-ARM/*.uvprojxMDK-ARM/*.uvoptxMDK-ARM/startup_stm32g031xx.shudie_fly_01.ioc.mxproject
通常不建议提交:
MDK-ARM/hudie_fly_01/下的编译产物*.o*.d*.crf*.axf*.map*.htm*.hex