☰
PWM调速从LED到电机:STM32定时器配置与实战避坑指南
2026/10/27 18:07:58 网站建设 项目流程

1. 从一个反直觉的现象说起:LED 调光不是"降压",电机调速也不是"降流"

很多人第一次接触 PWM 的时候,脑子里会冒出一个很自然的想法:要让 LED 变暗,把电压调低不就行了?要让电机转慢,把电流减小不就行了?这个思路在电阻分压的世界里确实成立,但一旦你真正动手去调 LED 或者驱动直流电机,就会发现事情完全不是这么回事。

我最早做 LED 调光的时候,试过用可调电阻串在 LED 回路里。灯确实暗下来了,但电阻烫得厉害,而且亮度调节范围很窄,稍微调过头灯就灭了。后来换成用单片机 DAC 输出一个可变的模拟电压去驱动 LED,理论上电压从 3.3V 降到 1.8V,亮度应该平滑变化。实测下来,LED 在某个电压阈值附近突然亮起来,再往上加电压亮度变化又很迟钝,整个调光曲线非常难看。更麻烦的是,DAC 输出的模拟电压在长导线上很容易受干扰,亮度会莫名其妙地抖动。

直到我用上 PWM,才真正理解了"调光"和"调速"的本质。PWM 不去改变电压的幅值,而是改变电压"开"和"关"的时间比例。LED 在"开"的时候是全亮,在"关"的时候是全灭,但只要开关速度足够快,人眼就分辨不出来,看到的是平均亮度。电机也是一样,全压供电时扭矩最大,断电时靠惯性滑行,快速切换之后,电机感受到的是平均电压,转速就跟着变了。

这个思路的妙处在于:功率器件始终工作在"完全导通"或"完全截止"两个状态,不存在中间的高功耗区间。用可调电阻调光,多余的能量全变成热耗散掉了;用 PWM 调光,开关管要么几乎不耗电,要么几乎不压降,效率高得离谱。这就是为什么现在几乎所有的 LED 驱动芯片、电机驱动芯片、甚至开关电源,底层都在用 PWM。

关键词里提到的 STM32、GPIO、定时器、CCU6、DRV8323、步进电机、伺服电机,其实都围绕同一个核心问题:怎么用数字引脚产生一个频率和占空比都可控的方波,然后用这个方波去控制功率器件的通断。这篇文章就从这个最根本的问题出发,把 PWM 调速的来龙去脉讲清楚,顺带把 STM32 上配置 PWM 的实操细节、常见坑点、以及从 LED 到电机的完整链路都过一遍。

2. 占空比、频率、平均电压:PWM 三个参数到底谁在起作用

2.1 占空比决定"平均效果",但不是简单的线性关系

PWM 波形最直观的描述就是占空比,也就是一个周期内高电平时间占总时间的比例。假设供电电压是 12V,占空比 50%,那么负载两端的平均电压就是 6V。这个"平均"是理解 PWM 的第一把钥匙。

但这里有个容易被忽略的细节:平均电压只是从能量角度看的等效值,负载实际承受的是一连串的方波脉冲。对于纯电阻负载,比如一个加热丝,平均电压确实能直接换算成功率。但对于 LED,亮度大致和平均电流成正比,而 LED 的伏安特性是非线性的,所以占空比和亮度之间并不是完美的直线关系。对于直流电机,转速和平均电压的关系也受负载转矩、反电动势、摩擦力的影响,空载和带载时的调速曲线完全不一样。

我在实际调 LED 背光的时候发现,占空比从 0% 加到 10%,亮度变化非常明显;但从 80% 加到 100%,肉眼几乎看不出差别。这是因为人眼对亮度的感知近似对数关系,同时也和 LED 本身的非线性有关。所以如果你要做精细的调光体验,最好在软件里做一次伽马校正,把线性占空比映射成感知上均匀的亮度曲线。

2.2 频率选低了会闪,选高了会发热,中间有个甜区

PWM 频率的选择是另一个关键决策。频率太低,LED 会肉眼可见地闪烁,电机也会听到明显的啸叫;频率太高,开关损耗会上升,驱动芯片可能发热,EMI 也会变差。

