1. 双惯量伺服系统的机械谐振问题
在工业伺服控制系统中,双惯量结构是一种常见但颇具挑战性的机械配置。这种系统通常由电机侧的惯量(Jm)和负载侧的惯量(Jl)通过具有一定弹性的传动部件(如联轴器、丝杠或皮带)连接而成。弹性元件在传递扭矩时会产生扭转变形,这种变形与惯量相互作用就形成了典型的弹簧-质量系统。
当伺服系统运行时,电机输出的扭矩波动会通过传动部件传递到负载端。在特定频率下,系统会出现明显的机械谐振现象——表现为电机电流异常波动、位置跟踪误差增大,严重时甚至能听到机械结构发出的"嗡嗡"声。这种谐振不仅影响控制精度,长期运行还会加速机械部件的磨损。
以一个典型的工业机器人关节为例:伺服电机(Jm=0.001 kg·m²)通过谐波减速器(刚度K=5000 N·m/rad)驱动机械臂连杆(Jl=0.1 kg·m²)。根据双惯量系统谐振频率公式:
code复制f_res = (1/2π) * √(K*(Jm+Jl)/(Jm*Jl))
计算可得该系统的谐振频率约为357Hz。当控制环路的增益设置较高时,很容易激发这个频率附近的振荡。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 陷波滤波器的原理与设计
陷波滤波器(Notch Filter)是一种特殊的带阻滤波器,它能在特定频率附近形成极窄的阻带,同时几乎不影响其他频率信号的传输。这种特性使其成为抑制机械谐振的理想工具。
2.1 基本数学模型
一个典型的数字陷波滤波器可以用以下传递函数表示:
matlab复制H(z) = (1 - 2cos(ω0)z⁻¹ + z⁻²) / (1 - 2rcos(ω0)z⁻¹ + r²z⁻²)
其中:
- ω0 = 2πf0/fs 是归一化的中心频率(f0为谐振频率,fs为采样频率)
- r 是极点半径(0<r<1),决定滤波器的带宽
- 分子在单位圆上产生零点,正好抵消极点的影响
在Simulink中,我们可以直接使用Discrete Notch Filter模块,其参数设置界面包含:
- Center frequency(中心频率):设置为机械谐振频率
- Bandwidth(带宽):通常设为谐振频率的1/10~1/5
- Depth(深度):控制衰减程度,一般用-30dB~-50dB
2.2 参数整定经验
在实际工程中,谐振频率的准确识别至关重要。以下是几种实用方法:
-
频响分析法:
matlab复制% 使用sinestream信号进行频率扫描 f = logspace(1,3,100); % 10Hz到1kHz [mag,phase] = bode(sys,f); [peakMag,peakIdx] = findpeaks(mag); resFreq = f(peakIdx); -
时域观察法:
给系统施加阶跃信号,用FFT分析电流或速度响应的频谱成分:matlab复制current = simout.Current.Data; Fs = 1/simout.Current.Time(2); [Pxx,f] = pwelch(current,[],[],[],Fs); -
自动调谐工具:
MATLAB的Control System Tuner或PID Tuner工具可以自动识别谐振频率并设计相应滤波器。
注意:实际谐振频率可能随温度、负载位置等因素变化,建议保留10%~15%的设计余量。
3. Simulink仿真模型搭建
3.1 双惯量系统建模
在Simulink中建立完整的双惯量系统模型需要以下几个关键部分:
-
电机模型:
- 使用PMSM或DC Motor模块
- 关键参数:定子电阻、电感、转矩常数
-
弹性传动模型:
matlab复制function tau = springTorque(theta_m, theta_l, K, B) delta_theta = theta_m - theta_l; tau = K * delta_theta + B * diff(delta_theta); end -
负载模型:
- 包含负载惯量和可能的摩擦力
- 可添加外部扰动转矩
完整的系统拓扑结构为:
code复制[速度指令] → [PID控制器] → [电流环] → [电机] → [弹性耦合] → [负载]
↑ ↓
[陷波滤波器] ← [速度反馈]
3.2 陷波滤波器集成
将陷波滤波器正确集成到控制环路中有两种主要方式:
-
速度环前向通道:
matlab复制% 直接在速度反馈路径插入 notchy = notchfilter(velFeedback, f0, bw); -
电流环反馈路径:
matlab复制% 在电流反馈中过滤特定频率成分 notchy = notchfilter(currentFeedback, f0, bw);
对于高精度系统,可以同时采用多级陷波:
matlab复制% 针对多个谐振频率
notch1 = design(fdesign.notch(4,f1,bw1,fs),'SystemObject',true);
notch2 = design(fdesign.notch(6,f2,bw2,fs),'SystemObject',true);
filteredSignal = notch2(notch1(originalSignal));
3.3 仿真参数设置
关键仿真参数建议:
- 求解器:ode4 (Runge-Kutta),固定步长
- 步长:≤1/(10*f_nyquist),通常取0.1ms
- 停止时间:足够观察瞬态和稳态(2-5s)
4. 仿真结果分析与优化
4.1 典型波形对比
未加陷波滤波器时,系统阶跃响应可能出现:
- 速度波形上有明显的高频振荡(谐振频率成分)
- 电流波形出现周期性波动
- 位置跟踪误差随时间累积
添加适当参数的陷波滤波器后:
- 振荡幅度减小60%以上
- 电流THD(总谐波失真)显著降低
- 调节时间可能略有增加
4.2 参数敏感性分析
通过参数扫描可以观察不同设置的影响:
matlab复制f0_range = linspace(0.8*f_res, 1.2*f_res, 10);
bw_range = linspace(0.05*f_res, 0.3*f_res, 8);
for i = 1:length(f0_range)
for j = 1:length(bw_range)
set_param('model/Notch','CenterFreq',num2str(f0_range(i)));
set_param('model/Notch','Bandwidth',num2str(bw_range(j)));
simout = sim('model');
overshoot(i,j) = max(simout.Position) - 1;
end
end
surf(f0_range, bw_range, overshoot');
4.3 先进改进方案
对于要求更高的系统,可以考虑:
-
自适应陷波滤波器:
matlab复制% 使用LMS算法实时调整中心频率 lmsFilter = dsp.LMSFilter('Length',11,'StepSize',0.01); [y,e] = lmsFilter(noisySignal, referenceSignal); -
多谐振点处理:
matlab复制% 级联多个陷波滤波器 notchArray = [... design(fdesign.notch('N,F0,BW',6,350,50,1e4)),... design(fdesign.notch('N,F0,BW',6,700,80,1e4))]; -
与观测器结合:
matlab复制% 使用状态观测器估计谐振转矩 [A,B,C,D] = linmod('dualMassModel'); K = lqr(A,B,eye(4),1); estStates = lsim(ss(A-K*C,[B K],eye(4),0),u,[],x0);
5. 工程实现注意事项
在实际项目应用中,有几个关键点需要特别注意:
-
离散化效应:
数字滤波器实现时需要考虑:matlab复制% 双线性变换保持频率特性 [numd,dend] = bilinear(num,den,fs); -
计算延迟补偿:
matlab复制% 添加预测补偿 delaySteps = 3; compensator = tf([1.5 -0.5],[1 0 0],Ts,'Variable','z^-1'); -
参数漂移处理:
matlab复制% 定期在线辨识 if mod(k,1000)==0 [f_est,bw_est] = onlineIdentification(currentSamples); updateNotchParams(f_est, bw_est); end -
安全保护机制:
- 设置滤波器参数变化率限制
- 添加输出幅值钳位
- 异常状态检测与恢复
我在实际项目中曾遇到一个典型案例:某包装机械的横封伺服系统在300Hz附近出现谐振,导致封口位置波动±0.5mm。通过以下步骤解决:
- 用加速度计采集振动信号,FFT分析确认谐振频率为312Hz
- 在Simulink中建立等效模型,仿真显示需要-40dB的衰减
- 采用两级陷波(310Hz和315Hz)覆盖可能的频率偏移
- 现场调试时微调带宽至35Hz,最终将位置波动控制在±0.1mm内
这种问题往往需要结合仿真和实测,因为实际传动刚度可能比理论值低15%-20%。建议每次机械结构调整后都重新检查谐振特性。
