3、震动测量与评估:加速度传感器选型、数据采集方法、时域/频域分析基础、震动评价指标(RMS、峰值、FFT)

做FOC无刷电机震动抑制,第一步不是调参数,而是先搞清楚——震动到底有多大?

我见过不少工程师,上来就调PI、调陷波滤波器,调了半天效果不明显。为什么?因为没有量化。你连震动是0.1g还是1.0g都不知道,怎么知道抑制了多少?

所以这一章,咱们把测量和评估这件事聊透。说白了,就是三件事:用什么测、怎么测、测完怎么看。

3.1 加速度传感器选型:别小看这个“小东西”

加速度传感器是震动的“耳朵”。选错了,后面所有数据都是垃圾。

我个人习惯看这几个关键参数:

参数 推荐范围 说明
量程 ±2g ~ ±16g 电机震动一般不超过±8g,选±16g留余量
带宽 ≥ 1kHz FOC的电流环频率通常在1-5kHz,震动频率可能更高
噪声密度 ≤ 200 μg/√Hz 噪声太大,小震动信号会被淹没
输出接口 SPI 或 I2C SPI速度更快,适合实时采集
我的经验: 项目中我常用ADXL345或MPU6050做前期评估,便宜又好买。但量产产品我建议用工业级的,比如ADI的ADXL100x系列,噪声低一个数量级。

你想想看,如果传感器带宽只有400Hz,电机在800Hz的震动你根本测不到。那还抑制个啥?

3.2 数据采集方法:别让采样率坑了你

传感器选好了,接下来是采集。这里有个坑——采样率。

奈奎斯特定理大家都懂:采样率至少是信号最高频率的2倍。 但实际工程中,我建议至少5-10倍。

举个例子:电机转速3000RPM,极对数为4,电频率就是200Hz。但震动可能包含谐波,比如10次谐波就是2kHz。那你的采样率至少得10kHz以上。

我曾经踩过的坑: 用Arduino的AnalogRead采样,默认也就几百Hz。采集出来的FFT频谱全是混叠,根本看不出真实震动频率。后来换了SPI接口的传感器+DMA传输,才搞定。

采集流程我一般这样设计:

  1. 传感器初始化:设置量程、带宽、输出速率
  2. 数据同步:用定时器触发采集,保证等间隔采样
  3. 缓存管理:用环形缓冲区,避免丢数据
  4. 数据标定:减去零偏,转换到物理单位(m/s²或g)
// 伪代码示例:加速度数据采集
#define SAMPLE_RATE 10000  // 10kHz
#define BUFFER_SIZE 1024

float acc_buffer[BUFFER_SIZE];
int idx = 0;

void timer_isr() {
    // 读取传感器数据(SPI)
    int16_t raw = spi_read(ACCEL_X_OUT);
    // 转换为g值(假设量程±16g,16位ADC)
    float acc_g = raw * 16.0 / 32768.0;
    // 存入缓冲区
    acc_buffer[idx] = acc_g;
    idx = (idx + 1) % BUFFER_SIZE;
}

嗯,这里要注意:采集时间窗口要足够长。比如你要分析10Hz的震动,至少采1秒的数据。我一般采2-5秒,保证低频分辨率够用。

3.3 时域分析基础:看波形就能知道个大概

数据采回来了,先别急着上FFT。时域波形能告诉你很多信息。

时域看什么?

  • 波形形状: 正弦波?还是毛刺多?毛刺多说明有冲击或换相问题
  • 幅值稳定性: 震动幅值是否忽大忽小?可能是机械共振或控制不稳定
  • 周期性: 有没有明显的周期?周期对应什么频率?

我记得有一次调试一个无人机电机,时域波形看着像被调制了一样,包络线有规律地起伏。后来一查,是螺旋桨的桨叶不平衡导致的。这种问题在频域里反而不容易一眼看出来。

