4. 机械谐振与柔性模态:双惯量系统建模、谐振频率识别、陷波滤波器设计

做运动控制这么多年,我踩过最大的坑,就是机械谐振。你想想看,明明PID参数调得挺好,电机一转起来,整个系统就开始抖,甚至发出刺耳的尖叫声。说白了,这就是机械结构本身的柔性在捣乱。

今天咱们就聊聊这个让人头疼的问题。我会从双惯量系统建模开始,一步步带你识别谐振频率,最后给出实用的陷波滤波器设计方案。嗯,这些都是我在产线上摸爬滚打总结出来的经验。

4.1 双惯量系统建模

实际工程中,电机和负载之间不是刚性连接的。联轴器、皮带、减速机,这些东西都有弹性。我习惯用一个简单的双惯量模型来描述:

双惯量系统核心参数:

  • JM:电机惯量
  • JL:负载惯量
  • KS:连接刚度
  • BS:阻尼系数

这个系统的传递函数,我直接给你写出来:

G(s) = ω_L(s) / T_M(s) = 1 / (J_M * s²) * (J_L * s² + B_S * s + K_S) / (J_eq * s² + B_S * s + K_S)

其中:
J_eq = J_M + J_L  (等效惯量)

为什么会这样?因为电机输出的扭矩,一部分用来加速电机本身,另一部分通过弹性轴传给负载。这两者之间,就产生了谐振。

我在一个贴片机项目中遇到过这种情况。电机加速到2000rpm时,整个机头开始剧烈抖动。当时我用示波器抓电流波形,一眼就看出是典型的双惯量谐振特征。

4.2 谐振频率识别

识别谐振频率,说白了就是找到那个让系统发疯的频率。我个人习惯用两种方法:

4.2.1 理论计算法

根据双惯量模型,我们可以算出两个关键频率:

频率类型 计算公式 物理意义
反谐振频率 ωAR = √(KS / JL) 负载侧的固有频率
谐振频率 ωR = √(KS * (JM + JL) / (JM * JL)) 系统整体的谐振点

经验之谈:实际中,谐振频率通常比反谐振频率高。如果两者很接近,说明阻尼很小,系统很容易振荡。我曾经遇到一个案例,谐振频率和反谐振频率只差5%,结果系统根本没法用PID稳住。

4.2.2 扫频实测法

理论计算只能给个大概,真正要准,还得实测。我常用的步骤:

  1. 给速度环注入正弦扫频信号(比如从1Hz扫到500Hz)
  2. 记录电机实际速度响应
  3. 用FFT分析幅频特性曲线

下面是我画的一个典型双惯量系统幅频特性图:

双惯量系统幅频特性曲线 频率 (Hz) 1 10 100 500 0 dB -20 dB -40 dB 反谐振点 ωAR 谐振峰 ωR 幅频响应 特征频率点

看到那个尖峰了吗?那就是谐振频率。我建议你重点关注这个峰的幅值,如果超过10dB,系统基本没法稳定运行。

4.3 陷波滤波器设计

找到谐振频率后,最直接的办法就是加陷波滤波器。说白了,就是在谐振点挖个坑,把那个尖峰削掉。

4.3.1 滤波器结构

我常用的二阶数字陷波滤波器,传递函数是这样的:

H(z) = (b₀ + b₁·z⁻¹ + b₂·z⁻²) / (1 + a₁·z⁻¹ + a₂·z⁻²)

系数计算:
b₀ = (1 + α·R) / 2
b₁ = -cos(ω₀·Tₛ) · (1 + α)
b₂ = (1 + α·R) / 2
a₁ = -cos(ω₀·Tₛ) · (1 + α)
a₂ = α

其中:
ω₀ = 2π·f₀  (f₀为目标谐振频率)
Tₛ = 采样周期
R = 10^(-BW/40)  (BW为陷波带宽,单位dB)
α = (1 - tan(BW·Tₛ/2)) / (1 + tan(BW·Tₛ/2))

注意:陷波深度不是越深越好。我见过有人把陷波深度设到-40dB,结果系统响应变得特别慢,还引入了相位滞后。一般-20dB到-30dB就够用了。

4.3.2 参数整定步骤

我在实际项目中,一般按这个流程来:

  1. 粗调:先根据扫频结果,把陷波频率设在谐振峰中心
  2. 调带宽:带宽设为中心频率的5%-10%。太窄了削不干净,太宽了影响其他频段
  3. 调深度:从-10dB开始,逐步加深,直到系统稳定
  4. 验证:重新扫频,看谐振峰是否被削平

给你看个我实际用过的代码片段:

// 陷波滤波器参数计算
typedef struct {
    float b0, b1, b2;  // 前馈系数
    float a1, a2;      // 反馈系数
    float x1, x2;      // 输入历史
    float y1, y2;      // 输出历史
} NotchFilter;

void NotchFilter_Init(NotchFilter *f, float f0, float bw, float fs) {
    float w0 = 2 * M_PI * f0 / fs;
    float R = powf(10, -bw / 40.0f);
    float alpha = (1 - tanf(bw * M_PI / fs)) / (1 + tanf(bw * M_PI / fs));
    
    f->b0 = (1 + alpha * R) / 2;
    f->b1 = -cosf(w0) * (1 + alpha);
    f->b2 = (1 + alpha * R) / 2;
    f->a1 = -cosf(w0) * (1 + alpha);
    f->a2 = alpha;
    
    f->x1 = f->x2 = 0;
    f->y1 = f->y2 = 0;
}

float NotchFilter_Process(NotchFilter *f, float input) {
    float output = f->b0 * input + f->b1 * f->x1 + f->b2 * f->x2
                   - f->a1 * f->y1 - f->a2 * f->y2;
    
    f->x2 = f->x1;
    f->x1 = input;
    f->y2 = f->y1;
    f->y1 = output;
    
    return output;
}

避坑指南:我曾经在一个高速主轴项目上,谐振频率在800Hz附近。我按常规方法设计陷波器,结果发现滤波器本身引入了额外的相位延迟,导致系统在低频段出现振荡。后来我改用级联两个带宽较窄的陷波器,效果反而更好。记住,有时候一个滤波器搞不定,就拆成两个。

4.4 工程实践要点

最后,我总结几个关键点:

  • 谐振频率会变:负载变化、温度变化都会影响谐振频率。我建议在系统运行时做在线辨识,动态调整陷波参数
  • 不要只依赖陷波器:机械结构本身的优化更重要。能加粗轴径就别加粗,能用刚性联轴器就别用弹性联轴器
  • 注意采样率:陷波器的有效工作范围在采样率的1/10以内。如果你的采样率是10kHz,那陷波频率最好别超过1kHz

嗯,关于机械谐振和陷波滤波器,今天就聊到这儿。这些方法我在十几个项目里验证过,效果都还不错。你回去可以拿自己的系统试试,有问题随时交流。

核心要点回顾:

  • 双惯量系统是理解机械谐振的基础模型
  • 扫频法是最可靠的谐振频率识别手段
  • 陷波滤波器参数要谨慎整定,过深过宽都有副作用
  • 实际工程中要结合机械优化和电气补偿

公众号:蓝海资料掘金营,微信deep3321