攀爬机器人的控制固件,起初用裸机写,后来由于常常死机且难以排查问题,于是用FreeRTOS重写了一遍,提高稳定性,保证运行时行为可控
硬件:
-
主控:STM32F407VET6
-
遥控接收:ELRS 链路(UART4,420000 波特率,DMA + 空闲中断)
-
舵机总线:SMSCL 协议(UART5,115200 波特率,DMA 发送)
-
上位机通信:USART2,115200 波特率,自定义协议
-
调试串口:USART1
-
夹爪控制:GPIO 输出
-
安全恢复:独立看门狗 IWDG
软件采用 FreeRTOS 多任务架构,任务之间用消息队列解耦。整体数据流向:
ELRS / 上位机输入 -> 控制状态仲裁 -> 动作决策 -> 舵机总线 / GPIO 输出 / debug输出
| 任务 | 职责 |
|---|---|
taskRcDecode |
等待 ELRS 帧就绪事件,解析 CRSF 通道数据 |
taskCtrlMode |
控制模式仲裁,判断是否遥控器接管,检测失联 |
taskUplink |
上位机协议处理,识别 ping/命令帧,返回 ACK |
taskMotion |
根据当前控制状态决定执行分支,驱动舵机和夹爪 |
taskServoBus |
从队列解析舵机命令,统一向舵机总线输出 |
taskWatchdog |
检查关键任务心跳,全部正常再喂狗 |
defaultTask |
调试引脚,接LED,系统正常运行时闪烁 |
中断遵循“快进快出”原则,
CRSF 帧,CRC-8(多项式 0xD5),16 路 11-bit 通道解包。解析后映射到一个全局结构体中,方便调用。
映射做了死区和分段映射,消除了摇杆零点漂移的影响,并且优化了在摇杆零点附近的操作精准度
固定 11 字节帧:
0xFF 0xFF|指令类型|夹爪ID|夹爪动作|舵机ID|舵机方向|舵机速度|0xAB 0xAB|CRC8
逐字节状态机解析,只接受通过校验的完整数据包,支持PING、COMMAND、ACK三种类型
遥控失联保护:处于遥控模式时,如果超时没有新帧,立即停止所有舵机,夹爪 GPIO 全部拉低
任务心跳监控:taskWatchdog 周期检查关键任务,只有全部健康才刷新 IWDG
优先级关系:失联保护 > 遥控器 > 上位机命令
工程用 STM32CubeMX 生成,使用Keil自带的Arm Compiler编译,也可以用Clion+Cmake+arm-none-eabi-gcc编译,OpenOCD下载。
Clion是稚晖君的方案,有更智能的代码提示:优雅の嵌入式开发