ARTICLE · 1289352
电机抖动怎么排查?软件层面优化方案
电机一抖整机都跟着难受——从电流采样到观测器噪声,一步步把根因挖出来
01 引子:电机一抖,设备精度全废
做电机驱动的工程师,最怕听见客户说“电机抖”。装在伺服滑台上抖,定位精度直接掉两个数量级;装在云台里抖,画面全是果冻效应;装在AGV轮子上抖,走起来像喝醉酒。抖动这事,说小很小,说大能让整个项目验收不过。
很多人第一反应是机械问题:联轴器没装正、皮带太松、齿轮有间隙。这些确实会抖,但机械传动链路是固定的,装一次管很久。真正让人头疼的是软件带来的抖——时有时无、低速明显高速消失、换个参数又好一点,反反复复调试没个准。
这篇文章专门讲软件层面的抖动排查思路。不扯机械,不聊电源,就盯着固件里那一环路:采样、滤波、观测器、PID、PWM。把这些环节可能引入抖动的地方挨个过一遍,按概率从高到低排,基本能定位八成以上的软抖动。
02 先把现象描述清楚
排查抖动第一步不是改代码,是把现象量化。“抖”是个很主观的词,你得回答几个问题:是低速抖还是高速抖?是匀速抖还是加减速时抖?是嗡嗡响的高频抖,还是一窜一窜的低频抖?空载抖不抖?带载呢?
拿示波器或上位机把速度、电流、PWM占空比录下来,对着波形看。高频抖动通常表现为电流里有尖锐纹波,频率在几kHz到几十kHz,多半和采样、PWM、开关噪声有关。低频抖动表现为速度在某个设定值附近周期性摆动,频率几十Hz到几百Hz,多半和环路带宽、观测器死区、摩擦有关。
把这些现象记下来,后面每动一处就对比一次波形。不要凭感觉说“好像好点了”,要看波形上那个固定频率的分量降下去没有。工程上一个常用手段是对速度误差做FFT,抖在哪个频点,一眼就能看出来。

