第四讲:数据采集实战——用NI DAQ采集主轴振动信号
各位同学,今天咱们来点真家伙。
前面三讲我们聊了轴承故障的机理、特征频率的计算,还有传感器的选型。但说实话,那些都是纸上谈兵。真正要诊断故障,你得先把信号拿到手。数据都采不上来,后面分析得再漂亮也是白搭。
这一讲,我就带大家走一遍完整的流程:从硬件接线,到NI DAQ的配置,再到Python实时读取和存储。嗯,都是我在车间里踩过坑之后总结出来的经验。
核心目标:用NI DAQ采集卡(比如USB-6009或9234)采集主轴轴承的振动加速度信号,通过Python实时读取并保存为CSV文件,为后续的时域/频域分析做准备。
4.1 硬件连接与配置
先说说硬件。我个人习惯用NI的USB-6009,性价比高,16位分辨率,采样率最高48kS/s,对付主轴振动绰绰有余。如果你用的是ICP加速度传感器,记得要配一个信号调理器,或者直接用NI 9234这种带IEPE激励的模块。
接线要点:
- 传感器输出 → DAQ模拟输入通道(AI0+ / AI0-)
- 信号调理器供电(如果是ICP传感器)
- DAQ的USB线连到电脑
注意:我曾经有一次没注意传感器线缆的屏蔽层接地,结果采集到的信号里全是50Hz工频干扰。后来花了整整一个下午排查,才发现是接地问题。所以,屏蔽层一定要单端接地,别偷懒。
硬件接好后,打开NI MAX(Measurement & Automation Explorer),确认设备能被识别。如果设备列表里没有,检查驱动或者换根USB线——别问我怎么知道的。
4.2 Python环境准备
Python这边,我们需要装几个库:
- nidaqmx:NI官方提供的Python驱动,用来控制DAQ卡
- numpy:处理数据数组
- pandas:保存CSV文件
- matplotlib:实时绘图(可选,调试用)
安装命令很简单:
pip install nidaqmx numpy pandas matplotlib
这里有个坑:nidaqmx要求你的NI-DAQmx驱动版本在19.0以上。我建议直接装最新的,省得后面报错。
4.3 实时采集代码实战
好了,现在开始写代码。我会先给一个基础版本,然后逐步优化。
4.3.1 单次采集(测试用)
先跑通最简单的:采集1秒钟的数据,看看传感器和线缆有没有问题。
import nidaqmx
import numpy as np
# 创建设备对象
with nidaqmx.Task() as task:
# 添加模拟输入通道,物理通道名称为"Dev1/ai0"
task.ai_channels.add_ai_voltage_chan("Dev1/ai0")
# 配置采样率:10kHz,采样点数:10000(即1秒数据)
task.timing.cfg_samp_clk_timing(rate=10000, samps_per_chan=10000)
# 读取数据
data = task.read(number_of_samples_per_channel=10000)
# 转换为numpy数组
data_array = np.array(data)
print(f"采集完成,数据长度:{len(data_array)}")
print(f"最大值:{np.max(data_array):.4f} V,最小值:{np.min(data_array):.4f} V")
跑一下,如果输出正常,说明硬件链路没问题。如果全是0或者数值异常,检查传感器供电和接线。
4.3.2 连续采集与实时存储
实际诊断中,我们通常需要连续采集几分钟甚至几小时的数据。下面这个代码实现了:
- 连续采集,每1秒读取一次缓冲区
- 实时显示当前数据的均方根值(RMS)
- 将数据追加保存到CSV文件
import nidaqmx
import numpy as np
import pandas as pd
import time
from datetime import datetime
# 采集参数
SAMPLE_RATE = 10000 # 采样率 10kHz
DURATION = 60 # 采集时长 60秒
CHUNK_SIZE = 10000 # 每次读取10000个点(1秒)
CHANNEL = "Dev1/ai0" # 物理通道
# 存储数据的列表
all_data = []
print("开始采集...")
start_time = time.time()
with nidaqmx.Task() as task:
# 配置通道和采样时钟
task.ai_channels.add_ai_voltage_chan(CHANNEL)
task.timing.cfg_samp_clk_timing(
rate=SAMPLE_RATE,
samps_per_chan=CHUNK_SIZE
)
# 启动采集
task.start()
while time.time() - start_time < DURATION:
# 读取一个数据块
chunk = task.read(number_of_samples_per_channel=CHUNK_SIZE)
chunk_array = np.array(chunk)
# 计算RMS值
rms = np.sqrt(np.mean(chunk_array**2))
timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3]
print(f"[{timestamp}] RMS: {rms:.4f} V")
# 存储数据
all_data.append(chunk_array)
task.stop()
# 合并所有数据
final_data = np.concatenate(all_data)
print(f"采集完成,总数据点数:{len(final_data)}")
# 保存为CSV
df = pd.DataFrame({
'time': np.arange(len(final_data)) / SAMPLE_RATE,
'vibration': final_data
})
df.to_csv('spindle_vibration_data.csv', index=False)
print("数据已保存到 spindle_vibration_data.csv")
小技巧:我习惯在文件名中加入时间戳,比如 spindle_20250101_143000.csv,这样不会覆盖之前的采集数据。你可以在保存时用 datetime.now().strftime("%Y%m%d_%H%M%S") 生成文件名。
4.4 避坑指南与经验分享
做数据采集这么多年,我踩过的坑能写一本书。这里挑几个最常见的说说:
- 缓冲区溢出:如果采集时间很长,读取速度跟不上采样速度,DAQ卡会报缓冲区溢出错误。解决办法是增大
samps_per_chan或者用多线程读取。 - 采样率设置:主轴振动信号的频率范围一般在0-5kHz,根据奈奎斯特定理,采样率至少10kHz。我通常设到20kHz,留点余量。
- 文件太大:连续采集一小时,10kHz采样率,就是3600万行数据。CSV文件会很大。建议分段保存,比如每10分钟一个文件。
警告:千万不要在采集过程中拔USB线!我曾经手贱拔了一次,结果DAQ卡驱动崩了,重装才恢复。正确做法是先停止任务,再断开连接。
4.5 知识体系总览
下面这张图总结了本章的核心逻辑,从硬件到软件,从采集到存储,一目了然:
4.6 课后练习
光看不练假把式。给你留个小任务:
- 用你的DAQ卡采集一段主轴空转时的振动信号,保存为CSV
- 用Python读取这个CSV,画出时域波形图
- 尝试改变采样率(比如5kHz、20kHz),看看波形有什么变化
做完这些,你就掌握了数据采集的基本功。下一讲我们会用这些数据做频谱分析,看看能不能找到轴承故障的特征频率。