DSP实战TMS320F28035:EPWM互补输出+死区保护实现
一、前言
在开关电源、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。
更多推荐
所有评论(0)