3. PWM基础:从原理到实战

说到PWM,我最早接触它是在做电机调速的项目。那时候刚毕业,看着示波器上跳动的方波,心里直犯嘀咕——这玩意儿怎么就能控制转速呢?后来搞明白了,其实原理特别简单。

3.1 PWM的三个核心参数

PWM,全称是脉冲宽度调制。说白了,就是让数字信号模拟出模拟效果。你想想看,单片机只能输出高电平和低电平,但通过快速切换,就能"骗"过我们的眼睛和耳朵。

三个参数必须搞明白:

  • 频率:一秒内高低电平切换的次数。单位是Hz。频率越高,控制越平滑,但CPU负担也越大。
  • 占空比:高电平时间占整个周期的比例。比如50%占空比,就是一半时间高,一半时间低。
  • 分辨率:占空比能调节的精细程度。比如8位分辨率,就是0-255共256级。

核心公式

频率 = 定时器时钟 / (ARR + 1) / (PSC + 1)

占空比 = CCR / (ARR + 1) × 100%

分辨率 = log2(ARR + 1) 位

我在项目中遇到过一个问题:用PWM控制LED呼吸灯,频率设得太低(比如50Hz),肉眼就能看到闪烁。后来我习惯把频率设在1kHz以上,人眼就完全感觉不到了。

3.2 STM32的PWM输出模式

STM32提供了两种PWM模式,我刚开始用的时候也搞混过。

模式 计数方向 输出电平变化 典型应用
PWM1 向上计数 CNT < CCR时有效,CNT ≥ CCR时无效 电机调速、LED调光
PWM2 向上计数 CNT < CCR时无效,CNT ≥ CCR时有效 特殊波形需求

嗯,这里要注意:PWM1和PWM2其实就是极性相反。我个人习惯用PWM1模式,因为更符合直觉——CCR值越大,占空比越大。

3.3 关键寄存器详解

配置PWM,离不开这几个寄存器。我当年啃手册的时候,就是靠它们一个个试出来的。

TIMx_CCMRx:捕获/比较模式寄存器

这个寄存器决定通道的工作模式。要输出PWM,必须设置OCxM位为110(PWM1模式)或111(PWM2模式)。

// 设置TIM3的通道1为PWM1模式
TIM3->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2;  // OC1M = 110
TIM3->CCMR1 |= TIM_CCMR1_OC1PE;  // 使能预装载

TIMx_CCER:捕获/比较使能寄存器

这里控制PWM输出的开关和极性。CCxP位决定输出极性,CCxE位使能输出。

// 使能TIM3通道1输出,极性为高电平有效
TIM3->CCER |= TIM_CCER_CC1E;  // 使能输出
// TIM3->CCER |= TIM_CCER_CC1P;  // 如果需要反相,取消注释这行

TIMx_CCRx:捕获/比较寄存器

这就是我们常说的"占空比寄存器"。写入的值直接决定占空比大小。

// 设置占空比为50%(假设ARR=999)
TIM3->CCR1 = 500;  // 占空比 = 500/1000 = 50%

我的小技巧:调试时先用固定值测试,比如CCR设为ARR的一半。如果输出波形不对,先检查CCER的使能位,再检查CCMR的模式配置。我曾经花了一下午,结果发现是忘了使能GPIO的复用功能。

3.4 频率与分辨率的权衡

这是PWM设计中最让人头疼的问题。你想想看,定时器的时钟是固定的,ARR和PSC共同决定了频率和分辨率。

举个例子:STM32F103的定时器时钟是72MHz。

  • 想要20kHz的PWM频率:ARR = 3599,PSC = 0,分辨率 = log2(3600) ≈ 11.8位
  • 想要1kHz的PWM频率:ARR = 71999,PSC = 0,分辨率 = log2(72000) ≈ 16.1位

看到了吗?频率越低,分辨率越高。但频率太低又会导致控制不平滑。

避坑指南:我曾经在一个伺服电机项目中,为了追求高分辨率把频率降到了500Hz。结果电机低速运行时抖动得厉害。后来我查资料才发现,电机驱动的PWM频率至少要10kHz以上,否则绕组电流纹波太大。

我的建议是:

  1. 电机控制:10kHz-20kHz,分辨率10-12位就够了
  2. LED调光:1kHz-5kHz,分辨率8-10位
  3. 音频应用:20kHz以上,分辨率至少12位

如果实在需要高分辨率又高频率,可以考虑用定时器的DMA功能或者高级定时器的互补输出。不过那是后话了。

3.5 知识体系总览

下面这张图是我自己总结的PWM知识框架,帮你理清思路:

PWM核心概念 频率 (Hz) 占空比 (%) 分辨率 (位) TIMx_CCMRx TIMx_CCER TIMx_CCRx PWM1模式 (向上计数) PWM2模式 (向上计数) 频率 ↑ → 分辨率 ↓ 频率 ↓ → 分辨率 ↑ 电机控制 LED调光 音频输出 舵机控制

这张图把PWM的知识点串起来了。从核心参数到寄存器配置,再到模式选择和实际应用,每一步都环环相扣。你调试的时候,按照这个流程走,基本不会出大问题。

好了,PWM的基础就讲到这里。记住三个参数、两个模式、三个寄存器,再加上频率和分辨率的权衡,你就掌握了PWM的核心。下一节我们会在代码里把这些配置跑起来,到时候你就能亲眼看到PWM波形了。


公众号:蓝海资料掘金营,微信deep3321