4、信号采集与硬件平台:常用开发板、传感器接口、采样率与分辨率设置

TinyML工业状态分类的起点并非模型算法,而是物理世界与数字世界的交汇点——信号采集与硬件平台。在工业现场,温度、电流与振动信号往往混杂着噪声、工频干扰和突发冲击,若前端采集硬件设计不当,后续无论模型多么精巧,都难以获得理想的分类准确率。本章将聚焦于TinyML落地中最常用的两款开发板(Arduino Nano 33 BLE Sense与ESP32),深入剖析其传感器接口、采样率与分辨率设置方法,并结合工业振动监测的典型场景,给出可复用的工程配置方案。

TinyML工业信号采集硬件链路 传感器层 温度:NTC/PT100 电流:CT/霍尔 振动:ADXL345/ MPU6050 信号调理 放大/衰减 抗混叠滤波 电平偏移 隔离保护 开发板核心 Arduino Nano 33 BLE nRF52840 / ESP32 ADC: 12bit / 12bit I2C / SPI / UART DMA / 定时器触发 边缘处理 滑动窗口 FFT/特征提取 归一化 TinyML推理 关键配置参数 采样率 振动: 1-5 kHz 电流: 1-4 kHz 温度: 1-10 Hz 遵循奈奎斯特 分辨率 ADC: 12bit (0-3.3V) LSB ≈ 0.8 mV 过采样+求平均 有效位数ENOB 接口协议 I2C: 温度/部分振动 SPI: 高速振动 UART: 调试输出 GPIO: 触发/同步 电源与噪声 3.3V LDO供电 去耦电容 100nF 模拟/数字地分离 屏蔽线/双绞线

4.1 核心原理:从物理信号到数字特征的链路完整性

工业状态分类的本质是模式识别,而模式识别的质量上限由信号采集链路决定。一个完整的采集链路包含四个环节:传感器感知 → 信号调理 → ADC量化 → 数字预处理。传感器将温度、电流、振动等物理量转换为电信号;信号调理负责将传感器输出调整到ADC的最佳输入范围(通常为0~3.3V或0~5V);ADC以一定采样率和分辨率将模拟电压离散化;数字预处理则完成去直流、滤波、加窗等操作,为后续特征提取和模型推理准备数据。

在TinyML场景中,开发板的选择直接决定了上述链路的性能边界。Arduino Nano 33 BLE Sense搭载nRF52840处理器,内置12位ADC、支持I2C/SPI接口,板载麦克风、加速度计等传感器,适合振动和声音监测;ESP32则以其双核240MHz主频、12位ADC、Wi-Fi/蓝牙通信能力见长,适合需要无线传输的分布式监测节点。两者均支持TensorFlow Lite Micro,但内存和算力差异决定了模型复杂度上限。

关键认知:采样率决定频率分辨率,分辨率决定幅值精度。对于工业振动信号,若关注轴承故障特征频率(通常在1kHz~5kHz),采样率至少应设为10kHz;而温度信号变化缓慢,1Hz采样率已足够。盲目提高采样率会带来数据量膨胀和功耗上升,在TinyML设备上尤其需要权衡。

4.2 判断方法与操作流程:采样率与分辨率的工程设定

采样率与分辨率的设置并非越大越好,而是依据信号特性和分类目标进行工程权衡。以下是标准操作流程:

  1. 确定信号带宽:通过频谱分析或查阅设备手册,确认目标故障特征的最高频率f_max。根据奈奎斯特定理,采样率f_s ≥ 2×f_max,工程上通常取5~10倍以保证余量。
  2. 选择ADC分辨率:12位ADC的理论动态范围为72dB,可分辨约0.8mV(3.3V参考电压下)。若需检测微小振动幅值变化,可考虑过采样技术:以4倍采样率采集后求平均,等效增加2位分辨率。
  3. 配置采样触发方式:工业振动监测推荐使用定时器触发ADC采样,而非在循环中调用analogRead(),以保证采样间隔的精确性。Arduino Nano 33 BLE Sense可使用NRF52的PPI(可编程外设互连)实现定时器与ADC的硬件联动。
  4. 设置缓冲区与DMA:为避免CPU在采样过程中被中断频繁打扰,应使用DMA将ADC数据直接搬运到内存缓冲区。ESP32的ADC支持DMA模式,可连续采样多通道数据。
  5. 校准与归一化:上电后先采集静态基准值,计算偏置和增益误差,在软件中做校准。对于振动信号,通常去除直流分量(减去均值),再归一化到[-1, 1]区间。
