3、振动信号采集:加速度传感器选型(如ADXL345、MPU6050)、信号调理、采样率与分辨率设置、STM32的ADC/DMA采集配置

振动信号采集是电机异常检测项目的第一道物理关口,其质量直接决定了后续特征提取与模型诊断的上限。在工业现场,电机轴承磨损、转子不平衡、齿轮啮合故障等异常,都会在振动加速度信号中留下特定的频域痕迹。本章围绕“传感器选型→信号调理→采样参数设计→STM32采集链路搭建”四个环节展开,重点解决如何将微弱的机械振动转换为STM32可处理的数字序列,并确保采样过程不丢失故障特征频率。

振动信号采集链路架构与关键参数 加速度传感器 ADXL345 / MPU6050 量程 ±2g~±16g 灵敏度 3.9mg/LSB I2C/SPI 接口 信号调理 抗混叠低通滤波 截止频率 = 0.5×Fs 增益匹配 ADC 量程 隔直/偏置调整 STM32 采集配置 ADC 12bit / 16bit DMA 循环传输 定时器触发采样 双缓冲切换 数据处理 FFT 频谱 时域特征 异常检测 采样参数设计要点 ◆ 采样率 Fs ≥ 2.56 × f_max(f_max 为最高故障特征频率) ◆ 采样点数 N = Fs × T,频率分辨率 Δf = Fs / N ◆ 抗混叠滤波:低通截止频率 ≤ 0.5 × Fs ◆ ADC 分辨率:12bit 对应 4.88mV/LSB(3.3V 参考),16bit 对应 50μV/LSB I2C/SPI 模拟/数字滤波 DMA+定时器

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 更简洁

判断方法:对于电机振动检测项目,优先考虑以下选型路径:

  1. 确定频率范围:电机转速 3000rpm(50Hz),轴承外圈故障特征频率约为 3.5×转频 = 175Hz,内圈故障约 5.5×转频 = 275Hz。考虑 10 倍谐波,最高分析频率约 3kHz,因此传感器带宽需 ≥3kHz。
  2. 估算振动幅值:正常电机振动加速度约 0.1g~0.5g,故障初期可能低至 0.05g,严重故障可达 2g~3g。选择 ±8g 量程可覆盖正常与故障状态。
  3. 分辨率验证:若需检测 0.01g 的微弱变化,ADXL345 在 ±8g 量程下分辨率为 3.9mg/LSB(13bit),可满足需求;MPU6050 的 16bit 分辨率在 ±8g 下为 0.24mg/LSB,更适合早期微弱故障。
经验提醒:MPU6050 虽然分辨率更高,但其内置的 DLPF(数字低通滤波器)截止频率最高仅 1kHz,若需分析 2kHz 以上的高频振动,必须禁用 DLPF 或选择 ADXL345。实际项目中,建议将 MPU6050 的 DLPF 设置为 256Hz 或更高,并配合外部抗混叠滤波。

3.2 信号调理:从原始信号到ADC可采范围

核心原理:信号调理的目的是使传感器输出信号满足ADC的输入要求。对于数字接口传感器(ADXL345、MPU6050),信号调理主要在传感器内部完成,包括:低通滤波(去除高频噪声)、增益调整(匹配ADC量程)、偏置校准(消除直流偏移)。对于模拟输出传感器(如压电式加速度计),则需外部调理电路。

操作流程:

  1. 抗混叠滤波:根据采样率 Fs 设置低通截止频率 fc = 0.5 × Fs。例如 Fs = 6.4kHz,则 fc = 3.2kHz。ADXL345 内部有 32 级 FIFO 和数字滤波,可配置输出数据速率(ODR)从 0.1Hz 到 3200Hz。
  2. 增益匹配:确保传感器输出满量程电压接近 ADC 参考电压。ADXL345 的数字输出直接映射到 g 值,无需额外增益;若使用模拟传感器,需通过运放将信号放大到 0~3.3V 范围。
  3. 隔直处理:振动信号是交流信号,需去除直流偏置。数字传感器内部已处理,模拟电路则需高通滤波(截止频率 1Hz~10Hz)。
