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尖锐刺耳6218K8kHz明显啸叫5822K16kHz轻微可闻4731K20kHz基本不可闻4138K25kHz不可闻3946K可以看到频率从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μs5%是2.5μs够用。50kHz周期是20μs5%是1μs就有点紧张了。MCU定时器分辨率STM32的定时器是16位HC32F460也是16位。如果主频是168MHz预分频后计数时钟假设是168MHz20kHz需要计数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吸收参数C470pFR10Ω。用示波器看尖峰从32V降到28V母线24V噪声进一步降低。5.4 最终效果与参数固化最终配置PWM频率20kHz中心对齐死区1μsRC吸收470pF10Ω电流环带宽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频率设到人耳听不到的频率同时用随机抖频把残余噪声打散。这个方法我用了很多次基本都能把啸叫压到可接受范围。但记住频率越高开关损耗越大散热设计要跟上。
阅读完成 · 觉得有帮助?