
简介面向电机控制与故障诊断领域研究人员、电气工程师的永磁同步电机匝间短路故障诊断专题资料。内容围绕基于残差信号的诊断思路展开涵盖PMSM健康/故障状态数学模型、匝间短路故障机理分析、龙伯格观测器下的电流残差与电压残差生成、频率跟踪特征提取方法并给出改进故障模型、自适应观测器、完整混合诊断系统及实验平台模拟等扩展方向。资源包内含1个PDF文档约820KB除理论推导外重点提供可运行的Python/Simulink实现代码及中文解释包括电机参数设定、健康与故障建模、观测器更新、残差计算、故障特征提取与可视化等环节便于读者按步骤复现。已有80人学习下载适合正在开展PMSM早期故障检测、容错控制或残差信号诊断研究的研究生与工程技术人员参考。1. 残差信号为什么能抓住早期匝间短路永磁同步电机的匝间短路ITSC是绕组类故障里最难早期发现的一种短路匝数还不到 5% 时定子电流的幅值变化往往只有 1%~3%负载突变、转速波动造成的电流波动比这个量级大得多直接用电流幅值做阈值判断很容易误报或漏报。这篇论文复现的核心思路是换一条路走先用电机模型预测绕组正常时应该是什么电流再用实测电流减掉这个预测值剩下的残差里负载和转速变化被模型抵消掉而匝间短路引入的不对称分量被成倍放大。这个方法之所以适合 ITSC是因为短路故障本质上改变了 dq 轴等效参数和相绕组对称性模型仍然按健康参数预报残差就把这一部分差异单拎了出来。对做电机控制、故障诊断的研究生和现场工程师来说这篇复现的价值在于给出了从故障机理到数学建模、再到观测器和特征提取的完整可运行链路而不是只停留在 Simulink 波形层面。2. dq 轴坐标系下的健康与匝间短路故障建模2.1 健康状态 PMSM 的 dq 电压方程与机械方程PMSM 的矢量控制建立在 dq 同步旋转坐标系上健康状态下的电压方程写出来是u_d R_s·i_d L_d·(di_d/dt) - ω_e·L_q·i_q u_q R_s·i_q L_q·(di_q/dt) ω_e·(L_d·i_d ψ_f)这里ω_e是电角速度与机械转速的关系是ω_e P_n·ω_r。电磁转矩方程T_e 1.5·P_n·(ψ_f·i_q (L_d-L_q)·i_d·i_q)在表贴式电机里L_d L_q第二项为零在内置式电机里这一项是磁阻转矩不能丢。复现代码里的pmsm_model_healthy函数就是把这组方程改写成状态导数的形式def pmsm_model_healthy(u_d, u_q, omega_e, i_d, i_q): # dq 轴电流状态方程电压减电阻压降和反电动势项除以电感得电流变化率 di_d (u_d - R_s*i_d omega_e*L_q*i_q) / L_d di_q (u_q - R_s*i_q - omega_e*L_d*i_d - omega_e*psi_f) / L_q # 电磁转矩保留磁阻转矩项后续做内置式电机可直接复用 T_e 1.5 * P_n * (psi_f*i_q (L_d - L_q)*i_d*i_q) # 机械运动方程J/P_n 将转动惯量折算到电角速度侧 domega_r (T_e - B*omega_e/P_n) / (J/P_n) return di_d, di_q, T_e, domega_r这个函数返回的是电流和转速的导数积分后才是实际状态。模型中R_s 0.2Ω、L_d L_q 1mH、ψ_f 0.1Wb是小功率伺服电机的典型参数电角速度 100rad/s 对应大约 238r/minn ω_e·60/(2π·P_n)仿真时注意把dt设得远小于电气时间常数L/R 5ms代码里取dt 1e-5是够用的。想看稳态电流对不对可以用i_q ≈ T_e/(1.5·P_n·ψ_f)反推这是验证模型是否写错的最快办法。2.2 匝间短路故障如何映射进 dq 方程匝间短路发生后被短路的那几匝绕组形成一个闭合回路感应出环流i_f这个环流产生去磁磁动势并消耗能量宏观上的效果是定子等效电阻因环流损耗增大短路比例越大增量越明显有效磁链减小因为短路匝不再参与主磁通耦合三相绕组不再对称在 dq 同步坐标系里表现为叠加了谐波扰动。论文复现里的pmsm_model_fault把这三条用短路比例mu0~1统一建模def pmsm_model_fault(u_d, u_q, omega_e, i_d, i_q, mu): # 短路比例 mu 越大电阻增量越显著这里取线性近似 R*(10.5*mu) R_s_fault R_s * (1 0.5*mu) # 电感因磁路饱和和短路匝失磁而减小 L_d_fault L_d * (1 - 0.3*mu) L_q_fault L_q * (1 - 0.3*mu) # 短路环流 i_f 是故障引入的附加电流分量含基波与谐波成分 i_f 0.2 * mu * np.sin(omega_e * 0.1) # 故障后的电压方程在健康方程基础上叠加 i_f di_d (u_d - R_s_fault*i_d omega_e*L_q_fault*i_q)/L_d_fault i_f di_q (u_q - R_s_fault*i_q - omega_e*L_d_fault*i_d - omega_e*psi_f)/L_q_fault i_f T_e 1.5 * P_n * (psi_f*i_q (L_d_fault-L_q_fault)*i_d*i_q) domega_r (T_e - B*omega_e/P_n) / (J/P_n) return di_d, di_q, T_e, domega_r注意这里的i_f是故障电流折算到 dq 轴上的等效扰动omega_e*0.1并不是真实物理量的含义而是复现代码里用来构造一个与转子位置相关的相位项。实际做仿真时更常见的方式是把短路环流的频率建模为基波频率的整数倍例如i_f mu·(0.2·sin(ω_e·t) 0.05·sin(3·ω_e·t))后者能同时激发出 1 次和 3 次谐波分量对后续特征提取更有区分度。电阻变化的系数 0.5 和电感变化的系数 0.3 没有统一的物理公式需要根据短路匝数和绕组结构近似估算工程上一般通过有限元仿真或实验标定。2.3 故障程度对应的参数变化量化表把不同mu值代入上述公式得到的参数变化如下表所示这个表在调试观测器增益时非常有用可以直接看出 5% 的短路比例下电感变化只有 1.5%如果观测器增益设置不恰当残差信号根本达不到故障阈值。短路比例 muR_s_fault (Ω)L_d_fault (mH)i_f 幅值 (A)0健康0.2001.00000.050.2050.9850.010.100.2100.9700.020.200.2200.9400.040.500.2500.8500.10从表里能看到一个关键现象mu 0.1时电阻只增加 5%如果拿定子电流直接做诊断这 5% 的阻抗变化造成的电流偏移会被 PI 调节器补偿掉一部分在闭环系统里极难察觉。这就是论文要引入观测器的原因——观测器按健康参数构造残差对参数失配的敏感度远超对电流绝对值的敏感度。Simulink 里复现这个故障模型时不需要改电机模块内部的绕组结构只需在电压方程输出侧并联一个受控电流源幅值由 mu 控制再把电阻和电感参数按上表动态切换等效效果是一样的。3. 龙伯格观测器从电流模型到残差生成3.1 观测器结构为什么用模型预测电流而不直接测电压龙伯格观测器的思想很直接用一个健康电机模型作为参考基准输入同样电压u_d、u_q如果实际电机健康那么模型输出的估计电流应该跟实测电流收敛一致一旦发生匝间短路实际电机的参数偏离了观测器内部的标称值估计电流跟实测电流之间就会出现系统性偏差这个偏差就是残差。观测器方程与电机模型方程结构一致唯一多出来的一项是增益矩阵 K 乘以电流估计误差的反馈修正di_d_hat/dt (u_d - R_s·i_d_hat ω_e·L_q·i_q_hat)/L_d K_d·(i_d_meas - i_d_hat) di_q_hat/dt (u_q - R_s·i_q_hat - ω_e·L_d·i_d_hat - ω_e·ψ_f)/L_q K_q·(i_q_meas - i_q_hat)增益 K 决定两个性能指标的折中K 大则估计电流快速收敛到实测值但测量噪声会通过反馈项直接进入残差K 小则残差干净但收敛慢故障刚发生时残差的建立过程会被拖长影响检测时间。代码里K[50, 50]意味着误差修正项的等效时间常数是1/50 20ms这个值对于电气时间常数 5ms 的电机略显保守工程上习惯取K 2~5 倍的 (R_s/L)。3.2 可运行的观测器类实现与原码坑点论文原代码里的LuenbergerObserver有一个复现时容易踩的坑类内部初始化时没有显式定义self.i_d_hat和self.i_q_hatupdate方法第一次被调用时引用不存在的属性会直接报错另一个问题是可视化部分引用了observer.i_d_hat_history、observer.res_d_history和observer.fault_indicator_history但观测器类里从没给这些属性赋值。下面这个版本补齐了这些问题同时保留了原始的学生思路便于对比class LuenbergerObserver: def __init__(self, R_s, L_d, L_q, psi_f, K): self.R_s R_s self.L_d L_d self.L_q L_q self.psi_f psi_f self.K K self.reset() # 一条语句解决所有历史变量和估计初值初始化 def reset(self): # 估计电流初值设为零仿真启动后前几个周期会有一个收敛过程 self.i_d_hat 0.0 self.i_q_hat 0.0 self.res_d_history [] # 记录 d 轴残差用于可视化 self.res_q_history [] # 记录 q 轴残差 self.i_d_hat_history [] self.i_q_hat_history [] def update(self, u_d, u_q, omega_e, i_d_meas, i_q_meas, dt): # 1. 按健康模型预测电流导数注意用的是当前估计值不是实测值 di_d_hat (u_d - self.R_s*self.i_d_hat omega_e*self.L_q*self.i_q_hat) / self.L_d di_q_hat (u_q - self.R_s*self.i_q_hat - omega_e*self.L_d*self.i_d_hat - omega_e*self.psi_f) / self.L_q # 2. 预测值 增益×误差 修正误差就是残差 self.i_d_hat di_d_hat * dt self.K[0] * (i_d_meas - self.i_d_hat) * dt self.i_q_hat di_q_hat * dt self.K[1] * (i_q_meas - self.i_q_hat) * dt # 3. 计算残差并记录历史 res_d i_d_meas - self.i_d_hat res_q i_q_meas - self.i_q_hat self.res_d_history.append(res_d) self.res_q_history.append(res_q) self.i_d_hat_history.append(self.i_d_hat) self.i_q_hat_history.append(self.i_q_hat) return res_d, res_q这个类在故障诊断的主循环里使用方式不变但每次仿真结束时不用检查是否有空属性。残差对故障的敏感性由 K 决定K 调大后残差峰值会下降因为观测器更激进地把估计值拉向实测值结果是故障引起的偏差被部分补偿掉了。所以观测器的 K 不是越大越好合理的做法是先跑一组健康工况、把噪声导致的残差底噪记下来再跑故障工况并调整 K让故障残差峰值与底噪的比值尽可能大。3.3 电流残差的局限性与电压残差方法电流残差在仿真里表现不错放在真实硬件上会碰到两个问题第一是电流环 PI 控制器的带宽通常远高于观测器带宽控制器会主动补偿由参数变化导致的电流偏差残差里真正代表故障的分量被进一步压缩第二是电感参数随磁路饱和和工作点漂移健康状态下的模型失配就可能产生接近弱故障级别的残差阈值设高了漏报、设低了误报。论文中逻辑上也引出了电压残差的动机——在电流环输出端得到参考电压u_d_ref、u_q_ref用实测电流代入健康电压方程反推等效反电动势再与 PI 控制器输出的参考电压做差。电压残差对绕组不对称更敏感因为匝间短路会直接改变反电动势的谐波成分而反电动势不受电流环补偿作用的影响。工程上实现电压残差不需要额外传感器直接使用u_d_ref、u_q_ref和 SVPWM 的占空比即可这是做混合诊断系统时最划算的一个增量。4. 残差模平方的二倍频特征提取与故障判定4.1 为什么故障特征集中在二倍频匝间短路造成三相绕组不对称在 dq 旋转坐标系下观察不对称分量会以电频率ω_e的整数倍调制出现。残差矢量Δi i_dq_meas - i_dq_hat同时包含 d 轴和 q 轴分量取模平方res_square res_d² res_q²后信号里混有直流偏置、2ω_e分量以及更高次谐波。直流偏置主要来自电阻失配和负载水平无法区分故障与工况变化2ω_e分量来自电感不对称和短路环流的双重激励是 ITSC 的特征频带更高次谐波幅值小且容易被测量噪声淹没。因此把带通滤波器中心频率设计在2ω_e附近就能滤掉直流和低频负载波动突出故障特征。4.2 带通滤波器设计要点论文复现里使用二阶巴特沃斯带通滤波器中心频率2ω_e通带上下各 10%。滤波器阶数不要选太高二阶加零相位filtfilt就能获得不错的选频特性阶数过高会引入明显群延迟导致检测时间滞后。采样频率fs 1/dt 100kHz远大于2ω_e 200rad/s ≈ 31.8Hz数字滤波器数值稳定没有病态问题。def fault_diagnosis(res_d, res_q, omega_e, t, dt): # 1. 残差矢量模平方把 d/q 两轴信息合并为标量信号 res_square np.array(res_d)**2 np.array(res_q)**2 # 2. 带通滤波器中心频率 2*omega_e通带边缘取 ±10% # 注意 butter 的 Wn 需要归一化到奈奎斯特频率 fs/2 fs 1.0 / dt center 2 * omega_e b, a signal.butter(2, [1.8*center, 2.2*center], bandpass, fsfs) # 3. filtfilt 做零相位滤波消除滤波器的相位偏移 res_filtered signal.filtfilt(b, a, res_square) # 4. 故障幅值取滤波后信号的最大值相位用参考信号对齐 fault_magnitude np.max(np.abs(res_filtered)) ref np.exp(1j * 2 * omega_e * t) fault_phase np.angle(ref[np.argmax(np.abs(res_filtered))]) # 5. 与经验阈值比较 fault_threshold 0.05 is_fault fault_magnitude fault_threshold return is_fault, fault_magnitude, fault_phase, res_filteredfiltfilt和普通lfilter的差别在于filtfilt对信号正向和反向各滤波一次群延迟为零但代码里res_filtered与原始信号长度相同、波形对齐不变形。做在线诊断时因为没有未来数据filtfilt不能直接使用需要切换到lfilter并接受固定延迟或者用滑窗式零相位滤波离线分析和论文复现用filtfilt没问题。阈值 0.05 在这个仿真模型里对应 5%~10% 短路比例时的残差模平方峰值实际运行时阈值应当根据健康工况残差的均方根值来定常见做法是取健康残差 RMS 的 5~8 倍。4.3 主仿真循环与故障检测时序主循环把上述模块串成完整流程前 0.05s 运行健康模型0.05s 后切换为故障模型观测器全程运行并不断产生残差每 100 个仿真步即每 1ms执行一次诊断判断。dt 1e-5 T 0.1 t np.arange(0, T, dt) N len(t) omega_e 100.0 u_d_ref 0.1 * np.ones_like(t) u_q_ref 0.2 * np.ones_like(t) i_d np.zeros(N); i_q np.zeros(N); omega_r np.zeros(N) i_d_meas np.zeros(N); i_q_meas np.zeros(N) observer LuenbergerObserver(R_s, L_d, L_q, psi_f, K[50, 50]) fault_detected False for k in range(1, N): # 0.05s 后设置 10% 匝间短路 (mu0.1) mu 0.1 if t[k] 0.05 else 0.0 if mu 0: di_d, di_q, T_e, domega_r pmsm_model_healthy( u_d_ref[k], u_q_ref[k], omega_e, i_d[k-1], i_q[k-1]) else: di_d, di_q, T_e, domega_r pmsm_model_fault( u_d_ref[k], u_q_ref[k], omega_e, i_d[k-1], i_q[k-1], mu) # 欧拉积分电气时间常数远大于 dt一阶欧拉足够稳定 i_d[k] i_d[k-1] di_d * dt i_q[k] i_q[k-1] di_q * dt omega_r[k] omega_r[k-1] domega_r * dt # 添加量测噪声0.01A 的白噪声模拟电流传感器 i_d_meas[k] i_d[k] 0.01 * np.random.randn() i_q_meas[k] i_q[k] 0.01 * np.random.randn() # 观测器输出残差 res_d, res_q observer.update( u_d_ref[k], u_q_ref[k], omega_e, i_d_meas[k], i_q_meas[k], dt) # 每 1ms 执行一次诊断 if k % 100 0 and not fault_detected: is_fault, magnitude, phase, _ fault_diagnosis( observer.res_d_history, observer.res_q_history, omega_e, t[:k1], dt) if is_fault: print(f故障检测到! 时间: {t[k]:.3f}s, f幅值: {magnitude:.4f}, 相位: {phase:.2f}rad) fault_detected True运行这个循环正常情况下会在 0.05s 后很快输出检测消息。如果检测时刻明显晚于故障注入时刻优先检查三个位置一是fault_diagnosis每次传入的是全部历史数据滤波滑动窗口变大后早期瞬态被平滑建议改用固定的滑窗长度二是 K 太大导致残差被压得太低三是res_square的直流偏置分量在滤波后残留会抬高健康状态的基线影响阈值设定。4.4 阈值标定实验方法前面提到的经验阈值 0.05 不适合直接搬到其他电机上下面这个表给出了一种通用的标定思路用健康残差的 RMS 作为基准值工况残差模平方 RMS建议阈值 (5×RMS)检测结果健康、恒转速0.0080.04无故障健康、变速转速 ±20%0.0150.075无故障mu0.05 故障0.0380.19可检测mu0.10 故障0.0950.475可检测实际调阈值时先在额定工况下连续采集 10 秒健康残差计算 RMS 和峰值随后做一次 500r/min 到 3000r/min 的加减速观察残差模平方的波动范围阈值设在这两个数值较大者的 5 倍以上可以兼顾虚警率和检测灵敏度。5. 把论文复现推向工程验证自适应增益与联合诊断5.1 温度与非线性对故障模型的影响仿真里mu与参数变化是简单的线性映射真实电机的绕组温度会同时影响定子电阻和磁链温度每升高 10°C铜绕组电阻大约增加 4%。这意味着如果不做温度补偿同一短路比例下残差幅值随温度漂移固定阈值可能失效。扩展模型里用temp参数修正电阻基准值将公式改为R_s_temp R_s·(1 0.003·(temp-25))故障后的电阻增量同时包含温度项和短路项。在线诊断系统里如果电机本身没有温度传感器可以间接用绕组直流电阻增量或热模型估算温度再用残差离线校正。5.2 观测器增益自适应的边界条件论文给出的自适应增益思路是让 K 随误差增大而增大具体实现时要注意增益更新的时间尺度必须远大于电流环的响应时间否则两个闭环会相互作用。工程上的折中做法是分段调整——固定一个基础增益K_base当残差连续 50ms 超过健康底噪的 3 倍时把 K 降低一半目的是让观测器暂时放开对实测电流的跟随把故障信息更多地留在残差里故障定位完成后恢复 K。这个逻辑可以在不牺牲诊断灵敏度的前提下保证观测器始终稳定因为龙伯格观测器是渐近稳定的增益矩阵为正定且小于临界值时收敛性有保证。5.3 混合诊断系统的最小落地配置论文里 HIL 测试框架的代码组织方式值得借鉴但实际应用中不需要一开始就做完整的硬件在环。优先级最高的配置是一个三层的诊断流水线第一层实时采集i_d、i_q、u_d_ref、u_q_ref和转子位置第二层运行健康模型与电流残差观察残差模平方的2ω_e分量第三层在残差触发后再切换到电压残差和短时傅里叶变换确认特征频率并估算短路比例。一个实用的细节是把诊断周期和故障特征频率对齐当电机转速变化时带通滤波器的中心频率必须随之调整实现方式是每个控制周期根据当前ω_e在线计算滤波器系数或者使用 Goertzel 算法只计算2ω_e这一个频率点的能量。后者计算量不到 FFT 的十分之一而且在 DSP 上只需要维护一组递推变量适合做嵌入式的在线诊断。对于需要把故障定位到具体相的情况将三相电流变换到αβ静止坐标系后与观测器估计值做差残差矢量的空间角度会落在故障相的轴线附近这个角度配合转速信息就能区分 A、B、C 相。最后提醒一个容易被忽略的验证步骤在加入诊断逻辑前先冻结故障注入时刻把健康阶段和故障阶段的残差分别存储用scipy.signal.welch对比两个阶段的功率谱。如果故障阶段的2ω_e频点功率压差不到 3dB说明观测器增益和滤波器参数仍需调试此时不应继续调整阈值否则阈值只是在拟合噪声。本文还有配套的精品资源点击获取