
1. 内容整体设计与思路拆解做感应电机故障检测的仿真很多人第一步就栽在思路上——上来就急着搭模型、敲代码结果后面的路越走越乱。我在带项目的时候经常看到有同学把电机模型搭得花里胡哨但故障特征根本提取不出来原因就是整个仿真的底层逻辑没理顺。1.1 为什么选 Matlab/Simulink 这条仿真路线感应电机故障检测本质上做的是“信号采集—特征提取—状态判别”这么一条链路。如果在真实电机上做实验成本高、周期长而且故障复现非常麻烦——定子绕组匝间短路一旦操作不当电机当场就烧了。相比之下Matlab/Simulink 这种图形化建模环境有天然的工程落地优势。一大好处是电机本体模型可以直接用模块搭建不需要手写微分方程组。Simulink 里内置了异步电机模块拖出来填参数就能跑还可以配合 Simscape 电气模块做更精细的非线性建模。另一大好处是故障注入非常灵活——既可以在电路层面人为改变阻抗参数来模拟绕组短路又可以通过信号层面叠加特征谐波来模拟轴承磨损这种“污染-重建”的灵活性仿真环境天生就有。我一个很强烈的体会是Simulink 特别适合做“特征互动”分析。比如互调效应——定子短路加转子断条同时发生时特征频率并不是简单叠加而是会出现和差频率成分。这种复杂的耦合效应在真实实验中极难主动制造但在仿真模型里可以精确控制故障程度和注入时刻把特征耦合的过程一步步拆开看。1.2 整体方案的核心流程拆解整个仿真方案我习惯画成五个环节来推进每个环节负责一个明确的可交付物环节核心任务交付物电机建模搭建感应电机的电气-机械耦合模型转速、转矩、三相电流输出故障注入在不同位置设置故障参数或信号源故障状态下的电流/振动信号数据采集设计采样率、采样时长、数据导出通道结构化数据集时间×三相电流等特征提取对信号做频谱分析和特征参量计算特征频率幅值、相位差、能量占比故障判别基于阈值或分类器输出诊断结论故障类型、严重程度这里最关键的也是我踩过最多坑的一点故障信号的数据量一定不能省。很多人搭完模型仿真时间只跑 0.1 秒FFT 的频率分辨率根本不够故障特征频率和基波频率差不了几 Hz谱上糊成一团啥都看不清。这一环节直接决定后面所有工作的成败。2. 仿真环境搭建与电机模型构建2.1 MATLAB/Simulink 环境准备环境准备看起来是件简单事但细节上确实有些讲究。首先是版本选择——R2020b 之后 Simulink 的异步电机模块参数界面变化比较大如果你参考的是老教材上“Machines”库截图可能对不上号。我自己用下来比较稳定可靠的组合是 MATLAB R2022a 搭配 Simulink Simscape Electrical这套组合对电机模型的参数化支持已经非常成熟。其次是工具箱。你要确保安装了以下功能组件Simulink核心环境跑模型必备。Simscape Electrical里面的 Specialized Power Systems 库自带异步电机模型。Signal Processing Toolbox后面做 FFT、功率谱分析要用到。Statistics and Machine Learning Toolbox如果计划做分类器对比这个必须有。这里有一个很实用的技巧在命令行窗口输入powerlib可以打开电力系统模块库浏览器新版 MATLAB 会直接弹出来一个分类清晰的库面板。我刚接触的时候傻乎乎地在 Simulink 库浏览器里一个个翻找了半天也没找到异步电机模块后来才意识到直接输入命令才是最快的方式。2.2 感应电机模型的核心原理感应电机的数学模型说白了就是一组电压方程加磁链方程再加上电磁转矩和机械运动方程。稳态下可以用等效电路来分析但做故障检测必须用动态模型因为你关心的是电流波形上的谐波畸变那是在瞬态过程中体现出来的。dq 坐标系下的电压方程是这样的我写成 Simulink 模块配置时看得最顺眼的形式uds Rs * ids d(fluxds)/dt - w * fluxqs uqs Rs * iqs d(fluxqs)/dt w * fluxds这个方程组在 Simulink 里不需要你亲手搭——直接用Asynchronous Machine SI Units模块就行。但你必须理解 dq 变换的意义三相交流量通过 Park 变换落到旋转坐标系下会变成直流量这样控制和分析都简单得多。故障检测时用的“信号特征频率”转换到 dq 坐标系下仍然会体现为特定频率的脉动这一点在做故障特征分析时千万别搞混。2.3 参数设置与额定工况确定我以一台上电星形连接的 7.5 kW 感应电机为例常用参数如下参数项数值备注额定功率7.5 kW常见工业小功率额定电压400 V线电压有效值额定频率50 Hz电网工频定子电阻 Rs0.7384 Ω实测或查手册转子电阻 Rr0.7402 Ω已折算至定子侧定子漏感 Lls0.003045 H——转子漏感 Llr0.003045 H——互感 Lm0.1241 H——转动惯量 J0.0343 kg·m²——极对数 p2——仿真时电机通过三相断路器接入 380V/50Hz 电源负载转矩设定为额定转矩的 80%启动过程大概 1.5 秒稳定。这个参数组合里有一个关键点——互感 Lm 一定要填准它决定了励磁电流的大小进而影响定子电流的整体幅值。我见过有人把 Lm 填小了一个数量级仿真出来的电流偏大 4 倍不止后面做故障特征分析基波幅值本身就错了还找半天原因。3. 故障注入与信号采集设计3.1 典型故障的建模方式这是仿真搭建之旅中最核心的环节。我要给你拆四种最常见的感应电机故障以及它们在 Simulink 里的实现思路。定子绕组匝间短路是最常见的故障类型约占电机故障的 30%。建模思路是在电机定子某一相绕组上并联一个小阻抗支路相当于短路了一部分匝数。Simulink 里可以通过三个单相变压器来模拟三相绕组抽头然后在抽头位置接一个可变电阻和电感。短路匝数占比控制在 3%~15% 之间比例再大电机会直接过流跳闸。转子断条故障的建模思路是改变转子电阻的对称性。正常电机的三相转子电阻是平衡的发生断条时故障相的等效电阻会比另外两相大 1.5~2 倍。在 Simulink 的转子电阻参数里可以设置为分段函数用阶跃信号在指定时刻把其中一相电阻拉高。轴承故障的特征是会在定子电流中感应出特定频率的谐波。这个不需要改变电机参数更简单的做法是在电流测量信号后加法器注入对应频率的正弦波。轴承外圈故障特征频率约为f_v f_r * 0.4 * N_b其中 N_b 是滚动体个数。举个例子转速 1450 rpm转频约 24.2 Hz、滚动体 9 个时外圈故障频率约 87 Hz。在基波电流上叠加这个频率的小幅值正弦成分就模拟出了轴承早期故障信号。气隙偏心故障和轴承故障类似特征频率是转频的多倍与电网频率的调制组合。这里也直接用信号注入法叠加到电流波形上。3.2 故障注入点的设计原则在模型里放故障注入点要遵循一个原则尽量在电气层面做不要只在信号层面做。为什么这么说信号层面叠加谐波虽然省事但忽略了故障对电机电磁场的反馈影响比如定子短路不仅产生负序电流还会导致转矩脉动进而引起转速波动又反过来影响电流波形。电气层面做故障注入这种“故障-响应”的闭环耦合关系就能真实再现。当然纯电气层面建模也有两难Simulink 自带的异步电机模块内部结构是封装好的没法直接改三相绕组间的短路连接。我的做法是混合方案定子绕组短路用外接阻抗回路 单相变压器抽头模拟。转子断条改转子电阻参数 阶跃信号触发。轴承故障 / 气隙偏心信号注入法。这样既保住了电气耦合的核心故障又能在特征阶段精确控制注入谐波的幅值频率两边的好处都占了。3.3 数据采集与采样设置采集环节容易被低估这里我给出我实测稳定的配置% 仿真参数设置 sim_time 5; % 仿真时长 5 秒含启动 1.5 秒 sample_rate 10000; % 采样率 10 kHz sample_time 1/sample_rate;仿真结束后把电流信号导出到工作区。这里有一条核心经验稳态分析前必须截去启动过渡段。电机直接启动的瞬态电流可以达到额定电流的 6~8 倍这段数据如果不剔除频谱分析里全是巨大的低频分量故障特征频率被压得完全看不出来。我的做法是在采样脚本里用条件表达式把仿真时间大于 2 秒的数据才存下来。% 信号采集后处理 t simout.time; ia simout.signals.values(:,1); mask t 2.0; % 去掉前 2 秒启动过程 t t(mask); ia ia(mask);要注意的是一个叫“警报器”的坑。Simulink 里一排 Scope 模块看起来输出的波形都对但导出到工作区后时间轴对齐错位。我后来统一用带Time Vector输出的To Workspace模块把所有信号挂到同一个时钟上问题才彻底解决。4. 信号处理与特征提取4.1 电流信号预处理原始电流信号一上来不能直接做频谱分析。先做均值去除——因为电流波形里有直流偏置直接做 FFT 会在零频处产生一个巨大的尖峰而且会影响低频段的分辨率。去除方法很简单ia ia - mean(ia);然后做带通滤波。电网频率 50 Hz基波分量幅值很大但我关注的故障特征频率主要集中在 0~500 Hz 这个频段所以用了一个五阶巴特沃斯带通滤波器上下截至频率分别设为 5 Hz 和 600 Hz。这个滤波器的关键参数我用designfilt来生成并观察幅频响应曲线后确认filt designfilt(bandpassiir, ... FilterOrder, 5, ... HalfPowerFrequency1, 5, ... HalfPowerFrequency2, 600, ... SampleRate, 10000); ia_f filtfilt(filt, ia); % 零相位滤波避免相位偏移filtfilt做零相位滤波能避免相位偏移对后面相位特征计算的影响。这一点小而关键——我踩过一次用普通filter滤波的坑做完后信号相位整体偏移了基于相位差做故障判别时完全出错。4.2 频谱分析与特征频率识别预处理完用 Welch 功率谱密度估计来提取频谱。选 Welch 而不是直接 FFT 的原因是它能把长信号分段加窗后平均显著降低频谱噪声让特征峰更突出。[pxx, f] pwelch(ia_f, hann(4096), 2048, 4096*2, 10000);这里有几个设置讲究窗长选 4096 点对应时间分辨率 0.4096 秒频率分辨率约 2.44 Hz。这个分辨率对故障检测来说比较合适——转子断条特征频率与转频差值通常在 2~5 Hz 之间分辨率再粗就分不出来了。重叠率选 50%即 2048 点保证频谱平滑效果又不至于过度平滑把窄带特征抹掉。DFT 点数设为窗长的 2 倍8192 点做零填充让频谱看起来更细腻。画出频谱后怎么判断有没有故障我的经验是先看基波频率50 Hz附近的边频带。定子绕组短路时会在基波两侧产生 ±100 Hz 的边频转子断条时产生 (1±2s)f 频率的边频分量其中 s 是转差率。用上面参数算一下转差率约 0.033断条故障特征频率为 (1-2×0.033)×50 46.7 Hz 和 (12×0.033)×50 53.3 Hz。这两个边频和基波的频率差只有 3.3 Hz所以频率分辨率必须足够小。4.3 特征参数的选取与计算单纯看频谱峰值不够我建议提取一组多维特征参数方便后面做阈值判别或机器学习输入基波幅值 I1反映负载和整体工况。负序分量幅值 I2三相电流做对称分量变换取负序部分的均方根值。定子绕组短路时负序分量显著增大。特定边频带能量比把 (1±2s)f 附近 ±1 Hz 范围内的功率谱密度积分除以基波频段积分得到一个无量纲比值。这个比值对转子断条非常灵敏。零序分量幅值零序电流在定子短路时会显著增加但健康状态下应该接近零。计算负序分量需要把三相电流通过对称分量变换矩阵% 对称分量变换 a exp(1j * 2 * pi / 3); T_inv 1/3 * [1 1 1; 1 a a^2; 1 a^2 a]; ABC [ia_f, ib_f, ic_f]; seq T_inv * ABC.; % seq(1)零序, seq(2)正序, seq(3)负序 I_neg rms(abs(seq(3,:)));这组特征在工程上非常经典负序分量对定子故障敏感边频能量比对应转子故障两者联合基本能做到故障类型的初步区分。5. 故障检测算法搭建与结果分析5.1 基于阈值判别的诊断规则拿到特征参数后第一步建议用阈值规则做快速判别它的特点是逻辑透明方便排查验证。我自己的经验总结出四层判断规则负序幅值 I2 大于健康基线均值加 3 倍标准差判为定子故障候选边频能量比 R_sideband 大于阈值 0.02判为转子故障候选若两个指标同时超标进一步检查零序幅值排除两者同时发生的可能若所有指标都在正常范围内判为健康状态。阈值不能拍脑袋定。健康状态下的仿真需要跑 20 次不同负载水平把这个条件下的特征均值取好再算标准差然后按“均值 3σ”来定阈值。我一开始拍脑袋设了个 0.05 的边频能量比阈值结果转子轻度断条断 1 根时的特征值只有 0.035白白漏报了一次故障后来改成统计基线的“3σ”原则才算靠谱。5.2 信号级交互界面设计做仿真不能只自己能看到结果。我搭建了一个简单的交互界面通过 App Designer 把三段核心功能串起来故障类型选择下拉框健康 / 定子短路 / 转子断条 / 轴承故障故障严重程度滑块比如短路线匝占比 3%~15%断条数 1~3 根一键仿真按钮联动 Simulink 模型运行并自动回传特征参数。这个界面的价值不是炫技而是批量化做故障灵敏度分析。比如我想知道转子断条 1 根和断 2 根时边频能量比会有多大差异只需要滑块拖两次跑出来的数据自动记录在表格里。这种做法比改一次参数跑一次模型效率至少提升 5 倍。核心按钮的回调函数逻辑大致是这样% 按钮回调运行仿真 function run_sim(app) set_param(motor_fault_model, StopTime, 5); % 把界面参数传到模型工作区 assignin(base, fault_type, app.FaultTypeDropDown.Value); assignin(base, severity, app.SeveritySlider.Value); sim(motor_fault_model); % 调用特征提取脚本 extract_features; % 更新结果显示 app.MeanNegLabel.Text num2str(features.I_neg); end界面上同时绘制三相电流波形和频谱图每次仿真结束自动刷新。这种“改参数-看结果”的循环方式强烈建议保留它让分析思路和模型结构彻底分离开改参数不再意味着动模型。5.3 结果可视化的呈现技巧Simulink 自带 Scope 适合看时序波形但做故障检测分析我更推荐把数据拉到 MATLAB 脚本里统一出图。一图三行布局是我常用的呈现方式第一行显示三相电流随时间变化第二行显示电流频谱重点关注特征频率附近区间的放大视图第三行显示特征的二维散点图比如负序幅值对边频能量比不同颜色代表不同故障类型。数据可视化有一个我反复踩坑得来的经验放大区间一定要标得足够清楚。比如转子断条的 46.7 Hz 特征频率如果不设置 xlim 到 [40, 60]那么整张频谱图上它的峰值和基波峰比起来微不足道肉眼根本看不出来别人看图也找不到重点。我每次都会在图标题里把特征频率的理论值和实测值同时标出来差异一目了然。figure; tiledlayout(3,1); % 第一行 电流波形 nexttile; plot(t, ia_f); xlim([2,2.2]); % 第二行 频谱 nexttile; plot(f, pow2db(pxx)); xlim([0,200]); grid on; xline(46.7, --r, 故障特征频率 46.7Hz);6. 常见问题与排查技巧实录6.1 仿真速度慢到怀疑人生仿真跑 5 秒实际要等十几分钟这个问题我见了太多回。第一排查点是powergui模块的仿真类型设置如果你用的模块库是 Specialized Power Systems必须把求解器设置为离散模式discrete步长设 1e-5 秒而不是默认的连续模式。连续模式下 Simulink 要解刚性微分方程步长自适应会频繁降到极小值速度自然提不起来。第二个排查点是信号数据存储。我见过模型里连了十几个 Scope每个 Scope 都在以最高仿真步长记录全波形数据这相当于每个信号都在写硬盘速度能快才怪。统一改用To Workspace模块加降采样处理只在需要分析的时刻比如稳态区间 2~5 秒记录数据仿真速度立竿见影。还有一个容易忽略的Simulink 模型在回环运行时工作区变量会不断累积多次仿真后内存里堆了大量历史数据。每次sim()后执行一次clear关键变量能省不少内存开销。6.2 数据对不齐采样时间冲突有一次我同时用 10 kHz 采样率的电流采集模块和 100 Hz 的控制信号模块最后导出的两路数据点数不同时间序列没法对齐。原因很简单不同模块的采样率不一致输出到工作区的时间向量长度不同。解决思路有两个第一所有数据记录模块统一用同一个采样时间我常用 10 kHz第二如果确实有不同采样率的需求用resample函数在离线阶段把数据统一到同一时间轴。需要注意resample可能会导致边界效应前后各截掉几十个点保证数据质量。6.3 特征频率找不到原因在哪里这类问题按以下顺序排查最省时间是不是数据截取区间包含了启动过程启动过程转速剧烈变化转差率s不是常数理想的特征频率公式完全不适用。先确保从 t 2 秒后取数据。是不是频率分辨率不够窗长 4096 点采样率 10 kHz分辨率约 2.44 Hz而断条特征频率偏离基频只有 3.3 Hz图上看起来像基波峰旁边的一个小鼓包。这种情况把窗长加到 8192 点分辨率将到 1.22 Hz峰值分离度明显提升。是不是故障程度太轻断 1 根的边频幅值可能只有基波的 0.5%在幅值线性坐标下完全看不见改用分贝坐标pow2db后小峰值才能凸显出来。这一步被很多人忽略我在用分贝坐标后才发现原来“看不出来”的信号早就在那里了。还有一个小概率问题故障特征频率被滤波器压掉了。如果带通滤波器的上截至频率设得太低比如 100 Hz那 149 Hz 的定子故障边频分量会被直接滤除怎么找都找不到。每次设计完滤波器建议看一眼幅频响应曲线确认目标频段确实在通带内。6.4 结果复现性问题的避坑建议仿真结果在不同机器上不一致大多数人第一反应是模型有问题其实大概率是默认求解器参数差异。我建议在模型配置里把所有关键参数固化下来求解器类型、相对容差、仿真步长类型和步长值、采样时间。这样别人拿到你的文件时sim出来的结果就完全一致。另外务必加上模型版本检查。Simulink 模型在跨版本打开时即使模块参数不变底层求解器算法细节也可能变化。我在 README 里明确记录模型创建版本和验证版本这和写仿真代码时的随机种子有异曲同工之妙。7. 结束前的三个实用建议主体内容到这里核心链路已经完整从电机建模到故障注入从信号处理到特征提取再到检测算法和仿真加速技巧。最后分享三点我在整个搭建过程中感受最深的心得。第一仿真模型要分层。底层的电机模型保持干净故障注入单独放一个子系统信号采集和特征提取放到脚本里。这样做的好处是你换一种故障类型时不需要动仿真模型本身只需要换一个注入模块的配置。所有做实验的人都知道改动越小出错概率越小。第二建一个专门存放特征数据的目录。每次仿真后自动把特征和参数存成表格按日期进行编号管理。这样积累一个月后你手里就有了一套自己的“故障特征数据库”。这比临时跑一次记一次要高效得多也方便做阈值基线分析和模型验证。第三不要迷信模型越复杂越好。能表达故障特征的最简模型就是好模型。很多初学者把电机模型搭得非常细致考虑齿槽效应、磁饱和、铁损等一大堆因素导致仿真速度慢了几个数量级但故障特征频率的计算结果和简单模型相差不到 3%。先跑通再加复杂度否则只是在浪费时间。最后再分享一个调试小技巧。当你在仿真中发现异常波形时不要急着改模型。先给每个关键节点都加上显示模块依次检查从三相电压、三相电流到故障注入信号、特征提取输入全部环节的数据形态。我见过太多人盯着最终输出找问题结果问题出在波形记录器的采样率配置上前后折腾了一整天。信号链路是逐级传递的定位故障时也一级一级游走排查才能快速锁定问题所在。