用定时器生成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,达到了预期的低功耗效果。

相关推荐
今天的你比昨天进步了?12 小时前
单片机程序,keil可以正常编译,VScode编译报错处理
vscode·单片机·嵌入式硬件
linbaiwan66612 小时前
42V/50V/60V高耐压OVP保护芯片的应用——PW1600实测70V耐压
嵌入式硬件
嵌入式小站13 小时前
STM32 零基础可移植教程 24:SPI Flash 读数据,先从指定地址读几个字节
chrome·stm32·嵌入式硬件
崇山峻岭之间14 小时前
单片机汉字显示实验
单片机·嵌入式硬件
guygg8814 小时前
基于C# + Halcon的通用ROI绘制工具
stm32·单片机·c#
yugi98783814 小时前
基于 RFID 的智能公交刷卡系统
stm32·嵌入式硬件
点灯小铭14 小时前
基于单片机的雨量检测智能汽车雨刮器模拟系统设计与实现
单片机·嵌入式硬件·汽车·毕业设计·课程设计·期末大作业
三佛科技-1341638421215 小时前
腕式血压计方案开发设计,腕式血压计MCU控制芯片选择
单片机·嵌入式硬件·物联网·智能家居
cici1587415 小时前
C# LAS 点云读取与处理工具
stm32·单片机·c#