对于 LED 调光,人眼的闪烁融合频率大概在 60Hz 到 100Hz 之间。理论上超过 100Hz 人眼就感觉不到闪烁了,但实际使用中,如果 LED 或者摄像头在移动,低频 PWM 会产生"频闪条纹"。我一般会把 LED 调光频率设在 1kHz 以上,这样既不会闪,也不会让驱动电路太吃力。有些高端背光会用到 20kHz 以上,主要是为了避开音频范围,防止电感或者陶瓷电容产生可听噪声。

对于直流电机,PWM 频率的选择更讲究。有刷直流电机在低频 PWM 下(比如 1kHz 以下)会听到明显的"嗡嗡"声,因为电机绕组在脉冲电流下会产生机械振动。频率提高到 15kHz 到 20kHz 以上,就超出了人耳听觉范围,电机运行会安静很多。但频率太高也有代价:MOSFET 的开关损耗和栅极驱动损耗都会增加,如果驱动能力不足,波形会变形,电机反而转得不稳。

下面这张表是我在实际项目中总结的常见负载对应的 PWM 频率范围,可以作为选型参考:

负载类型推荐频率范围主要考虑因素
LED 指示灯1kHz - 5kHz避免可见闪烁,兼顾驱动简单
LED 背光20kHz 以上避开音频噪声,防止摄像头频闪
有刷直流电机15kHz - 25kHz超出听觉范围,减少啸叫
步进电机20kHz - 40kHz配合细分驱动,减少振动
加热丝1Hz - 100Hz热惯性大,低频即可
开关电源100kHz - 1MHz减小电感体积,提高动态响应

2.3 平均电压只是表象,电感电流连续性才是电机调速的核心

很多人用"平均电压"来解释电机调速,这个说法在宏观上没错,但容易让人忽略一个关键问题:电机绕组是电感性的,电流不能突变。PWM 加在电机上,电流并不是方波,而是三角波或者近似直流。

当 PWM 频率足够高,且电机电感量足够大时,电流纹波很小,电机感受到的几乎是平滑的直流电流,转速和占空比近似线性。但如果频率太低或者电感太小,电流会断续,电机的转矩会脉动,低速时甚至会出现"一顿一顿"的现象。

我在驱动一个小型有刷直流电机时,一开始用 1kHz 的 PWM,电机低速时抖得很厉害,还伴随刺耳的噪声。后来把频率提到 20kHz,同时确认驱动 MOS 的栅极电阻没有过大,电机立刻就顺滑了。这个经历让我明白:PWM 调速不是简单地给一个方波就行,频率、驱动能力、负载特性三者必须匹配。

3. 从 GPIO 到定时器:STM32 上产生 PWM 的完整链路

3.1 为什么不能直接用 GPIO 翻转来产生 PWM

初学者最容易想到的办法是用 GPIO 配合延时函数,手动把引脚拉高、延时、拉低、再延时,循环往复。这个方法在 51 单片机上很常见,但在 STM32 上用来做调速就力不从心了。

问题出在 CPU 占用和精度上。手动翻转 GPIO 需要 CPU 全程参与,一旦程序里有其他任务,比如按键扫描、串口通信,PWM 的周期就会抖动。而且用软件延时产生的 PWM 频率很低,通常只有几百赫兹到几kHz,占空比调节的分辨率也很粗糙。对于 LED 调光可能勉强够用,但对于电机调速,尤其是需要高频低噪声的场合,完全不够看。

STM32 的正确做法是使用定时器的 PWM 输出模式。定时器硬件自己计数、自己比较、自己翻转引脚,CPU 只需要在初始化时配置好寄存器和占空比,之后就可以去干别的事情。这就是硬件 PWM 和软件 PWM 的本质区别。

3.2 定时器是怎么"顺便"输出 PWM 的

STM32 的通用定时器和高级定时器都带有 PWM 输出功能。以最常见的 TIM1、TIM2、TIM3、TIM4 为例,每个定时器有四个独立通道,可以分别输出四路 PWM。

定时器的核心是一个计数器,它按照设定的时钟频率从 0 数到自动重装载值(ARR),然后归零重新开始。这个 ARR 决定了 PWM 的周期,也就是频率。每个通道还有一个比较寄存器(CCR),当计数器的值小于 CCR 时,输出高电平;大于 CCR 时,输出低电平。这样,CCR 和 ARR 的比值就决定了占空比。

