ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

三相永磁同步电机定子故障数据集构建:振动与电流信号采集实战

三相永磁同步电机定子故障数据集构建:振动与电流信号采集实战 做电机故障诊断的朋友应该都有体会算法、模型这些东西都好说真正让人头疼的是数据。凯斯西储大学的CWRU轴承数据集大家都在用但那是滚动轴承的公开数据到了三相永磁同步电动机PMSM的定子故障尤其是绕组匝间短路这种早期故障公开可用的高质量数据集非常少大多数时候只能自己搭台架、做实验、处理信号一步步攒出来。这篇文章就把我搭建“定子故障三相永磁同步电动机振动与电流数据集”的整个流程写出来——从故障机理、台架搭建、传感器选型到用Python程序完成信号采集、特征提取、数据集打包的全部代码思路以及我踩过的坑。如果你正准备构建电机故障数据集或者希望找到一份带真实故障标签的振动电流数据来验证模型这篇内容应该能给你一些能直接落地的参考。1. 项目思路为什么要同时采集振动和电流信号1.1 先搞清楚定子故障的信号来源先把故障对象聊透。三相永磁同步电机PMSM现在应用范围太广了新能源汽车驱动电机、工业伺服、精密主轴、家电压缩机、航空航天作动器几乎全是PMSM的天下。它的定子部分是故障高发区相关统计里定子绕组故障能占电机全部故障的30%以上其中最典型的就是绕组匝间短路。匝间短路的形成过程一般是这样的电机长期运行中绕组内部的漆包线绝缘层因为热应力、电应力、机械振动慢慢老化某几匝线圈之间的绝缘破损就形成了一个低阻抗的局部短接回路。早期阶段电机从外部看一切正常振动不大、温度不明显、声音也正常但绕组内部已经出现了异常电流环流导致局部发热加剧绝缘进一步破坏。如果没有及时发现它就会一步步恶化成相间短路、接地故障最后烧毁整个定子绕组电机直接报废。所以早期匝间短路检测的核心价值就是在故障还能控制的时候把它揪出来。什么样的信号能反映这种电气层面的异常呢最容易想到的就是电流。因为短路匝破坏了定子三相绕组的对称性反电动势发生畸变定子电流里会出现不对称分量和一系列特征谐波。这是电流信号最直接的诊断依据。但它有个短板电流信号特别容易受负载波动、变频器控制策略的干扰单独看电流特征误报率会比较高。这也是我一开始只测电流、后来坚决加上振动通道的原因。1.2 振动信号的作用电磁故障的“物理回声”振动信号和电流在机理上完全是互补的。定子匝间短路会引起绕组磁动势不平衡这个不平衡在气隙里产生额外的径向电磁力波电磁力波作用在定子铁心和机座上最终表现为电机机壳表面振动的变化。其中最有标志性的就是2倍电源频率国内50Hz工频下就是100Hz附近振动成分的变化以及相关边带的出现。所以振动信号相当于给电气故障装了一个“物理端口”——不直接测电而是测电异常带来的机械振动响应。好处是振动受负载和变频器控制策略的直接影响相对小它的核心反映是电磁力和结构动态特性之间的耦合关系。当然它的缺点也明显机座振动的传递路径长早期轻微故障引起的振动变化往往被运行噪声淹没需要提取特定频带能量才能看到差异。这也是本项目联合采集的逻辑核心振动信号覆盖机械结构响应电流信号覆盖电气状态两者共同构成一个更完整的故障证据链。实际实验中也印证了这一点有些故障工况下电流的负序分量指标变化非常剧烈但振动信号几乎无感另一些轻载工况则反过来某些低频振动成分比电流更敏感。如果只做单一信号的数据集实验室指标可能还不错到现场工况一变模型的泛化能力就会明显下滑。1.3 为什么整个流程用Python串起来还有一个工具选型的问题值得说一下。用MATLAB做信号处理很成熟用LabVIEW做数据采集也很经典但我的整套流程是纯Python走下来的从数据采集、信号处理、特征提取到模型训练一条链路不换环境。理由有三个第一采集环节的库已经够用。NI采集卡的DAQmx Python接口、串口仪器控制的pyvisa、示波器读取的Python SDK都能直接驱动硬件。第二信号处理生态成熟。numpy做数组操作、scipy做滤波和频谱分析、pywt做小波变换几乎覆盖所有故障诊断需要用到的处理手段。第三数据集最终要喂给机器学习模型用pytorch、tensorflow、sklearn直接无缝衔接不用像MATLAB那样还要再把数据搬来搬去。而且这个选择对数据集发布也有好处。别人拿到你的数据之后用一个轻量级Python环境就能跑通全部流程不需要商业软件授权。对想复现实验结果、做对比研究的同行来说这个门槛低很多。2. 实验平台搭建与数据采集方案2.1 台架搭建与故障注入方式整台实验台架的核心是一台4kW左右的三相永磁同步电机配增量式编码器用于转速闭环控制电机通过弹性联轴器和负载电机连接负载用磁粉制动器模拟不同力矩。驱动侧用商业变频器做矢量控制转速和加减速指令由上位机软件下发。测试电机需要单独准备这是数据集质量的关键。我们不可能真的等电机绕组自然老化出故障那周期太长且不可控。常规做法是人工故障注入把定子拆出来在绕组绕制过程中按物理位置抽出几个抽头引到接线盒。比如在A相绕组的第5匝、第10匝、第15匝位置各出一个引线端子外部用短接铜排把对应端子短接到一起。5匝短接对应轻度故障10匝对应中等15匝对应偏重故障。模拟短路后电机的电路状态和真实匝间短路接近短路匝内形成独立闭合回路短路电流远大于正常工作电流导致局部剧烈发热同时三相不对称程度随短路匝数增大而增强。做实验时一定要控制连续运行时间尤其15匝短接时电机发热很快温度上来之后绝缘老化和数据漂移都会影响一致性所以每组数据采完都让电机充分冷却这在下文还会讲到。要注意的是这种模拟方式和真实运行中因绝缘破损产生的匝间短路并非完全一致——端部人工短接的电流路径更明确分布参数更简单。但行业内文献和实验研究普遍采用这种方式故障特征的主要成分负序电流、特定谐波、2倍频振动是接近的用来做故障诊断算法验证完全足够。2.2 传感器选型、安装与采样参数振动传感器我用的IEPE型压电加速度计灵敏度100mV/g量程±50g频率范围0.5Hz到10kHz。测点选了三处驱动端轴承座、负载端轴承座、机座顶部轴向中点。三个测点分别覆盖轴承传递路径和电磁力直接作用的机壳表面。安装方式用强力磁座但这里有一个很大的坑磁座吸附如果接触面不平整或者测点表面有漆层高频振动成分会明显衰减不同测点之间幅值还可能不一致。我后来学乖了测点位置先用砂纸打磨露出金属面再薄薄涂一层硅脂让磁座和表面的耦合尽量一致。电流传感器用霍尔闭环式电流互感器量程50A接在变频器和电机之间的U、V、W三相相线上。霍尔传感器优势是电气隔离不影响主回路不过它本身有零漂问题上电后需要一段预热稳定时间零漂没有稳定前采集的数据基线是漂移的直接做特征提取会影响负序分量计算的精度。采样配置上所有通道同步采集统一采样率设为20kHz。振动3通道加电流3通道共6通道同步采集。每次采样时长10秒单次样本的数据量是6×20000×10120万个采样点原始文件几十MB。有人可能会问为什么采样率定这么高对电机故障诊断来说20kHz并不激进——变频器开关频率通常在4kHz到16kHz如果你想分析电流谐波中开关频率边带或者振动信号里电磁力引起的高频成分奈奎斯特频率至少要高过这些成分的两倍20kHz采样率才够看。2.3 工况矩阵设计让数据集具备“泛化能力”数据集的工况设计是影响后续模型泛化能力的关键。我构建的工况矩阵覆盖了三个维度转速档位600rpm、1200rpm、1800rpm约为额定转速的1/3、2/3和额定转速负载档位0%、25%、50%、75%、100%额定负载故障等级健康、5匝短路、10匝短路、15匝短路四个状态乘三个转速乘五个负载一共60个工况条件。每个条件下重复采集20组样本总样本数1200组。每组样本都带完整的元数据标签包括电机状态、故障等级、转速、负载、采集时间、样本编号。设计意图很明确实际电机运行转速和负载是动态变化的模型不能只在固定工况下识别故障要能适应真实应用中的工况漂移。更重要的是丰富的工况组合可以支持“域泛化”实验——用部分工况数据训练模型在另一部分未见过的工况上测试才能验证模型到底学到了故障的本质规律还是只记住了某个转速负载下的环境特征。在工况矩阵设计上我唯一的遗憾是没能加入更多变转速工况比如斜坡加减速和动态负载扰动。当时考虑到数据采集同步和实验重复性的问题还是先以稳态工况为主。如果你有时间和设备条件强烈建议在稳态之外把瞬态工况也加进去那会让数据集的价值提升一个档次。故障等级转速(ppm)负载档位(%)每组样本数分组说明健康600/1200/18000/25/50/75/10020参考基线5匝短路600/1200/18000/25/50/75/10020轻度故障10匝短路600/1200/18000/25/50/75/10020中度故障15匝短路600/1200/18000/25/50/75/10020严重故障3. Python程序核心实现从原始信号到标准数据集3.1 数据采集程序框架与长时写入策略采集程序整体分四层设备初始化、通道配置、流式采集与磁盘写入、元数据记录。核心思路是用DAQmx的连续采样模式一块一块读数据同步写入磁盘避免长时间采样把内存撑爆。下面是基于nidaqmx库的采集示例振动通道按IEPE加速度计方式接入电流通道按电流量程方式接入import nidaqmx import numpy as np import json SAMPLE_RATE 20000 BUFFER_SIZE 10000 DURATION 10 # 秒 with nidaqmx.Task() as task: # 振动通道ai0:2IEPE加速度计 task.ai_channels.add_ai_accel_chan( PXI1Slot2/ai0:2, sensitivity100.0, min_val-50.0, max_val50.0, unitsnidaqmx.constants.AccelUnits.METERS_PER_SECOND_SQUARED, ) # 电流通道ai3:5霍尔传感器 task.ai_channels.add_ai_current_chan( PXI1Slot2/ai3:5, min_val-50.0, max_val50.0, unitsnidaqmx.constants.CurrentUnits.AMPS, ) task.timing.cfg_samp_clk_timing( SAMPLE_RATE, samps_per_chanBUFFER_SIZE, sample_modenidaqmx.constants.AcquisitionType.CONTINUOUS, ) all_data [] for _ in range(int(DURATION * SAMPLE_RATE / BUFFER_SIZE)): data task.read(number_of_samples_per_channelBUFFER_SIZE) all_data.append(np.array(data)) signals np.concatenate(all_data, axis1) # (通道数, 采样点数)这段程序有几个细节值得强调。IEPE通道的sensitivity参数必须填传感器标定证书上的实际灵敏度填错了整个幅值标定全错振动信号的量纲就失真了。电流通道的min_val和max_val要留够裕量电机启动瞬间的浪涌电流可能达到额定电流的两到三倍如果量程设小了信号会直接削顶。每次采集开始前我还会让系统先空采200ms弃掉避开设备首次启动时的瞬态不稳定数据段。3.2 信号预处理去趋势、滤波和稳态段提取原始信号不能直接进特征提取流程预处理是必不可少的一步。首先是去均值和去线性趋势这两个操作如果不做后面做FFT时直流分量会泄漏到低频段把幅值谱搞出一大片虚假的低频能量。scipy一行代码就能搞定from scipy import signal vib signal.detrend(vibration_signal) # 去线性趋势 cur signal.detrend(current_signal)滤波方面振动信号做了5Hz到8kHz的带通滤波。低频截止的原因是把电源频率晃动和台架基础振动等无关成分滤掉高频截止是因为PMSM定子故障的特征成分主要集中在2倍频、齿槽频率和开关频率附近8kHz以上的成分对分类帮助不大反而会引入额外噪声。电流信号则保留直流到3kHz频段重点关注基波附近的不对称分量和开关频率边带。再一个重要操作是信号截断。电机起动过程和停车过程信号是非平稳的包含大量瞬态冲击如果直接当样本用会把模型注意力带偏。我的做法是保存完整的起动-稳态-停机过程但打标签时只标记稳态段。10秒样本里剔除前2秒起动段和后1秒停机段取中间7秒作为有效数据同时把三段时间边界记到元数据里。这样既不丢失原始信息又能保证训练样本的平稳性。万一以后需要研究瞬态诊断原始数据还在随时可以切回来。3.3 特征提取时域、频域、时频域的组合特征提取是数据集构建里最核心的环节。我的特征体系分三组时域特征组包括均方根值、峰值、峰峰值、峭度、波形因子、脉冲因子、偏度。这些虽然计算简单但组合起来对故障状态比较敏感而且工程现场部署极容易实现。频域特征组则对稳态段做FFT提取功率谱中若干关键频率处的幅值和能量占比。振动侧关注1倍频、2倍频、4倍频和边带电流侧提取基波幅值、5次谐波、7次谐波和负序分量。时频域特征组用短时傅里叶变换和小波包分解提取多个频带的能量占比和熵值用来捕捉非平稳和瞬态异常。需要特别展开讲的是负序电流分量这个特征。理想三相对称电流的负序分量为零而匝间短路会破坏三相绕组对称性导致负序分量显著上升。计算方法是用对称分量法import numpy as np def negative_sequence_components(ia, ib, ic): alpha np.exp(2j * np.pi / 3) i1 (ia alpha * ib alpha**2 * ic) / 3 # 正序分量 i2 (ia alpha**2 * ib alpha * ic) / 3 # 负序分量 return np.abs(i1), np.abs(i2)实测结论是健康状态下负序电流占比一般不到基波的0.5%5匝短路上升到1%到1.5%10匝能到3%左右15匝可以超过5%。这个单调上升的关系非常明显是区分故障等级的一个极其稳定的特征。但要注意这个特征对电流通道的幅值和相位一致性要求很高三个霍尔传感器的增益误差如果不校准负序分量会有一个固定的系统误差影响跨样本的比较。所以我每次实验前都会先测一组健康状态下的三相电流用来标定传感器的相对增益和相位偏移。3.4 数据打包目录结构、标签设计和元数据规范特征提取完下一步是把所有数据组织成标准的数据集结构。我使用的目录如下dataset/ ├── raw/ # 原始信号 npy 文件 │ ├── health_r600_l0/ │ │ ├── sample_0001.npy │ │ └── sample_0002.npy │ └── fault_5turns_r1200_l50/ ├── processed/ # 预处理后信号 ├── features.csv # 特征表 ├── labels.csv # 标签表 ├── meta.json # 全局元数据 └── README.md # 数据集说明文档features.csv和labels.csv是整个数据集的灵魂每一行对应一个样本。特征表里是全部提取出来的数值特征标签表里包括故障状态、故障等级、转速、负载、样本编号、采集时间。为了模型训练方便我额外生成了data.yaml文件记录特征名列表和标签值域喂给sklearn或pytorch的dataloader时直接读取非常省事。meta.json里记录所有关键实验参数采样率、通道数、通道名、传感器型号、灵敏度、抗混叠滤波设置、故障注入详情、工况矩阵、实验日期和环境温湿度等。这一步看似不起眼实际上极其重要——没有完整元数据的数据集别人拿到手根本没法复现实验价值直接打对折。如果你想发布自己的数据集请务必把这部分写完整。还有一点关于文件格式的选择没有把原始数据直接存成CSV因为采样点数量大时CSV文件体积巨大且读取慢。我选了npy格式numpy生态最通用、读取快、体积合理。如果你预期使用者中有不少人用MATLAB或R可以改成hdf5格式牺牲一点读取速度换来跨语言兼容性也是不错的选择。4. 数据集质量评估与机器学习基线验证4.1 拿到数据的第一件事可视化验证可分性数据集打包完成后不要急着训练模型先做一次无监督的可视化验证。我的做法是对全部样本的特征矩阵做PCA降维到50维再用t-SNE映射到2维平面按故障类型着色。如果健康样本和故障样本在t-SNE图上能够形成清晰的簇说明信号特征和故障状态之间存在稳定的映射关系数据集是可信的。如果不同类别的样本混成一团那就说明特征没有抓到关键信息或者某个工况下故障特征确实过于微弱需要回头检查信号处理流程。用sklearn几行代码就能完成from sklearn.decomposition import PCA from sklearn.manifold import TSNE pca PCA(n_components50).fit_transform(X_features) tsne TSNE(n_components2, perplexity30, random_state42).fit_transform(pca)我实测的结果是健康状态和10匝、15匝短路在t-SNE图上分离度很好边界非常清晰但5匝短路和健康状态有部分重叠主要集中在600rpm低速且轻载的工况下。这本身就是一个有价值的结论说明轻度匝间短路在低速轻载条件下的可检测性确实有限对后续算法设计是一个明确的挑战方向。4.2 建立基线一维CNN在原始信号上的直接分类为了给数据集提供一个可供对比的基线我用pytorch搭建了一个简单的一维CNN直接输入稳态段的6通道原始信号3路振动3路电流让网络自己学习特征表示不经过人工特征工程。网络结构6通道输入经过两个一维卷积层卷积核大小分别为64和32激活函数用ReLU中间接最大池化展平后接两个全连接层输出层4个神经元对应4种状态。训练时按样本数80/20划分使用交叉熵损失和Adam优化器batch size取64学习率0.001训练50轮。在同样的训练/测试划分下一维CNN在测试集上的分类准确率达到95%以上。准确率固然好看但我更关注混淆矩阵里的细节——健康样本和5匝短路样本的互相误判仍然存在尤其集中在低负载工况。这说明模型已经学到了大部分故障特征但对微弱故障的识别仍是短板也给后续工作留下了明确的优化空间。4.3 最大的坑训练集和测试集划分时的数据泄露这节我想用比较大的篇幅重点提醒因为这是我在实际工作中踩过最深的一个坑。很多人在做监督分类时习惯把所有样本随机打乱再按比例切分训练集和测试集。对有故障诊断背景的数据集来说这个做法有致命问题同一工况条件下的样本之间相关性极高如果同一次实验采集的样本被同时分到了训练集和测试集模型在测试时表现的准确率会非常高但这个准确率存在水分——模型实际上记忆了特定工况环境特征而不是学习到了故障的本质规律。正确的做法是按“实验工况”而不是按“单条样本”来划分数据集conditions dataset.groupby([status, speed, load]).ngroup() train_mask conditions int(conditions.max() * 0.8) test_mask ~train_mask比如60个工况条件中用48个工况的全部样本训练剩下12个工况完全不参与训练。这种“工况外测试”得到的准确率才真正反映了模型在实际应用场景的泛化能力。我在构建数据集时把建议划分方式直接写进了README同时提供了一个dataset_loader.py帮助使用者从一开始就避开数据泄露这个坑。在实践中按工况划分后一维CNN的准确率会从95%掉到90%以下这个差异非常值得关注。公布数据集时如果不说清楚划分方式使用者各自用不同划分方式得到的指标很可能不具备可比性造成“结果不可复现”的困境。这个细节一定要重视。5. 实操踩坑记录与问题排查心得5.1 不同步问题振动和电流总差那么几毫秒多通道采集最常见的问题是振动和电流通道之间出现时间偏移。不同传感器调理器的滤波电路会引入不同的相位延迟采集卡的模拟输入通道之间也可能存在微小的采样时序偏差。如果不对齐振动信号和电流信号在时间轴上就不是同一时刻的物理状态特征提取阶段就会出现错位。排查方法采集时在电机控制回路里接入一个脉冲信号作为同步标记比如用一个继电器开关产生明显的电压边沿。采集完成后在数据里检查这个边沿在各通道出现的位置如果时间戳不一致就是通道间有延迟。解决方式有两层硬件层面所有AI通道强制共用一个外部采样时钟采用定时触发模式软件层面多采集几次脉冲信号统计通道间的平均延迟差在后续处理时对滞后通道做线性插值把时间轴对齐。这个问题的隐蔽之处在于它不会导致程序报错数据看起来一切正常但最后训练出的模型可解释性很差而且特征可视化时总会觉得哪里不对劲。如果你发现特征提取结果在相同工况下重复性不好优先检查通道同步。5.2 变频器干扰开关频率成分污染了故障特征变频器驱动下的电流信号有个显著特点包含丰富的开关频率成分和边带。我用的变频器开关频率是10kHz电流频谱里10kHz附近有一个巨大的峰值两侧还有宽数十到数百Hz的边带。这些成分如果叠加在定子故障的特征频率附近会严重干扰谐波分析。硬件层面的解决办法在电流传感器输出端加低通滤波器截止频率设置在3kHz到5kHz把开关频率成分提前滤掉同时做好信号线的屏蔽和接地屏蔽层单端接地避免形成地环路干扰。软件层面也有补充手段对时域信号做同步平均或角域重采样把与转速周期相关的成分对齐叠加有效压制与转速不同步的变频器开关噪声。变频器干扰处理的好坏直接影响数据集里“电流特征”这项的质量。我建议在正式采集前先花半天时间做干扰摸底实验对比加滤波和不加滤波的频谱差异把干扰水平降到最低后再进入批量采集环节。5.3 轻载低速工况下故障特征太弱怎么办前面提到5匝短路在低速轻载条件下和健康状态几乎难以区分这是故障诊断领域最棘手的问题之一。此时无论人工特征还是CNN模型误判率都比较高。我的经验是与其执着于踩准确率不如换个角度看问题。一种方式是把任务从“多分类故障识别”改成“单分类异常检测”只在健康数据上训练模型任何偏离健康分布的样本都视为异常。这种思路更贴近真实工业场景——你往往积累了海量健康数据但故障数据很少。另一种方式是从控制闭环里挖特征比如分析d-q轴电流残差把那些微小的不对称量作为额外特征加入数据集中。我用残差特征对轻度故障检测率提升了约10个百分点是很值得尝试的方向。5.4 数据发布的两条实用建议既然项目目标之一是形成一份可复用的数据集整理发布时有几个细节值得额外重视。第一是数据版本管理。实验过程中难免会调整传感器位置或更换工况参数建议从一开始就给数据集加版本号任何改动都更新版本并写变更记录。没有版本管理的数据集很容易在使用几个月后分不清哪个版本是最终版。第二是加载脚本和示例代码。我在数据集根目录里放了一个dataset_loader.py提供读取特征表、按工况划分训练测试集的功能。使用者下载后跑一下就看到了数据结构不用自己研究半天README。这些细节看起来并不酷但能极大降低数据集的复用成本。常见问题典型表现排查与解决办法振动电流不同步特征重复性差可视化对不齐脉冲边沿检查硬件共享时钟或软件插值对齐变频器开关干扰电流频谱在开关频率处出现巨峰和边带硬件低通滤波屏蔽接地软件角域重采样霍尔传感器零漂负序分量基线偏高上电预热稳定采集前标定相对增益模拟故障与真实故障差异模型在实验室测试准现场泛化差识别场景用域泛化评估按工况划分数据集轻载低速下特征弱5匝短路与健康混淆明显换异常检测思路引入控制残差特征最后再分享一个经验层面的事。搭建实验台架和建数据集的工程量远比训练模型要大得多整个过程也枯燥得多。但恰恰是这个过程让我对定子故障的物理机理、信号特征和传感器噪声有了远比跑公开数据集更扎实的理解。所以我的建议是如果你有条件一定亲自动手攒一套哪怕小规模的数据集——它不只能帮你完成手头的论文或项目更会成为你评估所有算法的长期基准。拥有一个自己深度了解其来源、物理意义、局限性的私有数据集在故障诊断这个领域里是比任何公开数据集都宝贵的东西。
返回列表