2. EPWM模块生成互补PWM波

EPWM 互补输出与死区配置要点

本例使用 TMS320F28379D 的 EPWM1 模块,在 GPIO0/GPIO1 上输出一对互补 PWM 波。目标参数:PWM 频率 10 kHz、A 相占空比 50%、死区时间 1 μs(上升沿与下降沿各 1 μs)。EPWM 时钟来自系统时钟 200 MHz,经 EPWMCLKDIV 分频后进入模块。

核心配置链路:TBCLK 时基 → TBPRD 决定频率 → CMPA 决定占空比 → AQ 模块生成 EPWMxA/EPWMxB → DB 子模块插入死区 → GPIO 复用输出。

关键参数计算

设 EPWMCLK = 100 MHz(系统时钟 200 MHz 经 EPWMCLKDIV=/2),时基计数模式为增减计数(Up-Down),则:

  • PWM 频率 = EPWMCLK / (2 × TBPRD) → TBPRD = 100 MHz / (2 × 10 kHz) = 5000
  • 占空比 50% → CMPA = TBPRD × 50% = 2500
  • 死区 1 μs → DBRED = DBFED = 1 μs × 100 MHz = 100 个 TBCLK 周期
增减计数模式下,EPWMxA 在 CMPA 上升沿置高、下降沿置低,EPWMxB 通过 AQ 配置为互补翻转,再由 DB 子模块在两者之间插入死区,避免上下桥臂直通。

寄存器配置代码

#include "F28x_Project.h"

// EPWM1 配置:10kHz,50% 占空比,死区 1us
void EPWM1_Config(void)
{
    // 1. 时基配置
    EPwm1Regs.TBPRD = 5000;              // 周期 = 2*TBPRD*TBCLK
    EPwm1Regs.TBPHS.bit.TBPHS = 0;       // 相位清零
    EPwm1Regs.TBCTR = 0;                 // 计数器清零
    EPwm1Regs.TBCTL.bit.CTRMODE = 2;     // 增减计数模式
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;   // 高速时钟不分频
    EPwm1Regs.TBCTL.bit.CLKDIV = 0;      // 时基时钟不分频
    EPwm1Regs.TBCTL.bit.PHSEN = 0;       // 禁止相位同步

    // 2. 比较器配置
    EPwm1Regs.CMPA.bit.CMPA = 2500;      // 50% 占空比
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;  // CMPA 影子寄存器
    EPwm1Regs.CMPCTL.bit.LOADAMODE = 0;  // 在 CTR=0 时加载

    // 3. 动作限定器 AQ:EPWMxA 高有效,EPWMxB 互补
    EPwm1Regs.AQCTLA.bit.ZRO = 2;        // CTR=0 时置高
    EPwm1Regs.AQCTLA.bit.CAU = 1;        // 上升沿 CMPA 时置低
    EPwm1Regs.AQCTLB.bit.ZRO = 1;        // CTR=0 时置低
    EPwm1Regs.AQCTLB.bit.CAD = 2;        // 下降沿 CMPA 时置高

    // 4. 死区配置:1us = 100 个 TBCLK
    EPwm1Regs.DBCTL.bit.OUT_MODE = 3;    // 使能上升沿和下降沿死区
    EPwm1Regs.DBCTL.bit.POLSEL = 2;      // EPWMxB 反相
    EPwm1Regs.DBRED.bit.DBRED = 100;     // 上升沿死区
    EPwm1Regs.DBFED.bit.DBFED = 100;     // 下降沿死区

    // 5. GPIO 复用
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;  // GPIO0 -> EPWM1A
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;  // GPIO1 -> EPWM1B
    EDIS;
}

示波器验证方法

将示波器 CH1 接 GPIO0(EPWM1A),CH2 接 GPIO1(EPWM1B),共地。使用双通道同时捕获,观察以下指标:

  • 频率:测量 EPWM1A 周期,应为 100 μs(10 kHz)。
  • 占空比:EPWM1A 高电平时间应为 50 μs。
  • 死区时间:EPWM1A 下降沿到 EPWM1B 上升沿之间的间隔应为 1 μs;EPWM1B 下降沿到 EPWM1A 上升沿之间也应为 1 μs。
  • 互补性:两路波形不应同时为高,死区期间两路均为低电平。
若死区时间明显偏离 1 μs,检查 EPWMCLK 实际频率是否与预期一致。TBCLK 分频由 TBCTL[CLKDIV] 和 TBCTL[HSPCLKDIV] 共同决定,DBRED/DBFED 的计数基准是 TBCLK 而非 EPWMCLK。
EPWM1 互补 PWM 信号链与死区插入 TBCLK 时基 100 MHz TBPRD = 5000 10 kHz 周期 CMPA = 2500 50% 占空比 AQ 动作限定 EPWMxA / B DB 死区子模块 DBRED=DBFED=100 GPIO0 / GPIO1 示波器波形(双通道) CH1: EPWM1A CH2: EPWM1B 死区 1 μs 死区 1 μs T = 100 μs (10 kHz) 50 μs (50%) EPWM1A (GPIO0) EPWM1B (GPIO1) 死区边界

验证通过判据

检查项预期值容差不通过时的排查方向
PWM 频率10 kHz±1%检查 TBPRD、EPWMCLKDIV、系统时钟配置
A 相占空比50%±0.5%检查 CMPA 值、AQ 动作配置
死区时间1 μs±0.1 μs检查 DBRED/DBFED、TBCLK 实际频率
互补性无同时为高—检查 DBCTL[POLSEL] 和 AQCTLB 配置
若需动态调整占空比,可在运行时修改 CMPA 影子寄存器,在 CTR=0 时自动加载,避免波形毛刺。死区时间一般不需要在线修改,但若需调整,DBRED/DBFED 可在运行时写入。