本文档用于整理原始修改要求,并将其与仓库当前已经落地的实现统一起来。
后续如果文档描述与代码不一致,以当前工程代码为准。
由于单颗 STM32F103C8T6 引脚资源不足,项目已经拆分为双主控结构:
firmware:主板固件,负责机械臂、尾部舵机、深度传感器、编码器,以及遥控接收和板间指令转发。firmware_quad:从板固件,负责头部推进、尾部 4 路推进、背部 4 路四旋翼电机,以及JY901SIMU 数据接收与姿态保持。
设计原则如下:
- 以
firmware为主控制板。 - 主要控制逻辑集中在
firmware。 firmware_quad以执行推进和姿态稳定为主。- 原始草稿中若存在引脚冲突、接口命名错乱或逻辑重复,已按当前代码实现整理。
| 固件目录 | 角色 | 当前职责 |
|---|---|---|
firmware/ |
主板 | 接收遥控帧、解析控制状态、控制机械臂与尾部舵机、读取 MS5837、读取 6 路 AS5600、通过 USART1 向从板转发控制帧 |
firmware_quad/ |
从板 | 接收主板控制帧、驱动头部推进电机、驱动尾部 4 路推进电机、驱动背部 4 路四旋翼电机、通过 USART2 接收 JY901S IMU 数据、执行简单姿态保持混控 |
当前通信已经分成两层:
USART2外部遥控输入仍然使用 7 字节离散按键帧。USART1主从板链路改为 10 字节控制量帧,主板负责把按键翻译成连续控制量后再下发给从板。
外部遥控帧格式如下:
| 字节下标 | 含义 | 备注 |
|---|---|---|
0 |
帧头 | 0xA5 |
1 |
key |
基础运动控制 |
2 |
Left_Move |
左臂动作字段 |
3 |
Right_Move |
右臂动作字段 |
4 |
hand_OC |
夹爪控制 |
5 |
Water_Control |
保留字段,当前仅解析并透传 |
6 |
帧尾 | 0x7B |
主从板控制量帧格式如下:
| 字节下标 | 含义 | 备注 |
|---|---|---|
0 |
帧头 | 0xA5 |
1 |
协议版本 | 当前为 0x01 |
2 |
序号 | 每帧自增 |
3 |
mode |
SAFE / STABILIZE |
4 |
surge |
前后控制量,范围 -100..100 |
5 |
yaw |
偏航控制量,范围 -100..100 |
6 |
heave |
升沉控制量,范围 -100..100 |
7 |
flags |
预留标志位 |
8 |
校验 | 对 1..7 字节做异或校验 |
9 |
帧尾 | 0x7B |
key 当前定义如下:
| 码值 | 动作 |
|---|---|
0x01 |
前进 |
0x02 |
后退 |
0x04 |
左移 / 左转语义复用 |
0x08 |
右移 / 右转语义复用 |
0x10 |
上升 |
0x20 |
下降 |
- 主板每
10 ms调用一次BoardLink_SendCommand()。 - 主板会把旧
key按键映射成surge / yaw / heave三轴控制量,支持组合输入。 - 从板每次主循环调用
BoardLink_Tick()。 - 从板超时阈值为
BOARD_LINK_TIMEOUT_TICKS = 25。 - 按当前循环周期估算,若约
250 ms未收到主板有效帧,从板会清空控制状态并执行Start()停机。
从板当前将运行状态明确分成 3 类:
SAFE:无运动指令,或者故障解除后等待重新进入安全态。STABILIZE:收到合法控制量,且板间通信正常、IMU 在线。FAULT:任一安全前提不满足,立即停机。
当前故障标志包括:
| 标志位 | 含义 |
|---|---|
0x01 |
主板链路丢失 |
0x02 |
IMU 离线但仍请求稳定控制 |
0x04 |
控制模式非法 |
恢复策略:
- 故障出现时,从板立即进入
FAULT并执行Start()。 FAULT不会在条件恢复后自动重新起转。- 只有当主板重新下发
SAFE命令且故障条件已经消失时,状态机才会退出FAULT。
从板不再使用 while(1) + delay_ms(10) 的阻塞循环,而是改为 TIM4 提供 1 ms 时基的软调度器:
| 任务 | 周期 | 作用 |
|---|---|---|
control |
10 ms (100 Hz) |
递增链路/IMU 看门狗,并执行推进与飞控输出 |
supervisor |
20 ms (50 Hz) |
拉取最新板间命令、更新在线状态、刷新运行状态机 |
status |
100 ms (10 Hz) |
刷新状态快照,给后续遥测/调试输出预留挂点 |
这样处理后:
- 主循环不再忙等阻塞。
- 主循环在无待处理任务时执行
__WFI(),等待下一次定时器或串口中断唤醒。 - 控制频率固定为
100 Hz。 - 监督逻辑和状态快照被显式拆分,后续增加遥测输出时可以直接挂在
status任务上。
从板会在 status 任务中以 10 Hz 生成状态遥测帧,经 USART1 发回主板;主板收到有效帧后会缓存最新状态,并原样从 USART2_TX 转发给外部上位机。
遥测帧格式如下:
| 字节下标 | 含义 | 备注 |
|---|---|---|
0 |
帧头 | 0x5A |
1 |
协议版本 | 当前为 0x01 |
2 |
序号 | 每帧自增 |
3 |
run_state |
SAFE / STABILIZE / FAULT |
4 |
fault_flags |
当前故障标志位 |
5 |
board_link_online |
主从链路在线状态 |
6 |
imu_online |
IMU 在线状态 |
7 |
control_mode |
当前控制模式 |
8 |
surge |
当前前后指令,范围 -100..100 |
9 |
yaw |
当前偏航指令,范围 -100..100 |
10 |
heave |
当前升沉指令,范围 -100..100 |
11 |
校验 | 对 1..10 字节做异或校验 |
12 |
帧尾 | 0xA7 |
| 定时器通道 | 引脚 | 当前用途 | 代码接口 |
|---|---|---|---|
TIM1_CH1 |
PA8 |
左夹爪 180 度舵机 | L_Claw() |
TIM1_CH2 |
PA9 |
左肘 180 度舵机 | L_Elbow() |
TIM1_CH3 |
PA10 |
左上臂 360 度连续旋转舵机 | L_Upper_360() |
TIM1_CH4 |
PA11 |
左下臂 360 度连续旋转舵机 | L_Lower_360() |
TIM2_CH1 |
PA0 |
右夹爪 180 度舵机 | R_Claw() |
TIM2_CH2 |
PA1 |
右肘 180 度舵机 | R_Elbow() |
TIM2_CH3 |
PB10 |
右上臂 360 度连续旋转舵机 | R_Upper_360() |
TIM2_CH4 |
PB11 |
右下臂 360 度连续旋转舵机 | R_Lower_360() |
TIM3_CH1 |
PA6 |
尾部上舵机 | Tail_Servo1() |
TIM3_CH2 |
PA7 |
尾部下舵机 | Tail_Servo2() |
说明:
TIM2使用PartialRemap2,因此CH3/CH4实际输出到PB10/PB11。- 当前主板共承担 10 路 PWM 输出,其中机械臂相关 8 路,尾部舵机 2 路。
| 外设 | 引脚 | 当前用途 |
|---|---|---|
USART2_TX |
PA2 |
上位机 / 遥控数据发送 |
USART2_RX |
PA3 |
上位机 / 遥控数据接收 |
USART1_TX |
PB6 |
发往从板的板间串口 |
USART1_RX |
PB7 |
板间串口接收预留 |
当前项目没有占用硬件 I2C,而是使用软件 I2C:
| 信号 | 引脚 | 用途 |
|---|---|---|
SCL |
PB4 |
MS5837 与 6 路 AS5600 共用时钟线 |
SDA0 |
PB3 |
默认软件 I2C 数据线,同时用于 MS5837 与第 1 路 AS5600 |
SDA1 |
PB12 |
第 2 路 AS5600 |
SDA2 |
PB13 |
第 3 路 AS5600 |
SDA3 |
PB14 |
第 4 路 AS5600 |
SDA4 |
PB15 |
第 5 路 AS5600 |
SDA5 |
PB5 |
第 6 路 AS5600 |
这种实现方式本质上是共享一根 SCL,为不同 AS5600 分配独立 SDA,从而避免地址冲突。
主板当前已经实现 6 路 AS5600 读取:
| 传感器编号 | 代码名 | 引脚总线 | 对应机构 |
|---|---|---|---|
0 |
left_arm_upper_360 |
PB4 + PB3 |
左上臂连续旋转关节 |
1 |
left_arm_lower_360 |
PB4 + PB12 |
左下臂连续旋转关节 |
2 |
right_arm_upper_360 |
PB4 + PB13 |
右上臂连续旋转关节 |
3 |
right_arm_lower_360 |
PB4 + PB14 |
右下臂连续旋转关节 |
4 |
tail_servo1 |
PB4 + PB15 |
尾部上舵机 Tail_Servo1() |
5 |
tail_servo2 |
PB4 + PB5 |
尾部下舵机 Tail_Servo2() |
| 模块 | 接口 | 当前状态 |
|---|---|---|
MS5837 压力 / 水深传感器 |
软件 I2C,默认总线 PB4 + PB3 |
已初始化并可读取压力、温度、水深数据 |
主板在 main.c 中执行以下流程:
- 初始化 GPIO、PWM、双串口、
MS5837、全部AS5600。 - 每个循环周期刷新 6 路
AS5600状态。 - 根据控制帧判断是否执行基础运动或机械臂动作。
- 将当前控制帧通过
USART1转发给从板。
当前代码中的几个重要事实:
key == 0x00 && hand_OC == 0x00 && Left_Move == 0x00 && Right_Move == 0x00时,主板认为系统空闲,执行Start()。hand_OC负责左 / 右夹爪打开动作。Left_Move和Right_Move负责左右机械臂展开动作。Water_Control当前仍会被主板解析并透传到从板,但主板主循环未对该字段执行本地动作。
原始草稿中该部分存在明显冲突,例如将 PA8 重复分配给两个外设。根据当前代码,正确映射如下:
| 定时器通道 | 引脚 | 当前用途 | 代码接口 |
|---|---|---|---|
TIM3_CH4 |
PB1 |
头部推进电机 | HeadMotor() |
TIM1_CH1 |
PA8 |
背部左上四旋翼电机 | Quad_LeftUpper() |
TIM1_CH2 |
PA9 |
背部右上四旋翼电机 | Quad_RightUpper() |
TIM1_CH3 |
PA10 |
背部左下四旋翼电机 | Quad_LeftLower() |
TIM1_CH4 |
PA11 |
背部右下四旋翼电机 | Quad_RightLower() |
TIM2_CH1 |
PA0 |
尾部推进电机 1 | Tail_Motor1() |
TIM2_CH2 |
PA1 |
尾部推进电机 2 | Tail_Motor2() |
TIM2_CH3 |
PB10 |
尾部推进电机 3 | Tail_Motor3() |
TIM2_CH4 |
PB11 |
尾部推进电机 4 | Tail_Motor4() |
说明:
TIM2同样使用PartialRemap2。PB1才是当前头部推进电机的真实输出引脚,不是PA8。PB0未在当前从板实现中使用。
| 外设 | 引脚 | 当前用途 |
|---|---|---|
USART1_TX |
PB6 |
板间串口发送 |
USART1_RX |
PB7 |
板间串口接收主板控制帧 |
USART2_TX |
PA2 |
与 JY901S 的串口通信 |
USART2_RX |
PA3 |
接收 JY901S 数据 |
| 模块 | 接口 | 当前状态 |
|---|---|---|
JY901S IMU |
USART2 |
已实现 11 字节数据帧解析,可输出 roll / pitch / yaw 与三轴角速度,并带在线检测 |
当前从板会在接收 0x55 0x52 / 0x53 数据帧后更新陀螺与姿态缓存,飞控以此执行低算力闭环控制。
从板的实际职责比原始草稿更清晰,当前逻辑如下:
- 若板间链路离线,则清空状态并停机。
- 若
key == 0x00,则执行Start()。 - 若收到有效控制帧,则只根据
key执行推进 / 姿态动作。
对应行为:
key |
从板行为 |
|---|---|
Front |
4 个尾部推进电机沿 +X 方向推进 |
Back |
4 个尾部推进电机沿 -X 方向推进 |
Left |
头部推进电机执行目标偏航角速度,释放后保持当前航向 |
Right |
头部推进电机执行目标偏航角速度,释放后保持当前航向 |
Up |
背部四旋翼输出向上推力,同时维持姿态稳定 |
Down |
背部四旋翼输出向下推力,同时维持姿态稳定 |
当前从板飞控的实现要点:
- 固定
10 ms主循环,适配STM32F103C8T6,不引入重型滤波或矩阵运算。 roll / pitch使用角度外环 + 角速度内环的轻量级闭环。yaw使用航向保持 + 角速度控制,驱动头部推进电机完成偏航。- 四旋翼电机始终通过混控分配姿态修正量,
Front / Back时尾推进与姿态稳定可同时工作。 - 若
JY901S数据超时,则自动退化到开环输出,避免闭环使用陈旧姿态数据。
本次整理后,可以将原始要求概括为以下稳定结论:
- 双板方案已经确定,并且已经在代码中落地。
firmware是主控中心,firmware_quad是推进与四旋翼执行板。- 主板负责机械臂、尾部舵机、编码器、水深传感器,以及指令分发。
- 从板负责头部推进、尾部推进、背部四旋翼和 IMU 姿态修正。
- 原始文档中最容易引起误解的从板引脚表已经修正,特别是头部推进电机应为
PB1。 - 当前协议中
Water_Control仍作为保留字节透传,但不再绑定本地执行机构。
如果后面继续迭代,建议优先做以下整理:
- 若后续需要扩展控制协议,优先明确
Water_Control的后续用途,避免新增语义继续挤占现有字段。 - 为主板和从板分别补充正式的引脚图或原理图标注。
- 将
codex.md保持为“设计约束与实现说明”,不要再混入临时聊天式修改要求。
本整理主要依据以下文件:
firmware/BSP/GPIO.cfirmware/BSP/timer.cfirmware/HARDWARE/Servo.cfirmware/HARDWARE/AS5600.cfirmware/HARDWARE/MS5837.cfirmware/SYSTEM/usart/usart.cfirmware/USER/main.cfirmware_quad/BSP/GPIO.cfirmware_quad/BSP/timer.cfirmware_quad/HARDWARE/Servo.cfirmware_quad/HARDWARE/JY901S.cfirmware_quad/SYSTEM/usart/usart.cfirmware_quad/USER/main.c