1. 定时器PWM基础:原理、占空比与频率、STM32输出模式
各位同学好,我是老周。咱们这门课讲的是STM32定时器PWM,第一节课,得先把地基打牢。PWM这东西,说白了就是“方波调压”。你想想看,单片机只能输出高电平或低电平,怎么控制电机转速?怎么调LED亮度?PWM就是答案。
1.1 PWM原理:从方波到模拟量
PWM的全称是Pulse Width Modulation,脉冲宽度调制。核心思想很简单:通过快速开关信号,让负载“感觉”到的是一个平均电压。
举个例子。我手头有个LED,直接接3.3V它最亮,接0V它灭。如果我用一个频率足够高的方波,让它在3.3V和0V之间来回跳,比如70%的时间是高电平,30%是低电平。人眼反应没那么快,看到的就不是闪烁,而是——亮度大约70%的LED。
这里有两个关键参数:
- 频率:方波每秒钟重复的次数,单位Hz。频率越高,控制越平滑,但开关损耗也越大。
- 占空比:高电平时间占整个周期的百分比。占空比50%,平均电压就是50%的供电电压。
核心公式:
平均电压 = 供电电压 × 占空比
占空比 = (高电平时间 / 周期) × 100%
我在项目中遇到过一件事:有个同事用PWM控制风扇,频率设成了50Hz。结果风扇嗡嗡响,噪音特别大。为什么?因为50Hz在人耳可听范围内,线圈在振动发声。后来改成25kHz,世界清净了。这就是频率选择的重要性。
1.2 占空比与频率:一对好搭档
咱们把这两个参数拆开细说。
| 参数 | 定义 | 影响 | 典型值 |
|---|---|---|---|
| 频率 | 每秒脉冲个数 | 控制平滑度、噪声、损耗 | 1kHz ~ 100kHz |
| 占空比 | 高电平时间占比 | 决定平均输出电压/功率 | 0% ~ 100% |
| 周期 | 频率的倒数 | 决定定时器重装载值 | 由频率计算 |
占空比和频率是独立的吗?从数学上讲,是的。但在STM32定时器里,它们共用同一个定时器时钟源和分频系数。我建议你先把频率定下来,再调占空比。否则你改一次频率,占空比就得重新算,很麻烦。
个人习惯:我一般先把频率定在10kHz~20kHz之间。这个范围对电机、LED、蜂鸣器都够用,人耳听不到,开关损耗也不大。除非有特殊要求,否则别低于1kHz,也别高于100kHz。
1.3 STM32定时器PWM输出模式
STM32的定时器很强大。基本定时器(TIM6、TIM7)只能做计时,不能输出PWM。通用定时器(TIM2~TIM5)和高级定时器(TIM1、TIM8)才行。
PWM输出模式有两种:
- 模式1:向上计数时,CNT < CCRx 时输出有效电平,CNT ≥ CCRx 时输出无效电平。
- 模式2:反过来,CNT < CCRx 时输出无效电平,CNT ≥ CCRx 时输出有效电平。
说白了,模式1和模式2就是极性相反。你选哪个?看你的外设需求。比如有源蜂鸣器,高电平驱动,那就用模式1,占空比越大声音越响。如果是低电平驱动的LED,用模式2更顺手。
我画了一张图,帮你理解定时器PWM的生成过程:
流程是这样的:时钟源经过预分频器(PSC)分频后,驱动计数器(CNT)向上计数。计数器从0数到自动重装载值(ARR),然后归零重新开始。在这个过程中,计数器值会不断和捕获比较寄存器(CCRx)比较。当CNT小于CCRx时,输出一种电平;大于等于时,输出另一种电平。这样就生成了PWM波。
我曾经踩过的坑:ARR和CCRx的配置顺序。如果你先改了ARR,再改CCRx,中间那段时间CCRx可能大于ARR,导致PWM输出异常。我建议你先停掉定时器,改完所有参数,再重新使能。或者用影子寄存器机制,在更新事件时同步加载。
1.4 输出模式选择:边沿对齐 vs 中央对齐
STM32定时器还支持两种计数模式:
- 边沿对齐模式:计数器从0到ARR,然后跳回0。这是最常用的模式,占空比调节简单。
- 中央对齐模式:计数器从0到ARR,再从ARR回到0。一个周期内比较两次,PWM频率减半,但对称性更好。
我个人的经验是:90%的场景用边沿对齐就够了。中央对齐模式主要用于电机控制中的互补PWM,需要插入死区时间的时候才用。初学者先别碰中央对齐,容易把自己绕晕。
1.5 快速上手:HAL库配置要点
用HAL库配置PWM,其实就几步:
- 使能定时器时钟
- 配置GPIO为复用功能
- 设置定时器时基结构体(PSC、ARR、计数模式)
- 设置输出比较结构体(模式、极性、CCRx初始值)
- 调用HAL_TIM_PWM_Init()和HAL_TIM_PWM_Start()
代码示例我放在后面章节详细讲,这里先有个概念就行。
避坑指南:启动PWM时,别忘了调用 HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1)。我见过有人只调了Init,没调Start,折腾了半天发现引脚没波形。嗯,这种低级错误我也犯过。
1.6 本章小结
这一节我们讲了PWM的核心原理:通过占空比控制平均电压。频率和占空比是两个独立但相互影响的参数。STM32定时器通过PSC、ARR、CCRx三个寄存器配合,生成精确的PWM波。输出模式有模式1和模式2,本质是极性选择。
下节课咱们直接上手写代码,用HAL库点亮一个呼吸灯。你先把这些概念消化掉,后面实操才不慌。