STM32高级定时器TIM1驱动机器人关节电机:死区保护、编码器四倍频与FOC电流环实现

关节电机炸管、电流环发抖、换相位置对不上,问题往往不在算法,而在定时器这一层:互补PWM、死区、刹车保护、编码器接口与ADC同步采样,本来就是同一套外设链路

2026-10-02 📖 约 15 分钟阅读
STM32 TIM1 关节电机 FOC 编码器 死区 嵌入式

核心结论

机器人关节电机的 FOC 电流环能不能跑稳,七成取决于 STM32 高级定时器这一层的配置,而不是上层算法。三条可直接落地的量化结论:第一,TIM1 是带互补输出、硬件死区与刹车输入的专用电机定时器,72MHz 时钟下死区精度可达 13.8ns、范围 0~14µs,普通通用定时器做不出安全的半桥驱动;第二,编码器接口用 x4 模式可把 1000 线编码器变成每转 4000 个计数,把自动重载寄存器 ARR 设为每转计数后,计数器读出来就是转子角度,无需软件再算;第三,相电流必须在 PWM 的峰顶或谷底同步采样,用 ADC 注入组配合定时器触发,1MHz 采样、12 位精度、最小采样时间 107ns,双 ADC 同时转换可做到 2MSps 等效吞吐。把这三层做对,电流环的噪声与换相抖动会立刻下降一个量级。

一、关节电机的控制链路,其实是一条定时器链路

一台人形机器人或协作机械臂的关节,本质上是一个"位置—速度—电流"三环系统。外环要角度,内环要力矩,而力矩直接正比于相电流,所以 FOC(磁场定向控制)的核心是:把三相电流实时采回来,经 Clarke/Park 变换投到 dq 轴上,再反算出三相 PWM 占空比送进功率级。算法本身早已标准化,真正把项目拖进泥潭的,是这条链路最底层的三件事——PWM 怎么发、位置怎么读、电流什么时候采。

很多团队一开始把 STM32 的高级定时器当成普通 PWM 用:配个频率、设个占空比就上电。结果上电瞬间上下桥臂直通、管子发烫;或者电流波形上叠加着开关噪声,电流环怎么调 PI 都在抖;再或者编码器读数偶尔跳变,位置环跟着抖一下。这些现象的根因都在定时器,而不是 FOC 数学。本文按"PWM → 保护 → 位置 → 电流"的顺序,把这条链路逐层拆开。

二、TIM1 不是普通 PWM:互补输出、死区与 6 步换相

STM32 的高级定时器(如 TIM1)之所以适合电机控制,是因为它在通用定时器的基础上多了一整套面向半桥的硬件:三对互补输出(CH1/CH1N、CH2/CH2N、CH3/CH3N)加一个独立通道 CH4,一个刹车输入 BKIN,以及可级联的触发/时钟网络(ETR、ITR1~ITR4、TRGO)。时钟 72MHz 时计数分辨率为 13.8ns,PWM 更新还能交给 DMA 批量搬运,避免中断里逐寄存器写值带来的抖动。

驱动三相半桥,最关键的是死区时间。同一相的上管和下管如果同时导通,母线会经两个管子直接短路,这就是"直通"。硬件死区发生器的作用,是在互补的两路 PWM 之间插入一段"两管都关"的空白时间。TIM1 的死区发生器是一个 8 位寄存器,在 72MHz 时钟下精度最高 13.8ns,可编程范围 0~14µs(步进非线性),覆盖从低压小功率到高压大功率的绝大多数场景。

死区时间下限怎么定?由功率管的关断时间 toff 与驱动回路延迟共同决定:

tdead ≥ toff(max) + tdriver_delay + 裕量

例:MOSFET 关断 200ns、栅极驱动延迟 150ns,则死区至少取 400~500ns;取太小会直通,取太大则低占空比时输出失真、电流波形畸变。

