感应电机故障诊断Simulink建模与MCSA特征提取
简介:这份文档面向具备电气工程、自动化或电机控制基础的研究生、科研人员与工程技术人员,围绕感应电机绕组短路、转子断条等典型故障的检测与诊断展开,依托Simulink仿真思路梳理故障动态响应、信号采集、特征提取与分类判据设计,帮助读者理解故障机理并搭建诊断算法原型。压缩包内共1个docx文件,约261KB,内容以技术说明和仿真实验讲解为主,便于按章节查阅与复现。已有72人学习下载,适合用于高校教学实验、企业状态监测与预测性维护方案验证,也可作为相关故障诊断技术选型的参考。读者可从中获得故障模式分析框架、诊断流程组织方式及仿真验证思路,以及诊断算法的性能测试方法,并据此拓展至更多电机故障场景。
1. 感应电机故障诊断不是跑个仿真就完事:Simulink 模型卡住人的其实是故障显不显
在 Simulink 里搭一台感应电机,前半小时总是很顺:拖一个 Asynchronous Machine 模块,三相电源接上去,负载转矩一给,定子电流和转速波形就出来了。真正的麻烦从“让故障显出来”开始——转子断条明明设了,频谱里那条边带死活找不到;匝间短路加两匝,仿真几毫秒就发散;同一套判据换个负载点,健康工况被误判成故障。这份围绕感应电机故障诊断的 Simulink 资源,把定子绕组匝间短路、转子断条等典型故障的建模、数据采集、特征提取和判据验证串成了一条可复现的流程,配套 Matlab 脚本负责批量跑工况和组织数据集。它适合已经会用 Simulink 搭基础模型,手头有电机状态监测、预测性维护或电力系统相关课题的研究生和工程技术人员。下面按“故障在电流里长什么样 → 模型怎么改 → 特征怎么提 → 坑在哪 → 怎么扩展”的顺序拆。
2. 感应电机故障的电磁本质与 Simulink 选型:先把特征频率和额定工作点算清楚
2.1 三类故障在定子电流里的指纹
感应电机故障诊断的工程逻辑是从外部可测量反推内部异常。现场最容易拿到的是三相电压和电流,所以主流方案走电机电流特征分析(MCSA)路线,振动和温度作为辅助。定子绕组匝间短路、转子断条、气隙偏心这三类故障,在电流频谱里的表现各有分工:
- 定子绕组匝间短路:被短接的几匝形成闭合回路,相当于在定子侧叠加一个反向磁动势,气隙磁场不再对称。定子电流出现负序分量,基波两侧也会长出边带。短路匝数越多,负序分量越大,这是判断严重程度最直接的指标。
- 转子断条 / 端环开裂:转子回路不对称,会在定子电流中激发出 ((1 \pm 2s)f_1) 的边带,(s) 是转差率,(f_1) 是供电频率。这是最经典、也最适合在仿真里验证的一条判据。
- 气隙偏心:静态偏心带来 (f_1 \pm f_r) 的边带,动态偏心会把边带展宽成一组调制成分,通常需要电流和振动信号一起看。
这里有个新手最常踩的认知坑:转子断条的边带在负载下才明显。空载时转差接近零,((1 \pm 2s)f_1) 几乎和基波重合,频谱上根本分不开。所以做断条验证,千万别在空载工况下找特征,找一天也找不到。
2.2 模型选型:Asynchronous Machine 模块还是自建 dq 方程
Matlab/Simulink 里做感应电机故障仿真,实际就两条路,各有明确边界。
路线一:Simscape Electrical 的 Asynchronous Machine SI Units 模块。开箱即用,健康工况的稳态和暂态都稳,适合先跑通额定工作点、做控制器联调。缺点是模块内部是理想对称模型,定子绕组拓扑不能改,转子电阻也不能随转子位置变化。要注匝间短路和转子断条,得在模块外部加东西,或者换模型。
路线二:自己用 dq 轴方程或三相绕组方程搭。前期工作量大,但每一相电阻、电感都能单独改:匝间短路可以在某一相上引抽头,转子断条能把转子电阻写成转子位置的函数。这种模型跑起来慢,参数也难调,可一旦跑通,故障注入的自由度是模块给不了的。
我一般会先用模块跑通健康工况,拿到额定电流、额定转速和稳态转差作为基准,再切到自建模型注故障。这样做的好处是把“模型对不对”和“故障显不显”分开排查。一上来就自建模型注故障,发散了都不知道是参数错还是故障设置错,排查起来就是黑匣子。
2.3 额定工作点参数清单与稳态校验
不管走哪条路线,第一步都是把铭牌参数和等效电路参数对齐。下表是一台 5.5 kW、4 极、380 V 感应电机的典型参数,实际使用时按铭牌和空载/堵转试验校正,别直接抄:
| 参数 | 符号 | 数值 | 备注 |
|---|---|---|---|
| 额定功率 | (P_N) | 5.5 kW | 连续工作制 |
| 额定线电压 | (U_N) | 380 V | 星形接法 |
| 额定频率 | (f_N) | 50 Hz | |
| 极对数 | (p) | 2 | 4 极 |
| 定子相电阻 | (R_s) | 1.405 Ω | 冷态值 |
| 转子相电阻折算值 | (R_r) | 1.395 Ω | 折算到定子侧 |
| 定子漏感 | (L_{ls}) | 5.839 mH | |
| 转子漏感 | (L_{lr}) | 5.839 mH | |
| 励磁电感 | (L_m) | 172.2 mH | |
| 转动惯量 | (J) | 0.0131 kg·m² | 含负载折算 |
参数录进去后,先跑空载和额定负载两个点做校验。判断标准不复杂:额定负载下稳态电流应在额定值附近(5.5 kW / 380 V 约 11 A),转差落在 2%~5%,三相电流不平衡度小于 1%。转差明显偏大,优先查转子电阻和负载转矩;启动电流异常,查漏感和求解器步长。这一步做扎实,后面注故障才有比较基准。
3. 在 Simulink 里注入故障:匝间短路抽头、转子断条和不对称电阻
3.1 匝间短路:定子绕组的抽头与短路支路
匝间短路的物理本质是部分定子绕组被短接,形成闭合回路,等效为原绕组旁边多了一个耦合线圈。用自定义三相模型实现时,把 A 相绕组拆成主绕组和短路支路两段,主绕组剩下的匝数比例是 (1-\alpha),短路支路占 (\alpha),(\alpha) 等于短路匝数除以每相总匝数。电阻按匝数线性缩放,漏感按匝数平方缩放,主绕组与短路支路之间补一个互感项。参数化写法如下:
%% im_params.m —— 感应电机故障仿真基础参数 % 数值按 5.5 kW、4 极、380 V 电机铭牌与等效电路整理 function p = im_params() p.p = 2; % 极对数 p.f1 = 50; % 定子频率 (Hz) p.Ull = 380; % 线电压 (V) p.Rs = 1.405; % 定子相电阻 (Ohm) p.Rr = 1.395; % 转子相电阻折算值 (Ohm) p.Lls = 5.839e-3; % 定子漏感 (H) p.Llr = 5.839e-3; % 转子漏感 (H) p.Lm = 0.1722; % 励磁电感 (H) p.J = 0.0131; % 转动惯量 (kg.m^2) p.Ns = 48; % 每相串联总匝数,按实际绕组改 end%% inject_turn_fault.m % 按短路匝数比例修改 A 相绕组参数,供自定义电机模型调用 p = im_params(); faultMag = 5; % 短路匝数,作为输入传入 alpha = faultMag / p.Ns; % 短路匝数占总匝数比例 p.Rs_a_main = (1 - alpha) * p.Rs; % 剩余有效绕组电阻 p.Lls_a_main = (1 - alpha)^2 * p.Lls; % 漏感近似按匝数平方缩放 p.Rs_fault = alpha * p.Rs; % 短路支路电阻 p.Lls_fault = alpha^2 * p.Lls; % 短路支路漏感 p.M_af = alpha * (1 - alpha) * p.Lm; % 主绕组与短路支路互感faultMag就是资源里控制故障程度的输入量,改 1、2、5 匝分别对应轻度到中度匝间短路。p.Ns必须按实际绕组数据填,填错会让短路比例整体偏大或偏小,特征频率的位置不变,但边带幅值会失真。这里用主绕组和短路支路的耦合模型,而不是直接给 A 相串一个电阻,原因是串电阻只能改变电流幅值,不会产生反向磁动势,负序分量根本出不来。仿真里判断匝间短路是否生效,最直接的办法是看三相电流不平衡度和负序分量有没有随故障程度单调上升。
3.2 转子断条:转子电阻的非对称修改
转子断条在 dq 模型里不好直接表达,因为标准 dq 变换已经把转子当成对称三相处理。工程上常用的近似是让转子电阻随转子位置做周期性调制,调制频率对应两倍转差周期。断条数越多,平均电阻上升越多,调制幅值也越大:
%% inject_broken_bar.m % 转子断条近似:转子电阻随转子位置 2*theta_r 调制 p = im_params(); Nbar = 28; % 转子总导条数,按机座号取 faultMag = 3; % 断条数 k = faultMag / Nbar; % 断条比例 Rr_mean = p.Rr * (1 + 0.5 * k); % 平均电阻抬升 Rr_mod = p.Rr * 1.2 * k; % 调制幅值 % theta_r 由 Simulink 模型的转子位置输出提供 Rr_inst = @(theta_r) Rr_mean + Rr_mod * cos(2 * theta_r);Nbar和faultMag这两个参数是断条仿真的关键。Nbar取错,断条比例就错,边带幅值跟实测对不上;faultMag从 1 根加到 3 根,((1 \pm 2s)f_1) 边带幅值应该单调上升,如果没上升,多半是调制项没真正进到转子方程里。这种近似能复现边带的频率位置和变化趋势,但没法精确对应每根导条的电流分布。如果课题要求定量分析断条位置,得换成多回路模型,工作量和参数辨识难度都上一个台阶。
3.3 数据采集与工况表组织
故障注进去只是第一步,数据组织决定后面特征提取顺不顺。每个工况至少采三个量:三相定子电流、转子转速、电磁转矩。采样率按后面要分析的最高边带频率定,((1+2s)f_1) 在 50 Hz 电网下也就 55 Hz 左右,但包络解调会用到更高频段,实际采样率给到 10 kHz 比较稳妥。工况表按“故障类型 × 负载点 × 故障程度”组织,每个工况仿真 2 s,丢掉前 1.5 s 的启动暂态,只留最后 0.5 s 稳态段:
| 工况编号 | 类型 | 负载转矩 (N·m) | 故障程度 | 采样时长 (s) |
|---|---|---|---|---|
| H1 | 健康 | 0 | — | 2 |
| H2 | 健康 | 9 | — | 2 |
| F1 | 匝间短路 | 9 | 2 匝 | 2 |
| F2 | 匝间短路 | 9 | 5 匝 | 2 |
| F3 | 转子断条 | 9 | 1 根 | 2 |
| F4 | 转子断条 | 9 | 3 根 | 2 |
批量跑工况的脚本用assignin把变量写进基础工作区,Simulink 模型里对应模块直接引用这些变量名:
%% run_cases.m % 批量跑工况并把稳态段数据存成 mat 文件 clear; clc; model = 'IM_fault_diag'; load_system(model); cases = [ ... 1 0 0.0 0; % 健康,空载 2 0 9.0 0; % 健康,满载 3 1 9.0 2; % 匝间短路 2 匝 4 1 9.0 5; % 匝间短路 5 匝 5 2 9.0 1; % 转子断条 1 根 6 2 9.0 3]; % 转子断条 3 根 for k = 1:size(cases,1) c = cases(k,:); assignin('base','faultType', c(2)); % 0健康 1匝间 2断条 assignin('base','TLoad', c(3)); % 负载转矩 assignin('base','faultMag', c(4)); % 故障程度 out = sim(model, 'StopTime','2.0', 'SaveFormat','Structure with time'); t = out.tout; idx = t >= 1.5; % 只保留最后 0.5 s 稳态 data(k).t = t(idx); data(k).ia = out.ia(idx); data(k).ib = out.ib(idx); data(k).ic = out.ic(idx); data(k).wr = out.wr(idx); data(k).label = c(2); data(k).faultMag = c(4); fprintf('工况 %d 完成,类型 %d,故障程度 %d\n', c(1), c(2), c(4)); end save('im_dataset.mat','data');这段脚本里SaveFormat选Structure with time,是为了保留时间轴,后面做 FFT 和包络解调要对齐采样点。StopTime设 2 s 对应小惯量电机,大机座号电机启动时间更长,得往上加。idx截取稳态段这一步容易被忽略,带着启动暂态做频谱,基波附近会混进一大堆低频分量,边带直接被淹没。
4. 从三相电流到故障特征:MCSA 频谱与包络解调
4.1 边带频率:公式、采样率和频率分辨率
转子断条的特征频率是 (f_{brb} = (1 \pm 2s)f_1)。举例,(f_1 = 50) Hz,稳态转差 (s = 0.03),两边带分别落在 47 Hz 和 53 Hz,距基波只有 3 Hz。要把这两条线从基波泄漏里分出来,频率分辨率至少要到 0.1 Hz 量级。频率分辨率等于采样率除以 FFT 点数,10 kHz 采样、取 0.5 s 数据做 8192 点 FFT,分辨率约 1.2 Hz,不够;取 2 s 数据凑 32768 点,分辨率降到 0.3 Hz,勉强能看。想再稳一点,就继续加点数或者加长稳态段。
%% fault_feature.m % 从稳态电流中提取 MCSA 边带特征 load('im_dataset.mat'); fs = 10000; % 采样率 (Hz),与 Simulink 一致 f1 = 50; % 基波频率 p_pole = 2; % 极对数 N = 2^nextpow2(2.0 * fs); % 用 2 s 数据做 FFT for k = 1:numel(data) x = data(k).ia - mean(data(k).ia); % 去直流分量 win = hann(numel(x)); % Hanning 窗抑制泄漏 X = fft(x .* win, N); f = (0:N-1) * fs / N; amp = 2 * abs(X) / sum(win); % 归一化幅值 wr_mean = mean(data(k).wr); % 稳态平均机械角速度 s = 1 - wr_mean / (2*pi*f1/p_pole); % 由转速反算转差 f_lsb = (1 - 2*s) * f1; % 左边带 f_rsb = (1 + 2*s) * f1; % 右边带 [~,i1] = min(abs(f - f_lsb)); [~,i2] = min(abs(f - f_rsb)); feat(k).lsb = amp(i1); feat(k).rsb = amp(i2); feat(k).label = data(k).label; feat(k).faultMag = data(k).faultMag; ends这里是从平均转速反算的,比直接读 Simulink 里的转差变量更贴近实际采集场景,因为现场也是用编码器或转速估算拿转速。hann窗必须加,不加窗基波泄漏会把 3 Hz 外的边带盖掉,这是频谱分析里最常见的翻车点。2*abs(X)/sum(win)这种归一化方式能让不同长度数据的幅值可比,换工况时不用重新标定。
4.2 包络解调:把高频载波去掉再看低频故障分量
边带幅值在轻度故障下很小,直接看频谱容易被噪声底吃掉。包络解调是另一条常用路径:对定子电流做 Hilbert 变换取解析信号模值,得到包络,再对包络做低通和 FFT,故障引起的幅值调制就会在低频段显出来。
%% envelope_demod.m % 对定子电流做 Hilbert 包络解调,提取低频调制成分 ia = data(k).ia; ia = ia - mean(ia); % 去直流 env = abs(hilbert(ia)); % 解析信号取模,得到包络 env = env - mean(env); % 去包络直流 % 包络里保留 0~200 Hz,覆盖转差频率和边带差频 [b,a] = butter(4, 200/(fs/2), 'low'); env_lp = filtfilt(b, a, env); % 零相位滤波,避免时延偏移 N = 2^nextpow2(numel(env_lp)); E = fft(env_lp .* hann(numel(env_lp)), N); f_env = (0:N-1) * fs / N; amp_env = 2 * abs(E) / sum(hann(numel(env_lp)));butter(4, 200/(fs/2), 'low')里的截止频率按分析带宽调,匝间短路产生的低频调制一般在几百赫兹以内,200 Hz 够用;如果供电侧有变频器,谐波会污染包络,截止频率要往下压。filtfilt而不是filter,是因为零相位滤波不引入时延,后面跟电流频谱对时间轴时不会错位。包络谱里关心的峰是转差频率 (2sf_1) 及其倍数,断条严重时这个峰会明显抬高。
4.3 特征量计算与跨负载稳定性
单看一个边带幅值不够,负载一变幅值就漂。工程上通常把几个量拼成特征向量:左右边带幅值、负序分量、电流总谐波畸变率。负序分量用对称分量法算,匝间短路时它上升最明显;THD 作为辅助,排除供电谐波干扰。
%% build_feature_table.m % 汇总所有工况的特征量,输出 csv 给分类器 names = {'lsb','rsb','negSeq','thd'}; X = zeros(numel(feat), numel(names)); Y = zeros(numel(feat), 1); for k = 1:numel(feat) X(k,:) = [feat(k).lsb, feat(k).rsb, feat(k).negSeq, feat(k).thd]; Y(k) = feat(k).label; end T = array2table(X, 'VariableNames', names); T.label = Y; writetable(T, 'feature_table.csv');这里要盯住一件事:同一故障类型在不同负载下,特征量的绝对值会变,但变化趋势应该一致。比如断条边带幅值随负载上升而上升,匝间短路的负序分量随短路匝数上升而上升。趋势不稳,说明特征选错了,或者数据里混进了暂态段。跨负载稳定性比单点精度重要得多,现场负载本来就是变的。
5. 避坑:感应电机故障仿真最容易翻车的五个细节
5.1 找不到断条边带:先查采样率和窗函数
现象:转子断条设了三根,频谱在 47 Hz 和 53 Hz 附近还是一条平线,跟健康工况没差别。
原因:仿真步长太大导致等效采样率不够;或者 FFT 没加窗,基波泄漏把边带盖住;还有一种情况是To Workspace模块设成 Array 格式后丢了时间轴,重采样时对齐错位,频谱整体偏移。
解决:固定采样率不低于 10 kHz,FFT 前加 Hanning 窗,频率分辨率压到 0.3 Hz 以下;稳态段从启动后 1.5 s 再截,长度不少于 0.5 s。跑完先拿健康工况验证一遍频谱,基波幅值正常再往下做。
5.2 故障一加就发散:短路支路缺限流和刚性求解器
现象:匝间短路一投入,仿真几毫秒内报积分失败,或者步长被压到极小,跑一个小时出不来一秒数据。
原因:短路支路电阻接近零,定子方程刚性突然变强,ode45 扛不住;短路开关切换瞬间的电流冲击也会引起数值振荡。
解决:短路支路串一个 0.01~0.1 Ω 的接触电阻,代表实际短路点的接触阻抗;求解器换成 ode23tb 或 ode15s,最大步长限制到 1e-4 s。改完还发散,检查短路支路有没有形成代数环,有的话加单位延迟打断。
5.3 健康工况就有负序:电源和参数不对称
现象:还没注故障,三相电流就不平衡,负序分量不为零,后面所有判据的基准全乱。
原因:三相电压源幅值或初相有偏差;或者电机模块里定子三相参数用了不同值;再或者仿真步长过大,采样点没落在同一时刻,算出来的三相瞬时值本身就对不齐。
解决:先跑纯健康工况,把三相电流幅值差压到 0.5% 以内再往下走。电源侧用三相对称的可编程电压源,电机参数三相保持同值,采样用固定步长。基准不干净,后面所有特征都不可信。
5.4 分类准确率虚高:训练集和测试集共享了稳态段
现象:交叉验证准确率 99%,换一个没见过的负载点直接掉到 60%。
原因:同一工况的不同时间窗被随机分到训练集和测试集,模型学到的是这段数据的噪声指纹,不是故障特征。Simulink 仿真数据尤其容易出这个问题,因为同一工况的稳态段高度相似。
解决:按工况划分训练集和测试集,同一负载、同一故障程度的数据只出现在一边;至少留一个负载点做外部验证。分类器精度先别追高,先看特征在没见过的负载点上还保不保持单调趋势。
5.5 仿真和实测对不上:别在理想模型上死磕绝对幅值
现象:仿真里断条边带清清楚楚,现场采回来的频谱一团糟,边带时有时无。
原因:Simulink 模型用的是理想正弦供电和线性电感,实际电机有磁饱和、齿槽效应、轴承摩擦,供电侧还可能挂着变频器,开关谐波全叠在电流里。
解决:仿真的定位是验证判据和趋势,不是复现实测波形。把判据放在“负载变化时边带幅值单调上升”这一层,比死磕绝对幅值靠谱。真要把模型往实测靠,得加饱和查表、PWM 供电和轴承摩擦模型,工作量会翻几倍,看课题需要再决定。
6. 把单工况扩展
本文还有配套的精品资源,点击获取