3. 振动信号采集
振动信号采集是电机异常检测项目的第一道物理关口,其质量直接决定了后续特征提取与模型诊断的上限。在工业现场,电机轴承磨损、转子不平衡、齿轮啮合故障等异常,都会在振动加速度信号中留下特定的频域痕迹。本章围绕“传感器选型→信号调理→采样参数设计→STM32采集链路搭建”四个环节展开,重点解决如何将微弱的机械振动转换为STM32可处理的数字序列,并确保采样过程不丢失故障特征频率。
3.1 加速度传感器选型:ADXL345与MPU6050的工程权衡
核心原理:加速度传感器将机械振动转换为电信号,其工作原理基于MEMS(微机电系统)中的质量块-弹簧-阻尼结构。当传感器随电机壳体振动时,质量块产生惯性位移,通过电容检测或压阻效应转换为电压变化。选型时需关注四个核心指标:量程(决定可测量的最大加速度)、灵敏度(决定最小可分辨振动)、带宽(决定可采集的最高频率)、噪声密度(决定信噪比)。
| 对比维度 | ADXL345 | MPU6050 | 选型建议 |
|---|---|---|---|
| 量程 | ±2g / ±4g / ±8g / ±16g | ±2g / ±4g / ±8g / ±16g | 电机振动通常 0.5g~5g,选 ±8g 留余量 |
| 分辨率 | 10bit~13bit(可配置) | 16bit ADC 内置 | MPU6050 分辨率更高,适合微弱振动 |
| 带宽 | 0.1Hz~3200Hz | 内置 DLPF,最高 1kHz | 电机轴承故障频率通常 <2kHz,两者均满足 |
| 接口 | I2C / SPI | I2C(400kHz) | SPI 速率更高,适合多通道同步 |
| 功耗 | 23μA(测量模式) | 3.9mA(含陀螺仪) | 电池供电选 ADXL345,否则 MPU6050 |
| 额外功能 | 内置 FIFO(32级) | 内置 DMP、陀螺仪 | 仅需振动信号时 ADXL345 更简洁 |
判断方法:对于电机振动检测项目,优先考虑以下选型路径:
- 确定频率范围:电机转速 3000rpm(50Hz),轴承外圈故障特征频率约为 3.5×转频 = 175Hz,内圈故障约 5.5×转频 = 275Hz。考虑 10 倍谐波,最高分析频率约 3kHz,因此传感器带宽需 ≥3kHz。
- 估算振动幅值:正常电机振动加速度约 0.1g~0.5g,故障初期可能低至 0.05g,严重故障可达 2g~3g。选择 ±8g 量程可覆盖正常与故障状态。
- 分辨率验证:若需检测 0.01g 的微弱变化,ADXL345 在 ±8g 量程下分辨率为 3.9mg/LSB(13bit),可满足需求;MPU6050 的 16bit 分辨率在 ±8g 下为 0.24mg/LSB,更适合早期微弱故障。
3.2 信号调理:从原始信号到ADC可采范围
核心原理:信号调理的目的是使传感器输出信号满足ADC的输入要求。对于数字接口传感器(ADXL345、MPU6050),信号调理主要在传感器内部完成,包括:低通滤波(去除高频噪声)、增益调整(匹配ADC量程)、偏置校准(消除直流偏移)。对于模拟输出传感器(如压电式加速度计),则需外部调理电路。
操作流程:
- 抗混叠滤波:根据采样率 Fs 设置低通截止频率 fc = 0.5 × Fs。例如 Fs = 6.4kHz,则 fc = 3.2kHz。ADXL345 内部有 32 级 FIFO 和数字滤波,可配置输出数据速率(ODR)从 0.1Hz 到 3200Hz。
- 增益匹配:确保传感器输出满量程电压接近 ADC 参考电压。ADXL345 的数字输出直接映射到 g 值,无需额外增益;若使用模拟传感器,需通过运放将信号放大到 0~3.3V 范围。
- 隔直处理:振动信号是交流信号,需去除直流偏置。数字传感器内部已处理,模拟电路则需高通滤波(截止频率 1Hz~10Hz)。
3.3 采样率与分辨率设置:频率分辨率与动态范围的平衡
核心原理:采样率 Fs 决定可分析的最高频率(奈奎斯特频率 = Fs/2),采样点数 N 决定频率分辨率 Δf = Fs/N。分辨率(ADC位数)决定幅值量化精度,直接影响微弱故障特征的检测能力。
参数设计方法:
- 采样率选择:根据电机最高故障特征频率 f_max,取 Fs ≥ 2.56 × f_max(工程上留 20% 余量)。例如 f_max = 3kHz,则 Fs = 7.68kHz,取整为 8kHz。
- 采样点数:频率分辨率 Δf 需能区分相邻故障频率。轴承外圈故障频率与转频的间隔约 0.4×转频 = 20Hz,因此 Δf ≤ 10Hz。若 Fs = 8kHz,则 N ≥ 8000/10 = 800 点,取 1024 点(2 的幂次,便于 FFT)。
- ADC 分辨率:12bit ADC 在 3.3V 参考下,量化步长 = 3.3V/4096 ≈ 0.8mV。若传感器灵敏度为 100mV/g,则最小可分辨加速度 = 0.8mV / 100mV/g = 8mg。16bit ADC 则可达 0.5mg,适合早期故障检测。
| 参数 | 推荐值 | 计算依据 | 注意事项 |
|---|---|---|---|
| 采样率 Fs | 8kHz | f_max=3kHz,Fs≥2.56×3k | 过高增加数据量,过低丢失高频 |
| 采样点数 N | 2048 | Δf=8k/2048≈3.9Hz | 2 的幂次便于 FFT |
| 采样时长 T | 0.256s | T=N/Fs=2048/8000 | 需覆盖至少 10 个转频周期 |
| ADC 分辨率 | 12bit(STM32F4 内置) | 满足 8mg 分辨率 | 若需更高精度,外接 16bit ADC |
3.4 STM32的ADC/DMA采集配置:高效无丢失的数据链路
核心原理:STM32 的 ADC 采集需要与传感器输出速率匹配,并通过 DMA 实现无 CPU 干预的数据搬运。典型配置包括:定时器触发 ADC 采样(保证等间隔采样)、DMA 循环模式(自动搬运数据到内存)、双缓冲切换(避免数据覆盖)。
配置流程:
- 传感器初始化:配置 ADXL345 的 I2C 地址(0x53)、量程(±8g)、ODR(3200Hz)、FIFO 模式。
- 定时器配置:使用 TIM2 产生 8kHz 的触发信号,周期 = 84MHz / (Prescaler × Period) = 125μs。
- ADC 配置:选择 ADC1 通道 0(PA0),采样时间设为 84 周期(约 1μs),分辨率 12bit,扫描模式关闭。
- DMA 配置:DMA2 通道 0,外设地址 = ADC1->DR,内存地址 = 数组 buffer[2048],传输方向外设到内存,模式循环,数据宽度半字(16bit)。
- 双缓冲:使用两个 2048 大小的数组,DMA 传输完成中断中切换缓冲区,确保数据处理与采集并行。
// STM32F407 ADC+DMA 关键配置代码
void ADC_DMA_Init(void) {
// 1. 使能时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 2. GPIO 配置:PA0 模拟输入
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 3. ADC 配置:12bit,右对齐,扫描关闭
ADC_InitTypeDef ADC_InitStruct;
ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; // 由定时器触发
ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStruct.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStruct);
// 4. 定时器触发配置:8kHz
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_InitStruct.TIM_Prescaler = 84 - 1; // 84MHz/84 = 1MHz
TIM_InitStruct.TIM_Period = 125 - 1; // 1MHz/125 = 8kHz
TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
TIM_SelectOutputTrigger(TIM2, TIM_TRGO_Update);
// 5. DMA 配置:循环模式,半字传输
DMA_InitTypeDef DMA_InitStruct;
DMA_InitStruct.DMA_Channel = DMA_Channel_0;
DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)adc_buffer;
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStruct.DMA_BufferSize = 2048;
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
DMA_InitStruct.DMA_Priority = DMA_Priority_High;
DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_Init(DMA2_Stream0, &DMA_InitStruct);
// 6. 使能 DMA 传输完成中断
DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = DMA2_Stream0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
// 7. 启动
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
TIM_Cmd(TIM2, ENABLE);
DMA_Cmd(DMA2_Stream0, ENABLE);
}
实战场景:某项目需同时采集电机 X、Y、Z 三轴振动信号。使用 3 个 ADXL345 传感器,每个传感器输出 3 轴数据,共 9 通道。STM32F407 的 ADC1 有 16 个通道,可配置为扫描模式,DMA 循环传输 9 通道数据。采样率 8kHz,每通道采样点数 2048,总数据量 = 9 × 2048 × 2字节 = 36KB,DMA 双缓冲需 72KB RAM,在 STM32F407(192KB RAM)中可行。
3.5 常见误区与总结复盘
常见误区:
- 误区一:采样率越高越好。实际中,过高的采样率导致数据冗余和噪声增加,应根据故障特征频率合理选择。
- 误区二:忽略抗混叠滤波。数字传感器内部滤波不能完全替代硬件滤波,高频噪声仍可能混叠。
- 误区三:DMA 缓冲区大小不足。若缓冲区小于一次 FFT 所需点数,会导致数据截断,频谱泄漏。
- 误区四:未考虑传感器安装谐振。传感器安装方式(胶粘、磁吸、螺栓)会影响其固有频率,若安装谐振频率落在分析频带内,会引入虚假峰值。
总结复盘:振动信号采集链路的设计应遵循“故障特征驱动参数选择”的原则。首先明确电机故障类型和特征频率范围,然后反推采样率、采样点数、ADC 分辨率,最后配置 STM32 的定时器、ADC、DMA 资源。关键验证指标包括:① 频谱中是否出现预期的转频及谐波;② 背景噪声底是否低于故障特征幅值的 1/3;③ DMA 传输是否无溢出(检查 DMA 中断标志)。建议在正式采集前,使用标准振动源(如校准激振器)验证整个链路的幅值精度和频率响应。