电机驱动器发出PWM啸叫,这个问题我前前后后折腾了快两年。最早是在一批设备上发现电机还没真正转起来,控制器一上电,耳朵贴过去就能听到一种高频“嘶嘶”声,频率不偏不倚刚好落在人耳最难受的区间。后来换过电容、改过控制板布线、甚至试过给整个驱动模组灌胶,才一步步把原理彻底弄明白。这篇就把我在实际项目里排查和消除PWM啸叫的思路完整记录一遍,如果你也被这个声音折磨过,应该能少走不少弯路。内容覆盖直流有刷电机、步进电机、无刷电机常见的PWM驱动场景,适合做驱动硬件、写电机控制算法的工程师,也适合喜欢自己折腾驱动板的玩家对照排查。
1. 先说清楚声音到底是从哪来的
1.1 电机本身就是一个“扬声器”
很多人都以为啸叫是驱动板上的电感或者电容发出来的,实际上在大多数情况下,电机本体才是最大的发声源。电机的绕组是感性负载,PWM方波驱动时,线圈里的电流并不是平直的,而是叠加了很多纹波分量。电流变化会产生变化的磁场,绕组和铁芯在这个脉动磁场中受到周期性电动力,就相当于一个音圈在推动空气,电机外壳和内部结构跟着一起振动,声音就传出来了。
这个过程的链条其实是这样的:PWM翻转→电流纹波→电磁力波动→机械振动→空气传声。电机绕组的电磁力大约和电流的平方成正比,而PWM供电下的电流上升沿和下降沿里含有大量高次谐波。纹波越猛,声音越大。用示波器挂在采样电阻上看电流波形,你会发现噪声大小和纹波幅度几乎一一对应,纹波峰峰值高的时候,啸叫一定明显。
另一个容易被忽略的机理是磁致伸缩。硅钢片这类铁磁材料在交变磁场中,尺寸会发生微小变化,变化的频率和磁场变化的频率一致。这个高频的“伸缩”会带动铁芯表面产生声音,和扬声器振膜发声音的原理类似。电机叠片质量参差不齐时,同样频率下声音大小会差出好几倍,这也是为什么有些同型号电机叫得特别响,有些就安静很多。
1.2 驱动板和电容也会“开口说话”
电机之外,驱动板上最常见的发声源是陶瓷电容和功率电感。MLCC贴片陶瓷电容使用的X5R、X7R、Y5V这些介质,本质上是铁电材料,在电场作用下会发生压电形变。PWM信号本身是方波,方波经过电路板的走线加在电容两端时,电压以极高的斜率反复跳变,电容芯片就会随着跳变节奏“鼓动”外壳。当这个机械振动的频率落在可听范围内,你就会在板子某个角落听到嘶嘶声。
功率电感的发声路径稍微不同:磁芯在交变磁场里反复磁化,线圈绕组的匝间也受到电磁力,如果磁芯装配得不够紧,或者线圈浸漆不彻底,整个电感就会像一个小喇叭一样振动。有些电感外面包着一层热缩管,振动时热缩管和磁芯之间还会产生摩擦声,听起来更刺耳。
区分电机发声还是板级发声有一个很笨但有效的办法:用一根长柄螺丝刀或者绝缘棒,尖端抵住电机外壳或者芯片封装表面,耳朵贴在木柄上。抵住电机时声音变大,说明电机本体是主要声源;抵住某个电容或电感时声音突然变化,那问题就在元件上。这个听诊法能帮你快速锁定目标,避免在错误的路径上浪费时间。
2. 方案一:把频率拉到人耳范围之外
2.1 提高PWM频率的利与弊
最直观的消除手段就是把PWM频率往上抬。人耳能听到的频率范围大致是20Hz到20kHz,大多数成年人到了18kHz以上灵敏度就已经很差,所以把基波频率从15kHz改到25kHz,人耳听到的“尖叫”会立刻消失大半。
提高频率不只改变声学效果,还会改变电机驱动本身的电气特性。电机电流纹波的峰峰值和PWM周期T基本成正比,近似关系是ΔI=(VCC-VEMF)×D×T÷L,其中D是占空比,L是绕组电感。频率翻倍意味着周期减半,纹波电流差不多也会减半。纹波减小之后,电机的电磁转矩脉动变小,运行更平滑,铜耗和高频铁耗的分布也会变化。所以从电机电流质量角度看,提高PWM频率是有好处的。
但要清醒认识到代价:MOS管和续流二极管在每个开关周期里都要经历一次开和关,开关损耗约等于0.5×V×I×(ton+toff)×f,频率提高一倍,开关损耗就翻一倍。驱动芯片和MOS管的温升会明显增加,小体积驱动板可能直接扛不住。另外,PWM周期变短之后,定时器计数值变小,占空比分辨率下降。例如定时器时钟72MHz,15kHz时一个周期有4800个计数点,分辨率约为0.02%;提到25kHz后只有2880个点,分辨率掉到0.035%左右。低速精细调节时会感觉到占空比“跳变”,导致电机转速不平滑。
2.2 20kHz并不是绝对安全线
把频率抬到20kHz以上确实能骗过大部分成年人的耳朵,但别以为过了20kHz就万事大吉。人耳听力的截止频率因人而异,儿童和年轻女性的高频听力上限常常超过20kHz,某些敏感人群甚至能“感觉到”22kHz的存在,这种感受更像是一种压力感而非声音,但确实会让人烦躁。
还有一点要注意,无刷电机或步进电机驱动器中,PWM载波频率并不是唯一的声音来源。换向电流的转矩脉动会产生频率较低的噪声,这个频率往往等于电机转速和极对数的乘积;驱动器内部采样保持电路、软开关动作也可能产生额外的分频分量。你就算把PWM基波推到人耳范围之外,这些次生分量还是有可能会落在可听区间内。
我的建议是:优先把PWM频率提到25kHz以上,因为25kHz相对于20kHz留出了一段安全的过渡余量,抑制了基波及其二次谐波的可听风险。但“提高频率”只是第一步,实际项目中真正有效的做法,往往是频率提升配合扩频、滤波和机械减振综合使用。
3. 方案二:用扩频和随机调制抹掉尖峰
3.1 随机PWM的原理与实现要点
固定频率的PWM产生的声音,在频谱上是一条尖锐的能量峰。人耳对这种单一频率的峰值格外敏感,因为听觉系统会自动聚焦到持续不变的窄带信号上。如果让PWM频率在一个小范围内随机抖动,能量就从一条尖峰铺开成一段平坦的宽带底噪,感知上的“刺耳”会变成“温和的沙沙声”,甚至完全被环境噪声掩盖。这就是扩频和随机PWM的基本思想。
实现随机PWM的方式有很多种,最简单的是在定时器的周期寄存器ARR附近加一个伪随机扰动。比如基础周期对应ARR=2879,每次进入更新中断时生成一个-64到+64之间的随机数,加到ARR上,就能得到围绕25kHz上下扰动约±2%的变频PWM。更讲究一点的做法是维护一张预先算好的频率表,比如16kHz、18kHz、20kHz、22kHz、24kHz循环切换,切换间隔控制在几十到几百微秒,避免人耳感知到一个周期性的重复规律。
改频率时有一个容易踩的坑:ARR变了,比较寄存器CCR必须跟着按比例变,否则占空比会漂移。假设期望占空比是30%,原先是CCR=ARR×0.3,现在ARR加了δ,CCR就应该变成(ARR+δ)×0.3,或者在做完随机扰动后重新计算整个周期和比较值。如果MCU的PWM模块支持影子寄存器,最好先算好新ARR和新CCR,再在同一个更新事件里同步加载,避免PWM波形出现毛刺。
3.2 频谱打散后的实际效果
我在实际项目里对比过固定频率和随机扩频的频谱变化。在20kHz固定频率下,用频谱分析软件能看到一个明显高出底噪的尖峰;改成±5%的随机频率扰动后,这个尖峰消失了,能量展平到大约1.5kHz宽的频带里,峰值幅度下降了10dB以上。主观听感上,原来那种尖锐刺耳的“嘶嘶”变成了类似白色噪声的“沙沙”声,在环境噪音稍大的地方几乎听不出来。
随机扰动的幅度要控制好。调制深度太小,比如只有±0.5%,频谱展宽有限,人耳还是能识别出单频;调制深度太大,比如±15%以上,频率变化范围过宽,低速占空比的精度会下降,电流纹波的瞬时值也会忽大忽小,可能导致电机运行抖动。我实测下来±3%到±8%是比较理想的区间,既能有效打散能量峰,又不会明显影响电流环的稳定性。
还有一点值得提,随机数生成器本身的质量会影响扩频效果。用C库里的rand()不是不行,但它的周期短、调用开销在某些低端MCU上不可控,建议用线性反馈移位寄存器自己写一个伪随机序列,占用资源少,输出也够均匀。伪随机序列的重复周期最好超过几十个PWM周期,否则听起来又变成了一种有节奏的“嗡嗡”声。
4. 方案三:从控制模式里挤掉噪声
4.1 电流衰减与斩波模式的取舍
很多啸叫问题根子不在PWM基频,而在电流斩波的方式。尤其是步进电机驱动,驱动芯片内部通常有快衰减、慢衰减、混合衰减几种电流衰减模式。慢衰减模式下,续流时间较长,电流纹波小,但电流下降速度慢,电机在中高速时会显得“肉”;快衰减模式让电流快速下降,纹波大,斩波产生的噪声也更响。混合衰减就是在同一个开关周期里先快后慢,兼顾响应速度和纹波,实际效果往往是噪声明显低于纯快衰减模式。
直流有刷电机的H桥控制也有类似问题。如果用的是异步续流,即关断时电流只通过二极管自然续流,这时续流路径上的压降大,电流掉得快,纹波大;如果改用同步续流,关断时由下桥MOS管导通续流,压降小,电流更平滑,电流环的噪声和啸叫都会降低。当然同步续流需要MCU精确控制上下桥的互补输出和死区,不是所有驱动硬件都支持。
如果你是自己在做电流环PI调节,可以试试把电流环的带宽适当降低。有些系统把电流环带宽设置得太高,导致电流反馈对PWM开关噪声特别敏感,芯片里的比较器在噪声干扰下反复翻转,表现为占空比抖动,进而加剧噪声。用示波器查看电流波形,如果上面叠加了很多毛刺,优先检查电流采样电路的地线布局和RC滤波,而不是继续调参数。
4.2 软件层面的“软开关”技巧
还有一个经常被忽视的思路:不要一直让电机处于连续的PWM斩波状态。许多应用里电机并不需要持续高频输出,完全可以利用软件把PWM分成一小段一小段,中间插入强制关断时间。比如转速稳定时,让PWM输出10ms然后再完全关闭2ms,让线圈里的能量通过续流二极管自然泄放。这样做的代价是转矩会有轻微的周期性脉动,但好处是声音不再持续,人耳对间歇噪声的敏感度比连续噪声低得多,主观感受明显变好。
如果负载很轻,还可以考虑ON/OFF控制而不是PWM调速。比如风扇、水泵这类应用,低速时本来就不需要那么精细的电压调节,直接转一会停一会,平均转速靠开和关的时间比例控制。这种情况下PWM斩波时间大大缩短,线圈振动和开关噪声自然就减少了。这个方案和汽车启停系统的逻辑有点像,虽然不适用所有场景,但在低速轻载下非常有效。
另外提醒一句,很多驱动器有EN使能引脚。如果PWM输出为0时驱动芯片还在继续斩波,啸叫还是会存在。正确做法是在不需要驱动时直接拉低EN引脚,让驱动器输出级完全关断,比单纯把PWM设为0更彻底。这一条在电池供电的低功耗产品里尤其重要,既能降低噪声又能省电。
5. 方案四:硬件滤波器与机械减振
5.1 电机端的吸收网络怎么设计
软件调完之后,如果啸叫残余仍在,就需要动硬件了。最常见的做法是在电机两端并联一个小容值的安规电容或者CBB电容,吸收PWM开关瞬间产生的高频电压尖峰。这个电容不需要很大,取103(10nF)到104(100nF)之间,耐压按电机工作电压的2倍以上选。电容容量一旦过大,会拖慢电机电流的建立速度,导致转矩下降、启动变慢,而且大容量电容与电机电感形成LC谐振,可能反而激发新的振荡噪声。
我自己的经验是,在电机端用103/630V的CBB电容,再串一个10欧左右的电阻组成RC吸收网络。串电阻的用意是给高频振荡提供一个阻尼路径,避免电容和绕组电感发生低阻尼谐振。这个组合对减小换向火花带来的高频干扰特别明显,同时不会像纯电容那样影响驱动波形。如果是无刷电机驱动器,输出端可以加LC滤波器,但电感的饱和电流一定要大于堵转电流,否则电机一旦堵转,电感先饱和再发热,紧接着就开始啸叫,那等于一个新声源。
板级陶瓷电容的替换也值得做。X7R、X5R介质有较强的压电效应,在PWM驱动下容易发声。换成C0G/NP0介质后,压电效应基本可以忽略,噪声会明显下降。C0G的代价是同等容量下体积更大、价格更贵,所以一般只换PWM开关节点附近的、电压纹波大的那几个电容,不必整板都换。
5.2 灌封、减震垫与结构改进
万不得已的时候,还可以从声学传播路径下手。机械声要传到人耳,必须经过结构振动和空气传播两个环节。如果能打断这个路径,即使振动还在,也听不见多少声音。电机外壳和机架之间加一片硅胶减震垫,或者把固定螺丝的扭矩略微放松一点,就能改变电机和安装面的机械阻抗匹配,许多共振放大现象会随之消失。
灌封胶在驱动板降噪上效果非常明显,环氧树脂把电感、电容、芯片统统包裹起来,机械振动在胶体内部被阻尼吸收,实测整体噪声可以下降几个分贝。但灌封的代价是后续维修极不方便,芯片一旦损坏,整个模组基本报废。我一般只建议在散热条件允许且产品不计划返修的场景下使用,比如一次性设备或者终身免维护的嵌入式模组。
还有一招是针对轴承和机械装配的:如果电机在PWM停止、直接通直流电的情况下依然有嗡嗡声,那问题来自机械结构本身,换低噪声轴承、增加转子动平衡、改进定子安装方式才是正确的处理方向。这个和PWM啸叫是两个不同的问题,别混在一起排查。
6. 实操记录:一次15kHz到25kHz的迁移
6.1 原始配置与啸叫定位
拿我自己做过的一个直流有刷电机驱动板举例。板子用的是一颗内置固定频率驱动芯片配合外部MOS全桥,MCU输出单路PWM控制方向和油门。一开始为了兼容旧设计,PWM频率设成了15kHz,结果调试时一上电,清晰的“嘶嘶”声就出来了。用绝缘螺丝刀抵住电机外壳,声音明显增大,说明电机本体是声源主力;再把耳朵贴近驱动板,还能听到轻微的“吱吱”声,初步判断是功率路径上的陶瓷电容在响。
为了确认频点,我用示波器接在电机两端的采样电阻上看电流波形,纹波峰峰值大约0.6A,锯齿状的纹波频率正好是15kHz。又用手机装了一个频谱App放在电机旁边,能看到15kHz附近一个尖锐的能量峰。到这里目标就很明确了:把这一簇能量从可听区移走或者打散。
6.2 修改过程与实测数据
第一步是把PWM基频从15kHz改到25kHz。定时器时钟是72MHz,15kHz对应ARR=4800,改到25kHz后ARR=2880。修改CCR按比例计算,原来50%占空比的CCR是2400,改后是1440。实测输出波形频率25.0kHz,占空比误差控制在0.1%以内。
第二步是在电机端并联一组RC吸收网络:103/630V CBB电容串联10欧电阻。这个位置在电刷两端,吸收换向尖峰的同时不会影响稳态驱动。
第三步是找到驱动板上PWM节点处的一颗1206陶瓷电容,把X7R介质替换成同容值的C0G介质,板级“吱吱”声立刻消失。改完之后再用频谱软件查看,25kHz附近没有突出的能量峰,耳朵贴近电机只能听到极其轻微的高频,在室内安静环境下基本不可感知,故障告一段落。
6.3 高频化带来的三个副作用
频率提上来之后,新的问题马上出现了。第一个是驱动芯片发热。原先15kHz时芯片外壳只是温热,改成25kHz后,同样负载条件下表面温度大约升高了8°C,开关损耗随频率线性上升不是开玩笑的。最后加了铝散热片加强导热才算解决。
第二个是低占空比时的控制精度下降。原来5%占空比还能平滑调速,提到25kHz后,因为周期计数值变短、死区时间占比变大,PWM波形在低占空比段出现抖动,表现为电机低速时一顿一顿。我加了一个最小占空比钳位,并在低速段切换到不同的控制方式才缓解。
第三个是输入侧的电解电容明显变热,因为更高的开关频率带来了更高的dv/dt,输入滤波电容上的纹波电流增加。换成低ESR的固态电容之后,温度恢复正常。这里要特别提醒,提频不只是改个数字那么简单,热、EMI、低速性能都需要重新评估。建议提频前先看示波器上有没有明显的振铃,波形不干净的话先把吸收网络加上,再提频,否则高频振荡会放大。
7. 常见问题与排查技巧实录
7.1 如何快速判断啸叫来自电机还是电路板
第一个被问烂的问题:声音到底是电机发出的还是板子发出的?我总结了一个三步定位法。第一步,用绝缘长螺丝刀当听诊器,抵住不同元器件听声音变化,抵住电机外壳声音变大、抵住驱动板电容声音变小,那电机是主源;反过来的情况则问题在板级。第二步,断开PWM信号,直接给电机通一个干净的直流电压,让它慢慢转。如果依然有高频声,那是电机机械或换向问题;如果声音消失,定位到PWM驱动。第三步,保持驱动板供电、关掉PWM输出,把耳朵贴近驱动板,若还有吱吱声,说明是板上电容或者电感在振动。
要注意,陶瓷电容发出的声音往往不是基波频率,而是PWM上升沿和下降沿引起的振铃频率,听起来比基波更尖。用示波器测开关节点电压波形,如果看到上升沿有过冲和振铃,优先处理振铃,啸叫往往随之消失。
7.2 静音模式仍有细微噪声怎么办
现在很多驱动芯片有“静音”或者“低噪声”模式,原理多半是把PWM斩波频率移到超声频段,同时用更精确的电流环来维持波形质量。但不少用户反馈开启静音模式后,仍然能听到轻微噪声。这个噪声通常来自两个地方:一是电流环在换向时刻发生振荡,产生了包络调制,把超声频段的能量“差频”到了可听范围;二是死区时间设置不当,导致上下桥臂直通或关断时序产生微小毛刺,毛刺激发机械振动。
针对第一种情况,试着调整驱动芯片的电流衰减模式,尤其是步进驱动,混合衰减往往比快衰减安静很多。针对第二种情况,用示波器测量电机电流波形,看换向点附近是否有阻尼振荡,必要时增加吸收网络或者在采样端加低通滤波。如果芯片没有开放死区调节,那就只能在PCB布局上尽量缩短功率回路的长度,减小寄生电感。
7.3 硬件动不了的时候还能调什么
最后一种情况很现实:硬件已经定型,PCB不能大改,换芯片也不可能,啸叫还是明显。这时候能动的只剩软件。优先把固定频率改成随机扩频,用定时器ARR扰动实现,成本几乎为零。其次检查软件里电机控制的节拍是否固定,比如PID周期本身如果产生固定的低频包络,就会调制出可听噪声,把控制周期稍微“抖动”一下,或者与PWM周期设置成非整数倍关系,往往能收到意想不到的效果。
再就是充分利用驱动器的使能引脚和PWM输出关断。在不需要电机保持力矩的时候,把驱动器完全关断,比让PWM停在某个占空比更安静也更能省电。对于需要保持位置的场合,如果机械刹车可以承受,调整成“短时间高占空比→长时间零输出”的间歇控制策略,用平均输出换安静。
还有一个小技巧,如果你只是想让某个测试场景安静下来,可以在控制程序中增加一个“静音模式开关”:正常性能模式用原始频率,测试或者演示时切换到低噪声策略。我在好几个项目里用这个办法同时满足了两拨人的要求,很实用。
最后分享一个我自己的习惯:做新的驱动板,先默认把PWM频率定在25kHz,再从示波器、温升、EMI三个角度综合评估,除非有特殊需求,否则尽量不降回可听频段。善待这颗耳朵,它会在你调试到半夜的时候回报你。