差速底盘的两个轮子不是"各自调速",而是由油门与转向两条指令混控出左右两路目标转速。本文基于双电机双向调速控制器设计资料,讲清五段信号链、LM339 双斜坡 PWM 与回差、IRFP064 双 H 桥约 100ns 死区与同步整流、LM2937ET-5 加 MC34163P 双电源,附 STM32 混控与死区代码及七步落地清单。
移动机器人、AGV 与履带底盘的经典结构都是"左右两套驱动",转向不靠舵机,而是靠两侧轮子产生转速差。于是控制器的第一件事不是调速,而是混控:把一条油门指令和一条转向指令合成左右两路电机指令——左轮 = 油门 + 转向,右轮 = 油门 − 转向。结论先给三条:第一,混控必须在"后退"时把转向极性取反,否则倒车打方向会越打越偏;第二,两路 PWM 用"双三角斜坡 + 两个比较器"生成,两条斜坡之间的间隙就是中位死区,死区太小电机停不干净、太大则小信号不响应;第三,H 桥必须留约 100ns 死区并配快恢复二极管与栅极齐纳钳位,否则直通电流与电感尖峰几分钟就能烧掉 FET 与驱动 IC。
差速驱动的本质是运动学反解:给定底盘的前进速度与自转角速度,算出左右轮的线速度。摇杆或遥控器输出的是"油门 T"与"转向 S"两个量,二者都以中位为零点。嵌入式控制器要做的第一步就是把 T、S 线性组合成左右两个目标值,再做限幅。
| 运动意图 | 油门 T | 转向 S | 左轮 = T + S | 右轮 = T − S |
|---|---|---|---|---|
| 直行全速 | +100% | 0 | +100% | +100% |
| 原地右转 | 0 | +60% | +60%(前) | −60%(后) |
| 前进右转弯 | +80% | +30% | +110% → 限幅 100% | +50% |
| 后退左转(未取反) | −80% | −30% | −110% → 限幅 −100% | −50% |
| 后退左转(已取反) | −80% | +30% | −50% | −100% |
第四、五行是同一个操作意图的两种结果:当油门为负(倒车)时,转向指令必须先取反再相加,否则"左转"会变成右转。这就是很多自制底盘"前进正常、倒车方向反了"的根因,也是混控逻辑里唯一不能省的判断。
这套双向调速控制器可以拆成五段:指令接口、混控、PWM 生成、功率级、电源。每段都有明确的输入输出边界,任何一段出问题,现象都不一样。
| 段 | 功能 | 关键器件/参数 | 输出 |
|---|---|---|---|
| ① 指令接口 | 把遥控脉宽转成模拟电压 | 恒流源积分 + 采样保持;1.0 / 1.5 / 2.0 ms,帧率 50~60 Hz | 1.5~3.5 V,中位 2.5 V |
| ② 混控 | 油门与转向加减、倒车取反 | 运放加减法器 + 模拟传输门切换极性 | 两路 1.5~3.5 V |
| ③ PWM 生成 | 模拟电压转可调占空比 | NE555 + 恒流源三角波、LM339 ×2、回差 2.2 MΩ/20 kΩ | 两路逻辑 PWM |
| ④ 功率级 | 双向驱动电机 | IR2110 半桥驱动、IRFP064 ×8、栅极电阻 30 Ω | H 桥,约 70 A 能力 |
| ⑤ 电源 | 控制 5 V 与栅压 18 V | LM2937ET-5(低压差)、MC34163P(升压) | 5 V / 18 V |
值得注意的是第①段:遥控接收机给出的是脉宽 1.0~2.0 ms、周期 20 ms 的方波,中位 1.5 ms。要把它变成稳定电压,做法不是简单 RC 滤波,而是恒流源给电容积分、脉宽结束时用采样保持锁存电压,再让电容放电等待下一帧。恒流积分保证"脉宽—电压"线性,采样保持保证帧与帧之间输出不塌陷。中位 1.5 ms 对应 2.5 V,满行程摆到 1.5~3.5 V,后续所有环节都以 2.5 V 为"零"。
有了模拟控制电压,下一步把它变成占空比。这里用的是经典的两路三角斜坡 + 两个比较器方案,而不是单斜坡:一路斜坡整体抬高,驱动 H 桥的 A 侧;另一路整体压低,驱动 B 侧。当控制电压落在两条斜坡之间的空隙时,两侧都是"下管导通",电机两端等电位,真正断电;控制电压高于上斜坡,A 侧上管按比例导通,电机正转;低于下斜坡,B 侧上管导通,电机反转。
斜坡本身也有讲究。直接用 555 的 RC 充放电得到的是指数波,占空比对控制电压的响应是非线性的;换成可切换的恒流源(Widlar 电流镜加开关管)给定时电容充放电,才得到线性三角波,PWM 占空比与控制电压才成正比。比较器用 LM339(开漏输出,需上拉),并加正反馈形成约数毫伏的回差,保证比较翻转时只产生一次干净边沿,不会在门限附近来回抖。
| 调参取向 | 斜坡幅度 | 死区设置 | 结果 |
|---|---|---|---|
| 要极限速度 | 略小于 0.5 V(峰峰) | 上斜坡底部略高于 2.5 V、下斜坡顶部略低于 2.5 V | 满油门可达电机最高速,但转向在中位附近非线性 |
| 要线性手感 | 1.0 V(峰峰) | 同上方法设置 | 转向响应全行程线性,代价是极速约为一半 |
| 死区过小 | — | 两条斜坡重叠或贴近 | 摇杆回中后电机仍在微转,"停不下来" |
| 死区过大 | — | 两斜坡间隙过宽 | 中位附近操作无响应,"打舵不动" |
H 桥只需两个逻辑信号就能驱动一路电机:把 A 侧上管的驱动信号取反后送给 A 侧下管(ALO = !AHI),B 侧同理,这样同一侧上下管永远不会同时导通。前进时开 A 侧上管 + B 侧下管,后退时开 B 侧上管 + A 侧下管。
但"逻辑上不会同时导通"不等于"物理上不会"。大功率 MOSFET 的栅极电容可达 7400 pF,开关需要时间,从一个管子关断到另一个管子开通之间存在两管都导通的窗口,即直通。这套设计用"RC 充电延迟 + 二极管快速泄放"的延时电路,让开通被延迟约 100 ns、关断不延迟,天然形成死区。要特别说明的是:死区并非越大越安全——过长的死区会让体二极管承担更多续流,反而增加损耗。
续流本身也有文章可做。电机是大电感负载,PWM 关断瞬间会产生高压尖峰,利用"关断一侧管子时同步开通另一侧管子"的同步整流可以把这部分能量放掉。但 MOSFET 的体二极管恢复慢,所以实际电路在每个 FET 两端再并联快恢复二极管(如 20ETF02)兜底,并用齐纳管(如 1N4705)保护驱动 IC 输入端不被尖峰打穿。栅极串 30 Ω 电阻抑制振荡,栅极驱动用 IR2110 半桥驱动芯片,一颗内含高边与低边两路,8 颗 FET 用 4 颗驱动即可。
| 设计项 | 取值/做法 | 作用 |
|---|---|---|
| 死区 | 约 100 ns,开通延迟、关断直通 | 防上下管直通;过大反而增加续流损耗 |
| 栅极电阻 | 30 Ω | 抑制栅极振荡,兼顾开关速度 |
| 快恢复二极管 | 每管并联 20ETF02 类 | 补体二极管恢复慢的短板,帮续流 |
| 栅极齐纳钳位 | 1N4705 类 | 保护驱动 IC 输入,抗母线尖峰 |
| 母线电容 | 4700 µF,紧贴功率管 | 吸收换向冲击,抑制母线塌陷 |
| 功率走线 | 12 号粗线,源极引线尽量短 | 降低寄生电感,减少尖峰与误触发 |
| 保险丝 | 电池与控制器之间必须串 | 动力电池短路电流极大,无保险等于埋雷 |
控制部分要 5 V,栅极驱动却要将近 18 V——因为大功率 MOSFET 要可靠导通,栅源之间通常需要 10 V 以上,而底盘电池只有 7.2 V。这套设计用 LM2937ET-5 低压差稳压器产出 5 V(输入电压可低至 6 V 以下仍工作,输出能力 500 mA,而控制电路总耗不到 100 mA,输入耐压 26 V),再用 MC34163P 构成小功率升压把 7.2 V 抬到 18 V,输出电流不到 25 mA,短路保护设在 150 mA。若底盘改用 12 V 及以上电池,则可以直接用自举电容从 12 V 取栅压,省掉这一路升压电源。
更值得记录的是原型阶段的实测结论:用小电机(2~3 A)测试一切正常,换上 20~30 A 的大电机后,FET 与驱动 IC 在几分钟内就炸了。三项修正把可靠性救了回来——缩短高低边切换的死区时间、给驱动 IC 加齐纳保护、补加快恢复二极管辅助同步整流。即便如此,手工搭焊的板子在 30 A 工况下仍然不够稳,最终结论是必须做 PCB:功率区按高边一排、低边一排布置,驱动 IC 夹在两排中间让栅极走线最短,信号地与功率地只在电池负极汇合点单点相连,驱动 IC 的 5 V 与栅压输入旁各放 0.1 µF 去耦。
今天做移动机器人底盘,多数团队会直接用 STM32 定时器生成互补 PWM、由固件完成混控,省掉一半模拟器件。但混控逻辑与死区计算这两件事和模拟方案完全一致,代码必须写对。
/* 差速底盘混控 + 死区计算(可直接移植到 STM32 HAL 工程) */
#include "main.h"
#define PWM_FULL 10000 /* 满占空比计数,对应 100% */
#define T_DEAD_NS 100 /* 死区 100 ns */
#define TMR_TICK_NS (1000000000UL / (PWM_FREQ_HZ * PWM_FULL)) /* 每个计数值的 ns */
typedef struct {
int32_t left; /* 左轮目标 -10000 ~ +10000 */
int32_t right; /* 右轮目标 -10000 ~ +10000 */
} drive_cmd_t;
/* throttle / steering 为 -10000 ~ +10000;返回左右轮目标 */
static drive_cmd_t Diff_Drive_Mix(int32_t throttle, int32_t steering)
{
drive_cmd_t c;
int32_t s = steering;
/* 关键:倒车时转向极性取反,否则后退打舵方向相反 */
if (throttle < 0) {
s = -s;
}
c.left = throttle + s;
c.right = throttle - s;
/* 限幅到 +-10000,避免超过满占空比 */
if (c.left > PWM_FULL) c.left = PWM_FULL;
if (c.left < -PWM_FULL) c.left = -PWM_FULL;
if (c.right > PWM_FULL) c.right = PWM_FULL;
if (c.right < -PWM_FULL) c.right = -PWM_FULL;
return c;
}
/* 计算死区寄存器值:开通沿延迟、关断沿按硬件规则不延迟 */
static inline uint32_t DeadTime_Reg(void)
{
uint32_t ticks = T_DEAD_NS / TMR_TICK_NS;
return (ticks == 0U) ? 1U : ticks;
}
/* 把双向目标映射为"方向 + 占空比"两路 H 桥控制 */
void Drive_Apply(drive_cmd_t c)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,
(c.left >= 0) ? GPIO_PIN_RESET : GPIO_PIN_SET); /* 左轮方向 */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1,
(c.right >= 0) ? GPIO_PIN_RESET : GPIO_PIN_SET); /* 右轮方向 */
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1,
(uint32_t)((c.left < 0 ? -c.left : c.left) / 2) & 0xFFFF);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2,
(uint32_t)((c.right < 0 ? -c.right : c.right) / 2) & 0xFFFF);
TIM1->BDTR = (DeadTime_Reg() & 0xFF) | TIM_BDTR_MOE; /* 死区 + 主输出使能 */
}
这段代码对应三条硬件约束:一是混控后的目标必须限幅,否则一侧指令超过满占空比会被截断,而另一侧仍在变化,转向手感会突变;二是死区时间由定时器计数器换算得出,100 ns 在不同主频与 PWM 分辨率下换算出的计数值不同,不能照抄;三是双向驱动必须"方向 + 占空比"分离,先定方向再给占空比,避免换向瞬间产生制动电流。
| 对比项 | 模拟方案(双斜坡 + LM339) | MCU 方案(STM32 定时器 + 固件混控) |
|---|---|---|
| 混控实现 | 运放加减 + 模拟传输门切极性 | 固件一行判断 + 加减法 |
| 死区生成 | RC + 二极管延时,约 100 ns,误差大 | 定时器 BDTR 死区寄存器,精确可调 |
| 调参方式 | 8 个 10 圈电位器逐个调 | 改参数重新编译 |
| 中位死区 | 由两斜坡间隙决定,需示波器校准 | 固件加偏置即可,可标定 |
| 适合场景 | 无固件供给的小批量、纯硬件调速 | 需要里程计、闭环与总线通信的底盘 |
| 步骤 | 内容 | 验收判据 |
|---|---|---|
| 1 定功率预算 | 算电机堵转电流与峰值电流,选 FET 与保险丝 | FET 电流能力 ≥ 峰值 2 倍 |
| 2 定电池与栅压方案 | ≥12 V 可用自举取栅压;7.2 V 需升压到 18 V | 栅源电压 ≥ 10 V 且不超 FET 上限 |
| 3 画混控逻辑 | 油门 ± 转向,倒车时转向取反,输出限幅 | 原地转、直行、后退左转三种组合方向正确 |
| 4 定 PWM 与死区 | 双斜坡(模拟)或定时器互补输出(MCU),死区约 100 ns | 示波器确认上下管无重叠导通 |
| 5 做续流与钳位 | 每管并快恢复二极管、栅极齐纳、栅极串 30 Ω | 满载换向无尖峰击穿,驱动 IC 不发热异常 |
| 6 布功率板 | 高边/低边分排、驱动居中、母线电容贴管、单点汇地 | 源极引线最短,无地环路 |
| 7 做极限验证 | 堵转、换向、长时间满载、电池低压与反接 | 连续 30 分钟满载无失效,低压可正常停机 |
差速底盘双电机驱动的核心只有三件事:混控(左 = 油门 + 转向、右 = 油门 − 转向,倒车时转向取反)、死区(H 桥上下管之间留约 100 ns,过小会直通烧管、过大反而增加续流损耗)、续流(同步整流 + 快恢复二极管 + 栅极齐纳钳位)。器件层面,IRFP064(约 70 A、9 mΩ)配 IR2110 半桥驱动足以覆盖中小型底盘的功率等级,控制侧用 LM2937ET-5 与升压电源解决 5 V 与 18 V 两路供电,原型阶段"小电机正常、大电机炸管"的经验说明 30 A 以上必须上 PCB 而非手工搭焊。
本文基于《Dual Motor Bidirectional Electronic Speed Control》(Bob Harbour,1999-04-30,含双电机双向调速控制器各段原理图与元件清单)等技术资料整理优化,并结合移动机器人差速底盘的工程实践进行了系统化梳理。
沧州艾诺威电子 — 国家高新技术企业,20+项国家专利
嵌入式系统开发 · 物联网方案 · AI智能硬件 · 一站式交付
电话:13930711029 | 邮箱:tech@czinv.com | 24小时内响应