1. 项目起因:旧方案在高速脱水阶段为什么撑不住
1.1 老检测系统的失效表现
洗衣机的高速不平衡检测,我前后折腾了10个月,最终用LabVIEW彻底重做了一遍。这活儿说实话不算多难,但难就难在你要在真实的震动环境里把信号抠干净,然后在转速从几十转到一千多转的变化过程中判断出“这一筒衣服到底偏了多少”。
接手这个项目的时候,产线上传来的数据很不好看:脱水阶段误报率接近10%,也就是每十次高速脱水就有一次被误判成“不平衡”,洗衣机直接停机并尝试重新进水、重新分布衣物。用户端投诉倒是没那么多,但产线测试端的节拍被打乱得很严重,一台机器返工两次是家常便饭。更麻烦的是,偶尔有真正不平衡量很大的负载反而没被检出来,滚筒在1200转附近撞得咣咣响,减震器寿命明显下降。
旧方案用的是单片机采集一个加速度传感器的包络值,设一个固定阈值。传感器贴在洗衣机后背板上的减震弹簧附近,输出经过半波整流和RC低通滤波后进ADC,程序里拿包络平均值跟阈值比。这套思路在低速或转速稳定的工况下勉强够用,但在加速过程中完全抓瞎。因为洗衣机脱水的时候,转速从零一路拉到1200转,系统会穿过减震结构的共振区,在那个时刻振动包络会出现一个尖峰,幅值甚至比真正的不平衡负载还高。固定阈值要么设得高,导致真正偏心较小的负载漏报;要么设得低,导致过共振区时就误报。
工业现场的环境噪声也掺和进来了:变频器PWM的开关噪声通过电源线串入传感器信号,单片机那边没有足够带宽去做数字滤波,只靠硬件RC根本滤不干净。你去看示波器,包络线上挂着一堆毛刺,阈值判断就像在悬崖边开车。
1.2 为什么选择LabVIEW重做而不是继续修修补补
一开始团队里也有人提议继续在单片机端优化,比如加二阶有源滤波器、换更贵的加速度计、把“包络平均值”改成“滑动窗口峰值”。但我明确反对。核心原因有三个。
第一,洗衣机不平衡检测不是单纯的电压比较问题,而是要提取旋转基频分量,也就是“1X阶比”的幅值和相位。这个需求决定了算法必须依赖转速参考,需要在角度域做重采样,单片机裸奔做这些算法虽然理论上可行,但开发周期会拉得很长,调试也不方便。
第二,现场需要大量数据来验证算法边界。我要在不同偏心质量、不同负载分布、不同转速、不同温度下录制原始振动波形和转速信号,然后离线回放分析。LabVIEW配合NI的DAQ硬件,TDMS文件一把梭,原始波形和结果字段能直接存成数据库文件,回放时还能用“数据/速度”滑动条随意拖拽查看。这种调试体验是单片机串口打印远不能比的。
第三,这个项目迟早要并入产线测试软件。现场已有的下位机测试台就是基于NI PXI的,上位机用LabVIEW写报表。与其引入一套新语言新工具链,不如直接在LabVIEW里做。
后来的事实也证明这个选择是对的。十个月下来,我不仅把算法重做了,还顺手把整个信号链路、测试样本管理、生产报表、故障日志全部用LabVIEW串了起来。如果继续用单片机,光是采集和回放系统就得再写半年。
2. 物理模型与信号特征:不平衡检测的本质是提取“1X分量”
2.1 离心力公式与不平衡量量化
要设计好算法,得把物理讲清楚。脱水桶转速n(单位rpm)对应角速度ω = 2πn/60。如果衣物在桶内的等效偏心质量为m,等效偏心距为r,那么旋转时产生的离心力幅值为:
F = mω²r
这个力通过轴承传递到箱体,引起箱体振动。振动信号里最核心的频率成分就是旋转频率ω/(2π),也就是“1X阶比”分量。举例来说,转速1000rpm时,1X频率约16.7Hz;转速达到1200rpm时,1X频率约20Hz。如果衣物分布均匀,理论上不应该有1X分量;但实际中由于洗涤后衣物缠绕、吸水不均匀,总会有一个残馀不平衡量。
测量箱体振动加速度的幅值,本质上等于激励力除以结构动刚度。动刚度和转速相关,因为结构在不同频率下的响应不同;而且洗衣机箱体和减振系统是个强非线性系统,尤其在加速段穿过共振区时,传递特性会发生剧烈变化。所以你不能简单地把“加速度幅值超过阈值”当作不平衡判据。
工程上,我们习惯用不平衡量U = m×r来量化偏心程度,单位用g·mm。但在产线检测中,你不会去测量真正的m和r,而是通过振动响应来推测。算法要做的不是精确求出U,而是给你一个跟U单调相关的特征值,并保证分类错误率低。我最终的方案是融合三个特征:1X幅值、1X相位稳定性、总振动能量。
2.2 传感器选型与安装位置的实际考量
传感器选型上,我对比过三种:
压电式加速度计(ICP)频响宽、信噪比高,但需要恒流源供电;MEMS加速度计便宜、能测低频甚至直流,但噪声偏大;速度传感器和位移传感器体积大,不适合装在洗衣机背面。
最后选了ICP加速度计,量程±50g,灵敏度100mV/g左右,频率范围0.5Hz到5kHz。为什么不用±10g?因为洗衣机在共振区瞬态峰值可能超过10g,如果用±10g可能会导致输出饱和、波形削顶,1X幅值反而算低了。量程大一点,牺牲一些灵敏度,换来的是不容易饱和。
安装位置更是关键。我试过贴在箱体顶部、侧面、后板、甚至直接贴在减震器的支座上。实测下来,后板上靠近悬挂弹簧下支点的位置最合适:振动能量集中,频谱中1X分量清晰,但受电机散热风扇和进水阀开关噪声影响也小。安装方式必须用M5螺钉加平垫圈紧固,扭矩控制在2N·m左右。我后来发现很多重复性问题就是安装扭矩不一致造成的——压电加速度计对安装共振敏感,扭矩不足时高频响应会明显变差。
2.3 为什么“峰值/有效值”不够:共振与干扰的分析
一开始我还想直接沿用“统计包络峰值”的思路,只是把单片机换成LabVIEW。结果发现完全不行。原因就是前面提到的共振区。
洗衣机减振系统的固有频率通常在25~45Hz之间(不同机型差异很大),脱水转速从0升到1200rpm的过程中,1X频率从0Hz扫到20Hz。如果固有频率靠近30Hz,那么在转速上升到约900rpm之前就会经过共振区。此时即使衣物分布非常均匀,箱体也会因为共振而明显抖动。你去看时域波形,是一个逐渐增大又减小的“鼓包”,包络峰值很容易超过你的阈值。
如果在加速过程中采样包络并做阈值判断,就会频繁误报。旧方案最大的问题就在这里:它没法区分“共振导致的振动放大”和“真正的不平衡激励”。即使你把检测窗口放到高速稳定阶段,在1200rpm时1X频率20Hz,远离共振频率,振动响应相对小;但这时固定阈值又可能因为减震器老化、衣物含水率波动而失效。
正确的做法是引入转速同步,把振动信号从“时域信号”转换成“角度域信号”,也就是跟着转子的转角来采样。这样不管转速怎么变,1X分量永远对应角度域的第1阶谱线,共振区虽然放大信号但不会影响“1X阶比”的识别,因为共振频率对应的阶比是大於1的(比如30Hz/20Hz=1.5阶),和1X在阶比谱上分得开。
这是整个重做项目最核心的认知转变。
3. 核心算法重做:基于“阶比跟踪”的自适应检测
3.1 放弃固定阈值,改用角度域重采样
确定方向后,第一步就是抛弃时间域等间隔采样思维。
传统的FFT是等时间间隔采样后做频谱分析。但洗衣机转速在加速阶段变化很快,同一个FFT窗口里转速可能从600转到900转,1X频率也跟着漂移,导致谱线变“糊”,能量泄漏严重。你没法用固定分辨率去提取一个在频带上漂移的频率。
阶比分析的关键是把振动信号按照“每转过一定角度采样一个点”来重采样。也就是说,采样间隔不再是时间,而是角度。这样无论转速如何变化,每转一圈固定采样N个点,旋转基频永远是1阶。对重采样后的信号做FFT,横轴就是阶比,1X幅值就是我要的特征。
具体实现上,我用了转速脉冲作为参考。洗衣机的电机是变频驱动的,我们通过一个霍尔传感器采集电机的换向脉冲(或者叫转速脉冲),每转产生若干个脉冲。LabVIEW的计数器通道可以测出每个脉冲的到达时间戳;利用这些时间戳,可以计算出瞬时转速和旋转角度。
然后对振动通道做插值重采样:把原始时间序列按“角度”坐标重新采样。比方说,每个旋转周期定义3600个采样点,也就是0.1度一个点,转速再高也保证足够的分辨率。插值方法我用过线性插值和三次样条插值,线性插值在高转速大加速度下会产生轻微幅值偏差,三次样条更平顺,但计算量稍大。对于2kHz采样率、每个周期几十毫秒的数据,这点计算量在LabVIEW里根本不算事。
3.2 用LabVIEW实现阶比谱与1X幅值提取
LabVIEW里做阶比分析有两条路:直接用Sound and Vibration Toolkit里的Order Analysis Express VI;或者自己搭。
Express VI上手快,内部集成了角速度计算、角度域重采样、阶比谱计算,还能直接输出阶比瀑布图。但我个人建议至少理解它内部干了什么,因为现场调试时你会遇到各种边界情况。比如转速脉冲丢失、转速突变、插值后采样点数不够等,Express VI报错信息很笼统,你看不出问题出在哪个环节。
我自己的方案是:用“转速波形”通道,先做一个阈值过零检测,得到每个脉冲沿的时间戳t[i];计算瞬时转速n[i] = 60 / ((t[i+1]-t[i]) * NpulsesPerRev),然后用LabVIEW的“Interpolate 1D”函数把振动信号映射到角度坐标上;最后调用“FFT”并取幅值谱中第1根谱线。
伪代码逻辑如下:
- 读取振动加速度数组a[t]和转速脉冲数组p[t]。
- 提取p[t]的上升沿时间戳。
- 对每个时间戳区间,计算转速均值,并累计角度。
- 构造等角度采样时刻向量θ_target = 0, Δθ, 2Δθ, ...,用三次样条插值在a[t]上求值。
- 对插值后数组做FFT,取第1阶次对应的复数值,得到幅值和相位。
- 每0.5秒滑窗刷新一次。
在实际程序里,我把这些步骤做成了一个子VI,输入是振动信号、转速信号、每转脉冲数,输出是1X幅值、1X相位、当前转速、置信标志。
3.3 状态机设计:从启动到判断的完整时序
算法有了,还得把它嵌到洗衣机的运行流程里。脱水过程不是恒定转速的,而是分阶段:初始排水、低速晃动、加速、高速脱水、减速停机。
我把检测系统设计成一个状态机,每个状态一个LabVIEW枚举,用while循环+移位寄存器来维护状态切换。状态包括:
- IDLE:等待启动命令,待机;
- ACCEL_LOW:转速从0升到400rpm,此阶段不做判定,只记录数据;
- ACCEL_HIGH:转速从400升到目标转速(比如1200rpm),继续记录,但暂时只缓存;
- STABLE:转速到达目标转速并稳定超过2秒,进入判定窗口;
- DECISION:在STABLE窗口内连续取10个0.5秒子窗口的1X幅值,取中位数(而不是平均值)作为该次脱水的特征值;
- JUDGE_DONE:将特征值和转速、机型参数一起送入阈值模型,输出“OK”或“REBALANCE”;
- SLOWDOWN:无论判定结果如何,都按原有逻辑减速;若判定为“REBALANCE”,则发送信号给主控,要求重新进水并执行衣物分布程序。
为什么用中位数?因为真实振动信号里经常有短促冲击(比如拉链碰到桶壁、轴承滚子通过),这种冲击在时域会形成很大的峰值,但通过阶比分析后,冲击能量分散到多个阶次,对1X幅值影响没那么大。然而在某些子窗口内,如果冲击恰好落在1X频带附近,还是会出现一个异常高值。用中位数可以把这个“野值”剔掉,比均值稳健得多。
判定阈值我也改成了随转速动态调整。因为同样是50g偏心,在600rpm下产生的1X幅值,和在1200rpm下差了4倍(力与ω²成正比)。我用台架标定数据拟合出不同转速下的正常基线,然后设定阈值为基线乘以系数k,k根据机型调整,通常取1.5~2.0。
3.4 双重判定:1X幅值加相位稳定性
只靠1X幅值还不够。在共振区附近,即使衣物平衡,1X幅值也会升高。为了区分“共振放大”和“真实不平衡”,我加了一个很有趣的判据:1X相位稳定性。
如果激励源是真正的不平衡质量,那么不平衡方向相对于转轴是固定的,所以1X振动相位相对于转速脉冲应该保持稳定,波动一般不超过20°~30°。如果激励源是共振放大、随机扰动或者结构松动,相位会来回乱跳。这个现象在信号处理领域叫“相干相位”,在旋转机械诊断里非常常用。
我在LabVIEW里把FFT结果中的复数虚部实部做反正切,得到相位角,然后在判定窗口内统计相位的标准差。如果标准差小于某个阈值(比如15°),认为相位稳定,不平衡特征可靠;否则标记为“可疑”,并结合其它特征综合判断。
这个相位判据帮了大忙。有一次现场实验,我们在箱体上贴了一个附加质量块模拟不平衡,但固定不牢,结果振动幅值很大,相位却在±60°之间乱摆,系统识别为“可疑”而不是“不平衡”,避免了误报。后来机械工程师检查,发现是附加质量块胶水松动。
4. 硬件链路与抗干扰改造:花了我整整两个月
4.1 信号调理、屏蔽与接地
算法开发到一定阶段后,我逐渐意识到真正的瓶颈是信号质量。LabVIEW算法再花哨,喂进去的信号满是噪声,出来的结果就是垃圾。
洗衣机里的电磁环境相当恶劣。变频器PWM的工作频率在4kHz到16kHz之间,走线又长又乱。加速度计输出的是微弱的电压信号,如果屏蔽不好,变频器的高频噪声会直接耦合进来。我在早期调试时就发现,只要变频器一启动,LabVIEW采集到的振动信号底噪瞬间从5mVp-p变成50mVp-p。
解决办法分三层。
第一层是物理隔离:加速度计信号线换成双层屏蔽绞合线,外层屏蔽单端接地,内层屏蔽接到放大器地。信号线尽量避开电机动力线,必须交叉时要垂直交叉,不要平行走线。
第二层是信号调理:在采集卡前加一个模拟低通滤波器,截止频率设在500Hz,滤掉PWM的kHz噪声。很多人觉得NI DAQ自带抗混叠滤波器就够用了,但那是采样率相关的抗混叠,针对的是采样混叠;对于已经串入模拟通路的PWM噪声,一个简单的RC低通能显著改善信噪比。
第三层是数字滤波:在LabVIEW算法前面加一个截止频率100Hz的巴特沃斯低通,因为我们的关注频段是1X分量(通常不超过50Hz),不需要保留高频细节。
4.2 变频器PWM与电机换向噪声的实战处理
另外一个坑是电机换向和PWM造成的共模干扰。压电加速度计信号是单端对地的,变频器母线电压跳变时,会通过寄生电容在地回路里产生共模电流,导致同一时刻所有通道读数都出现一个尖峰。
我当时排查了很久,一开始以为是传感器坏了,后来用示波器同时测电机电流和振动信号,发现振动信号上的尖峰和PWM开关沿完全同步。
怎么办?三个动作:
- 把NI机箱的地和变频器地分开,采用单点接地;
- 传感器的安装螺钉加绝缘垫片,避免形成地环路;
- 使用差分输入的NI模块(比如PXIe-4492动态信号采集卡),虽然ICP传感器本身是单端输出,但配合信号调理设备可以伪差分输入。
做完这些之后,底噪从50mVp-p降到5mVp-p以下,1X幅值提取稳定多了。这一步看似不起眼,却是整个项目成功的关键。
4.3 DAQ同步采样与转速脉冲采集
硬件选型上,我用了NI PXIe-4492作为振动采集模块,这是一款24位动态信号采集模块,自带ICP激励和抗混叠滤波器,非常省事。转速信号则用PXIe-6363的计数器通道采集,两个模块之间需要共用同一个PXI时钟信号,以保证振动和转速时间基准一致。
这里有个容易忽略的细节:转速脉冲信号一定要做施密特触发或者光耦隔离,否则现场地噪声可能会导致计数器不断误触发。我最初直接把霍尔传感器信号接进计数器,结果转速脉冲每转多出几百个毛刺,角度计算完全乱套。后来在信号线上加了一个RC滤波加施密特触发器,毛刺才消除。
同步性决定了角度域重采样的准确性。如果振动采样和转速脉冲在时间上偏差几毫秒,每转的角度标定就会偏移,导致阶比谱出现偏差。好在NI的硬件同步机制很成熟,在PXI机箱内通过背板时钟共享能做到微秒级同步,完全够用。
5. 十个月里踩过的坑与排查链路
5.1 一模一样的负载,检测结果却每天不同
项目进行到第三个月时,出现了一个让我特别崩溃的问题:同样的标准负载,同样的偏心质量,前一天测出来的1X幅值是2.1g,第二天变成3.4g,第三天又变成1.8g。排查了传感器、采集卡、算法所有环节都没有问题。
最后发现是环境温度变化导致的减震器阻尼变化。洗衣机减震器是摩擦阻尼加弹簧结构,气温从20℃降到10℃,阻尼明显增大,箱体振动响应就变了。后来我在程序里增加了“温度补偿”功能:读取机器内部热敏电阻的温度,对1X幅值基线做线性修正。温度修正后的结果偏差控制在±5%以内。
这个坑提醒我:做检测算法一定要留好“补偿入口”,不要急着把所有特征固定死。
5.2 内存泄漏与界面冻结:LabVIEW程序员的日常
LabVIEW开发到后期,程序变得很大,前面板控件很多。我在连续运行48小时后发现上位机内存占用缓慢增长,最终导致界面无响应。排查后发现原因是“TDMS文件写入”和“波形图表刷新”没有做好队列管理。每个采样循环里,波形图引入了新的数据点,但没有限制图表的历史长度;同时每次迭代都在新建字符串数组并写入文件,却没有释放引用。
解决方案是:用生产者/消费者架构,采集线程只管把数据放入队列;显示线程从队列取出数据点并更新图表,并设置历史长度上限(比如10万点);TDMS文件写入由独立线程负责,写完一帧就flush一次。改完后内存曲线变成了一条直线,连续跑了一周都没重启。
10个月项目里,LabVIEW程序的稳定性往往比算法更磨人。建议大家在写代码时就要把“长时间运行不泄漏”当成硬性指标来检查。
5.3 现场验收才发现的问题:高湿度环境下的传感器漂移
台架测试都通过了,结果一上产线就出事。产线环境湿度长期在80%以上,洗衣机刚洗完脱水时还带水汽,加速度计底座和螺钉连接的地方生锈了,灵敏度下降,导致漏报。更麻烦的是,水汽会沿着电缆屏蔽层渗透,改变电缆电容,让信号出现低频漂移。
打了一圈补救:传感器底座改不锈钢,螺钉换镀镍的;连接器加硅胶密封圈;把加速度计从垂直安装改成了向下倾斜45°,防止积水沿着线缆倒流。这个教训最后也写进了维护手册,要求每两个月检查一次传感器状态。
现场环境永远比实验室复杂,台架测试再顺利也一定要在真实产线上跑至少一周的马拉松。
6. 验证方案与最终效果:以误报率/漏报率说话
6.1 标准负载与偏心测试样本设计
重做系统不能光嘴上说“好了”,必须拿出数据。我为这个项目专门设计了一套标准测试样本:
- 标准负载:棉织物5kg,洗涤后脱水,含水率控制在80%左右;
- 不平衡注入:使用橡胶包铅块,质量分别为50g、100g、150g、200g,模拟不同偏心质量;
- 位置变量:铅块分别放在滚筒前壁、后壁、左壁、右壁,以及两个不同位置同时放;
- 转速变量:分别测试600rpm、800rpm、1000rpm、1200rpm四个目标转速;
- 重复次数:每个组合重复20次,样本总量接近400组。
每组测试中,系统自动记录1X幅值、相位标准差、总振动能量,并给出“通过/不平衡/可疑”的判定结果。同时人工记录洗衣机的实际表现(是否异常跳动、是否噪声超标)。
这一套流程跑下来,我整整用了一个多月。但数据非常宝贵,它让我能画出不同转速下的1X幅值分布图,看清楚“正常负载”和“不同偏心质量”之间的分离度。
6.2 新旧方案数据对比
对比结果如下表:
| 项目 | 旧方案(固定阈值包络) | 新方案(阶比+相位+动态阈值) |
|---|---|---|
| 误报率(正常负载判定为不平衡) | 9.7% | 0.4% |
| 漏报率(200g偏心未判定) | 1.2% | 0.0% |
| 最小可检测偏心质量 | 150g | 80g |
| 转速适应性 | 仅在1200rpm有效 | 600-1200rpm均可 |
| 温度漂移影响 | 明显 | 可补偿 |
| 数据回放能力 | 无 | 完整TDMS日志 |
特别是最小可检测偏心质量从150g降到80g,意味着有些轻微分布不均的衣物以前会被放过去,现在能被提前发现,高速轴承和减震器的寿命得到保障。
6.3 关于这10个月的复盘和一些个人体会
10个月的时间分配大致是:需求梳理和现场观察2个月,硬件平台搭建1.5个月,核心算法开发与仿真3个月,台架验证2个月,现场试运行与参数调优1.5个月。
如果用一句话总结,那就是:做工业检测项目,千万不要一开始就埋头写代码。先把物理模型搞清楚,把信号链路做到“干净”,再把算法建立在可靠的物理基础上,最后用海量样本去验证分类边界。
另外,LabVIEW的价值不在于“图形化编程比文本快”,而在于它天然适合数据采集、可视化和硬件集成。这个项目里我大量使用了TDMS文件存储、事件结构、生产者消费者队列,这些功能在Python或C++里也能实现,但LabVIEW可以把它们和DAQ设备无缝衔接,开发效率确实高。
最后分享一个小技巧:在LabVIEW里写状态机时,一定要把每个状态的入口条件和出口条件写成“可配置项”,不要硬编码。现场调试时会频繁调整这些参数,如果每次都要改代码再编译,那你的10个月可能会变成12个月。把阈值、窗口长度、转速目标都做成前面板控件,然后存成配置文件,这样调试效率能提升一个档次。
这个项目结束后,我把整套检测程序封装成了一个可复用的LabVIEW项目模板,后续开发其他家电振动检测项目时,只需要换传感器参数和阈值配置就能快速上手。如果你也在做类似的高速旋转设备不平衡检测,希望这篇复盘能帮你少踩几个坑。