如果是方波驱动的 BLDC(6 步换相),每个电周期分成 6 个状态,每个状态只有两相导通、第三相悬空。用 TIM1 的三对互补输出实现时,换相表就是硬件配置的直接映射:

Step 上桥导通 下桥导通 OC1 / OC1N OC2 / OC2N OC3 / OC3N
1 T1 T4 OC1REF / 0 0 / 1 0 / 0
2 T1 T6 OC1REF / 0 0 / 0 0 / 1
3 T3 T6 0 / 0 OC2REF / 0 0 / 1
4 T3 T2 0 / 1 OC2REF / 0 0 / 0
5 T5 T2 0 / 1 0 / 0 OC3REF / 0
6 T5 T4 0 / 0 0 / 1 OC3REF / 0

表里的 OCxREF 是"有效电平",具体高低由输出极性位决定。这里有个常被忽略的细节:互补输出可以工作在正弦波模式(上下管都按占空比调制,带死区)或6 步模式(一相完全关断、一相常通)。模式由 MOE、OSSI、OSSR、CCxE、CCxNE 这一组控制位组合决定,配错就会得到"该关的管子没关"。换句话说,换相表不是软件随便写写,它必须和定时器的输出使能组合严格对应。

三、刹车保护:BKIN、MOE 与 AOE 的行为差异

关节电机堵转、母线过流、编码器断线,都可能让功率级在几微秒内进入危险状态。TIM1 的刹车(Break)输入就是为这种"必须立刻关断"的场景准备的。触发源可以来自 BRK 引脚(极性可编程),也可以来自时钟安全系统(CSS,检测外部晶振失效)。

刹车一旦触发,硬件会立即把主输出使能位 MOE 清零,关闭六路 PWM,置位状态标志并产生中断;此时各通道输出到功率管的电平由 OISx 位决定(可选择安全电平)。关键在于,MOE 何时恢复有两种截然不同的策略,由 AOE 位选择:

AOE 配置 刹车后 MOE 的行为 适用场景 工程含义
AOE = 1(自动输出使能) MOE 保持 0,直到软件重新置 1 功率模块保护、硬件级故障 故障后彻底封锁,必须软件确认才恢复,安全但需主动复位
AOE = 0 MOE 在下一个更新(U)事件自动置 1 电流调节、周期性限流 可在每个 PWM 周期自动恢复,适合逐周期限流保护

实际项目中这两者常常要配合使用:过流比较器触发刹车并选 AOE=0,让电流在每个周期被"削顶"限制;而硬件过温、母线过压这类不可逆故障,则用 AOE=1 彻底封锁并等待主控处理。把这两种保护混为一谈,是"限流保护变成停机"或"该停机却自动恢复"的常见原因。

四、位置反馈:编码器四倍频与 Hall 接口

关节电机的位置反馈通常有两条路:增量式编码器(精度高,用于 FOC 的电角度)和 Hall 传感器(用于换相与上电初始定位)。STM32 的通用定时器内置了专门的编码器接口,增量编码器可以直接接到 MCU,不需要外部接口电路。

编码器接口有三种模式,本质是对 A、B 两相边沿的计数策略不同:

模式 计数依据 1000 线编码器每转计数 分辨率 典型用途
x2 模式 只对 A 相(或 B 相)的上升/下降沿计数,仍可判方向 2000 较低 低速测速、对分辨率要求不高的场合
x4 模式(标准) A、B 两相的所有边沿都有效 4000 最高 FOC 电角度、位置环、精密速度反馈
转速模式 对编码器计数时钟做运算 — — 直接得到转速量,减少软件计算

x4 模式是关节电机最常用的配置:1000 线编码器每转发出 4000 个计数脉冲,机械角度分辨率达到 0.09°。更巧妙的是把自动重载寄存器 ARR 设为"每转计数"——比如 4000——计数器就直接代表转子角度,读 CNT 就是读位置,省掉了软件累加和溢出处理。若 ARR 设为 0xFFFF,则与自由运行定时器的设计兼容,适合需要连续多圈计数的场合。