图1 优化前后速度波形与电流采样噪声对比:高频噪声经微分项放大后表现为转速抖动
03 电流采样噪声:最常见的源头
FOC 的内环是电流环,电流采样值就是整个控制的“眼睛”。眼睛糊了,后面 PID 算得再漂亮也是瞎指挥。采样噪声主要来自 ADC 量化、采样电阻发热、运放噪声和 PWM 开关瞬间的尖峰。
先看采样时刻。很多人 ADC 是软件触发的,什么时候采全靠代码跑,结果刚好采到 MOS 管开关瞬间的电压尖峰,电流里全是毛刺。正确做法是用 PWM 硬件触发 ADC——在计数器归零或计数值达到峰值的那一刻,也就是三相桥都处于低侧导通、电流最平稳的中点触发采样。
t_sample = (0.5 − D) × Tpwm 附近为开关跳变点,应避开
具体位置要看拓扑:中心对齐 PWM 一般在计数器上溢或下溢点采样,此时上下桥臂都在导通区间,没有开关跳变。把采样点从软件触发改成 PWM 触发,很多人做完这一步抖动就小了一半。
04 采样电阻与运放带宽
采样电阻的取值是个折中。阻值大,信噪比好,但发热厉害、功耗高;阻值小,发热小,但输出电压毫伏级,对运放和 PCB 布线敏感。小功率驱动器常用 0.005 到 0.02 欧,大功率用 0.001 欧上下,配合高增益运放。
运放带宽不够也会抖。电流环带宽通常要求 1 到 2 kHz,采样链路的带宽至少要比这高 5 到 10 倍,也就是运放和滤波的总带宽到 10 kHz 以上。很多人随手用个低速运放,或者加了个截止频率只有几百 Hz 的 RC 滤波,电流信号还没算出来就被延迟和相移糟蹋了。
fc = 1 / (2π × R × C)
RC 低通滤波的截止频率 fc 按上面算。假设 R=1k、C=100nF,fc 只有 1.6 kHz,对电流环来说相移太大了。电流采样的滤波电容一般控制在 1nF 到 10nF,把 fc 推到几十 kHz,只滤掉开关尖峰,别把有用的电流信号也滤没了。
05 PWM 分辨率与母线电压利用率
抖有时候不是算错了,是“算不出来”。电流环输出一个电压指令 U_ref,要转成 PWM 占空比。如果 PWM 的分辨率不够,U_ref 很小的时候占空比只能跳着走,电压指令被量化成台阶,电流自然一抽一抽。
Duty = U_ref / Udc
PWM 计数器是 N 位的,占空比只能取整数档,最小电压步长是 Udc / N。以 12 位 PWM、母线 24V 为例,一档约 5.9mV。低速时电流环输出电压指令可能就十几 mV,还没一个量化步长大,于是输出在 0 和 1 档之间来回跳,表现就是低速抖动。
解决办法有几个:提高 PWM 时钟和分辨率(用更高的计数器重装载值)、母线电压别用太高(够用就行)、或者在低速段引入电压前馈,让 PID 只负责补偿小误差,基础电压直接给出去。
06 死区效应:电压平白丢了一块
为了防止上下桥臂直通,每个桥臂都加了死区时间。死区期间两个管子都关断,实际加在电机上的电压不是你想要的那个,而是由电流方向决定的续流二极管压降。这段“丢失”的电压和电流符号有关,等效成一个非线性扰动。
ΔU = T_dead / Tpwm × Udc × sign(I)
死区造成的电压误差ΔU 和电流方向挂钩,在过零附近电流方向频繁切换,电压误差来回翻,低速时这部分误差占比很大,直接表现为电流正弦波在过零点被削平,转矩脉动加大,电机低速一抖一抖。
软件上常用死区补偿:根据当前相电流方向,提前把这部分丢的电压补回去。补偿量按上面的ΔU 算,叠加到 SVPWM 输出上。补偿要做电流极性判断,注意噪声导致方向误判,一般加个小滞环,电流绝对值小于阈值时不补。
07 观测器噪声污染了角度
无传感器方案里,转子角度不是传感器直接量出来的,是观测器算出来的。观测器依赖反电动势,反电动势本身就掺着采样噪声。噪声进了观测器,角度估计就抖,角度一抖,Park 变换出来的 Id、Iq 全跟着抖,电机就跟着抖。
滑模观测器(SMO)本身带开关抖振,低速时反电动势小,抖振更明显。工程上常用低通滤波器把估计角度平滑一下,但滤波会引入相位滞后,高速时滞后又造成角度误差。这个平衡点要靠参数试。
θ_filt(k) = θ_filt(k−1) + α × [θ_raw(k) − θ_filt(k−1)]
一阶低通滤波系数α越小越平滑,但滞后越大。α一般取 0.05 到 0.2,对应转折频率大约在采样频率的几十分之一。低速段α调小一点压抖动,高速段α调大一点保相位,做成随转速自适应的效果最好。
08 编码器与霍尔信号抖动
有传感器的方案,抖动排查重点在信号链。增量式编码器输出 AB 两相方波,如果走线没做好屏蔽,差分信号受干扰,计数就会多一个少一个,速度算出来一跳一跳。先看编码器线有没有和动力线捆在一起,差分对有没有走平行双绞。
速度通常是用单位时间内的编码器脉冲数算出来的:ω = Δcount / Δt。这个方法在高速时很准,低速时一个计数间隔对应的时间太长,速度分辨率粗得离谱。比如 2500 线编码器、四倍频后 10000 脉冲每转,低速 60rpm 时每秒才 1000 个脉冲,10ms 测速窗里才 10 个脉冲,少一个就是 10% 的速度误差。
ω = (θ(k) − θ(k−1)) / Ts
解决办法是低速段改用 M/T 法测速——既数单位时间内的脉冲数,又测相邻两个脉冲的时间间隔,把两种方法的优势拼起来。或者对位置做观测器(比如加一个速度观测器,用位置预测),输出平滑的速度估计,别直接用差分。
09 速度环微分项放大噪声
PID 里最容易惹事的是微分项 D。微分项本质是对误差求导,噪声是高频的,求导之后高频成分被放大 N 倍。很多人调速度环时一加 D 就抖得更厉害,就是这个原因。
D_out = Kd × [e(k) − e(k−1)] / Ts
误差里哪怕只有几个计数单位的噪声,除以很小的 Ts,再乘上 Kd,输出就是一个大尖峰。工程上 D 项要么干脆不加(PI 控制器够用就别上PID),要么对误差先滤波再求导,要么用测量值微分而不是误差微分,避免设定值跳变时产生冲击。
一个经验值:速度环先把 Kp、Ki 调好,能稳能跟就行,Kd 最后再考虑要不要加。多数云台、轮子场景 PI 就够了,只有定位要求很高的伺服滑台才真正需要 D 项帮忙阻尼。
10 积分饱和与 windup
抖动还可能来自积分饱和。速度突变或堵转时,误差一直很大,积分项拼命累积,一旦误差反向,积分项要花很长时间才能放出来,这期间控制器动作迟钝,系统就会来回摆。
解决办法是抗积分饱和(anti-windup)。当输出到达限幅边界时,停止积分累积,或者按输出超出量反向回算积分项。常见的做法是条件积分:只有当 PID 输出没到限幅时才积分,到了就冻住。
I(k) = I(k−1) + Ki × e(k),当 |out| < out_max;否则保持 I(k) = I(k−1)
没有 anti-windup 的速度环,在启停和正反转切换时特别容易超调摆动。很多人以为是 Kp 太大,其实是积分在捣乱。加上条件积分后,摆动会明显收敛。
11 控制周期抖动
还有一类隐蔽的抖动:控制周期本身不稳定。FOC 电流环应该在固定的 PWM 中断里跑,每 Ts 一次。如果中断被其他高优先级任务堵了,或者中断里夹了打印、串口通信这类慢操作,实际控制周期忽长忽短,PID 的离散系数就对不上了。
PID 是按固定 Ts 离散化的,Ts 变了,同样的 Kp、Ki 实际效果就变了。周期一抖,等效于控制器增益在波动,电机表现就是没有规律的微抖。排查方法很简单:在中断入口翻转一个 GPIO,用示波器量这个引脚的周期,看抖动有多大。
干净的电流环中断,周期抖动应该在百分之几以内。一旦看到抖动超过 5%,就要查中断里是不是塞了不该塞的东西——浮点打印、Flash 擦写、长串口发送,统统移出控制环。
12 软件滤波怎么加才不引入延迟
前面反复提到滤波,但滤波是把双刃剑:压噪声的同时也带来相位滞后,环路里多一个滞后环节就少一份稳定裕度。加滤波要克制。原则是:能在采样硬件层解决的别放到软件里,能用窄带的别用宽带。
常用的软件滤波器有一阶低通、移动平均、中值滤波。一阶低通最简单,一个系数搞定;移动平均窗口固定,延迟等于窗口一半;中值滤波对付脉冲尖峰特别有效,适合去掉偶发的采样野点。
y(k) = (1 − α) × y(k−1) + α × x(k)
一阶低通的α和截止频率关系是α ≈ Ts × 2π × fc。举个例子,控制频率 10kHz,想滤到 fc=500Hz,α ≈ 0.31。这个α对电流环来说偏大,相移明显,所以电流采样一般不靠软件低通,而是靠硬件 RC 加 PWM 同步采样。软件滤波更多用在速度环、位置环这些慢环上。
13 调试工具与测量手段
光靠改参数猜效率太低,得有工具。第一是在线变量观察:用调试器的 Live Watch 把 Id、Iq、速度误差、PWM 占空比实时画出来,很多问题一眼就明白。第二是串口或 CAN 把数据上传到电脑,用绘图软件看波形,必要时做 FFT。
第三是示波器直接抓模拟量。把 DAC 引出来一路速度估计、一路电流,或者用示波器探头测 PWM 引脚、栅极驱动信号,确认开关时刻和采样时刻是不是对齐的。这些看得见摸得着的量,比纯推理可靠得多。
第四是分步隔离。先断开速度环,只开电流环,给 Iq_ref 一个阶跃,看电流响应干不干净。电流环干净了再叠速度环,一层一层往上加。哪一层加上去开始抖,问题就在哪一层,别一上来就三环一起调。
14 一个实际排查案例
说个真实案例。一台两轮平衡小车,低速直行时车身来回小幅度摆动,频率大概 8Hz,客户怀疑机械装配。先录速度波形,发现两个轮子的速度误差都是 8Hz 的周期摆动,和机械无关。再断开速度环只看电流,电流波形干净,说明采样和电流环没问题。
问题锁定在速度估计上。查编码器测速窗用了 10ms,低速时每个窗口只有十几个脉冲,再加上编码器线干扰偶尔丢一两个计数,速度估计就出现周期性跳变。把测速窗改成 M/T 法,又在速度输出加了一个α=0.1 的一阶低通,8Hz 的摆动分量直接消失。
这个案例说明,很多抖动不是控制律本身的问题,而是前端估计量不干净。先保证眼睛看到的是平稳的,再谈闭环调参。顺序反了,参数怎么调都不对。
15 小结
电机软件抖动排查,按这个顺序走:先把现象量化成波形和频点,再从最前端的采样往后查——PWM 同步采样做了没有,采样电阻和运放带宽够不够,PWM 分辨率在低速下够不够细,死区补偿做了没有。
采样链干净了,再查估计环节:观测器角度抖不抖,编码器测速在低速下分辨率够不够,有没有用差分直接算速度。估计量干净了,最后才动 PID——微分项是不是在放大噪声,积分有没有饱和,控制周期本身稳不稳。
记住一句话:抖动多数不是控制器算错了,是控制器看到的东西不干净。把“眼睛”擦亮,比盲目调参数有效得多。下一篇我们专门讲低速震荡这个老大难问题,看看它和普通抖动到底有什么不一样。















































































