Robotics - Emedding 2
| 类型 | 方向 | 能否同时发送 |
|---|---|---|
| 单工 | 只能单向 | 不适用 |
| 半双工 | 可以双向 | 不能,必须轮流 |
| 全双工 | 可以双向 | 可以同时进行 |
单工 Simplex
只能往一个方向传输:
遥控器 ─────→ 玩具
玩具不能通过同一条通信方式回复遥控器。
半双工 Half-duplex
两个方向都可以通信,但必须轮流:
电脑 ─────→ 舵机:移动到 120°
电脑 ←───── 舵机:当前位置 118°
类似对讲机:
A 按下说话 → B 听
A 松开以后 ← B 才能说
SO-ARM 的总线舵机通常使用半双工,因为发送和接收共用一根 DATA 线:
时间 ─────────────────────────→
电脑发送命令 │ 停止 │ 舵机回复
████████████ │ │ ████████
如果电脑和舵机同时发送,信号就可能发生冲突。
全双工 Full-duplex
双方可以同时发送和接收:
电脑 TX ─────→ 设备 RX
电脑 RX ←───── 设备 TX
类似打电话,双方可以同时讲话和听到对方。
普通 UART 经常使用两条独立信号线:
- TX:发送线
- RX:接收线
因此可以全双工。
而 Bus Servo Adapter 会把 UART 的 TX 和 RX 转换成一根共享的 DATA 线:
USB-UART 芯片 舵机总线
TX ─┐
├── 方向控制 ─── DATA
RX ─┘
所以它变成半双工:
发送命令 → 切换线路方向 → 等待舵机回复
最简洁的记法是:
半双工:双向,但轮流。
全双工:双向,而且可以同时。
Q:Bus Servo Adapter 是一个标准件吗?
A:它有两个层面的答案:
作为“可以买到的现成模块”,它是标准件;
作为“各品牌都能互换的统一标准”,它不是标准件。
SO-ARM 常用的 Waveshare Bus Servo Adapter (A) 是一块现成商品,不需要自己设计 PCB,因此在 BOM 中可以当作通用采购件。
但不同厂商的总线舵机并没有完全统一,下面这些可能不同:
- 通信协议;
- 电气接口;
- 工作电压;
- 接口针脚顺序;
- 波特率;
- 最大供电电流;
- 舵机地址范围。
例如:
| 系统 | 常见接口/协议 |
|---|---|
| Feetech STS3215 | 单线半双工 TTL、Feetech 协议 |
| FashionStar 舵机 | UART 总线、FashionStar 协议 |
| Dynamixel TTL | 单线半双工 TTL、Dynamixel 协议 |
| Dynamixel RS-485 | 差分 RS-485、Dynamixel 协议 |
| CAN 关节电机 | CAN 总线和厂商协议 |
即使接口看起来都是三根线:
- 电源
- GND
- DATA
也不能直接认为可以互换,因为针脚顺序、电压和协议可能不同。
选择替代板时需要核对六项:
- 舵机型号:例如 STS3215。
- 协议:是否支持 Feetech/SCServo 协议。
- 物理层:单线 TTL、双线 UART,还是 RS-485/CAN。
- 电源电压:5V、7.4V 或 12V。
- 接口针序:V+ / GND / DATA 的排列。
- 电流能力:是否能承受六个舵机同时动作或堵转的峰值电流。
另外,普通 USB-UART 模块不能自动替代 Bus Servo Adapter:
普通 USB-UART:
- TX、RX、GND
- 通常没有舵机电源分配
Bus Servo Adapter:
- TX/RX → 半双工 DATA
- 外部电源 → 多个舵机
- 带方向控制和一定的电源保护
所以对 SO-ARM 来说,最稳妥的是使用官方 BOM 指定的 Waveshare Bus Servo Adapter (A);之后如果要自行设计 SO-ARM 主板,再把它拆解为“USB-UART、半双工转换、电源输入、保护和舵机接口”几个电路模块。
这些基本上设计的时候,都是去买标准件,很少自己开发,对吧?
对。尤其在原型阶段,大部分都是购买现成标准件,再把它们组合成系统。
以 SO-ARM 为例:
| 组件 | 方式 |
|---|---|
| Mac/Orin | 现成计算平台 |
| Bus Servo Adapter | 现成转接板 |
| STS3215 | 现成智能舵机 |
| 5V/12V 电源 | 现成电源 |
| USB/舵机线缆 | 现成线束 |
| 3D 打印结构件 | 自定义机械结构 |
| LeRobot 软件 | 开源软件集成 |
开发重点是系统集成,而不是重新制造每个零件。
原型阶段
通常优先采购:
- MCU 开发板;
- USB-UART/CAN 转接板;
- 电机驱动模块;
- 智能舵机;
- 稳压模块;
- 摄像头和传感器;
- 标准电源;
- 接插件和线束。
这样可以快速验证:
- 机械结构能不能动
- 控制协议是否正确
- 电流是否足够
- 软件是否跑通
- 传感器是否满足需求
产品阶段
当原型验证通过,才可能设计自己的 PCB,把多个现成模块合并起来:
原型:
USB 转接板 + 稳压模块 + 电源保护板 + 接线板
↓
产品:
一块自定义机器人控制板
但所谓“自己设计”,通常也不是自己设计芯片,而是使用标准芯片:
- USB-UART 芯片
- 稳压芯片
- MOSFET
- CAN 收发器
- ESD/TVS 保护器件
- 标准 MCU
工程师根据数据手册和参考设计,把它们连接到一块自己的 PCB 上。
什么时候需要自己开发板子
一般是现成模块出现这些问题时:
- 尺寸太大;
- 接口太多或不够;
- 线缆混乱;
- 供电电流不够;
- 缺少反接、过流、浪涌保护;
- 成本太高;
- 需要批量生产;
- 需要更好的可靠性和散热;
- 需要把 MCU、CAN、传感器和电源集成起来。
因此比较合理的 SO-ARM 开发路线是:
- 第一阶段:全部使用现成模块,把机器人跑起来。
- 第二阶段:理解每个模块的输入、输出、电源和协议。
- 第三阶段:发现现成模块的限制。
- 第四阶段:设计自己的集成 PCB。
这也是学习《Practical Electronics for Inventors》的意义:不一定是为了从零制造所有东西,而是让你能够判断标准件是否合适、如何正确连接、为什么烧坏、怎样测量,以及将来怎样把几个模块整合成可靠的电路板。
PWM 是 Pulse Width Modulation,中文叫脉宽调制。
它的核心是:
电压仍然只有“高”和“低”,但通过改变每个周期内高电平持续的时间,控制平均功率。
一个 PWM 周期
高电平 ┌────────┐
│ │
低电平 ┘ └────────
← Ton →← Toff →
←──── T ─────→
其中:
- :高电平时间;
- :低电平时间;
- :一个完整周期。
PWM 频率是:
占空比
占空比 Duty Cycle 表示高电平占整个周期的比例:
例如:
25% 占空比
高 ┌──┐ ┌──┐
低 ┘ └──────┘ └──────
每个周期只有四分之一时间通电。
50% 占空比
高 ┌────┐ ┌────┐
低 ┘ └────┘ └────
一半时间通电。
75% 占空比
高 ┌──────┐ ┌──────┐
低 ┘ └──┘ └──
四分之三时间通电。
PWM 怎样控制电机
MCU 输出 PWM 给 MOSFET:
MCU PWM
│
▼
MOSFET 快速开关
│
▼
控制电机电流
当 PWM 是高电平:
- MOSFET 打开;
- 电机连接电源。
当 PWM 是低电平:
- MOSFET 关闭;
- 电机依靠惯性和续流电流继续运动。
开关速度非常快,电机不会每次都完全停下来,而是感受到一个平均效果。
理想情况下,平均电压近似为:
假设电源是 12V:
| 占空比 | 理想平均电压 |
|---|---|
| 0% | 0V |
| 25% | 3V |
| 50% | 6V |
| 75% | 9V |
| 100% | 12V |
但示波器看到的仍然是:
0V 和 12V 快速切换,
并不是真的输出稳定的 6V。
为什么不用 MOSFET 半开来降低电压
如果让 MOSFET 半开,它会同时承受较大电压和电流:
因此产生大量热量。
PWM 让 MOSFET 大部分时间处于两个高效率状态:
- 完全关闭:电流接近 0;
- 完全打开: 很小。
所以 PWM 控制电机比让 MOSFET 长时间半开更高效。
电感为什么让电流比较平滑
电机绕组是电感,电感不允许电流突然变化:
MOSFET 关闭后,电机电流不会立刻变成零,而会经过续流路径逐渐下降。
因此:
- PWM 电压:快速跳变;
- 电机电流:相对平滑;
- 电机转矩:相对平滑。
PWM 频率有什么影响
假设 PWM 频率是 20 kHz:
也就是每 50 微秒开关一次。
频率太低可能:
- 电机抖动;
- 出现可听见的噪声;
- 电流波动较大。
频率太高可能:
- MOSFET 开关损耗增加;
- Gate Driver 负担增加;
- 驱动器发热增加。
实际频率要根据电机、电感、MOSFET和驱动器选择。
PWM 在三相无刷电机里
无刷电机驱动器有六个 MOSFET:
- U 相:上管 + 下管;
- V 相:上管 + 下管;
- W 相:上管 + 下管。
控制器分别给六个 MOSFET 发送 PWM,从而调节三相绕组的等效电压和电流,形成旋转磁场。
所以完整路径是:
编码器测量转子角度
│
▼
控制器计算三相电压
│
▼
生成六路 PWM
│
▼
六个 MOSFET
│
▼
U/V/W 三相电流
│
▼
无刷电机旋转
注意:舵机 PWM 有两种含义
“PWM 控制电机”和“PWM 舵机信号”容易混淆。
电机功率 PWM
占空比直接影响电机获得的平均电压和功率。
普通航模舵机 PWM
脉冲宽度用于编码目标角度,例如:
- 约 1.0 ms → 一个方向;
- 约 1.5 ms → 中间位置;
- 约 2.0 ms → 另一个方向。
这里的脉冲宽度主要表达“目标位置”,不是直接给电机供电。舵机内部控制器还会再次产生自己的功率 PWM 驱动内部电机。
而 STS3215 这类总线舵机:
- 外部:UART 数字数据包传递目标位置;
- 内部:PWM + MOSFET 控制电机。
可以简单记为:
PWM 就是通过快速开关,并改变“每次打开多久”,控制平均电压、功率或编码控制信息。
是不是像 CPU 里的那个时钟
很像,因为两者在示波器上都是周期性的高低电平,但用途不同。
- CPU 时钟:主要看“什么时候发生边沿”;
- PWM:主要看“高电平持续了多久”。
CPU 时钟
CPU 时钟通常是比较规则的方波:
高 ┌──┐ ┌──┐ ┌──┐
低 ┘ └──┘ └──┘ └──
↑ ↑ ↑
时钟沿 时钟沿 时钟沿
数字电路通常在上升沿或下降沿执行操作:
- 第 1 个时钟沿:读取指令;
- 第 2 个时钟沿:进行计算;
- 第 3 个时钟沿:写入结果。
它的重点是:
- 周期是否稳定;
- 频率是多少;
- 边沿什么时候到来;
- 不同电路是否同步。
CPU 时钟的占空比通常比较固定,经常接近 50%。
PWM
PWM 也有固定周期,但会改变高电平宽度:
25%:
高 ┌─┐ ┌─┐
低 ┘ └───────┘ └───────
50%:
高 ┌────┐ ┌────┐
低 ┘ └────┘ └────
75%:
高 ┌──────┐ ┌──────┐
低 ┘ └──┘ └──
它的重点是占空比:
PWM 周期可以保持不变,而高电平时间不断变化。
两者的对比
| 特征 | CPU 时钟 | PWM |
|---|---|---|
| 波形 | 周期性高低电平 | 周期性高低电平 |
| 主要信息 | 边沿和周期 | 高电平持续时间 |
| 占空比 | 通常固定 | 经常变化 |
| 作用 | 同步数字电路 | 控制功率或编码命令 |
| 典型频率 | MHz、GHz | Hz、kHz 到数百 kHz |
| 是否直接控制功率 | 通常不是 | 经常是 |
PWM 通常由时钟产生
MCU 内部正是利用时钟和计数器产生 PWM。
假设计数器每次时钟加一:
0, 1, 2, 3, ... 99, 0, 1, 2...
如果设定:
- 计数值 < 25:输出高电平;
- 计数值 ≥ 25:输出低电平。
就得到 25% 占空比:
0~24 高电平
25~99 低电平
如果设定:
- 计数值 < 75:输出高电平;
- 计数值 ≥ 75:输出低电平。
就得到 75% 占空比。
所以关系是:
MCU 系统时钟
│
▼
定时器/计数器
│
▼
比较计数值和设定值
│
▼
生成 PWM
例如 MCU 时钟是 1 MHz,PWM 周期需要 100 次计数:
设置比较值为 30,就得到约 30% 占空比。
因此可以这样理解:
CPU 时钟像节拍器,告诉系统每一步什么时候发生;PWM 利用这些节拍,决定每个周期里打开多长时间。