编码器的第三路 Z(Index)信号代表机械零位,接到一个外部中断引脚上,用它触发计数器复位,就能在每次过零时消除累计误差。而 Hall 传感器的三路信号则常做"异或"后送入定时器的 TI1 输入,配合输入滤波与边沿检测,用于换相时刻捕获——这套接口同样由定时器硬件完成,不占用 CPU 轮询。

/* 编码器 x4 模式配置要点 (通用定时器, 以 TIM3 为例) */
/* 1. 配置 TI1/TI2 为输入, 上拉, 滤波 */
TIM3->CCMR1 |= (1 << 0) | (1 << 8);      /* IC1/IC2 映射到 TI1/TI2 */
TIM3->CCER  |= (1 << 0) | (1 << 4);      /* 两相都使能, 不反相 */
/* 2. 编码器模式 3 = 两相都计数 (即 x4) */
TIM3->SMCR  |= (3 << 0);                /* SMS = 011 */
/* 3. 自动重载 = 每转计数, 计数器即角度 */
TIM3->ARR    = 3999;                     /* 1000线 x4 = 4000 计数 */
TIM3->CNT    = 0;
TIM3->CR1   |= (1 << 0);                /* 使能定时器 */
/* 读位置: TIM3->CNT; 读方向: TIM3->CR1 & TIM_CR1_DIR */

五、电流采样:ADC 注入组与 PWM 同步

FOC 电流环最容易被忽视、却最影响性能的一环是采样时刻。三相半桥的相电流在 PWM 开关瞬间会剧烈振荡,如果在开关沿附近采样,得到的全是噪声。正确做法是把采样点对准PWM 计数的峰顶或谷底——此刻电流纹波处于平均值附近,采样最干净。

STM32 的 ADC 为电机控制做了专门设计:转换速率 1MHz、12 位精度,采样时间可编程(1.5~239.5 个 ADC 时钟周期,最小采样时间 107ns),输入范围 0~VREF+,共 18 个通道(16 个外部 + 温度传感器 + 内部参考电压)。转换通道分成两组,正好对应两种采样需求:

分组 最大通道数 结果存放 触发方式 典型用途
常规转换组(Regular) 16 常规数据寄存器 / DMA 外部事件、软件、定时器 母线电压、温度、慢变量监测
注入转换组(Injected) 4 独立的注入数据寄存器 可由定时器事件精确触发 相电流采样,要求与 PWM 严格同步

注入组之所以适合相电流,是因为它有独立的数据寄存器与触发源,可以在 PWM 峰顶被定时器 TRGO 精确触发,而不必等常规组扫描完。三电阻法的两相/三相电流就挂在注入组上,配合偏移补偿寄存器修正运放带来的直流偏置,必要时还能输出带符号值。

如果两个 ADC 协同工作(ADC1 主、ADC2 从),还能进入"双模式",实现两种高效采样:注入同时模式让两个 ADC 在同一时刻各采一路,保证三相电流时间一致;快速交替模式让两个 ADC 交替对同一通道采样,等效吞吐率可达 2MSps,再配合 DMA 一次搬运 32 位(两个 16 位结果),几乎不占 CPU。

/* 相电流采样: PWM 峰顶触发 ADC 注入组 (思路示意) */
/* 1. TIM1 在峰顶(或谷底)产生 TRGO */
TIM1->CR2  = (2 << 4);                 /* MMS = 010: 更新事件作 TRGO */
/* 2. 使能 TIM1_TRGO 作为注入组外部触发 */
ADC1->CR2 |= (4 << 12);                /* JEXTSEL = TIM1_TRGO */
ADC1->CR2 |= (1 << 15);                /* JEXTTRIG: 使能注入触发 */
/* 3. 注入序列: 先 Ia 后 Ib (最多4通道) */
ADC1->JSQR = (1 << 20) | (0 << 10) | (1 << 5);
/* 4. 转换完成中断/标志读取 Ia, Ib, 再算 Ic = -(Ia+Ib) */

