QiuQiu

Robotics - Emedding 2

类型 方向 能否同时发送
单工 只能单向 不适用
半双工 可以双向 不能,必须轮流
全双工 可以双向 可以同时进行

单工 Simplex

只能往一个方向传输:

遥控器 ─────→ 玩具

玩具不能通过同一条通信方式回复遥控器。

半双工 Half-duplex

两个方向都可以通信,但必须轮流:

电脑 ─────→ 舵机:移动到 120°
电脑 ←───── 舵机:当前位置 118°

类似对讲机:

A 按下说话 → B 听
A 松开以后 ← B 才能说

SO-ARM 的总线舵机通常使用半双工,因为发送和接收共用一根 DATA 线:

时间 ─────────────────────────→
电脑发送命令 │ 停止 │ 舵机回复
████████████ │      │ ████████

如果电脑和舵机同时发送,信号就可能发生冲突。

全双工 Full-duplex

双方可以同时发送和接收:

电脑 TX ─────→ 设备 RX
电脑 RX ←───── 设备 TX

类似打电话,双方可以同时讲话和听到对方。

普通 UART 经常使用两条独立信号线:

因此可以全双工。

而 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 总线和厂商协议

即使接口看起来都是三根线:

也不能直接认为可以互换,因为针脚顺序、电压和协议可能不同。

选择替代板时需要核对六项:

  1. 舵机型号:例如 STS3215。
  2. 协议:是否支持 Feetech/SCServo 协议。
  3. 物理层:单线 TTL、双线 UART,还是 RS-485/CAN。
  4. 电源电压:5V、7.4V 或 12V。
  5. 接口针序:V+ / GND / DATA 的排列。
  6. 电流能力:是否能承受六个舵机同时动作或堵转的峰值电流。

另外,普通 USB-UART 模块不能自动替代 Bus Servo Adapter:

普通 USB-UART:

Bus Servo Adapter:

所以对 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 软件 开源软件集成

开发重点是系统集成,而不是重新制造每个零件。

原型阶段

通常优先采购:

这样可以快速验证:

产品阶段

当原型验证通过,才可能设计自己的 PCB,把多个现成模块合并起来:

原型:
USB 转接板 + 稳压模块 + 电源保护板 + 接线板

产品:
一块自定义机器人控制板

但所谓“自己设计”,通常也不是自己设计芯片,而是使用标准芯片:

工程师根据数据手册和参考设计,把它们连接到一块自己的 PCB 上。

什么时候需要自己开发板子

一般是现成模块出现这些问题时:

因此比较合理的 SO-ARM 开发路线是:

  1. 第一阶段:全部使用现成模块,把机器人跑起来。
  2. 第二阶段:理解每个模块的输入、输出、电源和协议。
  3. 第三阶段:发现现成模块的限制。
  4. 第四阶段:设计自己的集成 PCB。

这也是学习《Practical Electronics for Inventors》的意义:不一定是为了从零制造所有东西,而是让你能够判断标准件是否合适、如何正确连接、为什么烧坏、怎样测量,以及将来怎样把几个模块整合成可靠的电路板。

PWM 是 Pulse Width Modulation,中文叫脉宽调制。

它的核心是:

电压仍然只有“高”和“低”,但通过改变每个周期内高电平持续的时间,控制平均功率。

一个 PWM 周期

高电平 ┌────────┐
       │        │
低电平 ┘        └────────
       ← Ton →← Toff →
       ←──── T ─────→

其中:

T=Ton+Toff T=T_{on}+T_{off}

PWM 频率是:

f=1T f=\frac{1}{T}

占空比

占空比 Duty Cycle 表示高电平占整个周期的比例:

D=TonT×100 D=\frac{T_{on}}{T}\times100%

例如:

25% 占空比

高 ┌──┐      ┌──┐
低 ┘  └──────┘  └──────

每个周期只有四分之一时间通电。

50% 占空比

高 ┌────┐    ┌────┐
低 ┘    └────┘    └────

一半时间通电。

75% 占空比

高 ┌──────┐  ┌──────┐
低 ┘      └──┘      └──

四分之三时间通电。

PWM 怎样控制电机

MCU 输出 PWM 给 MOSFET:

MCU PWM


MOSFET 快速开关


控制电机电流

当 PWM 是高电平:

当 PWM 是低电平:

开关速度非常快,电机不会每次都完全停下来,而是感受到一个平均效果。

理想情况下,平均电压近似为:

VavgDVs V_{\text{avg}}\approx D V_s

