一、前言

在开关电源、BLDC/PMSM 电机驱动等电力电子场景中,上下桥臂直通短路是最致命的故障之一。EPWM 模块的互补输出 + 死区保护功能,是解决这一问题的核心手段。


二、核心原理

1. 互补 PWM 与死区保护的必要性

半桥 / 全桥驱动中,上下功率管必须交替导通,但 MOS 管 / IGBT 存在固有开关延迟:

  • 关断延迟:给关断信号后,管子无法立刻截止

  • 开通延迟:给开通信号后,管子无法立刻导通 若直接输出互补波形,会出现 “上管未关、下管已开” 的直通状态,导致电源短路、器件烧毁。

死区保护的核心逻辑:在上下管切换时,强制插入一段两个管子都关断的安全时间,避免直通。

2. EPWM 死区模块工作机制

F28035 的 EPWM 外设内置专用死区(DB)模块,支持以下配置:

  • 输入源:可选择 EPWMxA 通道作为基准

  • 输出模式:完全使能(同时输出带死区的 EPWMxA/EPWMxB)

  • 极性选择:互补输出(A 高 B 低,A 低 B 高)

  • 死区时间:上升沿 / 下降沿可独立配置,单位为 TBCLK 时钟周期


三、完整代码实现

1. 头文件与宏定义

#include "DSP28x_Project.h"

// 配置参数(可根据需求修改)
#define PWM_PERIOD      15000   // PWM周期,60MHz下对应4kHz
#define DEADBAND_CYCLE  60      // 死区周期数,60MHz下对应理论1μs

2. GPIO 初始化(复用为 EPWM 输出)

void InitEPwm7Gpio_Custom(void)
{
    EALLOW;
    // GPIO40 → EPWM7A
    GpioCtrlRegs.GPBMUX1.bit.GPIO40 = 1;
    GpioCtrlRegs.GPBDIR.bit.GPIO40 = 1;

    // GPIO41 → EPWM7B
    GpioCtrlRegs.GPBMUX1.bit.GPIO41 = 1;
    GpioCtrlRegs.GPBDIR.bit.GPIO41 = 1;
    EDIS;
}

3. EPWM 初始化(核心配置)

void InitEPwm7(void)
{
    // 1. 使能EPWM7时钟
    EALLOW;
    SysCtrlRegs.PCLKCR1.bit.EPWM7ENCLK = 1;
    EDIS;

    // 2. 暂停时钟同步,避免配置过程中PWM误输出
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;

    // 3. 时基模块(TB)配置:向上计数模式
    EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
    EPwm7Regs.TBPRD = PWM_PERIOD;
    EPwm7Regs.TBPHS.all = 0;
    EPwm7Regs.TBCTL.bit.HSPCLKDIV = 0;
    EPwm7Regs.TBCTL.bit.CLKDIV = 0; // TBCLK=60MHz

    // 4. 动作限定模块(AQ):仅配置A通道,B通道由死区模块接管
    EPwm7Regs.AQCTLA.bit.ZRO = AQ_SET;    // 计数器为0时,EPWM7A置高
    EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR;  // 计数器等于CMPA时,EPWM7A置低
    EPwm7Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;
    EPwm7Regs.AQCTLB.bit.CAU = AQ_NO_ACTION;

    // 5. 死区模块(DB)配置:互补输出+对称死区
    EPwm7Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 死区完全使能
    EPwm7Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;      // 互补输出(A高B低)
    EPwm7Regs.DBCTL.bit.IN_MODE = DBA_ALL;         // 输入源为EPWM7A
    EPwm7Regs.DBRED = DEADBAND_CYCLE;              // 上升沿死区
    EPwm7Regs.DBFED = DEADBAND_CYCLE;              // 下降沿死区

    // 6. 配置占空比:固定50%
    EPwm7Regs.CMPA.half.CMPA = PWM_PERIOD / 2;

    // 7. 恢复时钟同步,启动PWM输出
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;
}

4. 主函数

void main(void)
{
    // 系统初始化
    InitSysCtrl();
    InitEPwm7Gpio_Custom();

    // 关闭中断(本工程无需中断)
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    // 初始化EPWM7
    InitEPwm7();

    // 开启全局中断(标准流程)
    EINT;
    ERTM;

    // 死循环,PWM由硬件自动输出
    for(;;);
}

四、示波器实测与分析

1. 测试波形说明

使用 Tektronix TDS1001C 示波器,CH1 接 EPWM7A(黄色),CH2 接 EPWM7B(蓝色),测得波形如下:

2. 核心参数计算公式

本文基于TMS320F28035,系统主频配置为60MHz,EPWM时基时钟TBCLK不分频,即TBCLK=60MHz。

(1)PWM周期计算

核心公式

计算: TBPRD=PWM_PERIOD=15000,TBCLK=60MHz PWM周期=15000/60=250μs

(2)PWM频率计算

核心公式:频率与周期互为倒数,

计算: PWM频率=60MHz/15000=4000Hz=4kHz,与实测结果吻合。

(3)占空比计算

本程序采用向上计数模式,占空比为高电平时间占整个PWM周期的比例,

计算公式:

计算: CMPA=15000/2=7500 占空比=7500/15000×100%=50%,实现固定50%互补PWM输出。

说明:修改CMPA值即可调整占空比,CMPA越小,占空比越低;CMPA越大,占空比越高,最大值不超过TBPRD。

(4)死区时间计算

C2000 EPWM死区时间由死区计数寄存器(DBRED/DBFED)配置,单位为TBCLK时钟周期

计算公式:

计算: 死区计数=DEADBAND_CYCLE=60,TBCLK=60MHz 理论死区时间=60/60=1μs。

更多推荐