六、定时器同步:让 Hall 触发换相

在 6 步换相方案里,还有一个更漂亮的用法:用一个通用定时器读 Hall 位置,再用它的触发输出去驱动 PWM 定时器换相。STM32 的定时器之间通过 TRGO/ITR 组成主从网络——主定时器的更新事件、比较输出、计数器使能等都能作为触发源,从定时器则工作在触发、门控、复位或外部时钟模式下。

典型连接是:主定时器(如 TIM2)的 Hall 输入经异或与边沿检测捕获换相时刻,更新事件产生 TRGO,经内部触发线 ITR 送给 TIM1,TIM1 在收到触发后自动完成换相动作。这样换相完全由硬件链路驱动,中断只负责"事后"读状态,抖动远小于软件在中断里改寄存器的做法。对于正弦波 FOC,同样的同步链路则用来保证 ADC 采样与 PWM 的相位严格对齐。

七、别忽略调试与寄存器锁定

电机控制代码在调试器里"一停就炸管"是经典事故。原因是标准断点会让 CPU 停下,但定时器仍在跑,固定的占空比持续加在功率管上,中断又不会执行。STM32 为此提供了专门的断点行为配置位:标准模式下定时器继续运行(危险),安全模式下定时器停止、PWM 停住输出,对功率级安全,且可在断点处继续运行。调试电机固件时应当默认选择安全模式。

另一个安全机制是寄存器锁定。安全级别高的寄存器(死区、PWM 输出极性、刹车使能等)可以在初始化后被上锁,防止软件跑飞后误改而损坏功率器件。锁定分 4 个等级,锁前可读可写、锁后只读;两个锁定位一旦写入就无法修改,直到 MCU 复位。GPIO 配置也能一并上锁,避免 PWM 功能引脚被意外重配成普通输出口。

八、把坑提前列出来

把上面几层落到工程实践,最容易出问题的几处可以汇总成一张对照表,供设计评审时逐条核对:

现象 常见根因 排查/解决方向
上电或换相瞬间直通炸管 死区不足或未使能;MOE/OSSI 组合错误 按 toff+延迟重算死区;核对输出使能组合表
电流环 PI 怎么调都抖 采样点落在开关沿,采到纹波噪声 改为 PWM 峰顶/谷底触发注入组,检查 TRGO 相位
编码器读数偶尔跳变 未开输入滤波;A/B 未做上拉或走线受扰 启用输入滤波,缩短走线,必要时差动传输
限流保护变成停机 误把逐周期限流配成 AOE=1 周期性限流用 AOE=0,不可逆故障才用 AOE=1
调试时一暂停就烧功率级 断点采用标准模式,定时器未停 改用安全模式,使 PWM 在断点处停止输出

九、总结

关节电机的 FOC 不是"写完算法就完事",它真正的地基是 STM32 高级定时器这一层:用互补输出与硬件死区保证半桥不直通,用刹车输入与 MOE/AOE 实现分级保护,用编码器 x4 模式把 1000 线编码器变成每转 4000 计数的直接角度,用 ADC 注入组配合定时器触发把相电流采在 PWM 峰顶,再用主从定时器把 Hall 换相交给硬件链路。

一句话收尾:把定时器配置当成电机控制的一部分来设计,而不是当成"底层驱动"随手填参数,电流环的噪声和换相抖动会立刻下降一个量级。

还想接着看

本文基于《STM32在马达控制中的应用》等技术资料整理优化,并结合机器人关节电机的驱动工程实践进行了系统化梳理。

需要定制开发?

沧州艾诺威电子 — 国家高新技术企业,20+项国家专利
嵌入式系统开发 · 物联网方案 · AI智能硬件 · 一站式交付

立即微信咨询

电话:13930711029 | 邮箱:tech@czinv.com | 24小时内响应