1. 电机驱动器PWM啸叫的根源拆解
电机驱动器一上电,耳朵里钻进那种尖锐的“吱——”声,很多人第一反应是电机质量不行,或者驱动器买到次品了。实际上,PWM啸叫是电机驱动系统里最典型、也最容易被误解的现象之一。它跟电机好坏关系不大,跟你的PWM频率、载波调制方式、电流环参数、甚至PCB布局都有直接关系。
先把结论摆在前面:PWM啸叫的本质,是PWM开关频率或其谐波落在了人耳可听范围内(大约20Hz到20kHz),通过电机绕组、驱动器功率器件、甚至PCB板材产生机械振动,最终以声波形式辐射出来。要消除它,核心思路无非三条——把频率挪出可听范围、把振动源压下去、把传播路径切断。
这个内容适合谁看?如果你正在用STM32、HC32F460这类MCU做电机驱动,或者用专用驱动芯片搭BLDC、步进、有刷直流方案,被啸叫搞得头疼,那这篇就是写给你的。不管你是刚接触PWM调速的新手,还是已经调过几版板子的老手,下面这些拆解和实操细节都能直接拿去用。
1.1 啸叫从哪来:三个物理源头
很多人以为啸叫是电机在“叫”,其实发声体可能有三类。
第一类是电机绕组和铁芯。PWM加在绕组上,电流是脉动的,绕组在磁场里受到周期性电磁力,定子铁芯会跟着做微小形变,这就是磁致伸缩效应。频率对了,它就像扬声器振膜一样把声音推出来。小功率电机这个效应特别明显,因为铁芯薄、结构刚性低。
第二类是功率器件和PCB。MOSFET或IGBT每次开关都伴随电流突变,PCB走线上的寄生电感和电容形成LC振荡,板子本身会“嗡”地一声。多层板、陶瓷电容(MLCC)的压电效应也会贡献噪声,尤其是那些小封装的0402、0603电容,它们真的会唱歌。
第三类是电源和母线。母线电容在PWM开关瞬间充放电,如果电容选型或布局不当,母线电压纹波会通过电源线传导,耦合到其他电路,甚至让整个系统产生共振。
注意:很多人一上来就换电机,结果换了三四个还是一样叫。先定位声源,再动手,不然就是白花钱。
1.2 为什么偏偏是PWM:调制方式与频率的关系
PWM调速的核心是改变占空比来等效输出电压,但开关动作本身是方波,方波在频域里是基频加无穷多次谐波。假设你的PWM频率是8kHz,那人耳能听到8kHz、16kHz、24kHz……其中8kHz最响,因为能量最集中。
这里有个关键点:人耳对2kHz到5kHz最敏感,所以如果你的PWM频率落在3kHz到5kHz,哪怕幅值不大,听起来也会特别刺耳。相反,如果频率拉到20kHz以上,虽然超声波听不见,但会带来开关损耗增加、驱动器发热、EMI变差等新问题。所以频率选择是一个权衡,不是越高越好。
另外,PWM模式1和模式2的区别也会影响噪声表现。以STM32为例,模式1是向上计数时通道有效,模式2是向下计数时有效。两者在单极性驱动下噪声差异不大,但在双极性或互补输出时,模式选择会影响死区时间和电流纹波,进而改变啸叫的谐波成分。这个后面会细说。
2. 频率调整:最直接但最需要算账的手段
把PWM频率挪出可听范围,是最容易想到的办法。但挪到多少、怎么挪、挪了之后有什么代价,这些必须算清楚。
2.1 人耳可听范围与PWM频率的对应关系
人耳可听范围通常说是20Hz到20kHz,但实际对高频的敏感度随年龄下降。成年人大多在15kHz以上就听不太到了,但年轻人、小孩能听到18kHz甚至20kHz。所以如果你把PWM设到16kHz,你自己听不见,但你的用户可能听得见,尤其是做消费类产品,这一点必须考虑。
更稳妥的做法是把PWM基频设到20kHz以上,同时确保前几次谐波也尽量远离敏感区。但这里有个陷阱:20kHz的方波,三次谐波是60kHz,五次是100kHz,这些虽然听不见,但会加剧EMI和开关损耗。
我实测过一组数据,用同一台小功率BLDC电机,同一块驱动板,只改PWM频率,用声级计在30cm处测:
| PWM频率 | 主观听感 | 声压级(dBA) | 驱动器温升(满载30分钟) |
|---|---|---|---|
| 4kHz | 尖锐刺耳 | 62 | 18K |
| 8kHz | 明显啸叫 | 58 | 22K |
| 16kHz | 轻微可闻 | 47 | 31K |
| 20kHz | 基本不可闻 | 41 | 38K |
| 25kHz | 不可闻 | 39 | 46K |
可以看到,频率从8kHz提到20kHz,声压级降了17dBA,但温升多了16K。这就是代价。所以频率不是随便拉的,要结合你的功率器件、散热条件、母线电压来定。
2.2 频率上限怎么算:开关损耗与死区时间的约束
PWM频率的上限由几个因素决定。
开关损耗:每次开关,MOSFET都要经历电压电流交叠区,产生损耗。损耗近似为 ( P_{sw} = \frac{1}{2} V_{ds} I_d (t_r + t_f) f_{sw} )。其中 ( t_r ) 和 ( t_f ) 是上升下降时间,( f_{sw} ) 是开关频率。频率翻倍,开关损耗翻倍。如果你用的是普通MOSFET,( t_r + t_f ) 可能在100ns量级,20kHz下还能接受,50kHz就发热严重了。
死区时间:互补输出时,上下管不能同时导通,必须留死区。死区时间一般取 ( t_{dead} = 200ns ) 到 ( 1\mu s )。如果PWM周期太短,死区占比太大,输出波形畸变,电流纹波反而增大,噪声可能更差。经验上,死区时间不应超过PWM周期的5%。20kHz周期是50μs,5%是2.5μs,够用。50kHz周期是20μs,5%是1μs,就有点紧张了。
MCU定时器分辨率:STM32的定时器是16位,HC32F460也是16位。如果主频是168MHz,预分频后计数时钟假设是168MHz,20kHz需要计数8400次,分辨率足够。但如果你的主频低,或者预分频太大,占空比调节精度会下降,低速时可能产生额外的低频谐波,听起来像“沙沙”声。
实操心得:我一般先把PWM频率设到20kHz试听,如果还有轻微啸叫,再往上加到23kHz或25kHz。但每次加频率,都要重新测驱动器温升,确保不超过器件结温的80%。
2.3 变频与抖频:把单一频率打散
如果频率不能无限拉高,还有一个办法:抖频。让PWM频率在一个小范围内周期性变化,比如20kHz±2kHz,这样噪声能量不再集中在单一频率上,而是分散到一个频带里,主观听感会明显改善。
实现抖频的方法有几种。一种是用MCU的定时器,在每次更新周期时微调ARR寄存器值。比如STM32可以用DMA把一张频率表搬到ARR寄存器,实现自动抖频。另一种是用专用驱动芯片,有些芯片内置抖频功能,直接配置寄存器就行。
抖频的代价是电流纹波会略微增大,因为频率在变,电感电流的纹波峰峰值也跟着变。但实测下来,只要抖频范围不超过±10%,对电机运行影响很小,噪声改善却很显著。
3. 硬件层面的降噪:从电容到布局
频率调整是软件手段,但很多啸叫问题根子在硬件。硬件不改,软件怎么调都是治标不治本。
3.1 母线电容与MLCC的选型陷阱
母线电容的作用是吸收PWM开关瞬间的电流突变,如果电容选小了或者ESR大了,母线电压会剧烈波动,噪声自然大。
很多人喜欢用MLCC做母线电容,因为体积小、ESR低。但MLCC有个致命问题:压电效应。MLCC的陶瓷介质在电压变化时会机械形变,形变量虽然只有纳米级,但在20kHz频率下,它就是一个微型扬声器。尤其是X5R、X7R材质的MLCC,压电效应特别明显。
我踩过的坑:一块驱动板,PWM频率20kHz,电机不叫,但板子叫。后来用听诊器(就是医生用的那种)定位,发现是母线上一颗1210封装的10μF MLCC在响。换成钽电容加小MLCC组合,噪声立刻消失。
所以母线电容的选型原则是:大容量用钽电容或电解电容,小容量用MLCC,但MLCC尽量选压电效应小的材质,比如C0G/NP0,或者用多个小封装并联代替一个大封装。
3.2 PCB布局:环路面积与接地
PWM电流的环路面积越大,辐射的电磁噪声越强,同时PCB走线的机械振动也越明显。关键回路包括:母线电容到功率管、功率管到电机、电机回到母线电容。这三个回路要尽可能短、尽可能宽。
接地也很关键。功率地和信号地要分开,最后单点连接。如果功率地噪声串到信号地,电流采样会失真,电流环震荡,反而产生低频啸叫。这种啸叫听起来像“呜呜”声,频率低,但很难听。
注意:不要为了省层数把功率地和信号地混在一起。我见过太多两层板为了省成本,结果噪声怎么调都下不去。四层板多花的那点钱,比你在实验室熬的夜便宜多了。
3.3 吸收电路与缓冲:把尖峰压下去
MOSFET开关瞬间,漏源电压会有尖峰,这是寄生电感引起的。尖峰不仅增加EMI,还会激发更高频的机械共振。加RC吸收电路或者TVS钳位,可以把尖峰压下去。
RC吸收的参数要算:假设寄生电感 ( L_{par} = 20nH ),电流 ( I = 5A ),尖峰能量 ( E = \frac{1}{2} L I^2 = 0.25\mu J )。吸收电容 ( C_{snub} ) 一般取100pF到1nF,电阻 ( R_{snub} ) 取几欧到几十欧。具体值要在示波器上看波形调,目标是尖峰降到母线电压的1.2倍以内。
4. 软件与算法层面的抑制策略
硬件改完,软件还有很大空间。尤其是电流环和PWM调制方式,对啸叫影响很大。
4.1 电流环带宽与PWM频率的匹配
电流环带宽一般取PWM频率的1/10到1/5。如果带宽太高,电流环会放大PWM纹波,导致电流震荡,噪声变大。如果带宽太低,动态响应差,电机运行不平稳。
以20kHz PWM为例,电流环带宽取2kHz到4kHz比较合适。用PI控制器的话,比例增益 ( K_p ) 和积分增益 ( K_i ) 要配合。我一般先用理论算,再在示波器上看电流波形微调。
理论计算:假设电机电感 ( L = 1mH ),电阻 ( R = 0.5\Omega ),期望带宽 ( f_{bw} = 2kHz )。则 ( K_p = 2\pi f_{bw} L = 12.56 ),( K_i = 2\pi f_{bw} R = 6283 )。实际值可能差几倍,因为还有采样延迟、PWM延迟等。
4.2 调制方式选择:单极性、双极性与SVPWM
有刷直流和步进电机常用单极性或双极性驱动。单极性驱动时,电流纹波小,噪声相对低。双极性驱动时,电流纹波大,但低速平稳性好。如果啸叫严重,可以试试从双极性切到单极性,或者用慢衰减模式。
BLDC和PMSM常用SVPWM。SVPWM的电压利用率高,谐波含量低,噪声通常比SPWM小。但SVPWM的实现复杂,对MCU算力有要求。HC32F460有硬件除法器和浮点单元,跑SVPWM没问题。STM32F4系列也够用。
另外,中心对齐模式比边沿对齐模式的噪声更低。因为中心对齐时,PWM脉冲对称,谐波成分更分散。STM32的定时器支持中心对齐模式,配置时把CMS位设成01或11即可。
4.3 随机PWM与频谱扩展
随机PWM是抖频的升级版,频率随机变化,噪声频谱更平坦。实现方法是把ARR值用伪随机数生成器更新。STM32有硬件随机数发生器,HC32F460也有。用随机数更新ARR,每次PWM周期都不同,噪声能量被均匀分散。
实测下来,随机PWM对主观听感改善很明显,尤其是那种“吱吱”声会变成轻微的“沙沙”声,不仔细听几乎注意不到。但随机PWM会增加电流纹波,对电机效率有轻微影响,一般不超过1%。
5. 实操案例:HC32F460驱动BLDC的啸叫消除全过程
下面用一个实际案例,把上面的思路串起来。项目背景:用HC32F460驱动一台24V、100W的BLDC电机,PWM频率初始设为8kHz,啸叫严重。
5.1 初始配置与问题复现
HC32F460的定时器配置PWM,我用的是TIM6,中心对齐模式,频率8kHz。代码如下:
// HC32F460 PWM初始化,8kHz中心对齐 void PWM_Init(void) { stc_tim6_base_init_t stcInit; stc_tim6_pwm_init_t stcPwmInit; // 使能TIM6时钟 PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIM6, Enable); // 定时器基础配置 TIM6_StructInit(&stcInit); stcInit.u16Period = 8400 - 1; // 168MHz / 8400 / 2 = 10kHz? 实际算清楚 stcInit.u16ClockDiv = TIM6_CLOCK_DIV1; stcInit.u16CountMode = TIM6_CNT_MODE_CENTER_ALIGN; TIM6_BaseInit(&stcInit); // PWM输出配置 TIM6_PwmStructInit(&stcPwmInit); stcPwmInit.u16CompareValue = 4200; // 50%占空比 stcPwmInit.u16PwmMode = TIM6_PWM_MODE1; TIM6_PwmInit(TIM6_CH0, &stcPwmInit); TIM6_Cmd(Enable); }上电后,电机运行,耳朵听到明显的8kHz啸叫,声压级约58dBA。
5.2 频率提升与温升测试
第一步,把频率从8kHz提到20kHz。修改周期值:
// 20kHz中心对齐,168MHz / (2 * 20000) = 4200 stcInit.u16Period = 4200 - 1; stcPwmInit.u16CompareValue = 2100; // 50%重新上电,啸叫明显减弱,声压级降到41dBA,基本不可闻。但运行30分钟后,驱动器散热片温度从45度升到83度,有点高。
5.3 死区时间与吸收电路调整
检查死区时间,发现配置的是1μs。20kHz周期是50μs,死区占2%,还行。但MOSFET的上升下降时间较长,开关损耗大。换用低Qg的MOSFET,上升下降时间从120ns降到45ns,温升降到68度。
同时在功率管漏源之间加RC吸收,参数:C=470pF,R=10Ω。用示波器看,尖峰从32V降到28V(母线24V),噪声进一步降低。
5.4 最终效果与参数固化
最终配置:PWM频率20kHz,中心对齐,死区1μs,RC吸收470pF+10Ω,电流环带宽2.5kHz。声压级39dBA,满载温升65K,电机运行平稳,啸叫问题解决。
参数固化到代码里,批量生产时一致性很好。但要注意,不同批次的MOSFET参数有差异,死区时间可能需要微调。我一般留一个宏定义,方便产线调整。
6. 常见问题与排查速查
6.1 啸叫排查流程表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 尖锐高频啸叫 | PWM频率在可听范围 | 改变PWM频率试听 | 提到20kHz以上或抖频 |
| 低频“呜呜”声 | 电流环震荡 | 示波器看电流波形 | 降低电流环带宽 |
| 板子响电机不响 | MLCC压电效应 | 听诊器定位 | 换钽电容或C0G |
| 只在低速响 | 死区时间过大 | 看低速电流波形 | 减小死区时间 |
| 只在高速响 | 开关损耗大 | 测温升 | 换低Qg器件或降频 |
| 随机“沙沙”声 | 采样噪声 | 看ADC采样 | 加滤波或屏蔽 |
6.2 独家避坑技巧
技巧一:用手机APP做频谱分析。很多手机有音频频谱APP,对着驱动器录一段,看峰值在哪个频率。如果峰值在PWM频率或其谐波上,那就是PWM啸叫。如果峰值在几百Hz,可能是电流环或机械共振。
技巧二:临时用胶水固定电容。怀疑MLCC响,可以用指甲油或硅胶临时涂在电容上,如果声音变小,就是它。这个方法快速有效,但不要用502,会腐蚀元件。
技巧三:PWM频率不要取整。比如不要取20.000kHz,取19.8kHz或20.3kHz。整数值容易和机械共振点重合,非整数值更安全。
技巧四:监控硬盘温度那个热词其实是个误搜。PWM怎么监控硬盘温度?这俩没关系。但如果你用PWM控制风扇,风扇转速变化时噪声频率也会变,那是风扇轴承噪声,不是PWM啸叫。别搞混了。
技巧五:pbfdkf啸叫抑制这个搜索词,我猜是某种滤波算法的缩写。实际工程中,抑制啸叫最有效的还是源头降频和硬件优化,算法只是辅助。不要指望一个算法解决所有问题。
6.3 工具与仪器清单
- 示波器:看PWM波形、电流波形、电压尖峰
- 声级计或手机APP:量化噪声
- 听诊器:定位声源
- 热成像仪:看温升分布
- 频谱分析仪:看噪声频谱
这些工具不需要全买,但示波器和声级计是必备的。听诊器几十块钱,效果很好。
7. 一些个人体会
我调过几十款电机驱动器,啸叫问题从来没有单一解法。有时候是频率问题,有时候是电容问题,有时候是布局问题,甚至有一次是电机引线太长,天线效应把噪声辐射出来了。
最深的体会是:先定位,再动手。不要一上来就改代码,先用耳朵听、用仪器测,找到声源再针对性解决。盲目调参数,可能把问题搞得更复杂。
另外,PWM啸叫和EMI往往是孪生兄弟。啸叫严重的板子,EMI通常也差。所以解决啸叫的过程,也是优化EMI的过程。把环路面积减小、把尖峰压下去、把接地做好,啸叫和EMI一起改善。
最后分享一个小技巧:如果实在搞不定,试试把PWM频率设到人耳听不到的频率,同时用随机抖频把残余噪声打散。这个方法我用了很多次,基本都能把啸叫压到可接受范围。但记住,频率越高,开关损耗越大,散热设计要跟上。