时域分析的实用技巧: 把加速度波形和电机电流波形放在一起对比。很多时候,震动和电流纹波是强相关的。

3.4 频域分析基础:FFT是震动的“照妖镜”

时域看个大概,频域才能精确定位问题。

FFT(快速傅里叶变换)把时域信号转换到频域,告诉你:哪个频率的震动最大?

做FFT时要注意几个关键点:

  • 频率分辨率: Δf = 采样率 / FFT点数。比如10kHz采样,1024点FFT,分辨率约9.8Hz。想分辨更细?增加FFT点数或降低采样率
  • 频谱泄漏: 加窗函数可以缓解。我常用汉宁窗(Hanning),通用性好
  • 平均处理: 做多次FFT取平均,能降低噪声影响
// FFT分析伪代码
#include "arm_math.h"  // ARM CMSIS-DSP库

float32_t input[1024];  // 时域数据
float32_t output[1024]; // FFT结果(复数)

// 加汉宁窗
for (int i = 0; i < 1024; i++) {
    input[i] *= 0.5 * (1 - arm_cos_f32(2 * PI * i / 1023));
}

// 执行FFT
arm_rfft_f32(&fft_instance, input, output);

// 计算幅值谱
for (int i = 0; i < 512; i++) {
    float real = output[2*i];
    float imag = output[2*i+1];
    float mag = sqrt(real*real + imag*imag) / 512;
    // mag就是频率点i * (10000/1024) Hz处的幅值
}
我的习惯: 在嵌入式MCU上做FFT,优先用CMSIS-DSP库,优化得好,速度比手写快5-10倍。STM32F4系列跑1024点FFT也就几毫秒。

3.5 震动评价指标:RMS、峰值、FFT

数据有了,频谱有了,怎么评价震动大小?

三个核心指标:

指标 计算公式 物理意义 适用场景
RMS(均方根值) √(1/N * Σx²) 震动的“能量”大小 稳态震动评估,最常用
峰值(Peak) max(|x|) 震动的最大瞬时值 冲击、启动/停止过程
FFT幅值 各频率点的幅值 各频率成分的贡献 定位具体震动源

我个人习惯这样用:

  • 先看RMS,判断整体震动水平是否超标
  • 再看峰值,确认有没有冲击性震动
  • 最后看FFT,找到主要震动频率,针对性抑制

举个例子:电机在3000RPM时,RMS震动0.5g,但FFT显示在200Hz处有个1.2g的尖峰。那说明整体震动不大,但某个频率点有问题。这时候就可以针对200Hz设计陷波滤波器。

注意: RMS和峰值的关系不是固定的。正弦波的峰值是RMS的√2倍,但实际震动波形复杂,可能达到3-5倍。所以两个指标都要看。

3.6 本章知识体系总览

为了让你更直观地理解这一章的内容结构,我画了一张图:

震动测量与评估知识体系 传感器选型 数据采集方法 分析与评估 关键参数 • 量程:±2g ~ ±16g • 带宽:≥ 1kHz • 噪声密度:≤ 200 μg/√Hz • 接口:SPI / I2C 采集流程 ① 传感器初始化 ② 定时器触发同步 ③ 环形缓冲区缓存 ④ 数据标定与转换 分析方法 • 时域:波形、幅值、周期 • 频域:FFT、频谱分析 • 指标:RMS、峰值、FFT幅值 输出:震动量化结果 + 频率定位 核心逻辑:选对传感器 → 采准数据 → 分析定位 → 量化评估 应用场景:电机调试、品质检测、故障诊断、减振效果验证

这张图把整个流程串起来了。从传感器选型开始,到数据采集,再到时域频域分析,最后输出量化指标。每一步都环环相扣。

好了,这一章的内容就到这里。震动测量是抑制的基础,基础打牢了,后面调参数才有方向。下一章咱们聊怎么根据测量结果设计滤波器——那才是真正动手干活的时候。


公众号:蓝海资料掘金营,微信deep3321