案例拆解:某电机测试台使用 ADXL345 采集振动信号,采样率设为 6.4kHz,ODR 配置为 3200Hz(内部滤波后)。实际采集时发现频谱在 3.2kHz 以上出现混叠噪声。分析发现,ADXL345 的 ODR 设置为 3200Hz 时,内部低通滤波截止频率为 1600Hz,但外部未加硬件滤波,导致 3.2kHz 以上的高频噪声混叠到低频段。解决方案:将 ODR 设为 6400Hz(内部滤波截止 3200Hz),并在 I2C 线上增加 RC 滤波(截止频率 3.5kHz),混叠现象消除。

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
风险提示:采样率并非越高越好。过高的采样率会导致:① 数据量激增,DMA 传输压力大;② 噪声能量增加,信噪比下降;③ 功耗上升。建议根据实际故障特征频率选择,并留 20%~30% 余量即可。

3.4 STM32的ADC/DMA采集配置:高效无丢失的数据链路

核心原理:STM32 的 ADC 采集需要与传感器输出速率匹配,并通过 DMA 实现无 CPU 干预的数据搬运。典型配置包括:定时器触发 ADC 采样(保证等间隔采样)、DMA 循环模式(自动搬运数据到内存)、双缓冲切换(避免数据覆盖)。

配置流程:

  1. 传感器初始化:配置 ADXL345 的 I2C 地址(0x53)、量程(±8g)、ODR(3200Hz)、FIFO 模式。
  2. 定时器配置:使用 TIM2 产生 8kHz 的触发信号,周期 = 84MHz / (Prescaler × Period) = 125μs。
  3. ADC 配置:选择 ADC1 通道 0(PA0),采样时间设为 84 周期(约 1μs),分辨率 12bit,扫描模式关闭。
  4. DMA 配置:DMA2 通道 0,外设地址 = ADC1->DR,内存地址 = 数组 buffer[2048],传输方向外设到内存,模式循环,数据宽度半字(16bit)。
  5. 双缓冲:使用两个 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)中可行。

案例闭环:某工厂电机振动监测系统,初始使用 MPU6050 的 I2C 接口直接读取数据,采样率仅 1kHz,无法捕捉 2.5kHz 的轴承故障特征。改造方案:① 更换为 ADXL345,SPI 接口通信,采样率提升至 8kHz;② 使用 STM32 定时器触发 ADC 采样,DMA 循环传输;③ 增加 2048 点 FFT 分析。改造后成功检测到 2.3kHz 的外圈故障频率,提前 3 周预警轴承磨损。代价是 SPI 通信占用 4 个 GPIO,DMA 占用 1 个 DMA 流,但 CPU 负载从 85% 降至 15%。

3.5 常见误区与总结复盘

常见误区:

  • 误区一:采样率越高越好。实际中,过高的采样率导致数据冗余和噪声增加,应根据故障特征频率合理选择。
  • 误区二:忽略抗混叠滤波。数字传感器内部滤波不能完全替代硬件滤波,高频噪声仍可能混叠。
  • 误区三:DMA 缓冲区大小不足。若缓冲区小于一次 FFT 所需点数,会导致数据截断,频谱泄漏。
  • 误区四:未考虑传感器安装谐振。传感器安装方式(胶粘、磁吸、螺栓)会影响其固有频率,若安装谐振频率落在分析频带内,会引入虚假峰值。

总结复盘:振动信号采集链路的设计应遵循“故障特征驱动参数选择”的原则。首先明确电机故障类型和特征频率范围,然后反推采样率、采样点数、ADC 分辨率,最后配置 STM32 的定时器、ADC、DMA 资源。关键验证指标包括:① 频谱中是否出现预期的转频及谐波;② 背景噪声底是否低于故障特征幅值的 1/3;③ DMA 传输是否无溢出(检查 DMA 中断标志)。建议在正式采集前,使用标准振动源(如校准激振器)验证整个链路的幅值精度和频率响应。

工程经验:在 STM32 项目中,建议将 ADC 采样率设置为传感器 ODR 的整数倍(如 ODR=3200Hz,Fs=6400Hz),避免采样时钟与传感器内部时钟不同步导致的相位噪声。同时,DMA 中断服务函数中只做缓冲区切换标志置位,数据处理放在主循环中,避免中断阻塞导致采样丢失。