1. 从 PWM 到 NVH:一条完整的测试链路
很多做电机驱动、泵阀控制或车载部件开发的工程师,都会遇到同一个场景:产品在实验室里跑得好好的,一上产线,或者一装到整机上,就出现异响、振动偏大、转速不稳的问题。你打开示波器看 PWM 波形,占空比正常、频率正确,电机也能转,但噪声就是超标。这时候,问题往往不在“能不能转”,而在“转得是否平稳、安静、一致”。
本文要聊的,是一条从 PWM 信号出发,经过转速测量,再到 NVH 声学分析,最后落到产线检测的完整技术链路。它不只是讲 PWM 怎么输出,也不只是讲噪声怎么测,而是把几件事串起来:
- PWM 信号如何驱动电机,为什么同样的占空比会产生不同的振动噪声;
- 转速与振动、噪声之间的关系,FFT 和阶次分析如何在 NVH 中起作用;
- 产线检测如何利用声学信号做快速判定,而不是靠人耳听;
- 嵌入式端需要采集什么、怎么采集,数据如何与上位机配合。
如果你从事的是 MCU 开发、电机控制、自动化测试设备设计或者产线工艺相关的工作,这篇文章可以给你一个相对完整的框架。即使你目前只负责其中一个环节,也能从链路视角发现自己岗位上下游的数据流和关键参数。
2. PWM 信号的基础概念与关键参数
2.1 PWM 是什么
PWM(Pulse Width Modulation,脉冲宽度调制)是一种通过调节脉冲宽度来改变有效功率输出的技术。简单说,就是输出一串高低电平,高电平持续时间占整个周期的比例,叫占空比(Duty Cycle)。
占空比 = 高电平时间 / 周期 有效电压 ≈ 供电电压 × 占空比举个例子:一个 24V 电源,PWM 占空比 50%,电机得到的有效电压约 12V。这里说的是“约”,因为实际还有 MOS 管压降、死区时间、寄生参数等因素。
2.2 PWM 的关键参数
| 参数 | 说明 | 典型值 | 对 NVH 的影响 |
|---|---|---|---|
| 频率 | 每秒钟 PWM 脉冲个数 | 1kHz ~ 40kHz 常见 | 低于 20kHz 可能被人耳听到,产生“啸叫” |
| 占空比 | 高电平时间的比例 | 0% ~ 100% | 决定电机平均电压,影响转速 |
| 死区时间 | 互补输出时上下管同时关断的时间 | 数百 ns ~ 数 us | 死区不合理会导致电流畸变、换相噪声 |
| 分辨率 | 占空比调节的最小步进 | 8bit、16bit | 分辨率不足会导致低速转速抖动 |
2.3 PWM 为什么会影响 NVH
很多初学者以为 PWM 频率只要超出人耳范围就不会有噪声。但实际项目里,20kHz 以上的 PWM 依然可能引发噪声,原因有几个:
- 电机绕组的电磁力波:PWM 的开关动作在电机绕组中产生高频电流纹波,引发电磁力波动,进而激励定子或壳体振动;
- 载波频率与机械固有频率耦合:如果 PWM 频率的倍频落在电机结构或安装支架的固有频率上,会放大振动;
- 换相转矩脉动:BLDC 或 PMSM 在换相时,如果 PWM 策略不当,转矩脉动会激励结构传播,产生阶次噪声;
- 压电/磁致伸缩效应:部分铁芯材料在 PWM 频率下会产生微小形变,形成高频“咝咝”声。
所以在做 NVH 排查时,不要只看 PWM 频率本身,还要看它的谐波分量,以及这些分量与机械结构的耦合关系。
3. 转速测量与 PWM 的联动
3.1 转速是 NVH 分析的重要基准
NVH 分析里有一个绕不开的概念:阶次(Order)。阶次是指振动或噪声频率与转频(转速/60)的比值。比如转频是 30Hz(对应 1800rpm),那么 2 阶就是 60Hz,3 阶就是 90Hz。
转频(Hz) = 转速(rpm) / 60为什么转速这么重要?因为很多机械噪声和振动都与旋转频率成整数倍关系。比如:
- 转子动平衡不良,通常在 1 阶有明显振动;
- 联轴器不对中,可能在 1 阶和 2 阶同时出现;
- 齿轮啮合噪声,一般出现在啮合频率(齿数 × 转频)及其谐波上;
- 电机换相噪声,与极对数和转频相关。
如果不知道转速,你只能看到一堆频率峰,却无法判断它们来自转子、齿轮还是轴承。所以,转速信号是 NVH 分析的地图。
3.2 用 PWM 信号推算转速
在部分低成本方案中,PWM 本身可以间接反映转速。比如恒压调速的直流电机,给定不同的占空比,电机的稳态转速大致遵循:
转速 ≈ K × (占空比 × 供电电压 - 电压降)但这种方式只适合粗略估算,不能作为 NVH 阶次分析的准确基准,原因有三:
- 不同负载下,转速与占空比并非线性关系;
- 电机温升会影响绕组电阻和反电动势系数;
- PWM 频率和占空比相同的情况下,控制算法(如是否带电流环)不同,瞬时转速波动差异很大。
3.3 更准确的转速获取方式
工程上更常用的是:
- 编码器:增量式或绝对值编码器,输出 AB 相脉冲或 SSI 协议数据;
- 霍尔传感器:BLDC 电机内置霍尔,可得到电角度和换相信息;
- 光电转速传感器:在转轴贴反光纸,光电探头输出脉冲;
- 电流信号频谱分析:通过电流 FFT 提取转子频率相关边带,但算法复杂。
在产线检测场景下,如果被测产品本身没有编码器输出口,但你能拿到它的驱动 PWM 和电流波形,可以通过电流谐波分析来判断转速是否平稳,再结合麦克风或加速度计做 NVH 判定。
下面是一个基于 STM32 的 PWM 输出与霍尔测速的经典配合思路:
// 定时器 PWM 输出配置(以 TIM1 为例),同时用外部中断采集霍尔脉冲 void Motor_PWM_Init(void) { GPIO_InitTypeDef gpio_init = {0}; TIM_OC_InitTypeDef oc_init = {0}; TIM_HandleTypeDef htim1 = {0}; __HAL_RCC_TIM1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); gpio_init.Pin = GPIO_PIN_8; // PA8 输出 PWM gpio_init.Mode = GPIO_MODE_AF_PP; gpio_init.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &gpio_init); htim1.Instance = TIM1; htim1.Init.Prescaler = 72 - 1; // 72MHz / 72 = 1MHz htim1.Init.Period = 1000 - 1; // PWM 频率 = 1MHz / 1000 = 1kHz htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; HAL_TIM_PWM_Init(&htim1); oc_init.OCMode = TIM_OCMODE_PWM1; oc_init.Pulse = 500; // 初始占空比 50% oc_init.OCPolarity = TIM_OCPOLARITY_HIGH; oc_init.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim1, &oc_init, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); }这里有一个重点项目中的常见取舍:PWM 频率选 1kHz 还是 20kHz,对 NVH 结果影响很大。如果选 20kHz,MCU 的定时器频率、功率器件的开关损耗、驱动芯片的栅极驱动能力都要重新核算。低频 PWM 扭矩脉动大,但开关损耗低;高频 PWM 噪音小,但驱动设计要求高。产线检测时,必须给每台产品固定同一组 PWM 参数,否则 NVH 数据不具备可比性。
4. NVH 声学分析的核心方法
4.1 NVH 是什么
NVH 是 Noise(噪声)、Vibration(振动)、Harshness(声振粗糙度)三个英文单词的缩写。它研究的是机械系统在工作过程中产生的振动与噪声,以及人对这种振动噪声的主观感受。
- Noise:通过空气传播,能被麦克风采集到的声压信号;
- Vibration:通过结构和固体传播,能被加速度计采集到的振动信号;
- Harshness:主观评价,指噪声振动的“品质”。
在产线检测中,NVH 最直接的体现是:产品运转时,麦克风听到的声音是否在允许范围内,振动传感器测得的加速度值是否超标。
4.2 声学分析有哪些常用指标
| 指标 | 计算方式 | 用途 |
|---|---|---|
| 声压级 SPL | 20 × log10(P/Pref) | 总噪声大小 |
| A 计权声压级 | 对声压频谱按 A 曲线加权 | 模拟人耳感知 |
| 频谱 | FFT 将时域信号转为频域 | 定位特征频率 |
| 阶次谱 | 将频率对齐到转速阶次 | 判断振动来源 |
| 响度 | 基于 Bark 或 ERB 频带计算 | 主观响度感知 |
| 尖锐度 | 高频能量占比较高的程度 | 声音品质评估 |
产线检测中计算能力有限,一般不会跑完整的声品质分析,但频谱和声压级是必做的。如果要判断“嗡嗡声”是来自 50Hz 工频干扰,还是来自电机换相,就需要看 FFT 结果。
4.3 数据采集与 FFT 的基础流程
要在产线上做声学检测,首先得有声音数据。常见方案是 MEMS 麦克风加上 MCU 或 FPGA 采集,也可以使用 PC 加 USB 声卡。关键是采样率的选择:
- 人耳可听范围是 20Hz ~ 20kHz,根据奈奎斯特定理,采样率至少要 40kHz;
- 工程上常用 48kHz 或 51.2kHz,留出抗混叠滤波器的过渡带;
- 如果还要分析超声波段(如 20kHz ~ 40kHz 的某些结构噪声),采样率建议 96kHz 以上。
下面是一个用 Python 做 FFT 的简单示例,适合在 PC 上位机中对采集到的音频文件做离线分析:
import numpy as np import wave def analyze_audio(filename, target_freq=None): with wave.open(filename, 'rb') as wf: sample_rate = wf.getframerate() n_frames = wf.getnframes() data = wf.readframes(n_frames) dtype = np.int16 if wf.getsampwidth() == 2 else np.int8 audio = np.frombuffer(data, dtype=dtype).astype(np.float32) # 取单通道 if wf.getnchannels() > 1: audio = audio[0::wf.getnchannels()] # FFT n = len(audio) window = np.hanning(n) spectrum = np.fft.rfft(audio * window) freqs = np.fft.rfftfreq(n, d=1.0/sample_rate) mag = np.abs(spectrum) * 2.0 / n if target_freq: idx = np.argmin(np.abs(freqs - target_freq)) print(f"target_freq={target_freq}Hz, magnitude={mag[idx]:.4f}") return freqs, mag这段代码的思路,是把音频文件读取出来,加汉宁窗后做 FFT。为什么要加窗?因为截断的音频帧首尾不是连续的,直接做 FFT 会产生频谱泄漏。汉宁窗可以缓解这个问题。产线检测中,最好使用采集到的周期信号整周期截断,这样不需要加窗也不会泄漏。
4.4 从噪声频谱倒推故障
在产线 NVH 检测中,最实用的能力是把声学频谱和已知故障对应起来。下面是一些典型的频率特征:
| 故障类型 | 频谱特征 |
|---|---|
| 轴承磨损 | 高频宽带噪声,通常在 1kHz ~ 10kHz 出现多个峰 |
| 齿轮啮合不良 | 啮合频率及其倍频处有明显峰值,边带密集 |
| 电机换相噪声 | 与极对数和转频相关的阶次频率,常见奇数倍频 |
| 转子不平衡 | 1 阶(1 倍转频)幅值突出 |
| 松动 | 出现大量高次谐波,且时域有冲击成分 |
有一个容易踩的坑:麦克风测到的“低频振动声”不一定来自机械故障,可能是风噪或气流声。所以在产线检测中,通常建议麦克风和加速度计配合使用,用加速度计确认振动源是否真实存在,用麦克风确认人耳主观感受。
5. 产线检测中的应用与落地
5.1 产线 NVH 检测的目标
产线检测与实验室 NVH 分析有一个本质区别:实验室追求“诊断得准”,产线追求“判得快、判得稳、不误杀”。
产线检测通常要完成三件事:
- 筛选出不合格品:存在异响、振动超标的产品下线返修;
- 发现工艺漂移:比如轴承压装力不够、齿轮中心距偏差,可以通过 NVH 特征提前发现;
- 辅助追溯:将声学指纹数据与产品序列号绑定,后续客诉时反向分析。
5.2 产线检测系统的基本架构
一个典型的产线 NVH 检测工位包括:
被测电机/总成 ├── 麦克风(近场测量) ├── 加速度计(可选) └── 转速信号(编码器/霍尔/电流) │ 数据采集卡或嵌入式采集终端 │ 上位机软件 ├── FFT 频谱计算 ├── 特征提取 ├── 合格/不合格判定 └── 数据上传 MES需要注意的是,被测件必须在固定工况下运转,转速、负载、供电电压、PWM 参数都要保持同一标准。否则采集到的声学信号千差万别,根本没法对比。
5.3 嵌入式采集端的 MCU 选择
产线检测的采集前端,可以使用 STM32 系列 MCU 来做 ADC 采集和简单处理,也可以直接使用 USB 数据采集卡。如果数据量不大、采样率控制在 48kHz 且只做单通道声学采集,STM32F103 级别的 MCU 够用;如果要采集多通道麦克风阵列或同时采集振动加速度信号,建议使用 STM32H7 或更高性能的处理器。
下面是一个 STM32 ADC 连续采集麦克风信号的思路:
#define ADC_BUF_SIZE 2048 uint16_t adc_buf[ADC_BUF_SIZE]; volatile uint8_t adc_complete_flag = 0; void Microphone_ADC_DMA_Init(void) { // 启用 ADC1、DMA1 时钟 __HAL_RCC_ADC1_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE(); // 配置 DMA,将 ADC 数据自动搬运到 adc_buf // DMA1 Channel1 对应 ADC1 // 方向:外设到内存,循环模式,半字宽度 } void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) { adc_complete_flag = 1; // 此时 adc_buf 中已经采集满一组数据 // 可在此处启动音频特征粗判,或通知上位机取数据 }上面的代码只是结构示意,实际工程中要完成 DMA 通道初始化和 ADC 参数配置。重点是理解思路:ADC 采样结果通过 DMA 自动搬运到内存数组,不需要 CPU 逐点搬移,这样 CPU 可以集中精力做 FFT 或特征判断。
5.4 上位机判定逻辑
产线判定最忌讳的是“只设一个总声压阈值”。因为总声压受环境噪声影响太大,走廊里一辆叉车经过,不合格率就会飙升。工程上更稳妥的方式是:
- 先做背景噪声估计:在设备不运转时测量底噪,作为参考;
- 提取特征频段能量:比如提取 500Hz ~ 2kHz 区间合计能量,作为主要特征;
- 结合转速阶次:在转速已知的情况下,对比特定阶次幅值是否超标;
- 做相对比较:同一批次产品,按统计方法计算均值、标准差,超出均值 + n×标准差的产品列为异常。
判定公式(示意): 合格条件: (特征频段声压级 - 背景噪声声压级) < 阈值 且 指定阶次幅值 < 阶次阈值 且 总声压级 < 安全阈值5.5 一个简化的产线检测判定示例
下面的 Python 示例模拟了一个产线检测判定过程:根据音频文件计算 1 阶和 2 阶幅值(假设输入了转速),并据此判断合格与否。
import numpy as np import wave def calculate_order_magnitude(filename, rpm, sample_rate=None, order=1): # 读取音频 with wave.open(filename, 'rb') as wf: rate = wf.getframerate() data = wf.readframes(wf.getnframes()) audio = np.frombuffer(data, dtype=np.int16).astype(np.float32) if sample_rate is None: sample_rate = rate # 计算转频和阶次频率 rotate_freq = rpm / 60.0 target_freq = rotate_freq * order # FFT 计算目标频率附近幅值 n = len(audio) window = np.hanning(n) spectrum = np.fft.rfft(audio * window) freqs = np.fft.rfftfreq(n, d=1.0/sample_rate) mag = np.abs(spectrum) * 2.0 / n # 取目标频率附近 ±0.5Hz 的最大幅值 mask = (freqs >= target_freq - 0.5) & (freqs <= target_freq + 0.5) return np.max(mag[mask]) if np.any(mask) else 0.0 def production_judge(filename, rpm, order1_th=0.05, order2_th=0.03): o1 = calculate_order_magnitude(filename, rpm, order=1) o2 = calculate_order_magnitude(filename, rpm, order=2) ok = (o1 < order1_th) and (o2 < order2_th) print(f"1阶幅值={o1:.4f}, 2阶幅值={o2:.4f}") print("判定: 合格" if ok else "判定: 不合格") return ok这里的阈值需要结合实际产品标定,不能照抄。有一个常见的工程经验:先从大量合格品数据中采集特征值分布,再根据分布确定阈值,而不是拍脑袋定数值。如果数据量够大,甚至可以用机器学习做更灵活的判别,但产线环境更看重解释性,频谱阈值法在很长一段时间内仍然是主流。
5.6 PWM 参数与产线检测的配合
回到 PWM 主题:产线检测时必须固定 PWM 参数,否则声学特征会混淆。比如同一台电机,载波频率 10kHz 和 20kHz 时,电磁噪声频谱差异巨大。如果产线上一台用默认配置、另一台因为固件版本不同用了另一种配置,检测结果就没有可比性。
具体建议如下:
- 产线检测程序中,将 PWM 频率、占空比、加减速时间统一写死,不允许操作员修改;
- 每次检测前自动读取固件版本和参数校验码,不匹配就禁止测试;
- 如果产品本身有多个工作档位,每个档位都要建立单独的 NVH 限值,不能用一个全局限值覆盖所有档位。
6. 常见问题与排查思路
6.1 噪声只在部分产品中出现
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 同批次部分产品高频啸叫 | MOSFET 驱动电阻不一致,开关振荡 | 检查驱动电路器件一致性 |
| 特定转速区间出现共振 | 转子固有频率与 PWM 倍频重叠 | 扫频测试,调整 PWM 频率避开共振 |
| 检测结果忽好忽坏 | 麦克风位置偏移或固定松动 | 加固工装,定期校准传感器位置 |
| 低速时异响明显 | 低速下电流纹波增大,力矩脉动显著 | 检查控制算法,低速段提高 PWM 频率或改变调制方式 |
6.2 产线检测误判率高
误判通常分两种情况:把合格品判为不合格(误杀),或者把不合格品判为合格(漏放)。
误杀常见原因:
- 背景噪声波动大,未做底噪扣除;
- 产品未达到稳定转速就开始采集数据;
- 麦克风线缆屏蔽不良,引入电磁干扰;
- 检测工位周围有设备启停,声场瞬态变化。
漏放常见原因:
- 阈值设置过宽;
- 麦克风离声源太远,信噪比不足;
- 检测时间过短,未覆盖异常出现的时段;
- 只看了总声压,没有分析特征阶次。
排查时建议按照“先硬件后软件、先时域后频域、先单台后批量”的顺序推进。先确认传感器安装可靠,再检查采集数据是否存在削顶或饱和,最后再怀疑算法问题。
6.3 PWM 触发 ADC 采样时的干扰
在嵌入式采集端,有一类典型问题:PWM 信号与 ADC 采样共用电源或地线时,开关噪声会被 ADC 采到,导致频谱中出现 PWM 频率及其谐波。
解决方法:
- ADC 采样避开 PWM 开关瞬间:使用定时器触发 ADC,让采样点落在 PWM 高电平稳定区间;
- 地线隔离:模拟地与功率地单点连接或使用磁珠隔离;
- 平均多次采样:在软件上做多次采样取平均,抑制随机噪声;
- 检查参考电压:确保 VREF+ 稳定,必要时加去耦电容。
PWM 开关时刻:高电平开始、高电平结束、死区切换 推荐采样点:PWM 高电平中间点,避开边沿跳变7. 最佳实践与工程建议
7.1 传感器与采集端
- 麦克风推荐使用 IEPE 传感器或 MEMS 麦克风。IEPE 适合实验室,MEMS 适合产线低成本方案;
- 麦克风与产品之间的距离要固定,通常 5cm ~ 20cm,太近受风噪影响大,太远信噪比低;
- 加速度计安装面要平整,使用高强度胶或磁吸座,不能用双面胶;
- 采集通道和产品供电回路必须隔离,避免地环路干扰;
- 每次检测前做一次标准声源自检,比如用 94dB 标准声源校准麦克风增益。
7.2 数据处理与判定
- 频谱分辨率要足够。两个相邻故障频率至少差 2 个频率分辨率才能分辨;
- 检测时长至少包含足够多的转数。比如 600rpm 时,转频 10Hz,若要求 0.1Hz 分辨率,理论上需要至少 10 秒数据;
- 产线节拍不允许 10 秒?那就优先用窄带特征峰,而不是全频段谱;
- 强烈建议记录原始音频或特征向量,不只看判定结果,方便后续质量追溯;
- 阈值参数保存到配置文件中,不要写死在代码里,方便工艺人员调整。
7.3 参数管理的安全边界
产线检测系统涉及参数修改时,要注意安全边界:
- 修改采集增益、阈值、PWM 参数需要操作权限,防止误操作影响所有产品判定;
- 参数变更前先备份原始配置,变更后先用已知合格品和已知不合格品验证;
- 检测系统保存的数据建议加密或加校验,防止产线数据被篡改;
- 涉及数据库写入时,使用事务和唯一序列号,避免重复检测产生脏数据。
7.4 嵌入式端的 PWM 配置建议
回到 MCU 端,PWM 配置有几个细节直接影响 NVH:
- 死区时间不要随便给,按驱动芯片手册计算,留出 20%~50% 的余量;
- PWM 频率尽量避开机械结构的固有频率,可以通过简单扫频测试摸底;
- 使用互补 PWM 时,建议在定时器初始化时配置刹车功能,出现短路或过流时快速关断;
- 如果 MCU 支持高分辨率定时器(如 STM32G4 的 HRTIM、STM32F334 的 HRTIM),可以用更高 PWM 频率降低噪声,但成本也会上升;
- 不要在运行过程中频繁跳变 PWM 频率,这会导致电机瞬时力矩突变,产生阶次噪声。
8. 总结与学习路线
顺着本文的链路走下来,你已经掌握了几个关键点:
- PWM 不仅是“调电压”,它的频率、死区、调制策略都会影响最终的 NVH 表现;
- 转速是 NVH 分析的重要基准,没有转速的频谱分析很难定位噪声来源;
- NVH 声学分析的核心是 FFT、阶次分析和特征提取,产线检测要的不是复杂算法,而是稳定可重复的判定逻辑;
- 产线检测系统要从传感器选型、采集硬件、上位机算法、数据管理四个层面综合考虑,任何一个环节出问题都会反映到误判率上。
如果你是嵌入式方向的工程师,下一步可以重点研究:
- STM32 定时器 PWM 输出和死区配置;
- ADC 与 DMA 的配合,实现高速连续采样;
- 如何在 MCU 上做轻量级 FFT(比如 ARM CMSIS-DSP 库);
- 如何把采集到的数据实时挂到上位机做更详细的频谱分析。
如果你是负责产线检测设备或质量的工程师,下一步可以关注:
- 声学传感器的校准方法;
- 不同类型故障的频谱特征库建立;
- 结合 MES 系统做数据追溯;
- 用统计过程控制方法监控产线 NVH 特征的稳定性。
技术与技术之间从来不是孤立的。PWM 背后是功率变换与电磁兼容,转速背后是传感与控制,NVH 背后是结构动力学与声学,产线检测背后是测量系统分析和数据管理。能把这些串起来的人,往往是项目中最难被替代的人。
建议你动手做一个小实验:找一块 STM32 开发板、一个直流电机、一个驻极体麦克风模块,先固定 PWM 频率输出,用串口把 ADC 采集数据发到 Python 上位机,画出频谱,再改变 PWM 频率对比频谱差异。这个过程并不复杂,但会把本文讲到的每个概念都串成真实的工程经验。