✨ 长期致力于二惯性系统、伺服驱动、振动抑制、扰动观测器、陷波器、转矩前馈研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(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, fs=10000, f0_guess=60): self.fs = fs self.f0 = f0_guess self.bw = 10.0 self.b, self.a = self._design_filter() self.window = deque(maxlen=1024) 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_len=256, fs=10000): self.window = deque(maxlen=window_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_nom=0.001, Kt=0.5, tau_f=0.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(fs=fs) anf = AdaptiveNotchFilter(fs=fs) 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, bw=15.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(f't={t:.3f}, f_dom={f_dom:.1f}, d_hat={d_hat:.3f}') if t < 0.05 else None if __name__ == '__main__': main_example()