ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PWM技术详解:从原理到LED调光与电机调速实战

PWM技术详解:从原理到LED调光与电机调速实战 1. PWM 到底是什么为什么它能“假装连续”1.1 一句话定义 PWM先跑通概念PWM全称 Pulse Width Modulation脉冲宽度调制。名字听起来有点唬人但拆开说就是一句话用一串宽度可变的方波脉冲去等效一个大小可调的直流输出。我见过很多新手第一次接触 PWM 时被波形图吓到觉得又是周期又是占空比还要对着示波器看上升沿下降沿好像很难。其实你用不着先上示波器先想一个生活场景家里的灯开关如果你以极快的速度反复按开和关灯看起来是什么状态如果开的时间长、关的时间短灯泡就偏亮反过来就偏暗。PWM 干的就是这件事只不过把“手按开关”换成了“电子开关高速切换”把“人眼观察”换成了电路或器件的物理响应。所以 PWM 的第一个关键词是占空比也就是高电平时间占整个周期的比例。占空比 50% 意味着在一段时间里一半时间输出高电平、一半时间输出低电平。第二个关键词是频率也就是这个开关动作每秒钟重复多少次。把这两个量控制好PWM 的输出就能在“等效直流”这个层面被精准调节。围绕这个标题我想把它拆成三个递进的问题LED 为什么能被 PWM 调亮度直流电机为什么能被 PWM 调转速单片机又是怎么把这个波形实打实配出来的一个一个说。1.2 平均电压视角从“占空比”到“等效直流量”要理解 PWM 能调速、能调光最核心的是接受一个观点负载看到的不再是瞬间的高或低而是一个被“平均化”后的效果。拿一个最简单的阻性负载来看比如电阻、LED 限流后的回路。假设电源电压是 5V占空比是 D取值范围 0 到 1那么单位时间内的平均电压就是 5V × D。占空比 50% 时平均电压 2.5V占空比 20% 时平均电压 1V。这就是驱动能力可调的本质。但这里有个关键点为什么负载会“认”这个平均值而不是被一串高高低低的电平打懵因为负载本身有“惯性”。这个惯性有两种体现形式对于 LED 加人眼系统惯性来自视觉暂留。人眼对光线的响应不是瞬时归零的只要 PWM 频率足够高你根本分辨不出灯在闪只会感受到一个介于最亮和最暗之间的“等效亮度”。对于电机系统惯性来自电感特性和转子转动惯量。电机绕组是电感电流不会突变转子也有质量转速不会突变。一串 PWM 脉冲打上去电流和转速最终稳定在一个与平均电压对应的状态。所以说PWM 能调速不是因为什么神奇的力量而是因为它输出了一串“有规律的开关信号”而负载端天然具有低通滤波一样的特性把这个开关信号还原成了连续量。1.3 频率到底怎么选低了闪高了热很多人在第一步就栽在频率上。频率太低LED 能看到明显闪烁电机能听到刺耳的“吱吱”声频率太高开关损耗上来了驱动芯片、MOS 管发热严重反而不划算。我的经验是分场景给一个参考起点LED 调光起步频率 1kHz 到 5kHz。人眼的视觉暂留大约在几十赫兹以上就不太容易察觉闪烁但为了让手机拍摄、不同灯光环境下都不露馅1kHz 以上比较稳。我之前做过一批 500Hz 的 LED 调光板肉眼看没问题拿手机一录视频满屏波纹后来统一改成 4kHz 才算干净。直流电机调速起步频率 10kHz 到 20kHz。低于 20kHz 处在人耳敏感范围电机线圈会发出高频噪声听着像蚊子在耳朵边上飞。高于 20kHz 后人耳听不见但驱动电路里的 MOS 管开关损耗会随频率直线上升散热压力变大。舵机控制这个特殊50Hz 左右因为舵机内部靠脉冲宽度解算角度频率和脉宽有固定协议不能用高频乱来。先按这个范围起步示波器看波形、用手摸器件温度再微调。没有哪个频率是“绝对正确”的合适就是王道。2. 从 LED 亮度说起PWM 和人眼怎么“合伙捉弄你”2.1 为什么不用高电平直接驱动 LED附 51 单片机场景先说一个我在交流群里被问烂了的问题为什么 51 单片机驱动 LED 时不能采用输出高电平的驱动方式很多人看电路图LED 正极接一个限流电阻电阻另一端接单片机引脚负极接地。代码里给引脚写 1LED 亮写 0LED 灭。这不就是“输出高电平驱动”吗能亮啊为什么说不行关键在于驱动能力。51 单片机的 IO 口尤其是标准 51比如 AT89C51、STC 早期型号上拉能力很弱官方手册里 P1、P2、P3 口输出高电平时能提供的电流通常只有几十到几百微安级别典型值也就几十微安。LED 想正常发光常见工作电流是 5mA 到 20mA。你指望一个只能挤出几十微安的引脚去喂饱一个要十几毫安的 LED结果就是引脚电压被拉垮、LED 亮度暗淡甚至单片机工作不稳定。而低电平驱动灌电流方式就不同引脚输出低电平电流从 VCC 经 LED 和限流电阻流入引脚。51 单片机的灌电流能力通常比拉电流强不少能承受的电流大得多这才是标准接法的原因。再说 P0 口它更特殊内部本身没有上拉电阻是开漏结构。要输出高电平必须外接上拉电阻不然引脚啥也驱动不了。很多教材喜欢直接甩一句“P0 口要加上拉”但不解释为什么其实就是这个驱动能力的问题。回到 PWM。你可能要问那 LED 调光为什么不用“高电平但限流”的方式限流电阻固定了电流亮度就固定了没法动态调。PWM 的方式是让电流在“额定值”和“零”之间高速切换平均电流可调而瞬间电流又不会突破 LED 的额定限制这样既安全又能线性调光。2.2 调光背后的“视觉暂留”与最低频率LED 调光的本质是利用人眼的视觉暂留效应。人眼看到一个亮点后光刺激在视网膜上会保留一小段时间大约几十毫秒。如果光源的熄灭时间远小于这个时间大脑就会自动“脑补”出一个连续画面。实际体验下来有两条经验可以分享最低频率不要低于 1kHz。虽然理论上一两百赫兹人眼就感觉不到闪烁但实际场景里总有人眼余光、相机拍摄、环境反光等问题低频 PWM 很容易在高速运动或拍摄时露出马脚。我做过一次成品灯板用 250Hz静态看确实没问题结果客户拿手机慢动作一拍整个灯像呼吸一样起伏最后改成 2kHz 才通过验收。高亮度段的低占空比要小心。如果占空比只有 1% 甚至更低脉冲宽度在微秒级别如果频率又高LED 可能根本没来得及完全点亮就被关掉了亮度曲线在低端会变得不线性。这是 PWM 调光的经典非线性问题需要做亮度曲线矫正gamma 校正。有的朋友问能不能用调节流过 LED 的电流大小来调光可以比如改变串联电阻或使用恒流芯片。但这种方式有一个问题LED 的色温会随着电流变化而偏移白光 LED 在小电流下会明显偏黄偏暖大电流下偏蓝偏冷。PWM 调光就不一样LED 始终工作在额定电流上只是间歇性通电光谱特性稳定色彩还原度更好。这也是为什么现在 LED 驱动芯片普遍支持 PWM 调光而不是线性调光。2.3 顺手聊聊 LED 驱动芯片里的 FB 和 CS 脚热词里出现了“led驱动器芯片fb cs脚调整”正好展开说。你去看一颗 LED 驱动芯片的 datasheet比如常用的升压恒流芯片往往有两个关键引脚FBFeedback和 CSCurrent Sense。CS 脚电流采样输入。芯片内部通过这个脚检测流过采样电阻的电压从而判断当前输出电流。典型接法是在 LED 回路里串一个小电阻电阻两端的压降送到 CS芯片根据这个电压调整开关管的导通状态把电流稳住。采样电阻的大小直接决定输出恒流值公式通常是 I Vref / RVref 是芯片内部的基准电压。FB 脚反馈调整输入。有的芯片用 FB 做输出电压采样通过外部电阻分压设定目标电压有的芯片 FB 还能接收外部 PWM 信号做调光把 PWM 的高低电平转换成芯片的使能和禁止实现数字调光。实操中调 CS 电阻时我踩过一个坑电阻太小导致电流过大LED 很快就光衰了电阻太大又导致电流不够亮度不足。后来总结先按数据手册的参考电路搭再用电流表实测微调电阻值不要凭感觉改。FB 脚如果支持 PWM 调光输入的 PWM 频率不要太高否则芯片内部的环路响应跟不上调光会失真。3. 直流电机调速电感、惯性和“看不见的连续电流”3.1 电机为什么对 PWM“言听计从”LED 靠视觉暂留理解 PWM电机靠什么靠电感和转动惯量。直流电机的等效模型可以看成电阻绕组铜阻串联电感绕组电感再串联一个反电动势源转子转动时产生的反向电压。当电机两端加上一个阶跃电压时电流不是瞬间跳变到最大值而是以时间常数 L/R 慢慢爬升转子的转速也不会瞬间到达目标值而是靠转矩慢慢加速。现在给电机加上 PWM 方波。导通阶段电压加上去电流开始上升关断阶段电压被切断但电感会维持电流继续流动这就是续流二极管作用的场景。只要 PWM 周期远小于电机电气时间常数和机械时间常数电机感受到的就近似一个连续的直流电压大小等于电源电压乘以占空比。占空比越大等效电压越高流过绕组的平均电流越大转矩越大转速也越高。这就是“PWM 调速”最底层的逻辑你其实是在调一个等效直流电压而不是真的在调电机内部的什么参数。有一件事需要提醒你PWM 调速不能把占空比调得太低尤其是空载或轻载的电机。占空比低于某个临界值电机可能转不动电流全部变成热损耗线圈发热严重。如果你要做低速场景优先考虑减速箱方案而不是靠极端低占空比硬撑。3.2 必须有的续流二极管不然一首《凉凉》送给你控制直流电机的标准半桥电路就是一个 MOS 管或者三极管串联在电机回路里单片机输出 PWM 驱动开关管。很多新手第一次搭这个电路电机能转但只要一停电源芯片就重启或者单片机就死机。原因就是没有续流二极管。电机的绕组是感性负载。当开关管关断时电流无法突变会在电机两端感应出一个反向电动势俗称反电动势尖峰。这个尖峰的电压可以高达电源电压的数倍甚至更高。没有续流回路这个尖峰就直接打到开关管上击穿 MOS 管同时通过地线窜到单片机造成复位、死机。正确做法是在电机两端反向并联一个二极管也就是续流二极管。当开关管关断时电感电流通过二极管继续流动把能量以热的形式慢慢消耗掉电压尖峰就被钳制在二极管导通压降附近。选择续流二极管时注意必须用快恢复二极管或肖特基二极管不能用普通整流二极管。普通管反向恢复时间太长高频 PWM 下会烧。二极管的额定电流要大于电机峰值电流的 1.5 倍以上。反向耐压要留足够的余量至少 2 倍电源电压。实际调试中我还见过一种更隐蔽的坑续流二极管装反了。有人把二极管正极接电源、负极接电机结果一上电直接短路MOS 管冒烟。方向记不住的话就记一句口诀二极管负极接电源正正极接开关侧也就是让电流在关断瞬间能够沿着原来方向继续往下走。3.3 从开环 PWM 到 PID 调速只差一个反馈纯 PWM 调速是开环的你设定占空比电机转到对应转速但负载一变转速就掉。比如一个传送带电机空载时占空比 30% 转得挺快放上货物后转速立刻下降。如果对转速精度有要求就得引入闭环控制也就是 PID。PID 调速的工作逻辑是编码器或霍尔传感器实时测量电机转速与目标转速比较得到误差误差经过比例、积分、微分三个环节计算输出一个校正量去调节 PWM 占空比。误差大就加大输出积分项消除稳态误差微分项抑制超调。我自己做过一个简单的闭环实验目标转速 1000 转/分负载从空载加到满载开环状态下转速掉到 700 转/分以下波动大。加上 P 控制后转速恢复到 900 转/分左右但存在稳态误差和轻微震荡。加上 PI 控制后转速稳定在 995 转到 1005 转之间效果非常明显。所以如果你只是做简单调速开环 PWM 就够了但如果你要对转速有要求或者电机负载会变尽早给 PID 留出位置。PID 并不神秘它就是“根据目标与实际的差距自动去改占空比”的一个算法核心是调好 P、I、D 三个参数。4. 在单片机上把 PWM 跑起来以 PA8 输出为例4.1 用 STM32CubeMX 生成 PWM五分钟出波形热词里出现了“pa8输出pwm”和“stm32cubmx配置pwm”这说明大家普遍在用 ST 系列做 PWM 实验。我拿最常见的 STM32F103C8T6 举例PA8 对应的是高级定时器 TIM1 的通道 1CH1。用 STM32CubeMX 配置的流程非常简单打开 CubeMX选好芯片型号配置时钟树系统时钟设为 72MHz。在左侧 Pinout 界面找到 PA8把它选为 TIM1_CH1 功能。左侧选中 TIM1在 Mode 里把 Channel1 选为 PWM Generation CH1。在 Parameter Settings 里设置预分频 PSC、计数周期 ARR 和初始脉冲宽度 Pulse。生成工程MDK 打开在 main 里调用 HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1)代码里改 CCR1 寄存器就能实时调占空比。整个配置过程如果不熟悉 IO 口重映射可能会踩一个坑PA8 和部分其他引脚可能同时出现在多个定时器的复用功能里如果选错了复用功能引脚不出波。CubeMX 里选功能时点一下引脚弹出的列表里第一项往往是 Derived from TIM1_CH1确认别选错。用 CubeMX 的好处是不用对着参考手册翻寄存器位定义图形化操作生成初始化代码对新手极其友好。但我不建议一直只依赖 CubeMX因为实际项目里总有库里没覆盖的型号或者特殊要求到时候还是要回到寄存器层面改。4.2 PWM 模式 1 和模式 2 到底差在哪热词里“pwm模式1和模式2的区别”也是一个高频问题。在 STM32 的定时器里PWM 模式 1 和模式 2 的区别用一句话说比较匹配时输出电平的极性不同。以向上计数为例PWM 模式 1计数器值小于比较寄存器 CCR 时输出有效电平默认高电平计数器值大于等于 CCR 时输出无效电平低电平。这意味着当 CCR 增大时高电平时间变长占空比增大。PWM 模式 2恰好相反。计数器值小于 CCR 时输出无效电平大于等于 CCR 时输出有效电平。CCR 增大时高电平时间变短占空比反而减小。所以在模式 1 下CCR 从 0 到 ARR占空比从 0% 到 100%在模式 2 下CCR 从 0 到 ARR占空比从 100% 到 0%。如果你把模式配置反了写代码时调小 CCR电机不降速反而加速很容易让人摸不着头脑。另外还有一个容易混淆的点有效电平本身还可以通过极性配置反转。你可以把有效电平改为低电平这样模式下输出的初始状态就变了。实际工程里模式 1 用得更多模式 2 多用在需要互补输出的死区配置场景或者外部电路正好需要反向逻辑时。4.3 把频率算明白预分频和自动重载寄存器怎么配PWM 频率的计算公式是频率 定时器时钟 / ((PSC 1) × (ARR 1))占空比 CCR / (ARR 1) × 100%以 STM32F103 为例定时器时钟来自 APB1 或 APB2通常可以到 72MHz。假设 PSC 71ARR 999套进去算频率 72,000,000 / ((711) × (9991)) 72,000,000 / 72,000 1000 Hz。分辨率就是 1/1000 0.1%也就是说占空比可以按千分之一步进调整。如果你需要更高的频率比如 20kHz可以保持同样分辨率推算20,000 72,000,000 / ((PSC1) × (ARR1))选一个组合即可比如 PSC 35ARR 99算出来频率就是 72,000,000 / (36 × 100) 20000 Hz分辨率 1%。这里有一个取舍ARR 越大占空比调节越细腻但频率越低ARR 越小频率越高但调节粒度越粗。做 LED 调光追求细腻ARR 取大一点做电机驱动追求高频降噪ARR 可以小一点。没有固定答案按需求权衡。配置完成后要动态改占空比时可以写__HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, 500);把 500 换成 CCR 值波形立即变化。这个操作在实际项目里非常高频PID 调节输出、呼吸灯效果、电机软启动都是靠它。补充一句热词里提到“hc32f460单片机pwm配置历程”。我用过华大的 HC32F460它的定时器配置思路和 STM32 类似但库函数命名和寄存器映射差异比较大。如果你是从 STM32 转过来建议先把 HC32 的 PWM 例程从头看一遍特别注意它的周期寄存器和比较寄存器的位数、计数方向设置不要想当然直接套 ST 的代码。国产芯片的例程质量参差不齐遇到不懂的地方参考手册一定要翻别只看库函数注释。5. 常见问题与排查技巧实录5.1 波形出不来、亮度不变、电机抖动对症排查列一个我实操中遇到的排查速查表基本覆盖了新手最常碰到的几类问题现象可能原因排查方法引脚无波形输出复用功能没配对、PWM 通道没使能、时钟没开确认 IO 复用功能、检查 HAL_TIM_PWM_Start 返回状态LED 亮度始终不变占空比改的寄存器不对或者没重新加载确认改的是 CCR 不是 ARR确认通道编号电机抖动、异响PWM 频率太低或占空比太小频率提到 10kHz 以上避免低占空比区间单片机一启动电机就复位电源被拉垮、续流缺失加续流二极管、加电源去耦电容、缩短供电线占空比越大转速反而越慢PWM 模式配置反了切换模式 1 / 模式 2电机方向反了接线反了或 H 桥逻辑配反交换电机两根线或交换 H 桥的互补 PWM 逻辑排查问题时有一个万能思路先用万用表量电、用示波器看波形。很多问题其实很简单比如杜邦线接触不良、共地没接好先做基本检查再查芯片配置能省一半时间。拿“电机抖动”举例我接过一个求助说电机在低速时像打鼓一样震动我让他把频率从几百赫兹调到 16kHz问题立刻消失。原因是几百赫兹的 PWM 正好落在电机机械共振范围内电机本体跟着脉冲一起震动频率低到人能听到的程度感官上就是狂抖。这就是频率选择不当造成的典型现象。5.2 官方文档不写的那些坑死区、负载、地线有些坑数据手册里不会特别强调只有实际做项目才会遇到。第一是死区时间。如果你的电机驱动用了 H 桥上下桥臂不能同时导通否则电源直接短路。解决方案是在 PWM 基础上插入死区时间也就是上下桥臂的导通沿之间留出一段空白时间。STM32 的高级定时器支持自动死区插入CubeMX 里就能配。死区太短上下管可能穿通死区太长波形失真电机效率下降。典型取值在几百纳秒到几微秒之间具体看功率管的开关速度。第二是负载反馈。LED 看起来是纯电阻性负载但驱动线长了也有寄生电感高频 PWM 下照样可能振荡。电机就更不用说了感性负载的反电动势尖峰如果不处理什么芯片都能给你打穿。所以在 PCB 布局时续流二极管要尽可能靠近电机端子驱动 MOS 管的门极电阻也要按需串。第三是地线。我有一个印象极深的案例PWM 输出接到电机驱动板驱动板和单片机板用一根杜邦线共地电机一启动单片机就死机。用示波器一看地线上的噪声高达几伏。原因就是共地线太细、太长大电流在地线上产生了压降噪声全部顺着地线窜进单片机。后来我把共地线换成粗短的多股线问题迎刃而解。大电流回路的“地”和信号回路的“地”要分开走最后单点汇合是 PCB 布线的铁律。5.3 扩展话题从风扇温控到故障保护热词里有一句“pwm怎么监控硬盘的温度”看着奇怪但其实是把几件事混在一起说。实际场景是这样的主板上有温度传感器它负责读取硬盘或 CPU 的温度然后根据温度高低调整风扇的 PWM 占空比实现温控调速。也就是说PWM 本身不监控温度它是执行器监控和决策靠传感器和控制器完成。这让我想到一个工程上的通病把反馈和执行混为一谈。做温控风扇时很多新手直接用一个 NTC 热敏电阻加个电位器就去改 PWM 占空比结果温度一变转速完全没有跟着变。正确思路是传感器采集温度 → 控制器做调节算法可以简单写一个查表映射也可以用 PID → 控制器改 PWM 占空比 → 风扇转速变化。链路分明问题才好定位。另一个重要话题是PWM 故障保护。电机堵转、过流、驱动芯片温度过高这些都属于 PWM 驱动系统的异常状态。完善的方案应该有过流检测通过采样电阻或电流传感器监测电流超过阈值后禁止 PWM 输出。堵转检测电机堵转会导致电流持续偏大长时间堵转必须停机或周期性重启尝试否则电机发热烧毁。过热保护驱动芯片内部有温度监测超出阈值后降载或关断。我在实际项目中做过一个直流电机的 PWM 驱动器最初只有在开机时启动一个软件定时器来做“最长运行时间限制”堵转时靠熔断保险丝兜底。后来发现保险丝换得勤改成实时电流采样之后堵转 1 秒内就能切断 PWM整机可靠性明显上了一个台阶。所以 PWM 虽然是个简单的波形生成功能但要真正用好它你需要同时考虑负载特性、保护机制和系统闭环。别把它当成“一个能输出方波的寄存器”那么轻描淡写。结尾写了这么多最后说点实在的。PWM 是我做嵌入式这几年用得最多、也最“出效果”的一个功能不管是点灯、控速、加热、充电还是音频输出几乎都离不开它。但我见过太多人死记配置步骤代码能跑起来就觉得完了一问“为什么占空比能调速”就卡壳。我的建议是拿到一个 PWM 项目别急着抄代码先把负载的时间常数、系统的工作频率、保护电路三件事想清楚。想清楚了之后无论你用的是 STM32、HC32、51 还是其他稀奇古怪的单片机配置流程本质上都是那几步定频率、算周期、设比较值、开通道。波形是死的负载是活的你真正要调的是“负载与波形的匹配关系”。最后再分享一个小技巧手头没有示波器时调 PWM 可以先拿 LED 当调试工具用眼睛观察亮度变化来判断占空比是否跟着程序变。等逻辑通了再切换到电机或功率负载这样能避免很多功率级的“炸机”风险。我在早期学习时用这个小办法避开了好几次 MOS 管冒烟的悲剧希望也能帮到你。
返回列表