之前调试一套产线检测工装时遇到一个很典型的场景待测产品由 PWM 信号驱动测试时既需要确认 PWM 信号本身是否正常又需要结合产品运转后的 NVH 表现来判断是否合格。也就是说电气激励和机械响应必须关联起来分析而不是各看各的。最开始我以为只要用万用表测一下占空比就够了可一旦进入批量产线问题就变成了频率是否稳定、边沿是否抖动、声学异常是来自驱动谐波还是机械结构、如何自动判定产品合格。这些单靠示波器手动测效率太低数据也不好存档。本篇就围绕“产线获取 PWM 信号 NVH 声学分析 产线检测”展开整理一套可落地的采集与分析方案。文章会从 PWM 与 NVH 的关系讲起给出 STM32 硬件采集方案、CubeMX 配置、HAL 库代码以及 Python 端的频谱分析实现最后补充产线落地时容易踩的坑和工程建议。1. PWM 信号与 NVH 声学分析的关联1.1 PWM 信号在产线检测中的角色PWMPulse Width Modulation脉冲宽度调制是嵌入式系统常见的驱动方式通过调节占空比控制输出电压或功率。在产线上PWM 信号通常出现在以下场景无刷电机的三相驱动输入风机、水泵、压缩机等调速执行器的控制信号电磁阀、继电器、加热器等开关型负载车载执行器、电子油泵、空调压缩机等模块的接口信号。对产线检测来说PWM 信号有两个层面的意义。第一层PWM 信号本身是待测对象需要确认频率、占空比是否符合规格边沿是否有抖动幅值是否满足器件电平要求。第二层PWM 信号是系统的“激励来源”它决定了执行器的工作状态而执行器的机械振动和噪声往往和 PWM 的频率与谐波强相关。很多产品在产线上“通电能转、功能正常”但装到整机后噪声大、振动明显就是因为在部件阶段没有把驱动信号和机械响应关联起来检查。PWM 测量是这种关联分析的入口。1.2 NVH 声学分析在产线检测中的价值NVH 是 Noise噪声、Vibration振动、Harshness声振粗糙度的缩写。产线检测里的 NVH 分析通常指通过声压传感器、加速度计等采集产品运转时的声学与振动信号从频域判断是否存在异常。NVH 检测能发现的典型问题包括轴承磨损或润滑不良导致的周期冲击转子动平衡不良引起的阶次振动装配间隙过大引发的碰撞噪声PWM 驱动谐波激励结构件产生的共振电机绕组异常导致的电磁噪声。在产线环境下NVH 检测的难点不是“信号能不能采”而是“信号采完之后怎么快速判定”。每个工位测试节拍可能只有几十秒数据要实时处理、自动判级并且要可追溯。这要求采集端具备稳定的触发与同步机制分析端具备可靠的频谱判据。1.3 一套完整的产线检测链路把 PWM 信号与 NVH 分析结合起来产线检测链路可以分成四个环节1PWM 信号采集使用 MCU 定时器输入捕获测量频率、占空比、脉宽抖动 2声学/振动信号采集使用 ADC 连续采样采集麦克风或加速度计的输出 3同步关联分析PWM 信号作为参考时基将声学频谱与 PWM 基频、谐波对照 4自动判定计算特征频段能量、谐波幅值、峰值频率偏移按阈值输出合格/不合格。下面章节会逐一展开每个环节的实现。2. 系统架构与环境准备2.1 整体采集链路本文的示例系统采用“MCU 前置采集 上位机后处理”的架构下位机STM32F103C8T6 最小系统板负责 PWM 参数测量和声学传感器采样传感器声学传感器模块模拟输出麦克风或 IEPE 加速度计前端输出信号接入 MCU ADC通信UART 将采集数据发送给上位机上位机Python 脚本接收数据后完成 FF T 频谱分析和判定。这套架构的优点是低成本、易搭建、适合产线原型验证。如果产线有更高要求也可以直接改用工业采集卡或嵌入式工控机但测量思路和判断逻辑是相同的。2.2 硬件选型与接线MCUSTM32F103C8T672MHz 主频PWM 信号源待测产品控制器输出或信号发生器模拟声学传感器模拟输出的驻极体麦克风模块或加速度计调理模块电平转换PWM 信号如果是高压12V/24V需要先用分压或光耦隔离再进入 MCU 引脚串口模块USB-TTL 串口用于数据上传电源建议使用隔离的 5V/3.3V 电源避免驱动电机回路与采集回路共地引入干扰。接线示意信号连接到 STM32PWM 输入PA0TIM2_CH1PWM 输入模式声学传感器模拟输出PA1ADC1_IN1串口 TXPA9USART1_TX串口 RXPA10USART1_RXGND与信号源、传感器共地注意如果待测产品与 MCU 之间有功率驱动回路强烈建议使用光耦或隔离放大模块隔离 PWM 信号避免功率地耦合干扰 MCU。2.3 软件环境说明STM32CubeMX用于生成 STM32 初始化工程版本请根据实际安装情况调整配置思路一致STM32CubeF1 HAL 库随 CubeMX 生成的固件包编译工具Keil MDK 或 STM32CubeIDEPython 环境建议 Python 3.8 以上Python 库numpy、scipy、matplotlib、pyserial。本文示例以常见环境为例重点演示配置思路。不同版本的 CubeMX 界面菜单可能有细微差别核心参数保持一致即可。2.4 示例项目结构pwm_nvh_project/ ├── firmware/ # STM32 工程 │ ├── Core/inc/main.h │ ├── Core/src/main.c │ ├── Core/src/stm32f1xx_it.c │ └── ... ├── host_analysis/ # 上位机 Python 脚本 │ ├── read_serial.py │ ├── analyze_pwm.py │ └── nvh_spectrum.py └── docs/ # 测试记录3. PWM 信号测量原理与 STM32 实现3.1 PWM 信号的关键测量参数测量 PWM 信号产线检测中最关心四个参数频率每秒周期数单位 Hz占空比高电平时间占整个周期的百分比脉宽稳定性相邻周期脉宽是否存在抖动反映控制器输出是否正常边沿质量上升沿和下降沿是否出现过冲、回沟现场可通过比较器整形。用普通 GPIO 轮询采 PWM 也可以但误差大、占 CPU。更合理的方式是利用定时器硬件输入捕获测量精确且不占用额外指令周期。3.2 定时器 PWM 输入模式原理STM32 的定时器可以配置为 PWM 输入模式。以 TIM2 为例CH1 和 CH2 会同时捕获同一路输入信号CH1 捕获周期CH2 捕获占空比。两个通道共用一个输入引脚不需要外部跳线连接。输入捕获的核心思想是信号出现上升沿时计数器当前值被锁存到捕获寄存器下一个同类型沿再次捕获两次捕获值之差就是周期对应的计数值。根据定时器计数时钟频率可换算出实际时间。PWM 输入模式的优势是周期和占空比可以同一次捕获完成两个数值天然对齐不会出现先测周期再测占空比的时间差。3.3 STM32CubeMX 配置过程使用 STM32CubeMX 配置输入捕获选择芯片 STM32F103C8T6在 Pinout 视图中点击 PA0将其复用为 TIM2_CH1左侧 Categories 展开 Timers选择 TIM2Combined Channels 选择 PWM Input on CH1Prescaler 设置为 71这样计数时钟频率为 72MHz / (711) 1MHzCounter Period 设置为 0xFFFF即 65535在 NVIC Settings 中勾选 TIM2 全局中断ADC 配置PA1 选择 ADC1_IN1开启 ADC1在 DMA Settings 中增加 DMA 请求模式为 CircularUSART1 异步模式波特率 115200时钟树配置HSE 8MHzPLL 倍频到 72MHz。配置完成后生成工程。关键配置如下TIM2: Clock Source: Internal Clock Combined Channels: PWM Input on CH1 Prescaler: 71 Counter Period: 65535 Auto-reload preload: Enable Input Capture: Rising Edge NVIC: TIM2 global interrupt: Enable3.4 HAL 库代码实现在 main.c 中定义全局变量保存 PWM 测量结果/* 文件路径firmware/Core/Inc/main.h */ #ifndef __MAIN_H #define __MAIN_H #ifdef __cplusplus extern C { #endif #include stm32f1xx_hal.h #define PWM_TIM_CLK 1000000U /* 计数时钟 1MHz */ #define ADC_BUFFER_SIZE 2048U extern volatile uint16_t g_pwm_period; extern volatile uint16_t g_pwm_duty; extern volatile float g_pwm_freq; extern volatile float g_pwm_duty_ratio; extern volatile uint8_t g_pwm_ready; extern uint16_t g_adc_buf[ADC_BUFFER_SIZE]; void Error_Handler(void); #ifdef __cplusplus } #endif #endif在 main.c 中实现输入捕获回调/* 文件路径firmware/Core/Src/main.c */ volatile uint16_t g_pwm_period 0; volatile uint16_t g_pwm_duty 0; volatile float g_pwm_freq 0.0f; volatile float g_pwm_duty_ratio 0.0f; volatile uint8_t g_pwm_ready 0; uint16_t g_adc_buf[ADC_BUFFER_SIZE] {0}; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM2) { if (htim-Channel HAL_TIM_ACTIVE_CHANNEL_1) { /* 读取 CH1 捕获的周期值 */ g_pwm_period HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); /* 读取 CH2 捕获的占空比计数值 */ g_pwm_duty HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); if (g_pwm_period ! 0) { g_pwm_freq PWM_TIM_CLK / (float)g_pwm_period; g_pwm_duty_ratio ((float)g_pwm_duty / (float)g_pwm_period) * 100.0f; } g_pwm_ready 1; } } }在 main 函数中启动采集int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); MX_TIM2_Init(); MX_USART1_UART_Init(); /* 启动定时器输入捕获CH1 和 CH2 都需要使能中断 */ HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_2); /* 启动 ADC 连续采样DMA 回环搬运声学数据 */ HAL_ADC_Start_DMA(hadc1, (uint32_t *)g_adc_buf, ADC_BUFFER_SIZE); while (1) { if (g_pwm_ready) { g_pwm_ready 0; char msg[128]; int len snprintf(msg, sizeof(msg), F%.1fHz,D%.1f%%\r\n, g_pwm_freq, g_pwm_duty_ratio); HAL_UART_Transmit(huart1, (uint8_t *)msg, len, 100); } } }这里有个容易忽略的点在 PWM 输入模式下虽然物理信号只进一个引脚但 CH1 和 CH2 都会产生捕获事件所以必须同时启动两路通道的中断回调里才能同时读取周期和占空比。如果只启动 CH1CH2 的捕获寄存器也可能有值但依赖硬件默认行为不可靠建议两个通道都显式启动。4. 声学信号同步采集与 NVH 分析准备4.1 声学传感器选型与信号调理产线 NVH 检测常用的传感器有两种驻极体麦克风模块成本低适合噪声超标检测频率响应通常在 20Hz-20kHzIEPE 加速度计适合振动检测能更早发现轴承、齿轮等机械故障需要配套恒流源供电。无论哪种传感器输出信号通常要先经过放大和带通滤波再送入 MCU ADC。直接采集原始信号容易混入直流偏置和高频噪声影响 FFT 结果。本文示例使用简易的模拟输出麦克风模块输出引脚接 STM32 的 PA1。ADC 设置为 12 位采样参考电压 3.3V。为保证频域分辨率采样率需要根据目标分析带宽来设计建议至少 20kHz 以上。STM32F103 的 ADC 在 12 位分辨率下可以跑到 1MHz 左右完全够用。这里要提醒一下 ADC 输入阻抗匹配问题。如果传感器模块输出阻抗较高直接连接 MCU 引脚会因采样电容电荷注入导致误差。稳妥的做法是在传感器模块后加一个运放跟随器或者选择自带输出缓冲的传感器模块。4.2 ADCDMA 连续采样ADC 连续采样的目的是一次性采集足够长度的时域数据供上位机做 FFT。DMA 回环模式的好处是不需要 CPU 逐点搬运采样数据自动写入缓冲区CPU 可以在缓冲区填满后统一处理或上传。配置 ADC 时注意ADC 时钟不要超过 14MHz过高的 ADC 时钟会损失精度采样时间建议设置为 55.5 或 71.5 周期保证信号源阻抗匹配DMA 模式选择 Circular这样缓冲区满了之后会从头覆盖适合连续监控场景。启动代码在上一节已经给出下面说明数据上传逻辑。上位机发给 MCU 一个开始指令后MCU 将缓存中的 ADC 原始数据加上一次完整的采样序列通过 UART 发送给 Python 端/* 简单的触发上传逻辑收到 s 后上传 ADC 数据 */ uint8_t cmd 0; if (HAL_UART_Receive(huart1, cmd, 1, 100) HAL_OK) { if (cmd s) { HAL_UART_Transmit(huart1, (uint8_t *)g_adc_buf, ADC_BUFFER_SIZE * 2, 1000); } }ADC 数据是 16 位数组发送时按两个字节一组发送。上位机需按照相同字节序解析。4.3 时域包络与 PWM 解调思路在 NVH 分析中除了直接对声学信号做 FFT还经常关注“PWM 谐波与声学峰值的对应关系”。由于 PWM 信号频率已知可以将 PWM 频率作为参考频率 f0在声学频谱中查找 f0 整数倍频点处的幅值如果 f0 的某次谐波被结构放大会在对应频点出现明显峰值。如果关注轴频振动还需要对时域信号做包络解调。例如电机类产品轴承故障信号往往出现在结构共振频段并受到轴频调制。分析步骤如下1对声学信号带通滤波提取共振频段 2取绝对值并低通滤波得到包络信号 3对包络信号做 FFT得到包络谱 4在包络谱中观察是否有突出的轴频及倍频。这部分实现放在 Python 端更灵活下面章节会给出对应代码。5. Python 端频谱分析与产线判定5.1 串口数据接收与预处理下位机上传的是原始 ADC 二进制数据Python 端用 pyserial 读取后解析为数值数组。# 文件路径host_analysis/read_serial.py import serial import numpy as np def read_adc_data(port: str, baudrate: int 115200, num_samples: int 2048): ser serial.Serial(port, baudrate, timeout2) # 发送 s 触发下位机上传 ser.write(bs) # 读取 2048 个 uint16每个占 2 字节 raw ser.read(num_samples * 2) ser.close() if len(raw) num_samples * 2: raise ValueError(串口返回数据长度不足) data np.frombuffer(raw, dtypeu2) return data.astype(np.float32)解析后需要根据 ADC 参考电压换算成实际电压再根据传感器灵敏度换算成声压或加速度数值。换算公式因传感器型号而异产线调试时要对应校准。5.2 PWM 信号时域参数提取如果手边没有 MCU 的测量结果也可以直接从 ADC 采到的 PWM 波形中提取频率和占空比。思路是利用上升沿和下降沿检测# 文件路径host_analysis/analyze_pwm.py import numpy as np def pwm_params(samples: np.ndarray, ts: float): 从 PWM 采样波形中提取频率与占空比 samples: 采样电压序列 ts: 采样周期单位秒 # 逻辑电平阈值根据实际电平调整 threshold 1.0 rising np.where((samples[:-1] threshold) (samples[1:] threshold))[0] falling np.where((samples[:-1] threshold) (samples[1:] threshold))[0] if len(rising) 2 or len(falling) 1: return 0.0, 0.0 # 周期相邻上升沿间隔 periods np.diff(rising) * ts freq 1.0 / np.mean(periods) # 高电平时间上升沿之后最近一个下降沿 high_times [] for r in rising: after_r falling[falling r] if len(after_r): high_times.append((after_r[0] - r) * ts) if len(high_times) 0: return freq, 0.0 duty np.mean(high_times) * freq * 100.0 return freq, duty # 使用示例 # freq, duty pwm_params(adc_data, ts1.0 / 40000.0)如果 PWM 频率接近采样率一半边沿检测会出现严重误差因此采样率要尽量高于 PWM 频率的 10 倍以上。5.3 FFT 频谱与峰值定位对声学信号做频谱分析推荐使用 scipy 的 welch 方法它返回功率谱密度估计适合噪声信号分析。# 文件路径host_analysis/nvh_spectrum.py import numpy as np from scipy.signal import welch, find_peaks def nvh_spectrum(data: np.ndarray, fs: float): 计算声学信号功率谱并定位主要峰值 data: 声学时域信号 fs: 采样率单位 Hz # 去除直流 data data - np.mean(data) # 窗函数选择 hanning减少频谱泄漏 f, psd welch(data, fsfs, nperseg1024, windowhann) # 定位峰值 peaks, props find_peaks(psd, height1e-4, distancemax(1, len(f) // 200)) return f, psd, peaks, props def check_pwm_related_peaks(f, psd, peaks, pwm_freq, tolerance20.0): 判断声学频谱中是否存在与 PWM 谐波对应的峰值 tolerance: 频点容差单位 Hz harmonic_peaks [] # 检查 PWM 基频的前 10 次谐波 for h in range(1, 11): target h * pwm_freq # 在峰值列表中查找最接近目标频点的候选 candidates np.abs(f[peaks] - target) if len(candidates) 0: continue idx np.argmin(candidates) if candidates[idx] tolerance: harmonic_peaks.append({ harmonic: h, target_hz: float(target), actual_hz: float(f[peaks[idx]]), amplitude: float(psd[peaks[idx]]), }) return harmonic_peaks这段代码先定位声学频谱的主要峰值再把峰值位置和 PWM 谐波频率对照判断声学异常是否与 PWM 驱动谐波相关。5.4 合格判据设计产线自动判定需要一个量化的合格判据。常见做法是设置多组阈值总声压级上限综合噪声超标即判不良特定频段能量上限例如 1kHz-3kHz 的窄带噪声对应轴承故障特征频段PWM 谐波幅值上限如果 PWM 某次谐波明显被放大说明结构共振或驱动参数异常频率偏差范围PWM 测量频率与设定值偏差应在允许范围内。示例判定函数def production_pass(pwm_freq, duty, spectrum_info, config): 简单的产线合格判定 config: 阈值配置字典 reasons [] # 1. PWM 频率范围 if abs(pwm_freq - config[pwm_target]) config[freq_tol]: reasons.append(fPWM频率超差: {pwm_freq:.1f}Hz) # 2. 占空比范围 if not (config[duty_min] duty config[duty_max]): reasons.append(f占空比超差: {duty:.1f}%) # 3. 总噪声能量 total_noise np.sum(spectrum_info[psd]) if total_noise config[noise_floor]: reasons.append(f总噪声能量超标: {total_noise:.4f}) # 4. PWM 谐波幅值 for peak in spectrum_info[harmonic_peaks]: if peak[harmonic] 1 and peak[amplitude] config[h1_limit]: reasons.append(fPWM基频幅值超标: {peak[amplitude]:.4f}) return (len(reasons) 0, reasons)阈值需要根据样件标定先测 20-30 个良品统计特征参数分布再按均值加减若干倍标准差设定阈值。不要一上来就凭经验写死否则误判率会很高。6. 常见问题与排查思路6.1 PWM 频率测量值跳动如果串口打印的 PWM 频率来回跳动常见原因有三个问题现象常见原因解决思路频率在小数点后一位波动定时器分频配置不对计数时钟不是整数核对 PSC 和系统时钟确保计数时钟精确到 1MHz频率偶尔跳变到几倍输入信号边沿有毛刺导致重复触发捕获在信号线加 RC 滤波或使用施密特触发器整形高速 PWM 下波动明显中断响应不及时丢失捕获事件检查中断优先级降低其他中断频率或改用 DMA 捕获排查时先在 PWM 输入端接示波器确认信号本身是否干净。如果示波器显示正常但 MCU 测量不稳定问题大概率在配置或中断响应。6.2 频谱出现混叠或假峰ADC 采样率不足时高于采样率一半的频率会折叠到低频产生假峰。解决思路1确认采样率。采样率应至少大于目标最高频率的 2 倍实际建议 4-5 倍以上 2硬件抗混叠。如果信号中确实存在高频成分需在 ADC 前加低通滤波器 3软件验证。在信号源端加入已知频率的正弦波确认 FFT 峰值位置是否正确。STM32 的 ADC 本身缺少“采样保持抗混叠”所以更推荐在传感器调理电路里增加一阶有源低通滤波截止频率设置为目标分析带宽的 1-1.5 倍。6.3 现场存在工频和相邻工位干扰产线环境中伺服电机、变频器、开关电源都会产生干扰。噪声可能通过电源、地线、空间耦合进入测量系统。处理建议测量供电与功率驱动供电尽量隔离传感器信号线使用屏蔽双绞线屏蔽层单端接地MCU 外壳与产线机架接地避免形成地环路数据上传采用隔离串口模块软件上增加数字滤波对特征频段外的能量做抑制。6.4 上位机串口丢帧如果数据量较大UART 默认波特率容易成为瓶颈。例如 ADC 每次上传 2048 个 uint16共 4096 字节在 115200 波特率下大约需要 0.35 秒。如果上传频率高会占满串口带宽。解决思路提高波特率到 460800 或 921600减少上传点数例如只上传降采样后的数据增加帧头和校验字段发现丢帧时请求重传上位机使用独立线程读串口避免阻塞。7. 产线落地的工程建议与最佳实践7.1 屏蔽、接地与测试安全产线检测和实验室测试最大的区别在于电磁环境不可控。电机启动、变频器开关瞬间可能产生几十伏的共模干扰。工程上要注意几点PWM 信号若超过 MCU 供电电压必须分压后进 MCU严禁直接接入功率地、模拟地、数字地在电路板上单点汇总不要串成环传感器线缆远离电机动力线交叉时垂直走线测试夹具和工装机架可靠接地每次测试前建议先做一个自检序列输入已知 PWM 信号确认测量误差在允许范围内。7.2 采样参数与触发策略产线测试节拍有限采样参数要提前规划。采样时长看最低关心频率。如果最低关心频率是 100Hz一个周期 0.01 秒FFT 至少要采 0.1 秒以上才有意义单次采集点数推荐 2048 或 4096兼顾分辨率和处理时间触发方式建议用 PWM 信号作为同步触发源确保每批数据都是相同相位起点多工位同步如果一条产线有多台测试工位需要统一的同步时钟或同步触发信号否则数据无法横向对比。7.3 数据管理与可追溯性产线数据最终要能回溯到具体产品。建议为每个待测产品生成唯一编号条码或二维码测试数据保存为结构化文件例如 CSV 或 HDF5记录关键参数PWM 频率平均值、占空比平均值、特征频段能量、判定结论、测试时间对不合格品保存完整时域波形便于离线复现。简单的 CSV 记录示例import csv def save_result(file_path, sn, freq, duty, total_noise, passed, reasons): with open(file_path, a, newline) as f: writer csv.writer(f) writer.writerow([sn, freq, duty, total_noise, passed, reasons, datetime.now()])7.4 阈值标定与持续优化在产线投用初期不建议立刻启用全自动判定。建议采用“人工复判模式”上位机计算特征参数标记可疑样件由质检员复听或复测。积累一段时间数据后再根据良品和不良品的分布重新校准阈值。另外要注意声学传感器和加速度计都会随时间漂移建议每季度或每半年使用标准声源或标准振动源校准一次确保测试数据在不同批次间可比。8. 总结与后续学习方向到这里从 PWM 信号采集、STM32 固件实现到 Python 端 NVH 频谱分析、产线判定一个完整的产线测试闭环已经讲完。核心收获可以整理为三点PWM 信号不仅是电气参数也是 NVH 分析的参考基准两者要放在同一时间轴上关联分析STM32 定时器 PWM 输入模式可以稳定测量频率和占空比配合 ADCDMA 能同步采集声学信号产线自动判定不能只看单一指标要综合 PWM 频率偏差、占空比、总噪声能量和特征谐波幅值并且依赖实际样件标定阈值。如果继续往下深入可以关注几个方向学习等精度测频法用两个定时器配合进一步提高高频 PWM 的测量精度探索互功率谱与相干分析判断声学信号和 PWM 信号的相关程度在 Python 中加入实时窗函数滑动处理实现边采集边判定的流水线逻辑如果产线用的是 PLC 或工控机也可以把本文的分析逻辑改写为 C# 或 LabVIEW 版本。技术方案没有绝对统一的标准关键是在现场多测、多调、多积累数据。如果你是刚接触产线测试建议先用信号发生器模拟 PWM 输入把采集链路跑通再逐步接入真实产品这样排查问题会轻松很多。如果本文对你有帮助可以收藏备用后续我也会继续整理 STM32 信号采集和 NVH 分析相关的实战内容。