用公式表示就是:

  • PWM 频率 = 定时器时钟 / ((ARR + 1) * (PSC + 1))
  • 占空比 = CCR / (ARR + 1)

其中 PSC 是预分频器。举个例子,如果定时器时钟是 72MHz,想要 20kHz 的 PWM 频率,可以设 PSC = 0,ARR = 3599,因为 72MHz / 3600 = 20kHz。如果想让占空比分辨率更高,可以把 PSC 设大一点,ARR 设得更大,比如 PSC = 71,ARR = 49999,这样频率还是 20kHz,但占空比可以细调 50000 个档位。

这里有个经验:ARR 越大,占空比分辨率越高,但频率会降低;PSC 越大,频率越低,但分辨率不变。实际配置时,先确定需要的频率,再在频率和分辨率之间做权衡。对于 LED 调光,1000 级分辨率足够了;对于电机调速,如果要做闭环控制,可能需要 2000 级以上。

3.3 PA8 输出 PWM 的完整配置过程

PA8 是 STM32 上很常用的一个引脚,它对应 TIM1 的通道 1。下面以 STM32F103 为例,把 PA8 输出 PWM 的配置过程完整走一遍。

第一步是使能时钟。TIM1 是高级定时器,挂在 APB2 总线上,PA8 作为 GPIO 也挂在 APB2 上,所以需要同时使能 GPIOA 和 TIM1 的时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);

第二步是配置 GPIO。PA8 要设置为复用推挽输出模式,因为 PWM 信号是由定时器外设产生的,不是普通 GPIO 输出。

GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);

第三步是配置定时器时基。这里设定 PSC 和 ARR,决定 PWM 频率。

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 3599; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

第四步是配置 PWM 输出通道。这里要设置 PWM 模式、输出极性、使能输出。

TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 1800; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

第五步是使能定时器。高级定时器 TIM1 还需要额外使能主输出,否则引脚不会有波形。

TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE);

这套流程跑通之后,PA8 上就会出现 20kHz、占空比 50% 的方波。如果你用的是 STM32CubeMX,这些配置都可以在图形界面里点出来,生成的 HAL 库代码结构类似,只是函数名换成了 HAL_TIM_PWM_Init 和 HAL_TIM_PWM_ConfigChannel。

3.4 PWM 模式 1 和模式 2 的区别,以及什么时候该用哪个

STM32 的 PWM 输出有两种模式:PWM 模式 1 和 PWM 模式 2。很多教程只提模式 1,导致有人遇到"为什么我的波形反了"的时候一头雾水。

简单说,PWM 模式 1 是"计数器小于 CCR 时输出有效电平",PWM 模式 2 是"计数器小于 CCR 时输出无效电平"。配合输出极性设置,可以实现四种组合。实际使用中,模式 1 加高极性是最常见的配置,输出的是正逻辑 PWM:占空比越大,高电平时间越长。

那什么时候需要模式 2 呢?一种情况是驱动低电平有效的负载,比如某些共阳极 LED 或者低边开关。另一种情况是做互补输出时,需要两路波形严格反相。还有就是在调整死区时间的时候,模式的选择会影响死区插入的位置。

我个人的习惯是:先用模式 1 加高极性把电路跑通,如果发现逻辑反了,优先检查硬件驱动电路的电平要求,而不是急着改 PWM 模式。因为改模式会让代码可读性变差,而硬件上的反相器或者上拉电阻往往更直观。

4. LED 调光实战:从闪灯到平滑调光的几个关键坎

4.1 LED 驱动方式选错了,PWM 再好也白搭

PWM 调光的效果,很大程度上取决于 LED 的驱动电路。常见的驱动方式有三种:直接 GPIO 驱动、三极管或 MOS 低边驱动、专用 LED 驱动芯片。

直接 GPIO 驱动最简单,但 STM32 的 GPIO 输出电流有限,通常只有 20mA 左右,只能点亮小功率指示灯。而且 GPIO 有内阻,多个 LED 并联时亮度不一致。我早期用 GPIO 直接驱动 LED,发现不同颜色的 LED 亮度差异很大,后来才知道是因为不同颜色的正向压降不同,导致电流差异。

