PWM波形生成

1. PWM波形介绍

PWM(Pulse Width Modulation,脉冲宽度调制)是一种通过调节方波信号的 占空比(Duty Cycle) 来控制能量输出的技术。它的基本特性包括:

  • 占空比(Duty Cycle):高电平时间占整个周期的比例,决定了平均输出功率,计算公式: $D=\frac{T_{\text{high}}}{T_{\text{total}}} \times 100%$
  • 其中 $T_{\text{high}}$是高电平持续时间,$T_{\text{total}}$ 是PWM周期。
  • 频率(Frequency):PWM波形的周期倒数,决定了PWM的切换速度。

PWM广泛用于:

  • 模拟信号模拟(例如调光、调速)
  • 数字信号传输(例如红外遥控)
  • 功率控制(例如电机调速、LED亮度调节)

2. PWM是否是数字信号模拟模拟信号?

PWM 是 数字信号的模拟输出,但它本身仍是 数字信号,因为它只有高低两个电平(0和1)。当PWM波形作用在负载(如LED或电机)上,负载的 响应(如电机的转速、LED的亮度)会与占空比成正比,表现出类似于模拟信号的效果。例如:

  • LED调光:人眼对光的响应是滞后的,高速PWM(>1kHz)调节LED亮度时,人眼感受到的是平滑的亮度变化。
  • 电机调速:PWM控制电机时,电机由于惯性无法瞬时响应脉冲变化,而是根据占空比调整平均电压,从而改变转速。

因此,PWM本质上是数字信号,但可以用于模拟信号的控制和仿真


3. STM32使用定时器生成PWM

STM32的PWM通常由通用定时器(TIMx)高级定时器(TIM1/TIM8) 生成,基本步骤如下:

3.1. 选择一个定时器(如TIM2)

不同的STM32型号有不同的定时器,可以查看数据手册选择合适的定时器和通道。

3.2. 计算PWM参数

设定:

  • PWM频率: $f_{\text{PWM}} = \frac{f_{\text{timer\_clock}}}{(PSC+1) \times (ARR+1)}$ 其中:
    • $f_{\text{timer\_clock}}$ 是定时器时钟频率(通常是 APB1/APB2 时钟)
    • PSC(预分频器)降低定时器计数频率
    • ARR(自动重装值)决定PWM周期
  • 占空比: $CCR=D×ARR$ 其中 CCR(比较值)决定高电平持续时间。

3.3. 配置STM32定时器

使用STM32 HAL库或寄存器编程:

  • 初始化定时器
  • 配置PWM模式
  • 设置占空比
  • 启动PWM输出

示例代码(基于 STM32 HAL库)

假设我们使用 TIM2 通道1(PA0引脚) 生成 1kHz 的 PWM,50

TIM_HandleTypeDef htim2;

void PWM_Init(void) {
    __HAL_RCC_TIM2_CLK_ENABLE();  // 使能TIM2时钟

    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 71;   // 预分频,假设时钟 72MHz,分频后 1MHz
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 999;     // ARR = 999,对应 1kHz PWM
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    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;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);

    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // 启动PWM
}

4. 使用CubeMX配置PWM

4.1. 使能 TIMx 定时器

  • “Pinout & Configuration” 选项卡中:
    • 找到 TIM2(或其他可用的定时器)。
    • 展开 TIM2,勾选 PWM Generation CH1(或其他通道)。
    • STM32CubeMX 会自动将对应的 GPIO(如 PA0)设置为 Alternate Function 模式。

4.2. 配置 PWM 参数

  • 进入 “Configuration” 选项卡,找到 TIM2
    1. “Parameter Settings” 里设置:
      • Prescaler(预分频器):计算方法:$\text{PSC} = \frac{f_{\text{APB1}}}{\text{计数时钟}} – 1$如果 APB1 时钟是 72MHz,想让计数时钟为 1MHz,则 PSC = 71
      • Counter Mode 设为 Up(向上计数)。
      • Auto-Reload Register (ARR)
        • 计算 PWM 频率$f_{\text{PWM}} = \frac{f_{\text{计数时钟}}}{\text{ARR} + 1}$​​例如设定 ARR = 999,则 PWM 频率:$f_{\text{PWM}} = \frac{1\,000\,000}{1000} = 1kHz$
      • 选择 Channel1,设置:
        • Pulse(CCR值) 设为 500(占空比 50
        • Mode 选择 PWM Mode 1
        • Polarity 选择 High(高电平有效)。
      • 点击 OK 退出配置。

总结

  1. PWM是一种用数字信号模拟模拟信号的方法,但它本质上仍是数字信号。
  2. PWM的核心参数是频率和占空比,它们决定了输出信号的特性。
  3. STM32使用定时器(TIMx)生成PWM,可用于LED调光、电机控制、信号输出等应用。

如果想更深入地研究STM32的PWM控制,比如高级定时器死区控制相位同步等,可以参考STM32官方参考手册

上一篇
下一篇