This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

28335生成带死区PWM的程序运行后自动跳到DSP2833x_DefaultIsr.c



#include "DSP28x_Project.h"


void InitEPwm1(void);
void InitEPwm2(void);


#define EPWM1_TIMER_TBPRD750 //PWM周期
#define EPWM1_CMPA 375
#define EPWM1_DB75
#define EPWM2_TIMER_TBPRD 750
#define EPWM2_CMPA 375
#define EPWM2_DB75




void main(void)
{
InitSysCtrl();
InitEPwm1Gpio(); //将引脚配置为EPWM1和EPWM2
InitEPwm2Gpio();


DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();


EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//关闭EPWM时钟
EDIS;
InitEPwm1();
InitEPwm2();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//打开EPWM时钟
EDIS;


EINT;
for(;;)
{


}
}






//PWM初始化
void InitEPwm1()
{
//设置时间基准的时钟信号(TBCLK)周期,相位
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //增减计数模式10
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; //设置定时器周期
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁止相位加载0
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; //时基相位寄存器的值赋值0,初相0
EPwm1Regs.TBCTR = 0x0000; //时基计数器清零
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;//TBCLK=SYSCLKOUT/1*1=150MHZ,PWM1频率=150MHZ/750=100KHZ;


//设置比较寄存器的阴影寄存器加载条件:时基计数到0或PRD
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;


//设置比较寄存器的值
EPwm1Regs.CMPA.half.CMPA = EPWM1_CMPA; //设置比较寄存器A的值


//设置动作,PWM1A为HIN的信号,PWM1B为LIN的信号
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; //递增计数时,发生比较寄存器A匹配时PWM1A输出高电平
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; //递增计数时,发生比较寄存器A匹配时PWM1A输出低电平






EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HI;
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm1Regs.DBRED = EPWM1_DB;
EPwm1Regs.DBFED = EPWM1_DB;
}


void InitEPwm2()
{
//设置时间基准的时钟信号(TBCLK)周期,相位
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //增减计数模式10
EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD; //设置定时器周期
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁止相位加载0
EPwm2Regs.TBPHS.half.TBPHS = 0x0000; //时基相位寄存器的值赋值0,初相0
EPwm2Regs.TBCTR = 0x0000; //时基计数器清零
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;//TBCLK=SYSCLKOUT/1*1=150MHZ,PWM2频率=150MHZ/750=100KHZ;


//设置比较寄存器的阴影寄存器加载条件:时基计数到0或PRD
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;


//设置比较寄存器的值
EPwm2Regs.CMPA.half.CMPA = EPWM2_CMPA; //设置比较寄存器A的值


//设置动作,PWM2A为INA的信号,PWM2B为INB的信号
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; //递增计数时,发生比较寄存器A匹配时PWM2A输出高电平
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR; //递增计数时,发生比较寄存器A匹配时PWM2A输出低电平


EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm2Regs.DBRED = EPWM2_DB;
EPwm2Regs.DBFED = EPWM2_DB;
}

自己写了个程序生成4路带死区的PWM,但是程序一运行就跳到DSP2833x_DefaultIsr.c中

用EPWM1A输入DB模块生成EPWM1A和EPWM1B 2路PWM

用EPWM2A输入DB模块生成EPWM2A和EPWM2B 2路PWM

现在发现问题出在EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
把 DB_ACTV_HIC换成其他3个,程序都可以一直运行下去,但是设置成DB_ACTV_HIC就不行
#defineDB_ACTV_HI0x0
#defineDB_ACTV_LOC0x1
#defineDB_ACTV_HIC0x2
#defineDB_ACTV_LO0x3
但是我需要互补的PWM,只能用DB_ACTV_HIC,一路反转一路不反转

问题真的很奇怪,程序里我也没使用中断,求大家帮我看下是为什么