尧图精选

嵌入式PWM完全指南:从占空比计算到H桥死区与电机调试

🕒 发布时间:2026/9/13 6:12:19 📁 来源:尧图网络
干了这么多年嵌入式大大小小跟 PWM 打过无数次交道。说实话PWM 是那种“看起来谁都懂一深挖全露馅”的知识点。面试应届生十个里有八个会说“PWM 就是调节占空比嘛”可真问到频率怎么选、为什么电机要加到 20kHz、中心对齐和边沿对齐到底差在哪、H 桥上下管为什么不能同时导通能讲清楚的人立刻少一大半。我自己也翻过车。有一回做 H 桥电机驱动省事没仔细算死区时间两个 MOS 管栅极信号一互补上电瞬间直接炸管。从那以后我把 PWM 相关的资料从头到尾捋了一遍发现这块内容完全可以串成一条线来学先搞懂波形参数本身的数学关系再看生成波形的硬件机制定时器、对齐模式、死区、故障保护然后把 PWM 接到具体负载上电机、LED、舵机最后用示波器和调试经验收尾。这篇文章就按照我自己的学习路径来从参数计算到实际驱动案例再到 RK3588 风扇调试这种真实场景尽量把能踩的坑和能省的弯路都写出来。适合刚入门嵌入式、想系统看一遍 PWM 的读者也适合工作几年后回过来查漏补缺的朋友。1. 先算清楚三个参数占空比、频率、分辨率之间的“三角关系”1.1 占空比不是唯一重要的参数大多数人对 PWM 的第一印象就是占空比公式占空比 D Ton / T × 100%其中 Ton 是一个周期内高电平持续时间T 是完整周期。如果 PWM 峰值电压是 Vm那么经过负载后的平均电压就是Vavg D × Vm这个公式在估算 LED 亮度、电机转速、加热器功率时非常直观。比如 12V 的电机想得到大约 5V 的平均驱动电压那占空比就是 5 / 12 ≈ 41.7%。但工程实践里只看占空比远远不够。同样的 50% 占空比放到 100Hz 和放到 20kHz 的载波上表现出来的是完全不同的物理效果前者可能让白炽灯明显闪烁、让电机一顿一顿地转后者人眼和人耳都无感电机转动也平滑得多。频率决定了 PWM 与负载之间的“交互方式”这直接引出了第二个参数。1.2 频率到底听谁的从电机、LED 到舵机的不同选择逻辑PWM 频率不是拍脑袋定的它取决于负载特性和系统需求。先看电机。直流电机的绕组有电感PWM 相当于在电感上反复施加和断开电压。频率太低时电流来不及平滑电机会出现转矩脉动、噪音大、低速时甚至会一顿一顿。频率太高也不行每个开关周期都会有开关损耗MOS 管和驱动器的发热会明显增加频率太高时损耗甚至可能超过负载本身获得的功率。业界常见的做法是选 20kHz 左右一个原因是这个频率超出了人耳听觉上限约 20kHz不会听到电机“滋滋”的啸叫声另一个原因是 20kHz 下开关损耗和电流纹波通常能取得不错的平衡。实际有些工业驱动、航模电调会用到 30kHz、50kHz主要是为了进一步减小噪音和纹波代价是更强的散热要求。再看 LED。LED 调光最常用的是 PWM 而非直接改变电流原因后面会详细说。LED 的 PWM 频率主要考虑人眼视觉暂留效应一般要高于几百赫兹才不会看到明显闪烁。实际产品中几百 Hz 到几 kHz 都有但要注意如果系统里有摄像头普通的 1kHz PWM 会在拍摄画面里产生滚动条纹。所以我做带摄像头模组的嵌入式设备时LED 调光频率通常直接上到 15kHz 以上这个经验在消费类产品里非常常见。舵机就比较特殊了。航模、机器人里常见的模拟舵机标准是 50Hz 的周期信号也就是 20ms 一个周期高电平脉宽在 0.5ms 到 2.5ms 之间对应舵机转轴的 0° 到 180°不同厂家略有差异。这个频率不是工程师随便定的而是舵机内部解码电路按这个规格设计的你用 200Hz 去驱动它舵机反而可能乱抖或转不到指定角度。1.3 定时器位数的“分辨率债”频率越高精度越紧张不少同学在学到定时器输出 PWM 时会忽略一个矛盾PWM 频率和占空比分辨率共享同一个定时器资源两者是此消彼长的关系。以 STM32 为例PWM 波形由定时器计数器产生。设定时器时钟为 72MHz预分频为 PSC自动重载值为 ARR那么PWM 频率 72MHz / ((PSC1) × (ARR1))占空比控制寄存器的比较值为 CCR占空比 CCR / (ARR1)。这意味着 ARR 决定了 PWM 周期同时也是一个周期内可分的占空比档位总数。档位越多占空比控制越精细但这个“精细度”是拿频率换来的。举一个实际例子72MHz 定时器输出 20kHz 的 PWM 用于电机控制那么每个周期只有 72MHz / 20kHz 3600 个计数时钟也就是 ARR 约等于 3599占空比分辨率约为 3600 分之一。作为对比如果这个定时器输出 1kHz 的 PWM那么 ARR 可以达到 71999分辨率大大提升但这显然不适合电机人耳能听到明显的啸叫。所以实际做项目时先别急着配置定时器先算一笔账需要的 PWM 频率是多少要求的占空比调节精度是多少这两个条件确定之后再去选定时器时钟和预分频。算完通常会发现单片机的定时器位数16 位还是 32 位直接决定了你能不能在想要的频率下达到想要的精度。2. 边沿对齐还是中心对齐从波形生成到 ADC 采样时刻工程师必须搞懂的三件事2.1 边沿对齐简单直接但对称性差STM32 等单片机输出 PWM 时定时器计数器有几种计数模式。最简单的是边沿对齐模式计数器从 0 向上计数到 ARR然后归零重新开始输出比较信号在计数值到达 CCR 时翻转。这种模式逻辑简单、配置方便适合大部分常规场景LED 调光、舵机控制、简单电机调速。它的问题在于一个周期内只有一次“翻转沿”在多路 PWM 同时输出时各路信号的上升沿可能挤在一起造成电流和噪声的集中。2.2 中心对齐多路 PWM 的对称之美中心对齐模式是另一个极端计数器先从 0 向上计数到 ARR再由 ARR 向下计数回 0一个完整 PWM 周期包含“上坡”和“下坡”两段。比较输出在上坡或下坡到达 CCR 时翻转产生的波形关于周期中点对称。为什么要用中心对齐因为多个 PWM 信号的波形中心点都在同一位置高电平宽度可以精确对称这在三相逆变器、BLDC 电机驱动、H 桥互补输出这些场景里非常关键。对称的 PWM 波形能减小输出电流中的偶次谐波让电机运行更平滑。英飞凌 TC3xx 的 CCU6 模块、STM32 的高级定时器TIM1、TIM8都支持这种模式三相六路 PWM 控制 BLDC 时一般是标配。TC3xx 的 CCU6 里有个典型用法T12 通道组输出三相互补 6 路 PWM通过设置 T12MSEL 选择中心对齐同时配置死区发生器。这样不仅能输出三相对称的波形还会自动在互补信号之间插入死区时间。2.3 互补输出与死区设置炸管子的那一次教训H 桥或者三相逆变器里同一桥臂的上下两个管子绝对不能同时导通。一旦同时导通电源直接通过两个 MOS 管短路电流瞬间飙升管子立刻报废。我那次炸管就是因为只配置了互补 PWM但把死区时间设成 0结果开关延迟导致一瞬间上下管都处于导通状态。死区的本质是在上下管切换时主动插入一段“两个管子都关闭”的时间。这段空隙短到电机或负载根本感知不到但长到能避免直通短路。STM32 高级定时器的死区时间由 TIMx_BDTR 寄存器控制需要检查目标芯片的参考手册确认时钟频率再换算成具体时长。通常做法是算出上下管各自的导通延迟和关断延迟死区时间至少要大于“关断延迟 - 导通延迟”的差值并留出一定裕量。比如 IGBT 驱动的死区一般设在 1~3 微秒功率 MOS 管驱动的死区常在 100ns~500ns 之间。太小不安全太大则会造成波形畸变和输出能力下降需要根据实测波形慢慢调。中心对齐模式下死区设置方式类似但要注意死区会占用有效占空比在计算最大占空比时要提前扣除。2.4 ADC 采样时刻为什么要避开 PWM 翻转沿很多做电源或电机控制的同学都会遇到一个问题PWM 输出和 ADC 采样同时工作采出来的电压电流数据毛刺特别大。原因很简单——PWM 翻转沿正好是开关器件导通关断的时刻这个瞬间伴随明显的 dv/dt 和 di/dt 噪声如果不避开ADC 很容易采到尖峰。中心对齐模式在这里有个天然的优点在一个 PWM 周期内计数器达到 0 或 ARR 的时刻所有桥臂处于同一种开关状态都导通或都截止此时采样噪声相对最小。很多高级定时器都支持在“计数器归零/上溢/下溢”事件触发 ADC 转换目的就是让你在噪声窗口之外抓到稳定的信号。我在 STM32 上做 FOC 电流采样时就是把 ADC 触发点设在中心对齐模式的下溢中断采样出来的电流波形明显比随便找个时刻采样干净得多。3. 从控制端到功率端H 桥、电机、舵机的“同一套 PWM不同脾气”3.1 H 桥 PWM 电路的数学原理H 桥由四个开关管组成负载电机接在桥的中间交叉导通不同管子可以让电流正反向流动从而实现电机正反转。当配合 PWM 调速时H 桥的任意一条对角线上两个管子由 PWM 信号控制另一对管子保持关断或也参与同步调制。电源电压为 Vbus负载平均电压由占空比决定。以半桥为例负载一端接电源地另一端通过高边或低边开关型 PWM 斩波负载上的平均电压约为 D × Vbus。全桥两个半桥在双极性调制下负载两端平均电压为 (2D - 1) × Vbus当 D 50% 时正向电压D 50% 时反向电压。这里有一个关键点电机绕组是感性负载PWM 断开时电流不会立刻归零而是通过续流二极管或 MOS 管体二极管继续流动。没有续流回路感性负载产生的反电动势足以击穿开关管。所以 H 桥电路里每个开关管旁边都要考虑续流路径要么靠管子内部体二极管要么外接快恢复二极管。这也是为什么我建议初学者先看数学原理再看原理图理解了电流在开关瞬间的流向才能理解为什么这些二极管和死区缺一不可。3.2 PWM 频率对电机的影响为什么不能拍脑袋选前面提到过 20kHz 只是常规选择。实际调试电机时频率对系统的影响可以从几个角度观察。首先是电流纹波。电机绕组电感 L 对 PWM 电流有滤波作用频率越高电流纹波越小电机转动越平滑。但频率也不能无限高开关损耗随频率线性增长MOS 管驱动芯片和 MOS 管本身会在高频下明显发热整体效率反而下降。参数选择上有个关键公式电流纹波大约正比于 Vbus / (8 × L × f)选型时可以根据纹波容忍度和开关损耗折中取频率。其次是低速性能。低 PWM 频率时电机在低速下会有明显的顿挫感甚至发出“咕噜咕噜”的声音。把频率提高到 20kHz 以上后这个问题通常肉眼可见地消失。但有些带减速箱的电机减速机构本身会有机械共振频率如果 PWM 频率正好落在共振区噪音反而更大这时候需要实测调整。最后是驱动器发热。很多人忽略 PWM 频率对驱动芯片的影响我曾在一款小型直流电机驱动器上把 8kHz 改成 32kHz结果驱动芯片表面温度直接上升了十几度。调试时务必用热成像或热电偶测一下驱动管温度不要只看电机的顺畅程度。3.3 舵机 PWM50Hz 周期的“位置协议”舵机和控制其它负载的思路不太一样。舵机内部有控制电路和电位器反馈它看的不是平均电压而是高电平脉冲的宽度也就是位置指令。标准的模拟舵机要求 50Hz 周期信号20ms 内的高电平宽度对应不同角度1ms 对应 0°1.5ms 对应 90°中位2ms 对应 180°不同舵机可能略有偏移。部分数字舵机可以接受更高频率的控制信号如 333Hz但 50Hz 是兼容性最好的。关键的一条经验是舵机信号必须和舵机电源共地。如果舵机由独立电源供电而信号来自单片机系统两边的地不连PWM 信号就会飘舵机会乱抖甚至完全不受控。很多初学者第一次接舵机发现乱转第一反应是修改程序延时其实大概率是地没共好。另外航模接收机和飞控之间传输的控制信号也是同样原理接收机把遥控信号转换成 50Hz、1~2ms 脉宽的 PWM 信号飞控或舵机读取脉宽来解算油门、舵面位置。所以学会用示波器测量 PWM 脉宽是调试这类系统的基本功。4. LED 调光不是“降低电流”而是用 PWM 保持光色4.1 为什么 LED 调光优先用 PWM 而不是调电流很多人刚做 LED 灯光控制时会困惑要调亮度直接减小电流不就行了原理上行得通但工程上不好用。LED 的色温和电流强相关大电流时偏冷白小电流时偏暖黄直接调电流会让灯光颜色发生漂移用在照明或显示屏上非常影响观感。而 PWM 调光在任意占空比下LED 导通时的瞬时电流始终保持设计值人眼看到的是亮度在视觉上的平均色温却基本不变白就是白黄就是黄。这背后的物理是人眼对高频亮度变化的感知不是线性累加而是在时间上做了积分。当 PWM 频率高于视觉融合频率一般数百赫兹后人眼看到的就是占空比对应的平均亮度。这也是为什么 PWM 调光在灯具、屏幕背光领域几乎是一统天下的方案。4.2 呼吸灯、RGB 灯和 WS2811 的数据编码呼吸灯是嵌入式学习里最常见的 PWM 实验之一。实现思路很简单定时器输出固定频率 PWM主循环或者定时器中断里不断修改 CCR让占空比从 0 缓慢增加到 100%再反向减小到 0%。比如 STM32 上用定时器输出 PWM 到 LED中断里做 CCR 渐变代码逻辑不复杂。单片机性能足够时也可以在 PWM DMA 方式下完成用 DMA 把一串 CCR 目标值周期性搬运到定时器的捕获比较寄存器CPU 全程不用干预波形更新适合做更复杂的渐变色动画。RGB 灯就是把红、绿、蓝三颗 LED 分别用三个 PWM 通道控制三路占空比独立调节理论上能混出 1677 万种颜色。但这里有个细节人眼对红绿蓝的感知灵敏度不一样同样 50% 占空比下三颗灯的视觉亮度并不相同所以 RGB 混色时需要做色度校定不能简单地把三个通道设成同一个百分比。WS2811 这类智能灯珠就更特殊了它本身内部集成了恒流驱动和 PWM 控制逻辑外部只需一根信号线输入数据内部芯片根据数据调制出对应的 PWM 信号来驱动三色 LED。数据协议本质上也是用高低电平的持续时间来编码 0 和 1这其实又是 PWM 思维的另一种应用——用宽窄不同的脉冲来表示数字信息。51 单片机用几个 IO 口模拟这样的时序就能驱动 WS2811关键是时序必须严格高电平脉宽控制在几百纳秒级别。4.3 人眼的非线性感知与调光曲线做 LED 呼吸灯时有一个常被忽略的问题按照占空比线性递增来做呼吸效果人眼看起来并不线性。亮度的感知大致遵循史蒂文斯幂律低亮度的变化比高亮度的变化更容易被察觉。所以想让呼吸灯看起来均匀自然占空比变化曲线应该做成指数型或伽马校正后的曲线而不是直线。最直观的做法是建一个 256 级的查找表把理论占空比做一次 2.2 次方的反向矫正然后查表输出。我用在 RGB 灯效上之后整个渐变过程顺滑了很多肉眼不再有“前段明显、后段没动静”的感觉。5. 开关管、故障保护与一次 RK3588 风扇调试实录5.1 像 AO3400 这样的小 MOS 管用对地方很关键AO3400 是嵌入式硬件里非常常用的 N 沟道 MOS 管封装小、价格便宜大概参数是漏源电压 30V持续漏流 5.7A封装散热条件不同会变化栅极阈值电压很低单片机的 3.3V 电平可以直接驱动。在嵌入式项目里拿它做低边开关、驱动 LED 灯带、风扇、小型电机很合适。但这类小 MOS 管有三个使用前提一是负载电源电压不能超过管子耐压二是持续电流要留裕量不要贴着极限值跑三是 PWM 开关时要注意栅极驱动。单片机的 IO 推挽输出能力有限如果 PWM 频率比较高几十 kHz 以上栅极电容充放电不够快会导致开关损耗增大、管子发热。常见做法是在栅极串一个小电阻并且加下拉电阻让单片机上电瞬间 MOS 管保持关断状态避免误触发。如果是直流电机这类感性负载负载两端别忘了加续流二极管。5.2 PWM 故障保护不只是软件能兜底的事PWM 相关的故障保护很多人第一反应是“程序里写保护逻辑”比如检测到过流就停 PWM。但真正的 PWM 故障保护应该是硬件级别的单片机定时器的故障输入引脚如 STM32 的 BKIN 引脚可以在外部故障信号触发时由硬件直接封锁 PWM 输出把输出引脚置于安全状态高阻或固定电平这个过程不需要 CPU 参与。这种机制在电机驱动、逆变电源里非常重要。因为 CPU 处理中断有延迟哪怕只有几十微秒也足以让电流飙升到烧管子的程度。硬件故障保护则能在纳秒级直接动作及时切断驱动信号。焊接短路、负载堵转、母线过压这些故障信号接入 BKIN 引脚后PWM 输出自动关闭等故障解除且程序重新使能才能恢复输出。死区设置本质上也属于故障保护的一部分它是防止直通短路的“时间窗口保护”。所以做 PWM 驱动功率电路时不要只关心占空比和频率一定要把硬件层面的故障保护链路设计好。这往往是方案评审时硬件工程师最关注的部分。5.3 RK3588 PWM 风扇调试一次典型踩坑过程RK3588 这类高性能应用处理器通常自带多个 PWM 控制器其中一个常见用途是风扇调速。之前在 RK3588 开发板上调试 PWM 风扇遇到了三个典型问题排错过程很有代表性。第一个问题是风扇不受控配置好 dts 里的 PWM 节点后风扇直接全速转调占空比没反应。检查发现是 PWM 极性配置反了。Linux 设备树里 pwm-backlight 或 fan 节点的 polarity 属性直接决定有效电平。如果配反本来应该输出低电平的时间段输出了高电平占空比语义完全颠倒导致默认占空比 50% 时风扇按 50% 反转逻辑全速跑。第二个问题是风扇低速时有明显噪声这是因为 PWM 频率太低低于风扇内部驱动电路的平滑能力。把 PWM 频率从默认的几千 Hz 调到 25kHz 之后噪音立刻消失转速控制也线性了许多。第三个问题是系统休眠后风扇不转原因是 PWM 控制器在睡眠时被断电或时钟关闭醒后没有重新初始化。解决方法是在驱动里注册系统休眠回调恢复时重新申请 PWM 并使能。这些都是理论之外、实测才会遇到的典型问题。调试 PWM 相关设备时手上最好有一台逻辑分析仪或示波器直接看输出波形比反复检查代码效率高得多。6. 面试常问 PWM 题和个人学习建议6.1 几句话就能讲清楚的高频考点嵌入式面试里 PWM 相关的题出现频率相当高我总结过几类常问的问题占空比如何计算、PWM 的输出平均电压怎么算这类题考察基础公式重点是把 Ton、T、D、Vavg 的关系讲顺顺带提一句死区会影响实际最大占空比。PWM 频率怎么选LED 和电机有什么区别这题考察工程直觉。答案是LED 要考虑人眼视觉暂留和摄像头的滚动条纹电机要考虑电感滤波、人耳听觉上限和开关损耗舵机则是沿用 50Hz 的标准协议。PWM 和 DAC 各有什么优缺点PWM 简单高效、适合开关型负载但输出的是数字开关波形需要 RC 滤波才能变成平滑模拟量且分辨率受限于定时器频率DAC 直接输出模拟电压精度高、反应快但成本和功耗更高。什么是 PWM 死区为什么需要死区这题直接关系到功率电路安全要能把上下管直通的后果和死区补偿逻辑讲清楚。多个 PWM 同时输出时如何避免相互干扰可以提边沿对齐与中心对齐的区别并说明中心对齐模式在对称输出上的优势。PWM 的占空比分辨率有限时怎么办可以从降低频率、提高定时器时钟频率、改用更高分辨率定时器或使用 TPM 模块等角度回答。这些问题背后其实都对应了前面几个章节的内容所以只要基础扎实面试基本不会被问倒。6.2 一条比较务实的学习路线如果你想系统地学习嵌入式中的 PWM我个人的建议是别急着啃大段的芯片参考手册按如下顺序走一遍学习效率会高很多第一步用单片机最小系统板输出最简单的 PWM连一个 LED 或蜂鸣器把占空比和频率对输出效果的影响直接听出来、看出来。第二步接示波器或逻辑分析仪观察波形亲眼看一看边沿对齐和中心对齐的差异测量一下占空比精度和频率误差。没有示波器时逻辑分析仪也够用很多入门级产品就能看到 PWM 波形。第三步驱动一个直流电机或者舵机体会感性负载和位置控制负载的不同节奏。这时可以配合万用表测电机端的平均电压把理论公式和实测数据对起来。第四步做一个带 H 桥的小驱动板自己算死区时间用示波器检查换向瞬间有没有直通。这是从“点亮 LED”跨到“功率控制”的关键一步也是最能加深 PWM 理解的一步。第五步做一个小闭环系统比如 PWM 控制加热器或风扇用 ADC 采样反馈把采样触发点和 PWM 输出对齐。做到这里PWM 相关的软硬件能力基本就打通了。6.3 最后分享一个调试工具层面的建议PWM 调式过程中最值得投资的东西一个是示波器另一个是带解码功能的逻辑分析仪。我见过不少同学在代码里反复调整占空比参数但完全不确定引脚上实际输出的波形长什么样。其实只要用示波器看一眼几秒钟就能判断是不是极性配反、频率不对、占空比受限。另一个小技巧是用万用表的直流档测量 PWM 输出引脚读到的电压大致等于峰值电压乘以占空比。这虽然精度一般但用来快速验证占空比是否按照预期变化非常方便。做过五六个 PWM 相关的实际项目后我的体会是PWM 本身不难难的是把它放在完整的系统里看问题。一个 PWM 信号从定时器引脚出来经过电平转换、栅极驱动、MOS 管再到电机或 LED每一个环节都可能改变波形的实际表现。只顾配置寄存器、不看功率端波形和发热、不做故障保护的项目往往早晚出问题。反过来当你搞懂了某一类负载在 PWM 驱动下的脾气后面再遇到新器件、新芯片几乎只需要照葫芦画瓢——因为原理是相通的。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →