一、EPWM模块概述
在电机控制、电源转换等工业应用场景中,PWM波形生成是核心功能之一。DSP28335芯片内置增强型脉宽调制模块(Enhanced PWM,简称EPWM),提供高精度的PWM波形生成能力。每个EPWM模块包含以下关键子模块:
-
时基模块(TB):决定PWM频率和相位
-
比较模块(CC):设置占空比
-
动作限定模块(AQ):控制PWM输出动作
-
死区模块(DB):防止上下桥臂直通
-
故障保护模块(TZ):紧急关断保护
二、EPWM配置步骤详解
2.1 系统时钟配置
// 系统时钟初始化(假设使用10MHz外部晶振)
SysCtrlRegs.PLLCR.bit.DIV = 10; // PLL 10分频
SysCtrlRegs.HISPCP.all = 0x1; // 高速外设时钟2分频
SysCtrlRegs.LOSPCP.all = 0x2; // 低速外设时钟4分频
2.2 EPWM模块基本配置
步骤1:使能EPWM时钟
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 先停止所有EPWM时钟
SysCtrlRegs.PCLKCR0.bit.EPWM1ENCLK = 1;// 使能EPWM1时钟
步骤2:配置时基模块
EPwm1Regs.TBPRD = 1000; // 周期值=1000
EPwm1Regs.TBPHS.half.TBPHS = 0; // 相位寄存器清零
EPwm1Regs.TBCTR = 0x0000; // 计数器归零
// 时基控制寄存器配置
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 递增计数模式
EPwm1Regs.TBCTL.bit.PHSEN = 0; // 禁止相位加载
EPwm1Regs.TBCTL.bit.PRDLD = 1; // 立即装载模式
EPwm1Regs.TBCTL.bit.SYNCOSEL = 0; // 禁止同步输出
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // 高速时钟分频系数=1
EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 时基时钟分频系数=1
步骤3:配置比较模块
EPwm1Regs.CMPA.half.CMPA = 500; // 设置比较值A=500(占空比50%)
EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; // 立即装载模式
步骤4:配置动作模块
// 当CTR=CMPA时,EPWM1A输出高电平
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
// 当CTR=0时,EPWM1A输出低电平
EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR;
步骤5:死区配置(可选)
EPwm1Regs.DBCTL.bit.OUT_MODE = 0x3; // 使能上升沿和下降沿延迟
EPwm1Regs.DBCTL.bit.POLSEL = 0x2; // EPWM1B反相输出
EPwm1Regs.DBRED = 50; // 上升沿延迟50个时钟周期
EPwm1Regs.DBFED = 50; // 下降沿延迟50个时钟周期
三、完整EPWM配置例程
#include "DSP2833x_Device.h"
void InitEPwm1(void)
{
// 时基配置
EPwm1Regs.TBPRD = 1000; // 周期1000个TBCLK
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 递增模式
EPwm1Regs.TBCTL.bit.PHSEN = 0; // 禁止相位同步
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // 分频系数=1
EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 分频系数=1
// 比较值配置
EPwm1Regs.CMPA.half.CMPA = 500; // 50%占空比
// 动作限定配置
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 比较匹配时置高
EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR; // 计数器归零时置低
// 死区配置
EPwm1Regs.DBCTL.bit.OUT_MODE = 0x3;// 使能双路延迟
EPwm1Regs.DBCTL.bit.POLSEL = 0x2; // EPWM1B反相输出
EPwm1Regs.DBRED = 50; // 上升沿延迟
EPwm1Regs.DBFED = 50; // 下降沿延迟
// 故障保护配置
EPwm1Regs.TZSEL.bit.OSHT1 = 1; // 使能故障输入1
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HIGH; // 故障时强制高电平
}
void main(void)
{
InitSysCtrl();
InitEPwm1();
while(1)
{
// 动态调整占空比示例
EPwm1Regs.CMPA.half.CMPA += 10;
if(EPwm1Regs.CMPA.half.CMPA > 900)
EPwm1Regs.CMPA.half.CMPA = 100;
DELAY_US(100000);
}
}
四、关键参数计算
4.1 PWM频率计算
五、注意事项
-
时钟同步问题:多个EPWM模块需要同步时,需配置SYNCOSEL寄存器
-
死区时间计算:死区时间=DBRED/DBFED值 × TBCLK周期
-
故障保护响应:建议在中断服务程序中处理故障事件
-
占空比更新时机:使用影子寄存器(CMPCTL.SHDWAMODE)防止波形抖动
六、常见问题解答
Q1:如何实现双边沿对称PWM?
EPwm1Regs.TBCTL.bit.CTRMODE = 2; // 设置为上下计数模式
Q2:如何同步多个EPWM模块?
// 主模块配置
EPwm1Regs.TBCTL.bit.SYNCOSEL = 3; // 主模块输出同步信号
// 从模块配置
EPwm2Regs.TBCTL.bit.PHSEN = 1; // 使能相位加载
EPwm2Regs.TBPHS = phase_value; // 设置相位偏移
下一期预告:DSP28335的EPWM中断配置与ADC同步采样技术