资讯动态

PWM从原理到STM32实战:LED调光与电机调速全解析

发布时间:2026/10/27 18:06:55 来源:尧图企业网站定制
1. 从一个LED灯说起PWM到底在干什么很多人第一次接触PWM都是在点亮一颗LED的时候。代码里写一句“设置占空比50%”烧录进去灯就变成了半亮。再改成20%灯暗下去改成80%灯又亮起来。整个过程没有改电压没有换电阻只是让一个GPIO引脚以极快的速度在高低电平之间来回切换LED的亮度就跟着变了。这件事第一次看会觉得有点反直觉。电压没变电流峰值也没变凭什么亮度会变答案藏在两个东西里一是人眼的视觉暂留二是LED本身的响应速度。人眼对光强的感知有一个积分效应大概几十毫秒以内的闪烁眼睛分辨不出来只会感知到一个平均亮度。如果引脚以1kHz的频率翻转高电平占一半时间、低电平占一半时间LED实际导通的时间就是总时间的一半平均功率也就是满功率的一半看起来就是半亮。同样的逻辑放到直流电机上效果更直观。给电机加一个恒定的5V它全速转加2.5V它慢速转。但很多单片机的GPIO只能输出高或低没法输出2.5V这种中间电压。PWM就绕开了这个限制让引脚快速地在5V和0V之间切换电机因为自身的机械惯性和电感惯性感受到的是一个平均电压。占空比50%平均电压就是2.5V转速就降下来了。所以PWM的本质是用时间上的“开关比例”去等效一个模拟量。它不需要DAC不需要可调电源只需要一个能快速翻转的GPIO和一个定时器。这也是为什么从LED调光、电机调速、舵机控制、开关电源到背光调节、加热控制PWM几乎无处不在。这篇文章我会把PWM从原理到落地完整走一遍。先讲清楚它为什么能调速、为什么能调光再拆解频率和占空比这两个核心参数怎么选然后落到STM32上用定时器输出PWM的实际配置最后把LED和直流电机两个场景的实操过程、常见坑和排查方法都摊开讲。不管你是刚点亮第一颗LED的新手还是已经在调电机但总遇到抖动、啸叫、发热的老手应该都能从里面找到能直接抄的东西。2. PWM能调速调光的底层逻辑2.1 平均电压与占空比的关系PWM波形其实很简单就是一个方波。一个周期T内高电平持续的时间记作Ton低电平持续的时间记作Toff那么占空比D就是D Ton / T如果高电平电压是Vcc低电平是0V那么一个周期内的平均电压就是Vavg Vcc × D这个公式是PWM所有应用的根。占空比50%平均电压就是Vcc的一半占空比10%平均电压就是Vcc的十分之一。对于LED平均电压近似对应平均电流平均电流对应平均功率平均功率对应亮度。对于直流电机平均电压对应电枢两端的等效电压等效电压决定转速在负载不变的前提下。这里有一个容易被忽略的点平均电压成立的前提是负载对PWM频率“不敏感”。也就是说负载的响应速度要慢于PWM频率。LED的响应在微秒级所以PWM频率要到几百Hz以上人眼才看不到闪烁电机的机械时间常数通常在几十毫秒到几百毫秒所以PWM频率只要几百Hz到几kHz电机就感受不到逐个脉冲的冲击只会感受到平均转矩。反过来说如果PWM频率太低比如给LED用10Hz人眼就会看到明显的闪烁给电机用10Hz电机会一顿一顿地转还会发出明显的噪音。这就是频率选择的第一个约束。2.2 为什么不是直接调电压有人会问既然要调平均电压为什么不直接用DAC输出一个模拟电压或者用可调电阻分压DAC的问题在于成本和效率。很多单片机没有DAC或者DAC通道很少。而且DAC输出的是小信号电压要驱动LED或电机后面还得加功率放大级电路复杂、效率低。用可调电阻分压更不现实电阻上会消耗大量功率发热严重效率极低而且只能手动调没法用程序控制。PWM的优势在于它直接用数字引脚控制功率开关MOSFET或三极管开关要么完全导通、要么完全截止导通时压降很小截止时电流为零所以开关本身的损耗非常低效率可以做到90%以上。这也是为什么开关电源、电机驱动、LED驱动几乎都用PWM而不是线性调节。2.3 频率和占空比各自决定什么PWM有两个核心参数频率和占空比。很多人会把它们混在一起其实它们管的是完全不同的两件事。占空比决定“平均量”的大小。占空比越大平均电压越高LED越亮电机越快。这是调速调光的直接手段。频率决定“开关的快慢”。频率太低负载会表现出脉冲响应LED闪、电机抖、有噪音频率太高开关损耗增加驱动电路可能跟不上EMI也会变差。所以频率的选择要匹配负载特性和驱动能力。应用场景典型PWM频率原因LED调光1kHz ~ 20kHz高于人眼闪烁感知低于驱动电路带宽极限直流电机调速1kHz ~ 20kHz高于听觉范围可减少啸叫低于电机驱动响应极限舵机控制50Hz舵机标准协议要求开关电源几十kHz ~ 几百kHz提高效率、减小电感体积加热控制0.1Hz ~ 10Hz热惯性大不需要高频这张表不是随便定的背后是负载的时间常数和系统的损耗权衡。比如电机用1kHz以下人耳能听到明显的啸叫用20kHz以上MOSFET开关损耗和驱动芯片的发热会明显上升。所以10kHz到16kHz是一个常见的折中区间。3. 频率与占空比怎么选参数背后的取舍3.1 频率选择的三个约束选PWM频率本质上是在三个约束之间找平衡。第一个约束是负载响应速度。负载能不能“跟上”PWM的开关。LED响应快频率可以很高电机机械惯性大频率不能太低热系统惯性更大频率可以很低。如果频率低于负载的响应带宽负载就会表现出脉冲行为而不是平均行为。第二个约束是人耳和人眼的感知范围。人眼对闪烁的感知大概在几十Hz到几百Hz所以LED调光频率要高于这个范围通常1kHz以上就很稳。人耳听觉范围是20Hz到20kHz电机如果在这个范围内开关绕组和机械结构会发出啸叫所以要么低于20Hz但电机会抖要么高于20kHz但损耗增加。实际工程里常用10kHz到16kHz刚好在听觉上限附近既能减少啸叫又不至于损耗太大。第三个约束是驱动电路的开关能力。MOSFET有栅极电容驱动芯片有上升下降时间光耦有响应延迟。如果PWM频率太高驱动波形还没建立起来就被切断了实际占空比会失真开关损耗也会急剧上升。所以频率不能超过驱动电路的能力上限。3.2 占空比分辨率的计算占空比不是无限可调的。它由定时器的计数位数决定。如果定时器是16位ARR自动重装载寄存器最大值是65535那么占空比的分辨率就是1/65536约0.0015%。如果ARR设成999那分辨率就是1/1000即0.1%。分辨率决定了你能把亮度或转速调得多细。对于LED调光人眼对低亮度区的变化更敏感所以低占空比区需要更高的分辨率。如果分辨率不够低亮度区会出现明显的跳变比如从0%直接跳到5%中间没有过渡。计算分辨率很简单分辨率 1 / (ARR 1)比如STM32定时器时钟72MHz预分频PSC71那么计数时钟是1MHz。要得到1kHz的PWM频率ARR 1MHz / 1kHz - 1 999。分辨率就是1/1000即0.1%。这个分辨率对LED调光够用对电机调速也够用。如果要更高分辨率可以降低PWM频率或者提高定时器时钟。比如同样1MHz计数时钟PWM频率降到100HzARR 9999分辨率就是0.01%。但100Hz对LED来说可能偏低会有闪烁风险。3.3 死区与互补输出的场景在一些电机驱动和开关电源场景里会用到互补PWM输出也就是两个通道输出相反的波形用来驱动H桥的上管和下管。这时候必须插入死区时间防止上下管同时导通造成直通短路。死区时间的选择取决于MOSFET的开关速度和驱动电路的延迟。太短了起不到保护作用太长了会损失有效占空比、增加谐波。一般从几百纳秒到几微秒不等需要根据具体器件手册和实测波形来调。STM32的高级定时器如TIM1、TIM8支持硬件死区插入配置BDTR寄存器即可。通用定时器一般不支持互补输出和死区所以驱动H桥时通常选高级定时器。4. STM32上输出PWM的完整实操4.1 定时器与GPIO的对应关系STM32的PWM输出依赖定时器的比较输出功能。每个定时器有四个独立通道每个通道可以映射到特定的GPIO引脚。以常见的STM32F103C8T6为例TIM1的CH1可以映射到PA8或PA9重映射TIM2的CH1可以映射到PA0TIM3的CH1可以映射到PA6。这里有一个关键点不是随便一个GPIO都能输出PWM。只有定时器通道对应的引脚才行。所以选引脚的时候要先查数据手册的“引脚复用表”确认这个引脚有没有定时器通道的复用功能。以PA8输出PWM为例PA8对应TIM1_CH1。配置步骤大致是使能TIM1时钟和GPIOA时钟把PA8配置为复用推挽输出配置TIM1的时基和输出比较通道最后使能定时器。4.2 时基配置PSC和ARR怎么算时基配置决定PWM的频率。公式是PWM频率 定时器时钟 / ((PSC 1) × (ARR 1))假设STM32F103的系统时钟是72MHzTIM1挂载在APB2上时钟也是72MHz。要得到1kHz的PWM频率可以这样算先定PSC。如果PSC71那么计数时钟 72MHz / 72 1MHz。然后ARR 1MHz / 1kHz - 1 999。所以PSC71ARR999得到的PWM频率就是1kHz占空比分辨率是1/1000。如果要10kHz可以保持PSC71ARR改成99分辨率变成1/100。也可以PSC7计数时钟9MHzARR899分辨率1/900。两种方案频率一样但分辨率不同。这就是参数选择时的取舍频率越高同样计数时钟下分辨率越低。4.3 输出比较模式PWM模式1和模式2的区别STM32的定时器输出比较有PWM模式1和PWM模式2两种。它们的区别在于有效电平的定义。PWM模式1计数器小于CCR时输出有效电平大于等于CCR时输出无效电平。 PWM模式2计数器小于CCR时输出无效电平大于等于CCR时输出有效电平。如果有效电平设为高那么PWM模式1下CCR越大高电平时间越长占空比越大。PWM模式2则相反。实际用的时候通常选PWM模式1有效电平设高这样CCR值直接对应高电平时间占空比 CCR / (ARR 1)直观好算。如果驱动的是低电平有效的电路比如某些LED驱动芯片的使能脚可以把有效电平设成低或者用PWM模式2效果一样。4.4 代码实现从寄存器到HAL库用寄存器配置TIM1_CH1输出PWM核心代码大概是这样// 使能时钟 RCC-APB2ENR | RCC_APB2ENR_TIM1EN; RCC-APB2ENR | RCC_APB2ENR_IOPAEN; // 配置PA8为复用推挽输出 GPIOA-CRH ~(0xF 0); GPIOA-CRH | (0xB 0); // 复用推挽50MHz // 时基配置 TIM1-PSC 71; TIM1-ARR 999; TIM1-CCR1 500; // 50%占空比 // 输出比较配置 TIM1-CCMR1 ~TIM_CCMR1_OC1M; TIM1-CCMR1 | (0x6 4); // PWM模式1 TIM1-CCMR1 | TIM_CCMR1_OC1PE; // 预装载使能 TIM1-CCER | TIM_CCER_CC1E; // 使能通道1输出 TIM1-BDTR | TIM_BDTR_MOE; // 高级定时器需要使能主输出 TIM1-CR1 | TIM_CR1_ARPE; // ARR预装载 TIM1-CR1 | TIM_CR1_CEN; // 启动定时器如果用HAL库配置会更简洁TIM_HandleTypeDef htim1; TIM_OC_InitTypeDef sConfigOC; htim1.Instance TIM1; htim1.Init.Prescaler 71; htim1.Init.CounterMode TIM_COUNTERMODE_UP; htim1.Init.Period 999; htim1.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter 0; HAL_TIM_PWM_Init(htim1); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 500; sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim1, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1);改占空比的时候直接改CCR1寄存器或者调用__HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, value)。value的范围是0到ARR对应0%到100%。注意高级定时器TIM1、TIM8必须使能MOE主输出使能否则通道不会有输出。这个坑很多人踩过配置都对了但引脚就是没波形最后发现是BDTR的MOE位没置1。5. LED调光实操从闪烁到平滑亮度5.1 硬件连接与限流电阻计算LED调光是最简单的PWM应用。硬件上LED正极接限流电阻再到电源负极接单片机引脚低电平点亮或者正极接引脚、负极接地高电平点亮。两种接法各有优劣。低电平点亮的好处是单片机引脚的灌电流能力通常比拉电流强能驱动更大的电流。比如STM32的GPIO灌电流最大25mA拉电流最大20mA所以低电平点亮能多带一点。但低电平点亮的逻辑是反的占空比越大反而越暗写代码时要注意。限流电阻的计算假设电源3.3VLED正向压降2.0V目标电流10mA那么电阻 (3.3 - 2.0) / 0.01 130Ω。取标准值130Ω或150Ω。如果目标电流20mA电阻 1.3 / 0.02 65Ω取68Ω。这里要注意PWM调光时LED是断续导通的平均电流是峰值电流乘以占空比。所以如果按峰值电流算限流电阻实际平均亮度会比预期低。通常按峰值电流略高于目标平均电流来选或者直接用示波器测实际波形再调。5.2 频率选择为什么1kHz是甜点LED调光的PWM频率1kHz是一个很常用的甜点值。原因有几个第一1kHz远高于人眼闪烁感知频率约100Hz所以不会看到闪烁。第二1kHz远低于大多数LED和驱动电路的带宽极限波形失真小。第三1kHz下用1MHz计数时钟ARR999分辨率0.1%足够平滑。第四1kHz的开关损耗对LED来说可以忽略。如果频率太低比如100Hz虽然人眼可能勉强看不出闪烁但在快速移动或者用手机摄像头拍的时候会出现明显的条纹。如果频率太高比如100kHz驱动电路的上升下降时间占比变大实际占空比会偏离设定值而且EMI会变差。所以1kHz到5kHz是LED调光的常见区间。如果用的是专用LED驱动芯片频率还要看芯片的PWM调光脚支持范围有些芯片支持几十kHz甚至上百kHz。5.3 占空比渐变实现呼吸灯呼吸灯的本质是让占空比随时间做周期性变化。最简单的做法是在主循环里写一个for循环让CCR值从0加到ARR再从ARR减到0中间加一个延时。while (1) { for (int i 0; i 1000; i) { __HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, i); HAL_Delay(1); } for (int i 1000; i 0; i--) { __HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, i); HAL_Delay(1); } }这样呼吸周期大约是2秒。但用HAL_Delay会阻塞CPU实际项目里更推荐用定时器中断或者RTOS任务来更新CCR值。呼吸灯的平滑度取决于两个因素一是占空比分辨率二是更新频率。分辨率不够低亮度区会跳变更新频率太低亮度变化会卡顿。一般每1ms到10ms更新一次CCR配合0.1%以上的分辨率效果就很顺滑。实操心得人眼对亮度的感知是非线性的近似对数关系。所以线性增加占空比人眼看到的亮度变化是先快后慢。如果想让呼吸灯看起来更均匀可以对占空比做伽马校正或者用查表法输出预校正的亮度曲线。这个技巧在高端LED调光里很常用。6. 直流电机调速实操从转起来到稳下来6.1 电机驱动电路的基本结构单片机GPIO的电流能力通常只有几十毫安驱动不了直流电机。电机启动电流可能是额定电流的几倍甚至十几倍所以必须加驱动电路。常见的方案有三极管驱动适合小功率电机一个NPN三极管加一个续流二极管就行。MOSFET驱动适合中大功率电机导通电阻小效率高。H桥驱动适合需要正反转的场景比如L298N、DRV8833、DRV8323等驱动芯片。不管哪种方案续流二极管都是必须的。电机是感性负载断电瞬间会产生反向电动势没有续流回路的话这个高压会击穿驱动管。所以二极管要反并联在电机两端方向是截止方向。6.2 PWM频率对电机噪音和发热的影响电机调速的PWM频率选择比LED要讲究一些。频率太低电机会有可听啸叫而且转矩脉动大低速时可能转不起来。频率太高MOSFET开关损耗增加驱动芯片发热而且电机绕组的集肤效应和涡流损耗也会上升。实际经验是1kHz到5kHz区间电机会有明显的啸叫10kHz到16kHz区间啸叫基本听不到但驱动芯片会温热20kHz以上啸叫完全没有但驱动芯片发热明显效率下降。所以常见的折中是10kHz到16kHz。如果对噪音要求极高可以用20kHz以上但要选低栅极电荷的MOSFET和强驱动能力的驱动芯片。如果对发热要求极高可以用1kHz以下但要接受啸叫和转矩脉动。PWM频率噪音发热低速性能适用场景1kHz以下明显啸叫低一般对噪音不敏感、大功率1k~5kHz有啸叫较低较好普通调速10k~16kHz轻微中等好常用折中20kHz以上无较高好静音要求高6.3 占空比与转速的非线性关系理论上占空比和平均电压是线性的但转速和平均电压不是严格线性的。原因有几个第一电机有启动死区。占空比太低时平均电压不足以克服静摩擦和负载转矩电机不转。这个死区通常在5%到20%之间取决于电机和负载。第二电机有反电动势。转速越高反电动势越大实际电流越小转矩越小。所以占空比增加到一定程度后转速上升变缓。第三负载特性。如果负载是风扇转矩随转速平方增加那么占空比和转速的关系会更陡。所以实际调电机的时候不能简单地认为占空比50%就是半速。要用编码器或者测速发电机做闭环或者至少在实际负载下测一条占空比-转速曲线用查表法来设定。实操心得调电机的时候先在空载下测一条曲线再在额定负载下测一条两条曲线对比就能看出负载对转速的影响。如果应用对转速精度要求高建议直接上闭环控制用PID调占空比而不是开环给固定占空比。6.4 电机启动与制动中的PWM策略电机启动时如果直接给一个较大的占空比启动电流会很大可能触发驱动芯片的过流保护。所以常见的做法是软启动占空比从0慢慢加到目标值比如用100ms到500ms的斜坡。制动的时候如果直接切断PWM电机会因为惯性继续转产生反电动势。如果驱动电路支持可以用短接制动或者反向PWM制动。短接制动是把电机两端短接反电动势产生的电流形成制动转矩。反向PWM制动是给一个反向的占空比产生反向转矩制动更快但电流更大。这些策略在电机驱动芯片的手册里通常有推荐实际用的时候要根据电机参数和保护要求来选。7. 常见问题与排查技巧实录7.1 PWM没有输出从时钟到引脚的排查顺序PWM配置完了但引脚没波形是最常见的问题。排查顺序建议从时钟开始一路查到引脚。第一步确认定时器时钟使能了。STM32的定时器挂在不同总线上TIM1在APB2TIM2~TIM4在APB1。用HAL库的话HAL_TIM_PWM_Init里会调用__HAL_RCC_TIMx_CLK_ENABLE但如果是寄存器配置要手动使能。第二步确认GPIO时钟使能了而且引脚配置成了复用推挽输出。如果配成了普通推挽输出定时器的波形出不来。第三步确认高级定时器的MOE位使能了。TIM1和TIM8需要TIM_BDTR_MOE置1否则通道输出被强制关闭。第四步确认CCR值不是0或者ARR。CCR0时占空比0%CCRARR时占空比接近100%但可能有一个计数周期的低电平。如果CCR设成了0引脚一直是无效电平看起来就像没输出。第五步用示波器或者逻辑分析仪看波形。万用表测PWM只能测平均电压看不到频率和占空比排查时不够用。7.2 电机抖动、啸叫、发热的归因电机抖动通常和PWM频率太低有关。频率低于电机的机械响应带宽时每个脉冲都会让电机加速减速一次表现出来就是抖动。提高频率到10kHz以上通常能解决。啸叫也是频率问题但更多是听觉范围内的开关频率引起的。1kHz到5kHz最容易听到。提高到16kHz以上或者降到20Hz以下但会抖可以避开。发热要分情况。如果是驱动芯片发热可能是PWM频率太高导致开关损耗大或者驱动电流不够导致MOSFET工作在放大区。如果是电机发热可能是占空比太高、电流过大或者频率太低导致电流纹波大、铜损增加。现象可能原因排查方法解决方向电机抖动PWM频率太低示波器看频率提高到10kHz以上电机啸叫频率在听觉范围改变频率试听提到16kHz以上驱动芯片发热开关损耗大测驱动波形上升下降时间降频或换低Qg MOSFET电机发热电流纹波大测电流波形提高频率或加电感低速不转启动死区逐步增加占空比软启动或闭环7.3 占空比与实际亮度/转速不符的排查有时候设了50%占空比但LED亮度明显不是半亮或者电机转速明显不是半速。原因可能有几个一是有效电平搞反了。如果电路是低电平点亮而PWM配置的是高电平有效那么占空比50%实际输出的是50%低电平亮度关系就反了。二是驱动电路的延迟。如果驱动芯片的上升下降时间占PWM周期的比例较大实际占空比会偏离设定值。比如周期100us上升时间10us那么实际高电平时间会比设定值少10us占空比偏低。三是负载的非线性。LED的亮度和电流不是严格线性电机转速和电压也不是严格线性。这个前面讲过需要用查表或者闭环来校正。四是测量方法的问题。万用表测PWM平均电压如果万用表的带宽不够读数会偏低。示波器测的时候探头衰减和耦合方式也会影响读数。7.4 PWM背光干扰显示的典型场景用PWM调LCD背光的时候有时候会出现屏幕上有横纹、闪烁或者颜色偏。这通常是PWM频率和LCD刷新率产生了拍频或者PWM的开关噪声耦合到了显示信号线上。解决办法有几个一是把PWM频率提高到20kHz以上远离LCD刷新率和人眼感知范围。二是把背光PWM的走线和显示信号线分开减少耦合。三是在背光驱动电路上加LC滤波把PWM波形平滑成近似直流。四是如果背光驱动芯片支持用模拟调光代替PWM调光彻底避开开关噪声。这个坑在嵌入式显示项目里很常见尤其是用ILI9341这类并口屏的时候背光PWM和SPI或者并口信号线挨得近很容易互相干扰。8. 从能用到好用几个进阶方向8.1 用DMA自动更新占空比如果要做复杂的PWM波形比如呼吸灯的多段曲线、电机的S形加减速手动在中断里改CCR会比较占CPU。STM32的定时器支持DMA请求可以在每次更新事件时自动从内存搬一个CCR值到寄存器实现无CPU干预的波形输出。配置方法是把CCR的地址设为DMA目标内存里放一个波形数组DMA循环模式打开定时器的更新事件触发DMA传输。这样CPU只需要准备波形数据剩下的交给DMA和定时器硬件。这个技巧在LED灯效、电机驱动、音频输出里都很有用能大幅降低CPU占用。8.2 互补PWM与死区在电机驱动中的应用驱动H桥的时候上下管不能同时导通。用高级定时器的互补输出功能可以硬件生成一对互补波形并自动插入死区。这样CPU只需要给一个占空比硬件负责生成带死区的互补信号安全又省事。死区时间要按MOSFET的关断时间和驱动电路的延迟来算。一般取关断时间加一点余量比如MOSFET关断时间100ns死区取200ns到500ns。太短了保护不够太长了损失有效占空比。8.3 闭环调速编码器加PID开环PWM调速的精度受负载、温度、电压影响很大。要稳就得加编码器做闭环。编码器测转速和设定值比较误差经过PID运算输出PWM占空比。这样负载变化时PID会自动调整占空比保持转速稳定。PID参数整定是个经验活。先调P让系统有响应但不振荡再加I消除稳态误差最后加D抑制超调。如果系统惯量大P和I要小一点如果要求响应快P和D可以大一点。实际调的时候用示波器看转速波形边调边看。这个方向展开能写很多但核心就是PWM提供执行手段编码器提供反馈PID提供决策。三者配合才能从“能转”做到“转得稳”。8.4 PWM故障保护与监控在一些安全相关的应用里PWM输出需要故障保护。比如电机堵转时电流会急剧上升如果不及时关断PWM驱动管和电机都可能烧掉。STM32的高级定时器支持刹车输入BKIN检测到故障信号时硬件自动关闭PWM输出不需要CPU干预。配置方法是把BKIN引脚接到过流检测电路的输出使能刹车功能设置刹车后的输出状态高阻、低电平或高电平。这样一旦过流硬件在几百纳秒内就能关断PWM比软件中断快得多。这个功能在电机驱动、开关电源里很关键属于“平时用不到用到时救命”的设计。9. 我个人在实际操作中的几点体会PWM这个东西原理简单但真正用好细节都在参数选择和场景适配上。我刚开始调电机的时候觉得占空比50%就是半速结果实测发现低速区根本不转高速区又非线性后来老老实实测了曲线才搞明白。调LED的时候觉得频率随便设结果用手机一拍全是条纹才知道频率和摄像头采样率还有关系。踩过几次坑之后我的习惯是第一任何PWM应用先用示波器看波形确认频率、占空比、上升下降时间都符合预期再往下调。第二电机和LED的参数不要凭感觉实测一条曲线比什么都靠谱。第三遇到抖动、啸叫、发热先查频率再查驱动最后查负载这个顺序能解决大部分问题。还有一个小技巧如果手头没有示波器可以用单片机自己的定时器输入捕获功能来测PWM频率和占空比虽然精度不如示波器但排查基本问题够用了。这个方法在只有一块开发板的时候特别实用。PWM的扩展方向很多从简单的调光调速到复杂的闭环控制、故障保护、DMA波形生成每一个方向都有足够的深度可以挖。但不管走多远核心始终是那个公式平均量等于峰值乘以占空比。把这个想透了剩下的都是工程实现的问题。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