AGV 和巡检机器人常用 12V 电池供电,满电时标定好的速度,电池一掉就跑偏——同一 PWM 占空比下轮速按电池电压比例下滑。本文基于 TI 官方数据手册,讲清 TPIC2101 有刷电机控制器把 Vbat 放进传递方程分母的电压补偿机制、AUTO 脉冲与 MAN 电位器两种接法、低于 200µA 的休眠功耗、2048 周期判停与 8192 窗口化限流的约 3.3 秒关断时序,附推荐外围参数表、STM32 配合代码及七步落地清单。
结论先给三条:第一,开环 PWM 调速的有效电机电压等于占空比乘以电池电压,电池从 12V 掉到 10.5V,同一占空比下轮速就掉约 12%,这账没法靠改代码抹平——TPIC2101 把 Vbat 直接放进输出占空比传递方程的分母,硬件自动补偿,全工况输出精度 ±7%;第二,它是一颗三态机器件:正常工作电流 4~10mA,无命令 2048 个时钟后进入休眠(典型 150µA、最大 200µA),过压则进入故障态,休眠唤醒全靠输入侧自动判别,MCU 不用管;第三,限流保护用的是 8192 时钟窗口化判据——瞬时浪涌一两个窗口内出现不会触发关断,连续 8 个窗口(约 3.3 秒)持续限流才切断栅极驱动,堵转保护与启动浪涌这对老矛盾被出厂时序固定解决了。
先算一笔账。PWM 调速加载在电机上的有效电压,等于占空比乘以供电电压:Vmotor = D × Vbat。满电 12.6V 时用 50% 占空比标定,有效电压 6.3V;跑到电池剩 10.5V,同样 50% 只剩 5.25V——直流电机的稳态转速近似与电枢电压成正比,轮速直接掉了 16% 以上。调度端看到的是任务节拍漂移,返航 SOC 判断跟着失真,多机编队更是队形全乱。
软件补偿的路线不是不能走:ADC 采样 Vbat、按公式修正占空比、再配编码器做速度闭环——每一层都占资源、都要调参,掉电瞬间 ADC 采样与 PWM 更新的时序偏差还会引入二次扰动。另一条路是把补偿交给硬件:TPIC2101 这颗 TI 的有刷直流电机控制器(1995 年发布的老牌片子,至今仍在车厂与工业产线上用),把电池电压直接做进了输出传递方程。
| 场景 | 开环 PWM(MCU 直驱) | TPIC2101 电压补偿 |
|---|---|---|
| Vbat = 12V,命令 50% | 有效电压 6.0V | 输出 78.7%,有效电压约 9.4V |
| Vbat = 16V,命令 50% | 有效电压 8.0V(偏快 33%) | 输出 59%,有效电压约 9.4V |
| Vbat = 8V,命令 50% | 有效电压 4.0V(偏慢 33%) | 输出钳到 100%,有效电压 8V(补偿饱和) |
| 补偿方式 | 软件采样 + 算法修正 | 传递方程分母自带 Vbat |
| 输出精度 | 取决于 ADC 与算法 | 全工况 ±7%(手册交流特性表) |
表中 TPIC2101 数据按传递方程 PWMout = (2.88 + 13.12×(1−Din))/Vbat × 100% 计算,数据来自 TI 数据手册。
TPIC2101 的定位要先用一句话钉住:它本身不带功率管,而是输出 0~Vbat 的 PWM 栅极信号,驱动一颗外部低边 NMOS,给电机做固定频率、可变占空比的功率调制;PWM 关断期间,电机绕组的感性电流经外部续流二极管回收。手册明确它也能控电磁阀和白炽灯泡这类阻性或感性负载。注意这是单向调速方案——需要正反转和制动,还是要回到 H 桥架构(我们之前写过的 IRFP064 双 H 桥那篇正好补位)。
开关频率由两个外围件决定:fosc = 2/(ROSC×COSC),按推荐值 45.3kΩ 加 2200pF 算出来正是 20kHz(实测范围 19~21kHz)。选 20kHz 不是随便定的——超出人耳听觉范围,机器人旁边站人不会听到啸叫。
| 项目 | 参数 | 备注 |
|---|---|---|
| Vbat 推荐范围 | 8~16V(标称 12V) | 绝对最大 -0.3~40V,抛负载 1ms 内可到 40V |
| 休眠静态电流 | 典型 150µA,最大 200µA | Vbat=13V,AUTO/MAN 开路 |
| 运行工作电流 | 4~10mA | Vbat=16V,GD 开路,20kHz |
| 工作频率 | 20kHz 典型(19~21kHz) | f = 2/(ROSC×COSC) |
| 栅极驱动能力 | ±50mA(绝对最大) | 负载电容最大 3300pF,上升 1µs/下降 0.8µs |
| 输出占空比精度 | ±7% | 9V<Vbat<16V,两种模式同 |
| 最小速度平台 | 15~21%DC | 命令最低速时输出也不降到零 |
| 工作温度 | -40°C~105°C | D 封装 131°C/W,N 封装 78°C/W |
| 封装 | 14 脚 DIP(N)/ SOIC(D) | — |
数据来自 TI《TPIC2101 DC BRUSH MOTOR CONTROLLER》(SLIS060)数据手册电气特性表与开关特性表。
AUTO 模式下,芯片内部的传递方程是:
PWMout = (2.88 + 13.12×(1−Din)) / Vbat × 100%
分子里没有 Vbat,分母里有——这就是补偿的全部秘密。代入 Din=50%:Vbat=12V 时输出 78.7%,有效电压 0.787×12=9.44V;Vbat=16V 时输出 59%,有效电压 0.59×16=9.44V。两个电压下有效电机电压完全一致,轮速自然一致。Vbat=8V 时方程算出 118%,输出被钳位到 100%——8V 已接近推荐范围下限,芯片补不满了,但方向始终正确。
MAN 模式的方程同理:PWMout = (2.88 + 6.56×(VMAN−VAUTO))/Vbat × 100%,把差分电压换成分子变量而已。
有个细节容易被忽略:最小速度平台。手册开关特性表里有一条"Minimum speed pedestal",15~21%DC——即便命令端要求最低速(AUTO 端 99% 占空比),输出占空比也停在这个台阶上,不会降到零。需要"真正零速"的场合(对位、驻车),靠的是让芯片进休眠把 GD 拉死,而不是把命令打到最低。
这颗片子同时支持两套完全不同的命令输入,芯片自己识别,不用外部配置。
AUTO 模式给 MCU 用:开集 PWM 信号进 AUTO 脚,MAN 悬空。芯片内部给 AUTO 挂了 1mA 上拉,速度信息是反向的——10% 高电平比 20% 高电平命令的转速更高。它还能容忍 ±2V 的地偏移,MCU 板和功率板之间共地不干净也不影响占空比。另外有个 2048 时钟判停机制:AUTO 端持续高或持续低、2048 个 20kHz 时钟(按 20kHz 换算约 102ms)没有任何跳变,芯片判定"命令消失",自动进休眠。
MAN 模式给人机电位器用:MAN 接 Vbat 且高于 5.5V 即切入,AUTO 与 MAN 之间接一只 0~1kΩ 电位器。芯片从两个脚各灌 2mA 电流沉,电位器上的压差 0~2.2V 就是满量程速度命令。值守面板、手动调试台,一只电位器搞定,MCU 都不用上。
| 维度 | AUTO 模式 | MAN 模式 |
|---|---|---|
| 命令信号 | 开集 PWM,100Hz 典型 | AUTO/MAN 间 0~1kΩ 电阻 |
| 满量程 | 0~100% 占空比(反向) | 0~2.2V 差分电压 |
| 接线特征 | MAN 悬空,内部 1mA 上拉 | MAN 接 Vbat(>5.5V 触发) |
| 判停休眠条件 | AUTO 无跳变 2048 时钟 | AUTO/MAN 回路开路 |
| 地偏移容忍 | ±2V | 最大 2.2V 源偏移 |
| 适合谁 | MCU、上位机数字调速 | 电位器面板、人工调速 |
电池供电设备的待机功耗是硬指标。TPIC2101 的休眠状态下 GD 拉低、内部 5.5V 基准(AREF)与负载断开,静态电流典型 150µA、最大 200µA;对应的运行状态是 4~10mA——差了两个数量级。休眠的触发全自动:AUTO 模式下命令消失 2048 时钟,或 MAN 模式下回路开路;任何有效的速度命令又把它唤醒回运行态。MCU 只管"发命令/停命令",状态机芯片自己维护。
这笔账落到实机上:一台配 12V/10Ah 电池的巡检机器人,按 200µA 上限估算,控制器待机一年只吃约 1.75Ah,理论待机时间远超电池自放电能撑的年限——整机待机功耗的短板反而在电池自放电和其它常供电外设上,控制器这块板不再是负担。
唤醒后还有一层内置保险:过压事件或休眠期间,INT 脚被内部小于 500Ω 的阻抗拉向地,积分器电容放空;电压恢复正常后 PWM 占空比从低处缓慢爬升——软启动不用软件参与。
过压保护:Vbat 升到 17~20V(典型 18.5V)芯片进故障态、切断栅极驱动,回差 0.5~0.99V,不会在阈值边上反复抖动。欠压保护:Vbat 跌破 7~8V(典型 7.5V)直接进休眠,回升到 8~9V(典型 8.5V)才恢复,回差 0.5~1V。抛负载(load dump)场景手册在绝对最大额定里给了 1ms 内 40V 的耐受值,推荐工况仍是 8~16V。
限流的判据更有意思。ILS 脚感测外部功率管漏极电压,与 ILR 脚(由 AREF 分压设定)比较,比较器偏移仅 ±10mV,共模范围 0.5~2.75V。ILS 高于 ILR 且栅极驱动为高时,先做闭环限流——把 INT 拉低压占空比;如果限流状态持续,就走窗口化锁存:
| 阶段 | 判据 | 时长(按 20kHz 换算) |
|---|---|---|
| 单窗口监视 | 8192 时钟内出现至少一次限流即置位 | 约 0.41 秒 |
| 连续计数 | 连续 8 个窗口全部置位才触发关断 | 约 3.28 秒 |
| 关断期 | GD 拉低 65536 时钟,INT 保持放电 | 约 3.28 秒 |
| 自动重启 | 关断期满自动重试 | — |
| 锁死条件 | 重启后 8 窗仍全限流,需休眠→运行循环复位 | — |
| 计数复位 | 任一窗口内无限流,8 窗计数清零 | — |
窗口与周期数来自 TI 数据手册 Current fault operation 节,秒数按 20kHz 振荡频率换算。
这套时序的价值在工程上:电机启动浪涌、越障瞬间的冲击电流,只会让个别窗口置位,下一窗口电流回落计数就清零——不误杀;真正的堵转或短路,电流持续超限,连续 8 窗约 3.3 秒后坚决切断。做 MCU 软件限流的都体会过那对矛盾:阈值定高了保护不来、定低了频繁误动作,还得配上复杂的延时退避逻辑。这颗芯片把时序固化在硬件里,出厂就是一套成熟的折中。
芯片外围按手册推荐值搭即可,没有需要反复调试的参数:
| 引脚 | 元件 | 推荐值 | 作用 |
|---|---|---|---|
| V5P5 | 钽电容 | 4.7µF | 内部 5.5V 稳压稳定 |
| MAN | 电阻 + 电容 | 499Ω 1% + 0.1µF | 手动模式输入滤波 |
| AUTO | 电阻 + 电容 | 499Ω 1% + 0.47µF | 自动模式输入滤波 |
| SPEED–INT | 电阻 | 100kΩ 1%(最小 20kΩ) | 积分器,约 1 秒软启动 |
| INT | 电容 | 4.7µF | 与 SPEED 电阻构成 RC |
| ROSC | 电阻 | 45.3kΩ | 定频,配 COSC 得 20kHz |
| COSC | 电容 | 2200pF | 同上 |
| CCS | 电阻 | 27.4kΩ 1% | ICCS = AREF/(2×RCCS) |
| ILR/ILS | 分压 + 检流点 | 共模 0.5~2.75V | 限流阈值与检测 |
推荐值来自 TI 数据手册 Recommended external components 表。
MCU 侧用 AUTO 模式最省事:定时器输出 100Hz 命令 PWM,经开漏输出接到 AUTO 脚,高电平由芯片内部 1mA 上拉给出,MCU 与芯片之间天然没有电平冲突。代码里唯一要记住的是反向映射——命令速度越快,AUTO 端高电平占空比越短。
/* TPIC2101 AUTO接口:100Hz命令PWM + 开漏输出 */
/* 速度反向:AUTO端高电平占空比越小,命令转速越高 */
TIM_HandleTypeDef htim2;
void tpic_cmd_init(void)
{
GPIO_InitTypeDef g = {0};
TIM_OC_InitTypeDef oc = {0};
__HAL_RCC_TIM2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
g.Pin = GPIO_PIN_1;
g.Mode = GPIO_MODE_AF_OD; /* 开漏输出 */
g.Pull = GPIO_NOPULL;
g.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &g);
htim2.Instance = TIM2;
/* 72MHz/7200 = 10kHz 计数 */
htim2.Init.Prescaler = 7200 - 1;
/* 10kHz/100 = 100Hz 命令频率 */
htim2.Init.Period = 100 - 1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&htim2);
oc.OCMode = TIM_OCMODE_PWM1;
oc.Pulse = 100; /* 初值常高:芯片保持休眠 */
HAL_TIM_PWM_ConfigChannel(&htim2, &oc, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
}
void tpic_cmd_set(uint8_t speed_pct) /* 期望速度 0~100 */
{
if (speed_pct > 100) speed_pct = 100;
/* 反向映射:速度越快,高电平越短 */
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2,
(uint32_t)(100 - speed_pct));
}
void tpic_cmd_stop(void) /* 停发命令,芯片自动入眠 */
{
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_2);
/* 引脚回开漏高阻,内部1mA上拉,
2048时钟无跳变后芯片进休眠 */
}
停机逻辑不用专门写:停掉 PWM 输出,引脚回开漏高阻,内部上拉把 AUTO 抬成持续高电平,约 102ms 后芯片自行入睡——固件不需要休眠指令,也不存在忘发命令导致整夜耗电的问题。
| 步骤 | 动作 | 要点 |
|---|---|---|
| 1 定场景 | 单向调速(轮驱/风机/泵)才用它 | 正反转与制动需求换 H 桥方案 |
| 2 定输入 | MCU 用 AUTO 开集命令,人工面板用 MAN 电位器 | 两种模式芯片自识别,不混接 |
| 3 照抄外围 | ROSC 45.3kΩ + COSC 2200pF 定 20kHz | V5P5 的 4.7µF 钽电容不能省 |
| 4 设限流 | ILR 经 AREF 分压取阈值 | 共模 0.5~2.75V 内,偏移 ±10mV |
| 5 选功率管 | NMOS 栅极电容 ≤3300pF | 续流二极管按电机电流选 |
| 6 写固件 | 100Hz 命令、占空比反向映射 | 停机即停 PWM,休眠自动完成 |
| 7 上电验证 | 变 Vbat 测有效电压恒定性 | 堵转验证约 3.3 秒关断时序 |
电池压降这件事,TPIC2101 的答案是把 Vbat 写进传递方程的分母:命令不变,电池从 16V 掉到 9V,输出占空比自动变大,有效电机电压纹丝不动,全工况精度 ±7%。它把三件 MCU 本来要自己扛的事做成了硬件——电压补偿(一条方程)、休眠管理(无命令 2048 时钟自动入睡,静态电流低于 200µA)、堵转保护(8192 窗口化判据,瞬时浪涌不误杀、持续堵转约 3.3 秒坚决切断)。定位也要说清楚:低边单管、单向调速,风机、水泵、单轮驱动正合适,需要正反转制动就回到 H 桥。下次给轮式机器人选电机控制方案时,先问一句:这 12V 电池的压降,打算让控制环路买单,还是让分母买单。
本文基于《TPIC2101 DC BRUSH MOTOR CONTROLLER》(Texas Instruments,SLIS060,1995 年 10 月)数据手册整理优化,并结合轮式移动机器人电机驱动方案的工程实践进行了系统化梳理。
沧州艾诺威电子 — 国家高新技术企业,20+项国家专利
嵌入式系统开发 · 物联网方案 · AI智能硬件 · 一站式交付
电话:13930711029 | 邮箱:tech@czinv.com | 24小时内响应