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 实现中的关键点

加速度前馈听起来很美好,但实际做起来有几个坑:

  1. 惯量辨识要准:J_load不准,前馈就变成负反馈了。我习惯用离线辨识+在线自适应结合的方式。
  2. 加速度信号要平滑:直接用位置指令的二次微分,噪声会很大。一般要用低通滤波器处理一下加速度指令。
  3. 前馈增益不能太大:通常设一个系数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)和自适应陷波。到时候再跟大家分享一些我在半导体设备上的实战经验。