遥操作主臂双链路通信实时性实践:UART 2M + CAN 1M 达妙七轴 500 Hz
一、结论
| 链路 | 角色 | 介质 / 速率 | 节拍 |
|---|---|---|---|
| 关节侧 | MCU ↔ 7×达妙电机 | CAN 1 Mbps,标准帧 MIT | 每周期逐轴问询 |
| 上层 | MCU ↔ 上位机 | UART 2 Mbps,多轴 MIT 打包帧 | 与关节侧同频 |
| 整机对齐 | 控制 / 反馈 | 应用层统一节拍 | 500 Hz(2 ms) |
一句话: 实时性不靠「所有层都拉到 1 kHz」,而靠 关节 CAN 与上层 UART 共用同一 2 ms 节拍;瓶颈在 CAN 1M 的七轴问询,不在 UART,也不在 MCU 主频本身。
二、系统怎么分层
┌─────────────────┐ UART 2 Mbps ┌──────────────────┐
│ 上位机 / Orin │ ◄──────────────────► │ 先楫 MCU │
│ 多轴 MIT 打包 │ 一帧含 7 轴控制/反馈 │ 汇聚 · 定周期 │
└─────────────────┘ └────────┬─────────┘
│ CAN 1 Mbps
┌────────────────────────┼────────────────────────┐
▼ ▼ ▼
达妙轴1 达妙轴2 … 达妙轴7
(MIT 控制帧) (问询触发反馈) (状态帧回传)
2.1 为什么要两段链路
- 关节侧要对接电机厂协议:达妙默认 CAN 1M、8 字节 MIT,反馈多为问询式(发命令帧 → 电机回状态帧)。
- 上层要稳定、少抖动的「整臂视角」:不适合把 14 路 CAN 帧直接暴露给 Linux/ROS;由 MCU 收齐再打包,上位机每拍只处理一帧多轴 MIT。
两段各干各的:CAN 保证电机交互;UART 保证整臂接口简洁。
2.2 一周期里 MCU 做什么
典型 2 ms 内顺序大致是:
- 按轴发送达妙 MIT 控制帧(CAN ID = 电机 ID)
- 接收对应反馈帧(位置 / 速度 / 力矩 / 温度等)
- 组装上层协议的多轴控制或反馈载荷
- 经 UART 与上位机完成该拍的收发
信令类事务(设频、清错、查丢包等)若插入,会占用该拍的定频槽位,需在协议里约定优先级,避免和 MIT 定频帧抢同一周期。
三、达妙电机侧:CAN 1M
3.1 协议特征(与实时性相关的部分)
- 波特率:1 Mbps(可配,工程常用默认 1M)
- 帧格式:标准 CAN,数据域 固定 8 字节
- MIT 控制:位置 / 速度 / Kp / Kd / 前馈力矩等位域打包进 8 字节
- 反馈:收到匹配 CAN ID 的控制帧后,回传状态帧(问询式)
因此 7 轴、双向问询 时,一拍在总线上大约是:
7(命令)+ 7(反馈)= 14 帧
3.2 带宽粗算
经典 CAN、8 字节数据帧,单帧占用大约 0.11~0.13 ms 量级(含仲裁与开销;最坏填充会再差一点)。
| 估算 | 14 帧占用 | 相对 2 ms(500 Hz) |
|---|---|---|
| 偏乐观 ~0.11 ms/帧 | ~1.5 ms | 仍有余量 |
| 常用 ~0.12 ms/帧 | ~1.7 ms | 紧,但可工程化 |
| 偏悲观 ~0.15 ms/帧 | ~2.1 ms | 理论上贴边或溢出 |
工程含义:
- 500 Hz:与「7 轴单总线达妙问询」是匹配的甜点区——紧,但留得出 MCU 打包和 UART 上报的缝。
- 1 kHz(1 ms):同样约 1.7 ms 的总线活,在单路 CAN 1M、七轴全问询下往往装不下;要上更高带宽(如 CAN-FD)、拆总线或减每拍交互量。
所以 500 Hz 不是「随便选的数字」,而是 电机协议形态 + 轴数 + 波特率 共同约束下的结果。
四、上层 UART 2M
上位机与 MCU 之间用专用帧:
- 物理:TTL UART,工程实现波特率 2 Mbps
- 定频:多轴 MIT 控制帧 / 反馈帧 按同一
feedback_rate对齐 - 设频范围在协议层可到 10~500 Hz,工程配置取 500
载荷量级:单轴控制约十余字节、反馈约十余字节,7 轴打进一帧后,即便加上帧头与校验,双向合计也只在 数百 kbps 量级,相对 2 Mbps 很宽裕。
因此:
- UART 负责 整臂接口与节拍对齐
- 实时性压力主要落在 CAN 侧 14 帧/拍,而不是串口打不满
实现上注意:主机侧发送周期与 MCU 反馈周期一致;一拍内信令与定频 MIT 互斥,避免同拍叠帧导致节拍漂移。
五、500 Hz 对齐
容易混淆的三个「频率」:
| 名称 | 含义 | 本方案取值 |
|---|---|---|
| 电机总线交互 | CAN 上完成 7 轴问询的闭环 | 落在 2 ms 窗内 |
| MCU↔上位机 | UART 定频 MIT 打包 | 500 Hz |
| 上层控制线程 | 订阅状态、算命令、再下发 | 与上同频对齐 |
原则:
- 同频:控制下发与状态上报同一节拍,减少排队与相位差。
- 定周期:MCU 用定时器硬节拍驱动 CAN 轮询,避免「主循环跑多快算多快」。
- 超时与保护:达妙侧有通信丢失保护;上层协议可查丢包;丢一拍不应拖垮后续拍。
- 观测:除了「配置写成 500」,还要看周期抖动、总线负载感、丢包率——实时性以实测为准。
六、先楫 MCU
在这种架构里,MCU 不是「简单透传」,而是实时边界上的 汇聚与隔离:
| 职责 | 说明 |
|---|---|
| 协议适配 | 达妙 CAN MIT ↔ 上层多轴 MIT 帧 |
| 节拍主时钟 | 2 ms 内完成轮询 + 打包 + 串口 |
| 故障收敛 | 单轴离线 / 过温 / 通信丢失 → 统一状态与保护 |
| 卸载上位机 | Linux/ROS 不直接啃 14 帧/拍的 CAN 细节 |
算力上,先楫类 Cortex-M 做 500 Hz 的打包与状态机足够;真正要设计的是 CAN 负载、中断与 DMA、临界区长度,而不是「主频能不能到 500 Hz」。
七、工程上容易踩的坑
-
只改上层频率、不改电机侧调度
UART 设成 500,CAN 仍按松散轮询,会出现「上报 500、关节数据陈旧」。 -
信令挤占定频拍
设零、清错、查丢包与 MIT 同拍互斥;频繁信令会制造周期性「缺控 / 缺反馈」。 -
按最坏填充位做设计,却不做实测
纸面可能判死刑;应用层要结合示波器 / 逻辑分析仪 / 丢包统计看真实余量。 -
把厂宣「总线能力 1 ms」当成应用层必须 1 kHz
达妙调试工具可以设 1 ms 连发,那是单电机或轻负载场景的能力展示;七轴单总线要单独算账。 -
文档与实现不一致
以代码与配置为准核对波特率(例如上层是 2M 还是其它),避免联调各说各话。
八、可复用的设计清单
若要复现类似「多轴电机 + MCU 汇聚 + 上位机」的实时链路,建议立项时先写清:
九、小结
这套主臂通信实时性的核心不是堆更高的标称频率,而是:
- 关节侧用 CAN 1M 按达妙 MIT 问询 7 轴;
- MCU在 2 ms 内收齐并打包;
- 上层用 UART 2M 以多轴 MIT 与上位机 500 Hz 对齐。
- 如果与上位机硬件通信口后续改为 EtherCAT 过程数据按周期交换,有 CRC、状态机(如 OP)、看门狗,比裸 UART 流式拆帧更不容易静默坏数据
确定性更好,少很多半帧、粘包、校验偶发失败类问题。
在七轴、单总线、问询式反馈的约束下,500 Hz 是算得清、跑得通的工程点;链路分层让上位机保持整臂接口,把实时压力关在 MCU 与 CAN 这一侧消化。

浙公网安备 33010602011771号