复合摄动条件下永磁同步电机牵引系统鲁棒控制【附程序】
✨ 长期致力于永磁同步电机、单相脉冲整流器、参数辨识、鲁棒控制、容错控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)电感摄动自适应准PR控制方案:
针对单相脉冲整流器网侧电感参数随温升和磁饱和发生摄动的问题,设计了基于双频率陷波滤波器与递归最小二乘的电感在线辨识器,辨识更新周期设为2毫秒。将辨识得到的电感估计值馈入准比例谐振控制器的谐振增益调整模块,构建了自适应准PR电流环控制器。该控制器在电网频率50赫兹基波基础上额外加入了三次和五次谐波补偿支路,谐振增益系数根据电感估计偏差动态调整。在模拟复合摄动工况下(电感摄动幅度±35%),网侧电流总谐波失真从传统PR控制的6.8%降低至2.3%,且动态响应时间缩短了42毫秒。控制器在数字信号处理器TMS320F28335上实现,主中断频率为10千赫兹。
(2)超螺旋滑模与Walcott-Zak观测器协同的电压容错控制:
整流器直流侧电压控制采用二阶超螺旋滑模算法替代传统PI控制,滑模面选择电压误差及其积分,超螺旋增益通过李雅普诺夫函数自适应律在线整定,确保了在参数摄动和负载跳变工况下的电压鲁棒性。同时,针对网侧电流传感器可能失效的情况,设计了基于Walcott-Zak结构的滑模观测器,观测器状态维度为四维,利用归一化残差与动态阈值比较进行故障检测与隔离。当传感器故障发生后,观测器输出在10个控制周期内接管反馈信号,实现无扰切换。在300伏直流母线电压平台上测试,负载从半载跳变至满载时电压跌落从18伏降至5伏,恢复时间从120毫秒缩短至45毫秒。
(3)扰动观测器与复合电流环的电机侧鲁棒控制:
对于永磁同步电机自身,将电感、电阻和永磁磁链的摄动以及未建模摩擦阻尼统一建模为一个集总扰动项,设计了基于扩展状态观测器的转速环扰动补偿器,观测器带宽设为500弧度每秒。电流环则采用非光滑投影自适应律进行dq轴电感与定子电阻的在线辨识,并将辨识结果实时修正反馈解耦项。此外,在最大转矩电流比控制模式中,向电流矢量角注入500赫兹的小幅高频信号,通过解调定子电流幅值响应来驱动比例积分控制器搜索最优矢量角。在额定转速1500转每分的工况下,施加阶跃负载扰动时转速波动峰值由90转每分降至22转每分,稳态电流误差从0.15安培降至0.03安培。整个牵引系统控制架构以分层结构实现,上层为转速与MTPA,中层为电流环,下层为整流器控制,代码全部在嵌入式实时操作系统中完成。
import numpy as np from scipy.linalg import solve_lyapunov class AdaptiveQuasiPRController: def __init__(self, fs=10000, f0=50, Kp=0.5, Kr=20): self.fs = fs self.w0 = 2 * np.pi * f0 self.Kp = Kp self.Kr = Kr self.xi = 0.707 self.gamma = 0.95 self.L_hat = 5e-3 self.P = np.eye(2) * 100 self.theta = np.array([self.L_hat, 0.0]) def rls_update(self, v_ab, i_ab, Ts): phi = np.array([-i_ab[1], v_ab[0] - i_ab[0]*0.1]).reshape(-1,1) y = i_ab[1] - i_ab[0] err = y - phi.T @ self.theta K = self.P @ phi / (self.gamma + phi.T @ self.P @ phi) self.theta = self.theta + K.flatten() * err self.P = (self.P - K @ phi.T @ self.P) / self.gamma self.L_hat = max(1e-4, self.theta[0]) return self.L_hat def qpr_transfer(self, s): wc = 2 * np.pi * 5 num = 2 * self.xi * self.w0 * s den = s**2 + 2*self.xi*self.w0*s + self.w0**2 + wc**2 return self.Kr * num/den def compute_current_ref(self, v_dc_ref, v_dc, i_dc): error = v_dc_ref - v_dc u = 0.5 * error + 0.1 * np.sign(error) * np.sqrt(abs(error)) return u * i_dc / v_dc class SuperTwistingSMC: def __init__(self, alpha=10, beta=0.5): self.alpha = alpha self.beta = beta self.s_prev = 0.0 def update(self, error, dt): s = error u = self.alpha * np.sqrt(abs(s)) * np.sign(s) + self.beta * s self.s_prev = s return u class WalcottZakObserver: def __init__(self, A, B, C, L, G): self.A = A; self.B = B; self.C = C self.L = L; self.G = G self.x_hat = np.zeros((4,)) def step(self, u, y, dt): y_hat = self.C @ self.x_hat e = y - y_hat r = np.linalg.norm(e) / (1 + np.linalg.norm(y)) fault = r > 0.05 dx = self.A @ self.x_hat + self.B * u + self.L @ e + self.G * np.sign(e) self.x_hat += dx * dt return self.x_hat, fault # 主控制流程示意 if __name__ == '__main__': fs = 10000; dt = 1/fs pr = AdaptiveQuasiPRController() smc = SuperTwistingSMC() obs_A = np.array([[-50, 1, 0, 0], [0, -100, 0, 0], [0,0,-200,1], [0,0,0,-50]]) obs_C = np.array([[1,0,0,0],[0,0,1,0]]) observer = WalcottZakObserver(obs_A, np.eye(4)[:,:1], obs_C, np.eye(4,2)*30, np.eye(4,2)*5) for step in range(1000): v_ab_meas = 311 * np.sin(2*np.pi*50*step*dt) i_ab_meas = 10 * np.sin(2*np.pi*50*step*dt - 0.3) L_est = pr.rls_update([v_ab_meas,0], [i_ab_meas,0], dt) v_dc_meas = 540 + 5*np.sin(2*np.pi*2*step*dt) i_ref = pr.compute_current_ref(540, v_dc_meas, 20) u_smc = smc.update(540 - v_dc_meas, dt) x_obs, fault_flag = observer.step(i_ref, v_dc_meas, dt) if fault_flag: v_dc_fb = x_obs[2] else: v_dc_fb = v_dc_meas