1. 脉冲宽度调制(PWM)基础概念与原理

各位同学,咱们今天聊聊PWM。说白了,脉冲宽度调制就是用数字信号去模拟模拟信号的一种手段。我刚开始接触嵌入式那会儿,总觉得这玩意儿有点绕——明明是个方波,怎么就能控制电机转速、调节LED亮度呢?

其实道理很简单。你想想看,一个方波信号,高电平时间占整个周期的比例,我们叫它占空比。改变这个比例,负载感受到的平均电压就变了。电机转得快慢、灯亮暗,本质上都是这个平均电压在起作用。

核心公式:

占空比 D = Ton / T × 100%

平均电压 Vavg = D × Vhigh

其中 Ton 为高电平时间,T 为整个周期,Vhigh 为高电平电压值。

1.1 PWM的三个关键参数

做PWM控制,你绕不开这三个东西:频率、占空比、分辨率。我见过不少新手,上来就调占空比,结果电机嗡嗡响——频率没设对。

参数 定义 典型范围 我的经验
频率 每秒脉冲周期数 50 Hz ~ 几百 kHz 电机用 1~20 kHz,LED 用 >100 Hz 即可
占空比 高电平时间占比 0% ~ 100% 别卡在 0% 或 100% 太久,容易出问题
分辨率 占空比可调的最小步进 8-bit ~ 16-bit 8-bit 够用,但调光细腻度差些

我的小技巧:做电机控制时,我习惯把PWM频率设在 10 kHz 左右。太低会听到啸叫,太高开关损耗就上来了。这个频率是人耳不太敏感、MOSFET又能轻松应付的折中点。

1.2 PWM是怎么产生的?

硬件上,PWM信号通常由定时器生成。定时器里有个计数器,从0一直数到某个上限值(ARR)。还有个比较寄存器(CCR),当计数值小于CCR时,输出高电平;大于等于CCR时,输出低电平。就这么简单。

拿STM32举个例子:

// 假设定时器时钟 72 MHz,预分频 71,ARR = 999
// 那么 PWM 频率 = 72 MHz / (71+1) / (999+1) = 1 kHz
// 占空比 50% 时,CCR = 500

TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71;        // 预分频
htim2.Init.Period = 999;          // 自动重装载值
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&htim2);

TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500;            // CCR = 500,占空比 50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

注意:我曾经在项目里犯过一个低级错误——预分频设成了0,结果PWM频率直接飙到72 MHz,MOSFET烫得能煎鸡蛋。预分频值一定要根据实际需求算清楚,别偷懒。

1.3 PWM的应用场景

PWM这东西,说白了就是个万能工具。我这些年做过的项目里,几乎每个都离不开它。

  • 电机调速:直流电机、步进电机、BLDC,全得靠PWM。占空比越大,转速越高。
  • LED调光:人眼有视觉暂留效应,频率够高就看不到闪烁。我一般用 200 Hz 以上。
  • 开关电源:Buck、Boost电路的核心就是PWM。这里频率和占空比直接影响输出电压纹波。
  • 舵机控制:标准舵机需要 50 Hz 的PWM,占空比 5%~10% 对应 0°~180°。
  • 音频生成:用PWM模拟正弦波,就是所谓的 Class-D 功放原理。

1.4 占空比与平均电压的关系

这个关系其实很直观。假设你有一个 5V 的方波,占空比 60%,那平均电压就是 5V × 60% = 3V。但要注意,负载不是纯阻性的时候,情况会复杂一些。

我做过一个项目,用PWM控制电磁阀。一开始以为占空比50%就能让阀开一半,结果发现阀根本没动——电磁阀有启动阈值电压,低于那个值它根本不工作。所以,平均电压只是参考,实际效果还得看负载特性。

避坑指南:

  • 占空比太低(比如 <5%),很多负载无法启动
  • 占空比太高(比如 >95%),开关管可能过热
  • 频率太低,人耳能听到啸叫,电机也会抖动
  • 频率太高,开关损耗剧增,效率反而下降

1.5 PWM信号的质量指标

做硬件的人都知道,理想方波不存在。实际PWM信号有几个关键指标:

指标 说明 影响
上升时间 信号从10%到90%的时间 太慢会导致开关损耗增加
下降时间 信号从90%到10%的时间 同上,还会产生EMI
过冲/下冲 信号超过目标电压的幅度 可能损坏负载或驱动电路
抖动 脉冲边沿的时间偏差 导致控制精度下降

嗯,这里要注意。我见过有人用示波器看PWM波形,发现上升沿有毛刺,以为是芯片坏了。其实多半是探头接地没做好,或者走线太长。先检查测量方法,再怀疑硬件。

1.6 PWM的核心逻辑框架

下面这张图,是我自己总结的PWM知识体系。你看一遍,应该能对PWM有个整体认识。

PWM 核心知识框架 脉冲宽度调制 (PWM) 频率 占空比 分辨率 定时器生成 比较输出 软件模拟 电机调速 LED调光 开关电源 舵机控制 音频 上升/下降时间 过冲/下冲 抖动

这张图把PWM的三大参数、生成方式、应用场景和质量指标串在了一起。你照着这个框架去理解,后面学优化策略会轻松很多。

我的建议:刚开始学PWM,别急着上复杂电路。拿一块开发板,一个LED,一个示波器,先调出50%占空比的方波看看。亲眼看到波形变化,比看一百页文档都管用。