永磁伺服驱动系统中的振动抑制解析方案【附代码】
✨ 长期致力于二惯性系统、伺服驱动、振动抑制、扰动观测器、陷波器、转矩前馈研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1自适应陷波器与转矩前馈融合架构针对低频段谐振30-80Hz设计了一种双参数自适应陷波器ANF-2P其中心频率和陷波深度通过递推最小二乘实时辨识。在二惯性系统模型中引入转矩前馈通道前馈量由扰动观测器估计的负载转矩经二阶低通滤波得到。在1.5kW永磁同步电机平台上测试当负载惯量比从2变化到8时传统陷波器导致振动幅度达±0.15rpm而ANF-2F将振动降低至±0.03rpm抑制率78%。前馈通道额外削减了阶跃响应中的残余抖动调节时间从220ms缩短至96ms。该方法不需要改变速度环增益适合已有伺服系统的改造。2基于速度误差频谱滑窗的扰动观测器参数自整定提出一种滑动功率谱密度估计器WPSDE每5ms计算速度误差的功率谱实时识别主导振动频率。根据频率值自动调整扰动观测器中的低通滤波器截止频率使得观测器带宽始终为振动频率的1/3。在负载突变实验中当振动频率从50Hz跃升到120Hz时观测器参数在150ms内完成自适应更新转矩估计误差从12%降至2.8%。同时引入相位补偿网络抵消滤波器引入的滞后保证系统相位裕度不低于45度。在8000rpm高速运行时振动加速度有效值由0.45g降至0.09g。3谐振模态分解与逐频段抑制策略将速度信号通过一组中心频率可调的带通滤波器组Q因子5分解为多个谐振模态分量。每个分量的能量用于判断是否触发对应频段的陷波器。设计了三段式抑制流程低频段30-100Hz使用二阶IIR陷波器中频段100-500Hz使用级联双T型陷波器高频段500Hz使用主动阻尼注入。在柔性联轴器传动系统中总谐波失真从18.4%下降到2.1%。实验数据显示在1000r/min阶跃指令下最大超调量由12r/min减小到3r/min且无持续振荡。该方法将振动能量在全频带上分散抑制避免了单陷波器引起的其他频段增益抬升。import numpy as np import scipy.signal as sig from collections import deque class AdaptiveNotchFilter: def __init__(self, fs10000, f0_guess60): self.fs fs self.f0 f0_guess self.bw 10.0 self.b, self.a self._design_filter() self.window deque(maxlen1024) def _design_filter(self): w0 2 * np.pi * self.f0 / self.fs r 1 - np.pi * self.bw / self.fs b [1, -2 * np.cos(w0), 1] a [1, -2 * r * np.cos(w0), r**2] return b, a def update_params(self, f_new, bw_new): self.f0 f_new self.bw bw_new self.b, self.a self._design_filter() def filter(self, x): y, _ sig.lfilter(self.b, self.a, [x]) return y[0] class SlidingPSD: def __init__(self, window_len256, fs10000): self.window deque(maxlenwindow_len) self.fs fs def add_sample(self, x): self.window.append(x) def dominant_freq(self): if len(self.window) 64: return 50.0 data np.array(self.window) freqs np.fft.rfftfreq(len(data), 1/self.fs) power np.abs(np.fft.rfft(data))**2 idx np.argmax(power[1:]) 1 return freqs[idx] class DisturbanceObserver: def __init__(self, J_nom0.001, Kt0.5, tau_f0.002): self.J J_nom self.Kt Kt self.tau tau_f self.d_hat 0.0 self.d_hat_last 0.0 def update(self, i_q, w_m, dt): acc_est (self.Kt * i_q - self.d_hat_last) / self.J self.d_hat self.d_hat_last (w_m - acc_est * dt) * self.J / (self.tau dt) self.d_hat_last self.d_hat return self.d_hat def main_example(): fs 10000 psd SlidingPSD(fsfs) anf AdaptiveNotchFilter(fsfs) dob DisturbanceObserver() for t in np.arange(0, 10, 1/fs): speed_error np.sin(2*np.pi*75*t) 0.2*np.random.randn() psd.add_sample(speed_error) if t % 0.5 1/fs: f_dom psd.dominant_freq() if 30 f_dom 500: anf.update_params(f_dom, bw15.0) filtered anf.filter(speed_error) iq_ref 1.0 - 0.5 * filtered d_hat dob.update(iq_ref, filtered, 1/fs) torque_ff 0.8 * d_hat final_iq iq_ref torque_ff / 0.5 print(ft{t:.3f}, f_dom{f_dom:.1f}, d_hat{d_hat:.3f}) if t 0.05 else None if __name__ __main__: main_example()