25、振动抑制:陷波滤波器、低通滤波器、加速度前馈控制
做运动控制这么多年,我遇到过最头疼的问题之一,就是振动。你想想看,一台高速高精度的设备,明明算法算得挺好,电机也响应了,结果末端抖得跟筛子似的。这种时候,光靠调PID参数往往没用。我们需要专门的振动抑制手段。
今天这一讲,我重点聊三个最常用的工具:陷波滤波器、低通滤波器、加速度前馈控制。它们各有各的脾气,用对了地方,效果立竿见影。
25.1 振动从哪来?先搞清楚敌人是谁
在动手抑制之前,我们得先明白振动是怎么产生的。说白了,工业机器人或者运动轴,本质上是一个弹性系统。电机输出力矩,经过减速器、联轴器、皮带,再到负载。这中间每一环都有刚度,有间隙,有惯量。
当电机加速或减速时,力矩会激励起系统的固有频率。如果这个频率正好落在控制带宽内,那就会产生持续的振荡。我见过一个案例,一台六轴机器人,末端抖动频率在12Hz左右,怎么调参数都压不下去。后来一查,是末端负载的固有频率。
核心观点:振动抑制不是消除振动,而是让控制器不激励振动。或者说,把激励源和系统固有频率隔离开。
25.2 陷波滤波器:精准打击特定频率
陷波滤波器,英文叫Notch Filter。它的作用很专一——只衰减某一个特定频率的信号,其他频率几乎不受影响。这就像在音频里去掉某个刺耳的杂音,其他音乐照常播放。
25.2.1 原理与传递函数
陷波滤波器的传递函数长这样:
G(s) = (s² + ωₙ²) / (s² + 2ζωₙs + ωₙ²)
其中:
- ωₙ:陷波中心频率(你要抑制的那个振动频率)
- ζ:阻尼比(决定了陷波的宽度和深度)
阻尼比越小,陷波越深越窄,但相位变化也越剧烈。阻尼比越大,陷波越浅越宽,对周边频率影响也越大。
我的经验:我个人习惯把阻尼比设在0.3到0.7之间。太小的阻尼比(比如0.1)虽然抑制效果好,但容易引起相位突变,导致系统不稳定。我在一个龙门双驱项目上吃过这个亏,后来把阻尼比从0.15调到0.5,问题就解决了。
25.2.2 离散化实现
实际代码里,我们用的是数字陷波滤波器。常用的离散化方法是双线性变换(Tustin变换)。
假设采样周期为T,中心频率为fₙ,阻尼比为ζ,那么离散化后的系数可以这样算:
// 计算陷波滤波器系数
float T = 0.001; // 采样周期 1ms
float fn = 12.0; // 陷波频率 12Hz
float zeta = 0.5; // 阻尼比
float wn = 2 * PI * fn;
float den = 1 + 2 * zeta * wn * T + wn * wn * T * T;
float b0 = (1 + wn * wn * T * T) / den;
float b1 = (2 * (wn * wn * T * T - 1)) / den;
float b2 = (1 - 2 * zeta * wn * T + wn * wn * T * T) / den;
float a1 = (2 * (wn * wn * T * T - 1)) / den;
float a2 = (1 - 2 * zeta * wn * T + wn * wn * T * T) / den;
// 滤波计算
y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2];
注意:陷波滤波器会引入相位滞后。尤其是在陷波频率附近,相位变化很快。如果你在位置环或者速度环里串联了多个陷波滤波器,一定要检查相位裕度。我曾经在一个项目里串了三个陷波,结果系统直接振荡发散——相位裕度被吃光了。
25.3 低通滤波器:简单粗暴但有效
低通滤波器,Low-Pass Filter,LPF。它的思路很简单:把高频信号滤掉。因为大多数机械振动都是高频的(相对于控制带宽而言),所以低通滤波器能起到一定的抑制作用。
25.3.1 一阶低通 vs 二阶低通
| 类型 | 传递函数 | 特点 |
|---|---|---|
| 一阶低通 | G(s) = 1 / (τs + 1) | 简单,相位滞后45°@截止频率 |
| 二阶低通 | G(s) = ωₙ² / (s² + 2ζωₙs + ωₙ²) | 滚降更陡,但可能引入谐振峰 |
一阶低通滤波器,说白了就是一个惯性环节。它的截止频率f_c = 1/(2πτ)。低于这个频率的信号基本无损通过,高于这个频率的信号被衰减。
二阶低通滤波器,衰减速度更快(-40dB/decade),但如果阻尼比太小,会在截止频率附近出现一个谐振峰,反而放大振动。所以用二阶低通时,阻尼比一般取0.7左右(巴特沃斯响应)。
25.3.2 实际应用中的取舍
低通滤波器最大的问题是什么?它会滞后。你想想看,你把高频信号滤掉了,但同时也把控制信号中的高频成分滤掉了。这会导致系统的响应变慢。
我建议:
- 速度环输出:可以用一阶低通,截止频率设在速度环带宽的3~5倍
- 位置环输出:尽量不用低通,或者用很低的截止频率(比如100Hz以上)
- 电流环:一般不用低通,电流环本身带宽就高
避坑指南:我曾经在一个高速贴片机上,为了抑制末端抖动,把速度环的低通截止频率从200Hz降到了50Hz。结果振动是没了,但设备加减速变得很肉,生产效率直接掉了15%。后来我改用陷波滤波器,只抑制那个特定的18Hz振动,效果就好多了。所以,低通滤波器虽然简单,但别滥用。
25.4 加速度前馈控制:主动补偿振动
前面两种方法都是被动滤波——把已经产生的振动信号滤掉。加速度前馈控制不一样,它是主动的。它提前计算负载需要的加速度力矩,直接补偿给电流环,让电机主动去抵消振动。
25.4.1 基本原理
加速度前馈的核心公式很简单:
I_ff = J_load * a_cmd / Kt
其中:
- I_ff:前馈电流
- J_load:负载惯量(折算到电机轴)
- a_cmd:指令加速度
- Kt:电机力矩常数
你想想看,如果负载惯量J_load是准确的,那么电机输出的力矩正好等于加速负载所需的力矩。这样一来,电机和负载之间就没有力矩差,也就不会激励起弹性振动。
25.4.2 实现中的关键点
加速度前馈听起来很美好,但实际做起来有几个坑:
- 惯量辨识要准:J_load不准,前馈就变成负反馈了。我习惯用离线辨识+在线自适应结合的方式。
- 加速度信号要平滑:直接用位置指令的二次微分,噪声会很大。一般要用低通滤波器处理一下加速度指令。
- 前馈增益不能太大:通常设一个系数K_aff,范围0~1。K_aff=1表示完全补偿,但实际中我一般从0.5开始调。
一个实用的加速度前馈结构:
// 伪代码示例
float accel_cmd = (vel_cmd - vel_prev) / T; // 加速度指令
accel_cmd = lowpass_filter(accel_cmd, 50.0); // 50Hz低通平滑
float J_load = 0.002; // 负载惯量 kg·m²
float Kt = 0.5; // 电机力矩常数 Nm/A
float K_aff = 0.8; // 前馈增益
float I_ff = K_aff * J_load * accel_cmd / Kt;
// 最终电流指令 = 反馈电流 + 前馈电流
I_ref = I_fb + I_ff;
25.5 三种方法的对比与选择
说了这么多,到底什么时候用哪个?我整理了一个对比表:
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 陷波滤波器 | 已知固定频率的振动(如结构共振) | 精准打击,不影响其他频率 | 需要知道振动频率,多频率时复杂 |
| 低通滤波器 | 宽频带高频噪声,或不确定的振动 | 实现简单,鲁棒性好 | 引入相位滞后,降低响应速度 |
| 加速度前馈 | 惯量变化大、加减速频繁的场景 | 主动补偿,不滞后 | 依赖惯量辨识,对噪声敏感 |
在实际项目中,我经常把这三种方法组合使用。比如:
- 先用加速度前馈把大部分振动补偿掉
- 再用陷波滤波器把残留的特定频率干掉
- 最后用低通滤波器兜底,滤掉高频噪声
重要提醒:不管用哪种方法,都别忘了做频率响应分析。用扫频信号或者FFT分析,找到系统的真实固有频率。我见过太多人凭感觉设陷波频率,结果越调越糟。数据不会骗人,先测量,再动手。
25.6 小结
振动抑制这件事,说难也难,说简单也简单。关键是理解振动的来源,然后对症下药。陷波滤波器是手术刀,低通滤波器是创可贴,加速度前馈是预防针。三者各有用途,别指望一招鲜吃遍天。
嗯,这一讲就到这里。下一讲我会聊聊更高级的振动抑制技术——比如输入整形(Input Shaping)和自适应陷波。到时候再跟大家分享一些我在半导体设备上的实战经验。