无锡一家轴承厂的磨床主轴轴承靠"老师傅听声音"判断状态,去年两次突发抱轴,砂轮碎裂险些伤人。厂里要一套在线振动监测:能在轴承劣化早期给出预警,而不是等异响出现。这套系统的技术核心是高速采集不丢点 + FFT 频谱找特征频率 + 包络解调抓早期故障,本文按数据流顺序把每一环的实现讲清楚。
一、数据流总览:从传感器到报警的五个环节
① 采集
IEPE加速度传感器,10kHz采样,采集卡DMA连续模式
② 缓冲
双缓冲交接,采集线程只管写,分析线程取整块处理
③ 预处理
去直流、加汉宁窗,8192点一段
④ 频谱
FFT幅值谱,比对轴承特征频率
⑤ 判定
速度有效值分级 + 特征频率能量趋势报警
▲ 五个环节各自独立线程/任务,任何一环慢都不影响采集本身——这是高速采集系统的第一设计原则。
二、采集与缓冲:10kHz 下丢点是怎么发生的
10kHz 采样意味着每秒 1 万个点,单通道 16 位数据每秒约 20KB——数据量不大,但对时序连续性极其敏感。丢点的三个常见原因:
- 采集卡用"查询模式"而非 DMA 连续模式:软件轮询读缓冲区,GC 或界面卡顿一来就溢出。必须配置为连续采集 + 硬件 DMA,采集卡自己往内存搬数据;
- 读取块太小、回调太频繁:每次只读 100 个点,每秒 100 次回调,线程切换开销吃掉 CPU。按 0.5~1 秒一块读取(5000~10000 点);
- 分析计算挤占采集线程:FFT 和绘图跟采集放同一个线程,分析一慢缓冲区就溢出。采集线程只做一件事——把数据搬进双缓冲。
双缓冲的交接逻辑很简单:采集线程写满 A 块,交换 A/B 指针,通知分析线程处理 B 块:
// 采集线程:只做搬数据,不做任何重计算 void OnDataReady(double[] chunk) // 采集卡回调,10000点/次 { Array.Copy(chunk, _bufWrite, chunk.Length); _filled += chunk.Length; if (_filled >= BlockSize) // 攒满一块(8192的整数倍) { (_bufWrite, _bufReady) = (_bufReady, _bufWrite); // 交换 _filled = 0; _readySignal.Set(); // 通知分析线程 } }
三、FFT 之前:采样长度、窗函数与频率分辨率
频谱分析的质量在 FFT 之前就决定了大半,三个参数必须想清楚:
| 参数 | 本项目取值 | 依据 |
|---|---|---|
| 采样率 fs | 10 kHz | 关注频段 ≤ 3kHz(轴承特征频率及其谐波),按 3 倍以上裕量取 |
| 分析长度 N | 8192 点 | 频率分辨率 Δf = fs/N ≈ 1.22Hz,足以分辨轴承各特征频率 |
| 窗函数 | 汉宁窗 | 振动信号非周期截断,汉宁窗压低频谱泄漏;幅值恢复乘系数 2 |
▲ 频率分辨率 Δf = fs/N 是最容易被忽视的指标:N=1024 时 Δf≈9.8Hz,轴承外圈故障频率 137Hz 和 146Hz 的两个峰就糊在一起了。
FFT 本体用 MathNet.Numerics,不用自己写基2算法:
using MathNet.Numerics.IntegralTransforms; // data: 8192点去直流后的振动数据 var spectrum = new Complex[data.Length]; for (int i = 0; i < data.Length; i++) spectrum[i] = new Complex(data[i] * Hann(i, data.Length), 0); Fourier.Forward(spectrum, FourierOptions.Default); // 单边幅值谱:前 N/2 根谱线,幅值×2/N double df = SampleRate / (double)data.Length; for (int i = 1; i < data.Length / 2; i++) amp[i] = 2.0 * spectrum[i].Magnitude / data.Length; // 第 i 根谱线对应频率 i * df
四、轴承四大特征频率:诊断的"靶子"
滚动轴承每个部件损伤都会在频谱上留下固定位置的峰,特征频率由轴承几何参数算出(n 为转频,Z 为滚动体数,d 为滚动体直径,D 为节径,β 为接触角):
| 故障部位 | 特征频率公式 | 本项目实例值(n=25Hz) |
|---|---|---|
| 外圈 BPFO | n·Z/2·(1−d/D·cosβ) | ≈137 Hz |
| 内圈 BPFI | n·Z/2·(1+d/D·cosβ) | ≈188 Hz |
| 滚动体 BSF | n·D/(2d)·(1−(d/D·cosβ)²) | ≈112 Hz |
| 保持架 FTF | n/2·(1−d/D·cosβ) | ≈10.5 Hz |
诊断逻辑就是:算出当前转速下的四个特征频率,在频谱上取 ±Δf×2 窗口内的峰值能量,跟踪其趋势。特征频率能量相对基线上涨 6dB 提示关注,上涨 12dB 报警。
五、包络解调:早期点蚀的唯一解法
轴承早期点蚀的冲击能量很小,直接看频谱,特征频率的峰淹没在噪声里。但冲击会激起轴承结构的高频共振(通常 1~5kHz),冲击的重复频率才是故障信息,它调制在高频共振的幅值上——这就是包络解调的用武之地:
- 带通滤波:截取 2~4kHz 共振频带;
- 希尔伯特变换求解析信号,取模得到包络;
- 对包络再做 FFT——包络谱上 BPFO/BPFI 处的峰就是故障证据。
这套流程上线后的实际效果:磨床主轴轴承在劣化早期(操作工完全无感、听诊棒也听不出)包络谱 BPFO 能量持续爬升,系统提前 11 天发出预警,厂方利用计划停机更换,避免了一次抱轴事故。
六、报警口径:速度有效值定"严重程度",特征频率定"故障部位"
两套指标各司其职:速度有效值(RMS,10~1000Hz 频带)按 ISO 10816 分四区判断整体振动烈度——这台磨床属刚性支承中型机械,取 A/B 边界 2.8mm/s、B/C 边界 7.1mm/s;特征频率能量判断是哪个部件出了问题。报警信息直接写成"主轴轴承外圈特征频率能量超标,建议检查外圈滚道",维修班组拿到就能干活,不用再找分析师读谱。
最后一点经验:振动监测系统的价值不在报警那一刻,而在趋势数据攒够三个月之后——每台设备的基线谱、劣化速率、换件前后对比,都会变成厂里自己的诊断知识库。原始波形按天归档(每天约 1.7GB/通道,务必压缩存储),频谱结果进数据库,这个存储架构要在第一天就设计好。