假设电源是 12V:

占空比 理想平均电压
0% 0V
25% 3V
50% 6V
75% 9V
100% 12V

但示波器看到的仍然是:

0V 和 12V 快速切换,

并不是真的输出稳定的 6V。

为什么不用 MOSFET 半开来降低电压

如果让 MOSFET 半开,它会同时承受较大电压和电流:

P=VDSID P=V_{DS}I_D

因此产生大量热量。

PWM 让 MOSFET 大部分时间处于两个高效率状态:

所以 PWM 控制电机比让 MOSFET 长时间半开更高效。

电感为什么让电流比较平滑

电机绕组是电感,电感不允许电流突然变化:

V=Ldidt V=L\frac{di}{dt}

MOSFET 关闭后,电机电流不会立刻变成零,而会经过续流路径逐渐下降。

因此:

PWM 频率有什么影响

假设 PWM 频率是 20 kHz:

T=120000=50μs T=\frac{1}{20000}=50\mu s

也就是每 50 微秒开关一次。

频率太低可能:

频率太高可能:

实际频率要根据电机、电感、MOSFET和驱动器选择。

PWM 在三相无刷电机里

无刷电机驱动器有六个 MOSFET:

控制器分别给六个 MOSFET 发送 PWM,从而调节三相绕组的等效电压和电流,形成旋转磁场。

所以完整路径是:

编码器测量转子角度


控制器计算三相电压


生成六路 PWM


六个 MOSFET


U/V/W 三相电流


无刷电机旋转

注意:舵机 PWM 有两种含义

“PWM 控制电机”和“PWM 舵机信号”容易混淆。

电机功率 PWM

占空比直接影响电机获得的平均电压和功率。

普通航模舵机 PWM

脉冲宽度用于编码目标角度,例如:

这里的脉冲宽度主要表达“目标位置”,不是直接给电机供电。舵机内部控制器还会再次产生自己的功率 PWM 驱动内部电机。

而 STS3215 这类总线舵机:

可以简单记为:

PWM 就是通过快速开关,并改变“每次打开多久”,控制平均电压、功率或编码控制信息。

是不是像 CPU 里的那个时钟

很像,因为两者在示波器上都是周期性的高低电平,但用途不同。

CPU 时钟

CPU 时钟通常是比较规则的方波:

高 ┌──┐  ┌──┐  ┌──┐
低 ┘  └──┘  └──┘  └──
    ↑     ↑     ↑
   时钟沿 时钟沿 时钟沿

数字电路通常在上升沿或下降沿执行操作:

  1. 第 1 个时钟沿:读取指令;
  2. 第 2 个时钟沿:进行计算;
  3. 第 3 个时钟沿:写入结果。

它的重点是:

CPU 时钟的占空比通常比较固定,经常接近 50%。

PWM

PWM 也有固定周期,但会改变高电平宽度:

25%:
高 ┌─┐       ┌─┐
低 ┘ └───────┘ └───────

50%:
高 ┌────┐    ┌────┐
低 ┘    └────┘    └────

75%:
高 ┌──────┐  ┌──────┐
低 ┘      └──┘      └──

它的重点是占空比:

D=TonT D=\frac{T_{on}}{T}

PWM 周期可以保持不变,而高电平时间不断变化。

两者的对比

特征 CPU 时钟 PWM
波形 周期性高低电平 周期性高低电平
主要信息 边沿和周期 高电平持续时间
占空比 通常固定 经常变化
作用 同步数字电路 控制功率或编码命令
典型频率 MHz、GHz Hz、kHz 到数百 kHz
是否直接控制功率 通常不是 经常是

PWM 通常由时钟产生

MCU 内部正是利用时钟和计数器产生 PWM。

假设计数器每次时钟加一:

0, 1, 2, 3, ... 99, 0, 1, 2...

如果设定:

就得到 25% 占空比:

0~24    高电平
25~99   低电平

如果设定:

就得到 75% 占空比。

所以关系是:

MCU 系统时钟


定时器/计数器


比较计数值和设定值


生成 PWM

例如 MCU 时钟是 1 MHz,PWM 周期需要 100 次计数:

fPWM=1,MHz100=10,kHz f_{\text{PWM}}=\frac{1,\mathrm{MHz}}{100}=10,\mathrm{kHz}

设置比较值为 30,就得到约 30% 占空比。

因此可以这样理解:

CPU 时钟像节拍器,告诉系统每一步什么时候发生;PWM 利用这些节拍,决定每个周期里打开多长时间。