信号类型推荐采样率ADC分辨率预处理要点
振动(加速度计)1kHz~5kHz12bit(±2g/±4g量程)去直流、带通滤波(10Hz~2kHz)
电流(CT/霍尔)1kHz~4kHz12bit(0~3.3V)工频陷波(50Hz)、RMS计算
温度(NTC/PT100)1Hz~10Hz10bit即可滑动平均滤波、异常值剔除

4.3 案例拆解:基于Arduino Nano 33 BLE Sense的电机振动监测

某工厂需要对一台三相异步电机进行状态分类,目标是区分正常、轴承磨损和转子不平衡三种状态。电机转速为1450rpm(约24Hz),轴承故障特征频率(BPFO)约为87Hz,考虑谐波成分,最高关注频率设为500Hz。

硬件选型:采用Arduino Nano 33 BLE Sense板载的LIS3DH三轴加速度计(I2C接口,量程±2g,带宽可配置)。该传感器内置FIFO缓冲区,可减轻MCU读取压力。

参数设置:采样率设为1kHz(满足500Hz信号5倍余量),量程±2g(电机振动幅值通常不超过1g),输出数据率ODR=1kHz,开启低通滤波器截止频率400Hz。ADC分辨率由传感器内部决定(12bit),无需额外配置。

实施步骤:

// 初始化LIS3DH
#include <Wire.h>
#include <LIS3DH.h>
LIS3DH accel(I2C_MODE, 0x18);
void setup() {
  accel.begin();
  accel.setRange(LIS3DH_RANGE_2G);
  accel.setDataRate(LIS3DH_DATARATE_1KHZ);
  accel.setHighPassFilter(0, 1); // 启用高通滤波去除直流
}
// 定时器中断中读取FIFO数据
void timerISR() {
  accel.readFIFO(buffer, 32); // 每次读取32个样本
  // 计算RMS、峰值、频谱特征...
}

结果与复盘:采集10秒数据(10000个样本),提取时域特征(RMS、峰值因子、峭度)和频域特征(1倍频、2倍频幅值),输入TinyML分类模型(如2层全连接网络),准确率达到96%。过程中发现,若不启用高通滤波,直流偏置会淹没微弱的振动特征;而采样率从1kHz降至500Hz时,BPFO谐波混叠导致分类准确率下降至82%。

风险提示:Arduino Nano 33 BLE Sense的I2C接口在1kHz采样率下已接近带宽极限(400kHz I2C时钟,每次读取需传输6字节,32样本需192字节,耗时约0.5ms)。若需更高采样率,应改用SPI接口或ESP32的ADC直接采样。

4.4 常见误区与总结复盘

误区一:采样率越高越好。高采样率导致数据量激增,MCU存储和传输压力增大,且高频噪声可能掩盖低频故障特征。正确做法是根据故障特征频率设定采样率,并配合抗混叠滤波器。

误区二:忽略ADC参考电压稳定性。开发板USB供电时,3.3V电压可能波动,直接影响ADC测量精度。应使用外部LDO稳压或至少并联100μF和100nF去耦电容。

误区三:多传感器同步采样缺失。温度、电流、振动信号需要时间对齐,否则特征融合时会出现相位错位。建议使用GPIO触发同步采样,或为每个通道打上时间戳。

误区四:忽视传感器量程设置。量程过小导致信号削顶,量程过大则量化噪声增加。应根据实际信号幅值预留20%~30%余量。

工程经验:在TinyML项目中,建议先离线采集数据验证信号质量,再部署到开发板。使用串口绘图仪或SD卡记录原始数据,在PC端用Python分析频谱,确认特征频率清晰可见后再进行模型训练。这能避免在硬件端反复调试的盲目性。