PWM 简介
PWM(脉冲宽度调制)是一种将信号表示为占空比可变的矩形波的方法。本质上,它利用数字信号的"开"和"关",通过调节脉冲的高电平持续时间(占空比),来控制负载获得的平均电压或功率。
- 脉冲越宽(占空比越大),平均输入电压越高
- 脉冲越窄(占空比越小),平均输入电压越低
下图展示了一个理想电感器在 PWM 电压驱动下的工作示例:

图片来源:网络
尽管输入电压是矩形波脉冲,但随着开关频率的提高,电感中的电流波形会逐渐变得平滑,最终接近正弦波。
应用示例:降低反射式光电开关的功耗
在本示例中,我们使用一个反射式光电开关,并通过 PWM 信号来控制其打开和关闭的时间,从而显著降低其平均功耗。
本示例基于STM32G0系列微控制器,使用STM32CubeMX进行配置,并生成初始化代码。
设计目标
- 每 10 ms 为一个周期
- 光电开关只在其中 100 μs 时间内打开
- 剩余 9.9 ms 处于关闭状态
这样,光电开关的占空比为:
100 μs / 10 ms = 1%
硬件与定时器配置
1. 引脚配置

- C_POS_TX_EN2:用于控制反射式光电开关
- 将该引脚配置为 TIM1 的通道 2(CH2)
2. 定时器模式配置

- 定时器: TIM1
- Clock Source: Internal Clock
- Channel 2: PWM Generation CH2
3. 定时器参数配置

- Prescaler(预分频器): 3 (实际分频值为 4)
- Counter Mode: Up (向上计数)
- Counter Period(自动重装载值): 39999 (对应 10 ms 周期)
- Pulse: 399 (对应 100 μs 高电平时间)
4. 参数计算说明

定时器时钟 TIMPCLK 来源于 PCLK(APB 总线时钟)。 在本配置中,APB 分频系数设置为 1,因此定时器时钟 TIMPCLK 的频率与 PCLK 相同,均为 16 MHz。
-
定时器计数频率计算
-
定时器的时钟频率:16MHz
-
预分频器值:4 (设置值为3,实际分频值为4) 分频后的定时器计数频率为:
计数频率 = 时钟频率 / 预分频器值 = 16MHz / 4 = 4MHz
也就是说,定时器在 1 秒内计数 4,000,000 次。
采用分频的主要原因是: 定时器自动重装载寄存器(ARR)为 16 bit,最大值为 65535。 如果不进行分频,计数器在有限的计数范围内,无法满足 10 ms 周期 的要求。
-
-
PWM周期计算
目标 PWM 周期为 10 ms。
在 4 MHz 的计数频率下,10 ms 内的计数值为:
4,000,000 × 10 ms / 1000 ms = 40,000因此,计数器从 0 计数到 39999,共计 40,000 个计数周期:
ARR = 39999 -
高电平时间(Pulse)计算
目标高电平时间为 100 μs。
在 4 MHz 的计数频率下,100 μs 内的计数值为:
4,000,000 × 100 μs / 1,000,000 μs = 400因此:
计数器从 0 计数到 399 时输出高电平
共计 400 个计数周期:
Pulse = 399
启动定时器与 PWM 输出
代码生成后,main() 函数中会包含 TIM1 的初始化代码。 仍需手动启动定时器和 PWM 输出:
HAL_TIM_Base_Start(&htim1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
输出结果
我们通过检测反射式开关发光管的电压波形,观察 PWM 信号的输出效果:


从示波器截图可以看到,光电开关的发光管在每个 10 ms 周期内仅点亮 100 μs,达到了预期的低功耗效果。