三极管或 MOS 低边驱动是最常用的方案。PWM 信号加到三极管基极或者 MOS 栅极,控制 LED 回路的通断。这里有个关键点:三极管是电流驱动,基极需要限流电阻;MOS 是电压驱动,栅极需要充放电回路。如果 PWM 频率较高,MOS 的栅极电容会导致波形边沿变缓,需要选择合适的栅极电阻。

专用 LED 驱动芯片,比如恒流驱动 IC,内部集成了功率管和电流检测,PWM 信号直接输入使能脚或者 FB 脚。这类芯片的好处是电流恒定,亮度一致性好,而且支持较高的 PWM 频率。关键词里提到的"LED 驱动器芯片 FB CS 脚调整",说的就是通过反馈脚或者电流检测脚来设定 LED 电流,PWM 则用来调节平均电流。

4.2 为什么 51 单片机驱动 LED 时不能采用输出高电平的方式

这是一个很经典的问题,关键词里也提到了。51 单片机的 GPIO 是准双向口,内部结构决定了它拉低能力强、拉高能力弱。输出低电平时,引脚可以吸收十几毫安电流;输出高电平时,只能提供很微弱的电流,通常不足以点亮 LED。

所以用 51 单片机驱动 LED,标准做法是"低电平点亮":LED 阳极接 VCC,阴极通过限流电阻接 GPIO。GPIO 输出低电平,LED 导通;输出高电平,LED 熄灭。如果反过来接,LED 要么不亮,要么亮度极低。

STM32 的 GPIO 是真正的推挽输出,拉高和拉低能力对称,所以高电平点亮和低电平点亮都可以。但在实际设计中,我仍然倾向于低边驱动,因为很多驱动芯片和 MOS 管的低边接法更简单,而且共地设计更方便。

4.3 调光曲线不平滑?试试伽马校正

前面提到,占空比和 LED 亮度不是线性关系。如果你直接用线性占空比去调光,会发现低亮度区域变化太快,高亮度区域变化太慢。解决方法是做伽马校正,把线性占空比映射成感知上均匀的亮度值。

具体做法是建立一个查找表,把 0 到 100 的亮度等级映射到 0 到 ARR 的占空比。映射公式可以用指数函数:

duty = (uint16_t)(ARR * pow(brightness / 100.0, 2.2));

其中 2.2 是常用的伽马值,可以根据实际观感微调。如果单片机资源紧张,也可以用分段线性近似,把曲线分成几段,每段用不同的斜率。

我在做一款台灯调光的时候,一开始没做伽马校正,用户反馈"低亮度调不了,一调就太亮"。加上伽马校正之后,调光手感立刻好了很多,从最暗到最亮整个过程都很顺滑。

4.4 PWM 背光干扰显示的问题怎么排查

关键词里有个"PWM 背光干扰显示",这是液晶屏背光调光时经常遇到的问题。现象是屏幕出现横向条纹、闪烁,或者摄像头拍照时出现滚动条纹。

根本原因通常是 PWM 频率和液晶屏的刷新率、行频产生了拍频,或者 PWM 的快速边沿通过电源和地耦合到了显示信号上。排查的时候可以分几步走:

先确认干扰是传导还是辐射。把背光电源和显示电源分开供电,如果干扰消失,说明是电源耦合。如果还在,可能是辐射耦合或者地弹。

然后调整 PWM 频率。把频率从 1kHz 改到 20kHz,或者反过来,观察条纹是否变化。如果条纹滚动速度变了,说明是拍频问题,需要把 PWM 频率设成刷新率的整数倍或者远离刷新率。

最后检查 PCB 布局。PWM 走线要远离模拟信号和高速信号,背光驱动的地回路要短而粗,必要时加磁珠或者 RC 滤波。我在一个项目里遇到背光干扰 SPI 屏的问题,最后发现是背光 MOS 的源极和屏的地共用了一段细走线,改成分开走线并在单点接地之后,干扰就消失了。

5. 直流电机调速:从开环到闭环,PWM 只是第一步

