资讯详情

资讯详情

STM32电机控制实战:定时器PWM死区与功率级对齐避坑指南

简介《电机应用开发实战指南—基于STM32》是野火电子于2021年5月推出的电机控制实践教程面向具备一定嵌入式基础、希望从原理走向实战的工程师与高校学生帮助读者理解直流电机、步进电机、伺服电机与舵机的工作特性并借助STM32全系列开发板完成驱动与控制落地。资源包共1个PDF文件约35.84MB内容从电机分类、驱动器分类有刷、无刷、步进、伺服讲起逐层过渡到STM32定时器详解、定时器与电机的关系、基本定时器配置等核心章节配合配套硬件说明与推荐书单形成从概念到外设编程的完整链路。目前已有863人学习。读者可据此掌握PWM输出、脉冲定位、闭环反馈处理等关键方法理清速度环与位置控制的实现思路并借助书中的项目参与建议与排错方向快速搭建自己的电机控制实验平台。1. 电机控制里的“玄学”抖动九成出在定时器与功率级的对齐上很多人第一次做电机应用开发都会经历同一个困惑PID 参数对着教程抄了一遍代码逻辑也检查过可电机就是低速抖、启动叫、带载一顿一顿。换块板子症状又变了于是开始怀疑是“玄学”。真相往往很朴素——问题不在控制算法而在 STM32 定时器输出的那几路 PWM和外面那颗 MOS 管开关的时序没对上。定时器的死区寄存器少写一位或者采样点正好落在开关振铃的窗口里算法再漂亮也只是在放大噪声。这份基于 STM32 的电机开发指南之所以值得逐章拆开看就因为它把“定时器配置—功率级电路—编码器反馈—PID 离散化”这条链路完整串了起来让你知道每一行配置代码背后到底是哪一段物理过程。搞懂这条链你才有能力判断故障出在哪一层而不是靠改参数碰运气。2. 定时器PWM 分辨率、死区与计数模式如何决定驱动能不能活电机控制里对 MCU 的全部要求几乎都压缩在定时器这一块外设上。它要产生频率够高、分辨率够细的 PWM要在互补通道之间插入死区还要在合适的时刻触发 ADC 采样。三件事里任何一件做错表现出来都不是“定时器错了”而是“电机行为异常”。2.1 时基单元PSC、ARR、CCR 三者把时间切成刻度时基单元的本质是一个计数器PSC预分频决定它走得多快ARR自动重装载值决定它数到多少归零CCR比较值决定输出在哪个刻度翻转。边沿对齐模式下PWM 频率和占空比的换算关系是死的f_pwm f_tim / ((PSC 1) × (ARR 1)) duty CCR / (ARR 1)这三个量是互相挤压的。假设定时器时钟 72 MHz你想要 20 kHz 的 PWM那么 (PSC1)×(ARR1) 必须等于 3600。你可以选 PSC0、ARR3599得到 3600 级分辨率也可以选 PSC35、ARR99得到 100 级分辨率。前者占空比能调到 0.028% 一档后者只能调到 1% 一档。电机低速运行时有效占空比本来就很小分辨率不够就会表现为“低速转矩脉动、起转困难”——指令给了 0.5%实际只能输出 0% 或 1%电机就在这两种状态间反复横跳。所以定 PWM 频率从来不是先定频率再算参数而是先问一句低速时我需要多细的占空比调节精度。STM32 的高级定时器还有个重复计数器 RCR它让更新事件每 N1 个周期才发生一次。这个位在电机控制里很有用中心对齐模式下每个 PWM 周期计数器上下各走一趟如果控制周期需要等于 PWM 周期的整数倍RCR 可以在不改变 PWM 频率的前提下把中断频率降下来避免控制任务被高频中断切碎。提示算 PWM 频率时分母是 (ARR1)算占空比时分母也是 (ARR1)两处都容易漏掉这个 1。这个偏差在低频应用里不明显到了几十 kHz 就会让频率整体偏掉几个百分点。2.2 互补输出与死区插入硬件替你挡住直通短路H 桥的同一侧桥臂上上下两个开关管如果同时导通母线电压会经由两个管子直接短接到地电流只受寄生电阻限制器件在微秒级内就会热失效。这不是“可能发生”而是“只要时序有重叠就一定会发生”。软件不可能保证绝对不重叠因为中断响应有延迟、代码执行有抖动所以这部分保护必须由硬件完成。STM32 的做法是在高级定时器里给每一对互补通道配一个死区发生器写进 BDTR 寄存器的 DTG[7:0] 位。它的编码是分段的不是线性的DTG[7:5]死区时间计算公式范围以 tDTS 为单位0xxDT DTG[4:0] × tDTS0 ~ 12710xDT (64 DTG[4:0]) × 2 × tDTS128 ~ 254110DT (32 DTG[4:0]) × 8 × tDTS256 ~ 504111DT (32 DTG[4:0]) × 16 × tDTS512 ~ 1008其中 tDTS 是定时器的采样时钟周期由 CR1 的 CKD[1:0] 位决定是否对定时器时钟再分频。这张表最容易被误读的地方是“看起来像线性其实分段”。有人照着某个算例填了个值换成别的定时器时钟后死区时间悄悄变了桥臂开始发烫还以为是散热问题。死区时间的取值要有物理依据它必须大于“关断慢的那只管子”的实际关断时间再留一点余量。这个时间来自 MOS 管的栅极电荷、驱动电阻和驱动芯片的传输延迟量级通常在几百纳秒到一两微秒。取太小保护不住取太大则损失有效电压、恶化低速性能。前面提到推进“设计取舍”时这里就是第一个真正的取舍点。下面是高级定时器互补 PWM 初始化的典型骨架注意 BDTR 那个寄存器是在通道配置完之后单独打开的/* 时基中心对齐PWM 频率约 20kHz */ TIM_TimeBaseInitTypeDef tb; TIM_OCInitTypeDef oc; TIM_BDTRInitTypeDef bdtr; tb.TIM_Prescaler 0; /* 不分频定时器跑满时钟 */ tb.TIM_CounterMode TIM_CounterMode_CenterAligned1; tb.TIM_Period 3599; /* ARR与 PSC 共同决定频率 */ tb.TIM_ClockDivision TIM_CKD_DIV1; /* 决定 tDTS */ tb.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM1, tb); /* 通道 1 输出互补通道一并使能 */ oc.TIM_OCMode TIM_OCMode_PWM1; oc.TIM_OutputState TIM_OutputState_Enable; oc.TIM_OutputNState TIM_OutputNState_Enable; /* 互补通道开 */ oc.TIM_Pulse 0; /* 初始占空比为 0安全 */ oc.TIM_OCPolarity TIM_OCPolarity_High; oc.TIM_OCNPolarity TIM_OCNPolarity_High; oc.TIM_OCIdleState TIM_OCIdleState_Reset; /* 刹车时强制为安全电平 */ oc.TIM_OCNIdleState TIM_OCNIdleState_Reset; TIM_OC1Init(TIM1, oc); /* 死区与刹车 */ bdtr.TIM_DeadTime 0x40; /* 需按上表反算不能凭感觉 */ bdtr.TIM_Break TIM_Break_Enable; bdtr.TIM_BreakPolarity TIM_BreakPolarity_Low; bdtr.TIM_AutomaticOutput TIM_AutomaticOutput_Enable; TIM_BDTRConfig(TIM1, bdtr); TIM_CtrlPWMOutputs(TIM1, ENABLE); /* MOE 主输出使能漏了就一点波形都没有 */这段代码里有三处是新手常翻车的地方。第一TIM_CtrlPWMOutputs打开的是 BDTR 里的 MOE 位它是所有输出通道的总闸不打开的话寄存器配置全对、引脚上也是死电平。第二TIM_OCIdleState和TIM_OCNIdleState定义了刹车触发后的输出电平它决定了故障时桥臂是“全关”还是“某侧导通”直接影响故障后果。第三死区值0x40只是示例实际必须按上面的分段表反算不能直接把这个数抄走。2.3 中心对齐与触发采样让采样点落在纹波中间边沿对齐模式下计数器从 0 加到 ARR 然后瞬间归零PWM 的跳变集中在周期的一端。中心对齐模式下计数器先加到 ARR 再减回 0两端的跳变关于中心对称。对电机来说中心对齐的电流波形谐波分布更友好三相之间的相位关系也更规整。但更关键的是采样时机。PWM 开关瞬间功率回路上会有明显的电压振铃和电流尖峰这时候采到的电流值没有物理意义。中心对齐模式在计数器到达峰值等于 ARR和谷值等于 0时各产生一次比较事件这两点正好位于开关动作的中间位置电流处于相对平稳的区间。把 ADC 的触发源配成定时器的 TRGO并让 TRGO 由这些事件产生采样点就自动对齐到了纹波中间。这里有个隐含前提从 PWM 跳变到 ADC 真正完成转换之间还有一段延迟包括触发响应、采样保持时间、转换时间。如果这段延迟刚好把采样点推到下一次开关动作附近前面所有设计都白费。稳妥的做法是留出可调的相位偏移——很多实现会给触发事件加一个固定的计数延迟在示波器上一边看相电流波形一边微调这个值直到采样点稳稳落在波形的平台段。这是典型的“血泪经验”型参数文档里给不出一个通用值只能在自己板子上量。3. H 桥与自举功率级为什么决定“能不能转”软件调得再好功率级是瓶颈就一切归零。这一层的核心问题只有三个开关管怎么排布、高边管的栅极电压从哪来、电流从哪里测。3.1 四个开关管与两条续流路径直流有刷电机的 H 桥由四个开关管组成左右两臂的中点接电机两端。正转时开通左上和右下反转时开通右上和左下。这里的“开通”指的不是把管子当开关直接短接而是用 PWM 调制其中一对另一对保持常通靠占空比控制平均电压。真正需要理解的是关断之后发生什么。电机是感性负载电流不能突变当调制的那个管子关断时电感里的能量必须找一条路释放这就是续流。以正转调制左下管为例关断瞬间电机电流会经由右上的体二极管回流到母线形成一个回路。这条路径决定了关断期间电机端电压被钳位在什么水平也决定了开关管承受的反向电压。由此引出一个操作上的硬规则不能用“同时开通对角两个管子再同时关断”的方式做调速正确做法是固定一侧常通、只调制另一侧。前者每次切换都要经历完整的死区、续流、再导通过程开关损耗成倍增加后者只有一个桥臂在工作另一个桥臂状态稳定。方向切换时也要先关断所有管子等电流衰减到零再切到反向否则反电动势和母线电压叠加瞬间反向电流可能超出器件额定值。3.2 自举电容高边管为什么需要一个浮动电源如果 H 桥全部采用 N 沟道 MOS 管这是效率最优的选择高边管的源极接在电机端而电机端的电位在 0 和母线电压之间来回跳。N 沟道管的导通条件是栅源电压大于阈值可是当源极电位等于母线电压时栅极需要比母线还要高出一个阈值电压才能开通。这个电压从哪来答案就是自举电容。自举电路由一颗二极管和一个电容组成接在高边驱动器的供电引脚上。当低边管导通时电机端被拉到接近地电位此时自举二极管正向导通把电容充电到驱动电源电压。当低边管关断、高边管需要导通时电容上的电压就作为浮动电源把高边栅极顶到比源极高出足够幅度的位置。也就是说高边管的每一次导通都依赖上一次低边管导通期间完成的那次充电。这条依赖关系直接产生了一个经典故障如果占空比长期接近 100%低边管导通的时间极短自举电容来不及补充电荷电压就会一路跌落高边管逐渐进入线性区发热严重甚至烧毁。表现是“轻载正常、满载掉速”或“运行一会儿就停”。对应的解决方式很直接——给占空比设上限比如限制在 95%~98%保证每个周期都留出足够的低边导通时间完成自举。同时自举电容的容值要留余量自举二极管的耐压必须高于母线电压这两点在选型时经常被忽略。3.3 采样电阻放在哪里决定你测到的是相电流还是母线电流电流采样是电流环和保护逻辑的输入而采样电阻的位置直接决定你拿到的是什么信息。低边采样是把分流电阻串在低边管的源极和地之间成本最低共模电压接近地运放容易设计。它的代价是只有在低边管导通期间电流才流过电阻其他时刻测不到。因此采样必须和 PWM 同步且要避开开关瞬间的振铃通常是延迟一两微秒后再触发 ADC。如果控制上需要在整个周期内都知道电流低边采样就不够用。在线式采样也叫相线采样把电阻串在电机相线上任何时候都有电流流过能真正测到相电流适合要做精细力矩控制的场合。但它要求运放支持高共模电压且共模电压会随 PWM 大幅摆动共模抑制比不够就会把共模噪声引入差模信号。母线采样串在直流母线上测的是所有相电流的合成在单相 H 桥场合可以等价使用在三相场合需要用特定时刻的母线电流反推相电流时序要求更苛刻。工程上更常见的组合是低边采样做电流环和过流保护母线电压采样做过压欠压保护温度采样通常用贴片热敏电阻分压做过温降额。这三种信号在 STM32 上通常走同一组 ADC 的多个规则通道用 DMA 搬运避免每次转换都进中断。保护逻辑是否可靠很大程度上取决于采样通道有没有做滤波和滞回——直接拿原始值与阈值比较会在临界点反复触发保护机器一开一停看起来像“随机保护”。注意分流电阻的功率余量要按最大电流的平方乘阻值算再留两倍以上余量。按平均电流选型是这个位置最常见的选型错误。4. 编码器与 PID四倍频、测速与被离散化的控制器反馈链路决定闭环质量。编码器给你的是脉冲测速算法把脉冲变成转速PID 把转速误差变成占空比。这三步里每一步都有量化误差和延迟它们共同构成了闭环的上限。4.1 正交解码四倍频不是配置出来的是两路沿叠加出来的增量式编码器的 A、B 两路信号相位差 90 度。这个相位差的设计目的是不仅能数出转了多少格还能根据谁的沿在前判断转向。STM32 的定时器编码器接口把这两路信号接到 CH1 和 CH2通过 SMCR 寄存器的 SMS 位选择计数模式。所谓的四倍频来源很朴素一个完整信号周期里A 有上升沿和下降沿B 也有上升沿和下降沿一共四个边沿。当配置为“在 TI1 和 TI2 的所有边沿计数”时SMS 011每个边沿都会让计数器加一或减一于是每转计数等于编码器线数乘四。如果只对一路的边沿计数SMS 001 或 010就是二倍频。这直接引出分辨率换算。假设编码器每转 500 线电机轴直连四倍频后每转 2000 个计数如果后面接了 1:30 的减速箱输出轴每转对应 60000 个计数。这个数决定了位置环的理论最小分辨角也决定了测速的量化台阶。反过来说如果发现位置控制始终有固定的抖动幅度先别怀疑 PID去算一算一个计数对应多少角度很可能抖动量正好就是一个计数。编码器接口还有个隐藏的细节计数器是 16 位的正转溢出到 0xFFFF 后归零反转从 0 借位到 0xFFFF。做多圈累计时必须处理这个溢出否则在某个位置会突然跳变一个巨大的数值。稳妥的写法是在定时器更新中断或周期任务里读取原始值与上一次的值做差差值按 16 位有符号数解释再累加到一个 32 位变量上。4.2 M 法、T 法与 M/T 法低速为什么测不准有了计数还要把它变成速度。常见三种方法区别在于“谁的量化误差更小”。M 法测频法在固定的时间窗口 Tc 内数脉冲个数 M1速度正比于 M1/Tc。高速时脉冲密集一个窗口里几百上千个脉冲相对误差很小低速时一个窗口可能只有三五个脉冲±1 个计数的误差就能让速度读数跳动 20% 以上。所以 M 法适合中高速。T 法测周法反过来测量相邻两个脉冲之间的时间。低速时脉冲间隔长计时的相对精度高高速时脉冲间隔短一个定时器计数的误差占比变大。所以 T 法适合低速。M/T 法在固定的采样时间内既数脉冲个数也数高频时钟的个数用两者相除消掉量化误差在全速域都有不错的表现代价是实现复杂一些。这三种方法的共同问题是它们都需要一个采样窗口而窗口本身就是延迟。窗口越长速度读数越平滑但响应越慢窗口越短响应快但噪声大。PID 里速度环的采样周期必须和测速窗口匹配否则控制器会对着一个滞后的测量值动作表现出来就是“参数怎么调都超调”。4.3 位置式与增量式 PID积分饱和从哪来PID 的两种离散形式差别不只在公式更在“输出的是什么”。位置式每次算出的是控制量的绝对值/* 位置式 PID输出直接是占空比 */ float pid_positional(pid_t *p, float target, float actual) { float err target - actual; p-integral err; /* 累加历史误差 */ p-integral clamp(p-integral, -p-i_max, p-i_max); /* 抗饱和必须有 */ float out p-kp * err p-ki * p-integral p-kd * (err - p-last_err); /* 微分项对应误差变化率 */ p-last_err err; return clamp(out, 0.0f, p-out_max); /* 输出限幅对应占空比范围 */ }增量式每次算出的是控制量的变化量累加后才是输出/* 增量式 PID输出是本次应该增加多少 */ float pid_incremental(pid_t *p, float target, float actual) { float err target - actual; float delta p-kp * (err - p-last_err) p-ki * err p-kd * (err - 2.0f * p-last_err p-last_err2); p-last_err2 p-last_err; p-last_err err; p-output clamp(p-output delta, 0.0f, p-out_max); return p-output; }两者的核心差异在积分项。位置式把历史误差累加在一个变量里一旦输出被限幅比如占空比已经到 100%但误差还在持续积分项会继续往上累加等误差反向时这个巨大的积分量要花很长时间才能退回来表现就是“超调后长时间不回落”。这就是积分饱和。抗饱和的常用做法是输出一旦饱和就停止积分累加或者只允许朝退出饱和的方向累加。另一种做法是“反算法”用实际输出与限幅前的差值反过来修正积分项。增量式的优势在于它天然没有积分累加这个状态——积分作用体现在ki * err这一项里输出靠外部累加。这也意味着如果执行机构有死区比如占空比低于某个值电机根本不转增量式不会像位置式那样积攒出一个巨大的起始量。代价是增量式对微分的处理更敏感err - 2*last_err last_err2在测量噪声大时会放大抖动通常需要给微分项加一个低通滤波。还有一个常被忽略的细节是微分项的作用对象。对上面前两段代码微分作用在误差上目标值突变时err会瞬间跳变微分项随之产生一个巨大的脉冲反映到电机上就是一声“咔”。更稳的写法是让微分作用在测量值上对-actual求差分这样目标变化不会激励微分项只有实际状态变化才产生阻尼作用。5. 避坑烧管、不转、震荡的几条血泪记录原理讲完落到板子上还是会有各种见鬼的现象。下面几条是这套链路上最集中的问题按“现象—原因—解决”整理每一条都能在指南对应章节里找到更细的展开。5.1 现象上电瞬间 MOS 管击穿有时连带驱动芯片一起报废原因是多方面的但排查顺序要固定。先看死区时间是否真的生效——不是看代码里写了TIM_DeadTime而是用示波器同时量上下管的栅极驱动波形确认两路之间存在无重叠的间隔。代码写对但 MOE 位没开、或者刹车引脚悬空导致反复触发都会让输出状态不可预期。再看自举电容和二极管。二极管反向恢复慢、耐压不足会在高边关断瞬间被母线电压击穿。电容容值偏小则在第一个 PWM 周期就没充够电高边管半开半闭等效电阻很大几安培电流就能把它烧穿。最后看母线。长导线接电机、母线上没有足够的去耦电容开关瞬间的电压尖峰可能达到母线电压的两倍以上。这时候即使死区完全正确器件也可能因为过压而失效。解决方式是在桥臂两端就近并大容量电解电容加高频陶瓷电容把回路面积压到最小。5.2 现象电机嗡嗡响、有电流但不转用手拨一下能转起来这是典型的“换相或调制方式不对”。有刷电机方向接反不会导致不转但步进电机的相序接错就会。步进电机按固定顺序给各相通电才能形成旋转磁场相序错乱时转子只是在原地做微小摆动发出嗡嗡声。另一种可能是 PWM 频率过低。开关频率落在音频范围内且幅值较大时电机绕组会把这个频率激励成机械振动。解决方式是把 PWM 频率提到 16 kHz 以上超出人耳敏感范围同时注意提高频率后的开关损耗和死区占比变化。还有一种容易被误判的情况占空比确实在变化但电机端实测电压始终接近零。这时去查驱动使能引脚的电平逻辑有些驱动芯片是高电平使能、有些是低电平接反了程序看起来一切正常输出却一直被关断。5.3 现象一加积分项就开始震荡去掉积分又永远有稳态误差稳态误差的存在说明系统里有一个恒定的扰动量比如摩擦力矩或者负载偏置只有积分项能消掉它。但积分一加就震荡通常是三个原因叠加。第一是采样周期和积分增益不匹配。离散化后的积分增益实际效果是ki × T_sample采样周期改小了一半而ki没动等效积分作用就翻倍了。调整控制周期后必须重新标定ki不能沿用旧值。第二是积分饱和没有被正确限制。前面说过输出限幅但积分不停止累加误差反向时要花很久才能退出饱和。检查方法很简单让电机堵转几秒再放开如果恢复过程明显滞后于指令就是积分饱和。第三是速度测量本身有延迟。M 法测速的窗口长度相当于一个纯延迟环节延迟会吃掉相位裕度增益越高越容易震荡。缩短测速窗口或者改用 M/T 法往往比调 PID 参数更有效。5.4 现象上位机在线调出来的参数很好用烧进固件脱机运行就崩这是调试链路和运行链路不一致导致的。上位机整定时参数通过通信协议下发生效路径可能绕过了某些初始化或者是在电机已经稳定运行的状态下才写入。脱机启动时参数在初始化阶段就被加载此时电机还没起转积分项、滤波器状态、编码器基准值都处于初始状态等效的系统动态完全不同。另一个常见原因是通信解析的健壮性。上位机下发的数据包如果在中断里解析而中断优先级又高于控制循环解析过程可能打断 PWM 更新造成个别周期的占空比异常。或者协议里没有做长度和校验检查某个字节错位导致参数被写成了离谱的值。解决思路是把“调参”和“运行”的路径统一调好的参数写进默认配置脱机启动时走完全相同的初始化流程参数写入只在控制循环的空闲窗口生效并且做范围和变化率限制防止单次异常的写入把系统推到不稳定区。6. 设计取舍死区、采样与控制周期永远在互相挤压把这条链路走完会发现没有一个参数是可以独立最优的。死区时间调大直通风险下降但有效电压损失增加低速转矩脉动变大尤其在占空比本来就小的区间一个固定死区可能占到整个导通时间的很大比例。死区调小保护余量变薄一旦温度升高导致关断变慢风险立刻回来。工程上的做法是按最坏工况选死区再在软件里做死区补偿——根据电流方向给占空比加一个反向偏移把损失的那部分电压补回来。补偿的前提是电流方向判断准确过零点附近方向抖动所以还得加一个死区带方向不明时不做补偿。控制周期也是同样的取舍。控制周期短闭环带宽高响应快但每次控制都要读编码器、算 PID、更新 PWM周期太短会让 CPU 负载升高而且编码器在短窗口内计数量化误差占比变大速度读数噪声上升反而逼着你降低增益。比较稳妥的经验是把控制周期取在被控对象主要时间常数的十分之一到二十分之一之间然后用示波器看阶跃响应确认没有明显的延迟台阶。取舍点偏保守的选择偏激进的选择代价死区时间按最坏关断时间加余量按典型值取小保守损失低速性能激进增加直通风险PWM 频率16~20 kHz兼顾噪声与损耗40 kHz 以上波形更平滑高频下开关损耗与驱动能力要求上升测速窗口长窗口读数平滑短窗口响应快长窗口引入延迟短窗口噪声大电流采样点固定延迟留足余量贴近开关时刻采样更及时贴太近会采到振铃数据不可信我自己的习惯是任何一块新板子上电之前先把 PWM 频率设到最低、占空比设到很小、母线电压用可调电源从低往上加同时用示波器盯着上下管栅极和相电流三路波形确认死区、时序、采样点全部对得上再放开闭环。有一次赶进度跳过了这一步直接跑闭环结果自举电容选小了没发现电机在 80% 占空比附近反复重启查了两个晚上才定位到是自举电压跌落。从那以后我每次做新功率级都强制走一遍这套空载波形确认哪怕看起来是在浪费时间。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →