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 扫频实测法
理论计算只能给个大概,真正要准,还得实测。我常用的步骤:
- 给速度环注入正弦扫频信号(比如从1Hz扫到500Hz)
- 记录电机实际速度响应
- 用FFT分析幅频特性曲线
下面是我画的一个典型双惯量系统幅频特性图:
看到那个尖峰了吗?那就是谐振频率。我建议你重点关注这个峰的幅值,如果超过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 参数整定步骤
我在实际项目中,一般按这个流程来:
- 粗调:先根据扫频结果,把陷波频率设在谐振峰中心
- 调带宽:带宽设为中心频率的5%-10%。太窄了削不干净,太宽了影响其他频段
- 调深度:从-10dB开始,逐步加深,直到系统稳定
- 验证:重新扫频,看谐振峰是否被削平
给你看个我实际用过的代码片段:
// 陷波滤波器参数计算
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