5.1 有刷直流电机的 PWM 驱动电路怎么搭

有刷直流电机的 PWM 驱动,核心是一个 H 桥电路。H 桥由四个开关管组成,通过控制对角开关管的通断,可以实现正转、反转、刹车、滑行四种状态。PWM 信号加到其中一个对角管上,另一个对角管常通,就可以调速。

常见的 H 桥驱动芯片有 L298N、DRV8833、DRV8323 等。关键词里提到的 DRV8323 是 TI 的一款三相栅极驱动器,主要用于无刷电机,但也支持有刷电机的半桥模式。这类芯片内部集成了栅极驱动、电流检测、保护电路,使用起来比分立 MOS 方便很多。

搭电路的时候有几个坑要注意。第一是死区时间,H 桥的上下管不能同时导通,否则会直通短路。专用驱动芯片内部通常有死区插入,但如果用分立 MOS 自己搭,必须在软件或者硬件上保证死区。第二是续流回路,电机关断时电感电流需要续流,否则会产生高压尖峰击穿开关管。H 桥的体二极管或者外部续流二极管就是干这个的。第三是电源去耦,电机启动和换向时电流变化剧烈,电源上要并大容量电解电容和陶瓷电容。

5.2 开环调速为什么低速不稳,闭环怎么补

开环 PWM 调速就是给定一个占空比,电机转到什么速度就是什么速度。空载时转速和占空比大致成正比,但一旦加上负载,转速就会下降。负载变化越大,转速波动越明显。

要解决这个问题,需要引入闭环控制。最常见的是用编码器或者霍尔传感器测速,把实际转速反馈给控制器,控制器根据误差调整 PWM 占空比。这就是经典的 PID 控制。

我在做一个小车项目时,一开始用开环调速,小车直行时左右轮转速不一致,走不了直线。后来加了编码器做闭环,用增量式 PID 调了两天参数,小车终于能走直线了。PID 参数整定的经验是:先调 P,让系统有响应但不振荡;再加 I,消除稳态误差;最后加 D,抑制超调。如果电机响应慢,P 可以大一点;如果电机容易振荡,D 要加一点。

5.3 步进电机和伺服电机的 PWM 控制有什么不同

步进电机和伺服电机的控制方式和有刷直流电机完全不同。步进电机是按步转动的,PWM 通常用来做细分驱动,也就是用 PWM 控制绕组电流的大小,让电机在两个整步之间平滑过渡。关键词里提到的"五线四相步进电机 STM32",就是典型的步进电机应用。

伺服电机内部有闭环控制器,外部只需要给位置指令或者速度指令。PWM 在伺服系统里通常用来产生指令信号,比如航模舵机就是用 PWM 的脉宽来表示角度,1ms 对应最小角度,2ms 对应最大角度。工业伺服更多用总线通信,比如 CAN 或者 EtherCAT,PWM 反而用得少。

关键词里还有"STM32 控制伺服电机 485",这说的是用 RS485 总线发送指令控制伺服驱动器。这种方案在工业现场很常见,因为 RS485 抗干扰能力强,传输距离远,可以挂多个从站。

5.4 PWM 故障保护:别等电机烧了才想起来

PWM 驱动电机,尤其是大功率电机,必须考虑故障保护。常见的故障有过流、过压、欠压、过热、堵转。

过流保护最简单的方法是在电源回路上串一个采样电阻,用 ADC 采集电压,超过阈值就关闭 PWM。专用驱动芯片通常有电流检测输出,可以直接接到单片机的比较器或者 ADC。STM32 的高级定时器 TIM1 和 TIM8 有刹车输入功能,一旦刹车引脚被触发,硬件会立刻关闭 PWM 输出,不需要 CPU 干预。这个功能在过流保护里非常有用,响应速度比软件快得多。

堵转保护也很重要。电机堵转时电流会飙升到额定电流的好几倍,如果保护不及时,电机和驱动管都会烧。我见过一个案例,一个小车电机被卡住,操作者没注意,几秒钟之后驱动 MOS 就冒烟了。后来加了电流检测和刹车功能,再遇到堵转,驱动器会立刻切断输出并报警。

