PWM波形生成

PWM(脉冲宽度调制)是一种通过调节脉冲的占空比来控制模拟信号的技术,广泛应用于电机调速、LED调光、电源控制等领域。

1. PWM核心参数

  • 频率(Frequency)
    每秒内脉冲重复的次数,单位Hz。
    • 电机控制:1kHz~20kHz(避免可闻噪声)。
    • LED调光:100Hz~1kHz(高于人眼闪烁感知频率)。
    • 音频生成:20Hz~20kHz(需匹配音频范围)。
  • 占空比(Duty Cycle)
    高电平时间占整个周期的百分比,范围0%~100%。
    • 占空比 = (高电平时间 / 周期时间) × 100%
  • 分辨率(Resolution)
    占空比可调节的最小步长,由计数器位数决定。
    • 8位分辨率:256级(步长0.39%)。
    • 16位分辨率:65536级(步长0.0015%)。

2. PWM生成原理

(1) 硬件PWM(基于定时器)

  • 核心组件
    • 计数器:递增或递减计数,产生周期性基准。
    • 比较寄存器(CCR):设置占空比阈值。
    • 自动重载寄存器(ARR):设置周期长度。
  • 工作流程
    1. 计数器从0开始递增,达到CCR值时输出电平翻转。
    2. 计数器达到ARR值时复位,并触发更新事件,开始新周期。
  • 频率计算

频率定时器时钟源频率预分频系数值

  • 占空比计算

占空比值值

  • 配置示例(STM32定时器):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    TIM_HandleTypeDef htim;
    htim.Instance = TIM1;
    htim.Init.Prescaler = 79; // 预分频系数8080MHz/80=1MHz)
    htim.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim.Init.Period = 999; // ARR=999 → 频率=1MHz/(999+1)=1kHz
    htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&htim);

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

(2) 软件PWM(GPIO模拟)

  • 实现方式
    使用定时器中断或延时函数,手动控制GPIO电平翻转。

  • 代码示例(Arduino)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void setup() {
    pinMode(9, OUTPUT);
    }

    void loop() {
    digitalWrite(9, HIGH);
    delayMicroseconds(200); // 高电平时间200μs
    digitalWrite(9, LOW);
    delayMicroseconds(800); // 低电平时间800μs → 周期1ms,占空比20%
    }
  • 局限性

    • 精度低(受中断延迟和代码执行时间影响)。
    • 占用CPU资源,难以生成高频PWM(通常<10kHz)。

3. PWM模式类型

模式 描述 应用场景
边沿对齐 计数器单向递增或递减,脉冲边沿对齐周期边界 通用控制(如LED调光)
中心对齐 计数器先递增后递减,脉冲中心对齐周期边界 电机驱动(减少谐波噪声)
互补输出 主通道与互补通道输出反相PWM,插入死区时间防止短路 H桥电机驱动
多通道同步 多个PWM通道共享ARR,相位可调 RGB LED颜色混合

4. 关键电路设计

(1) 驱动能力增强

  • MOSFET/晶体管驱动
    PWM信号通过MOSFET(如IRF540N)或驱动芯片(如L298N)放大电流,驱动电机或大功率负载。
  • RC滤波转换模拟信号
    对PWM输出进行低通滤波,得到平滑的模拟电压:

占空比

  • 滤波器截止频率:,需远低于PWM频率。

(2) 死区时间(Dead Time)

  • 作用:防止H桥上下管同时导通造成短路。

  • 实现:在互补PWM的上升沿和下降沿之间插入延迟(通常50ns~1μs)。

  • STM32配置示例:

    1
    2
    3
    TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
    sBreakDeadTimeConfig.DeadTime = 0x80; // 死区时间=0x80*T_dts
    HAL_TIMEx_ConfigBreakDeadTime(&htim, &sBreakDeadTimeConfig);

5. 高级应用技巧

(1) 提高分辨率

  • 时钟预分频优化
    降低定时器时钟频率(增大预分频系数),以增加ARR值,但会降低PWM频率。
  • 微步进PWM
    结合多个PWM相位差,合成更高分辨率信号(如两路90°相位差PWM叠加)。

(2) 动态调整PWM

  • 呼吸灯效果:

    线性或非线性改变CCR值,实现亮度渐变。

    1
    2
    3
    4
    for (int i=0; i<1000; i++) {
    __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, i);
    HAL_Delay(1);
    }

(3) 多设备同步

  • 使用主从定时器模式,确保多个PWM信号相位一致。

6. 常见问题与解决

Q1:PWM输出有毛刺?

  • 原因:GPIO切换速度过快或负载电感产生尖峰。
  • 解决:增加RC滤波、使用肖特基二极管续流。

Q2:如何测量PWM参数?

  • 使用示波器直接观测波形,或通过输入捕获模式测量频率/占空比。

Q3:高精度PWM如何实现?

  • 选择高位定时器(如32位ARR)、降低时钟分频,或使用专用PWM芯片(如LT6992)。

通过合理配置定时器和外围电路,PWM可实现从简单控制到高精度驱动的广泛应用。硬件PWM效率高且稳定,而软件PWM适用于资源受限的场景。