用定时器生成PWM信号

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,达到了预期的低功耗效果。

相关推荐
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11014 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元4 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133974 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315204 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
古译汉书4 天前
【IoT死磕系列】Day 7:只传8字节怎么控机械臂?学习工业控制 CANopen 的“对象字典”(附企业级源码)
数据结构·stm32·物联网·http
Alaso_shuang4 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟4 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126914 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315204 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机