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。
验证通过判据
| 检查项 | 预期值 | 容差 | 不通过时的排查方向 |
|---|---|---|---|
| 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 可在运行时写入。