6. 那些年我在 PWM 上踩过的坑和总结出的经验

6.1 占空比设了但没输出,先查这三个地方

PWM 配置完了,示波器一测没波形,这是新手最常遇到的问题。我总结下来,九成以上的原因出在三个地方。

第一是高级定时器的主输出没使能。TIM1、TIM8、TIM15、TIM16、TIM17 这些高级定时器,除了常规的 TIM_Cmd 之外,还需要调用 TIM_CtrlPWMOutputs 使能主输出。很多人只记得 TIM_Cmd,结果引脚一直没波形。

第二是 GPIO 模式配错了。PWM 输出引脚必须配成复用推挽,如果配成普通推挽输出,定时器的信号根本到不了引脚。如果配成复用开漏,没有外部上拉的话也测不到高电平。

第三是时钟没使能或者引脚映射不对。STM32 的定时器通道和 GPIO 引脚之间有固定的映射关系,有些引脚还可以通过重映射切换。如果引脚选错了,或者重映射没配置,波形自然出不来。

6.2 占空比改了但电机没反应,可能是频率太低或者驱动不足

有时候 PWM 波形在示波器上看是正常的,但电机就是不转或者转速不变。这种情况通常不是 PWM 本身的问题,而是驱动电路的问题。

一种可能是 PWM 频率太低,电机电流断续严重,平均转矩不够。尤其是小电感电机,低频 PWM 下电流纹波很大,有效值反而下降。把频率提高到 15kHz 以上,往往能明显改善。

另一种可能是驱动管的栅极驱动能力不足。MOS 的栅极电容在每次开关时都需要充放电,如果驱动电流太小,开关过程会变慢,MOS 工作在线性区的时间变长,功耗增加,甚至发热烧毁。这时候需要减小栅极电阻或者加专用栅极驱动芯片。

还有一种可能是电源功率不够。电机启动瞬间电流很大,如果电源限流或者内阻大,电压会被拉低,PWM 占空比再大也没用。这时候需要换更大功率的电源,或者在电源端并大电容。

6.3 用示波器看 PWM 波形时要注意的细节

调试 PWM 的时候,示波器是最好的朋友。但用示波器看 PWM 也有讲究。

首先要注意探头的地线。示波器探头的地线夹要尽量短,最好用弹簧地针,否则长地线会引入振铃,让你误以为波形有问题。尤其是在看高频 PWM 的边沿时,地线环路的影响非常明显。

其次要注意带宽限制。如果示波器带宽不够,高频 PWM 的边沿会被平滑掉,看起来上升沿很慢,实际上可能是探头或者示波器的问题,不一定是电路的问题。

最后要注意测量点。测 GPIO 引脚和测负载两端的波形可能完全不同。GPIO 引脚上是干净的方波,负载两端可能因为电感效应出现尖峰和振铃。判断驱动电路是否正常,要看负载两端的波形,而不是只看引脚。

6.4 从 LED 到电机,PWM 调速的通用思路

回过头来看,PWM 调速的核心逻辑其实很简单:用数字方式控制平均功率。LED 和电机的区别只在于负载特性不同,一个主要是电阻性加非线性,一个是电感性加机械惯性。

掌握了这个核心,剩下的就是具体问题具体分析。LED 调光关注的是闪烁、亮度曲线、驱动方式;电机调速关注的是频率、电流连续性、闭环控制、故障保护。但底层都是同一个定时器,同一个占空比寄存器,同一个"开"和"关"的哲学。

我在实际项目中越来越觉得,PWM 是嵌入式开发里性价比最高的技术之一。它不需要昂贵的 DAC,不需要复杂的模拟电路,只需要一个定时器和几个寄存器,就能实现精确的功率控制。从调一个 LED 的亮度,到控制一台电机的转速,再到开关电源的稳压,背后都是同一个原理在支撑。

如果你刚开始学 STM32,我建议从 PA8 输出 PWM 点亮一个 LED 开始,把频率、占空比、模式这几个参数都改一改,用示波器看一看波形变化。然后接一个电机驱动模块,感受一下占空比和转速的关系。最后加上编码器和 PID,做一个能稳速的小系统。这一套走下来,PWM 的里里外外你就都摸透了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询