我调试中遇到的问题是,当我 屏蔽掉主程序中的 PieCtrlRegs.PIEIER3.bit.INTx1 = 1;和 PieVectTable.EPWM1_INT = &EPWM1_INT_ISR;时,28335也能输出方波。我明明是设置了中断模式的,怎么会不进中断也有数据输出呢?
另外正常进中断时,用示波器测量28335的输出波形,每产生7.5ms的方波,就有2.5ms的低电平。如果不进中断,则一直有方波输出,没有长时间的低电平。请问,为什么会出现这种情况?
请高手予以指教,谢谢!
我的程序如下:
void main(void)
{
InitSysCtrl();
EALLOW;
InitEPwm1Gpio();
DINT;
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.EPWM1_INT = &EPWM1_INT_ISR;
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
HRPWM1_Config(3750);
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
IER = M_INT3 ;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
EINT;
ERTM;
for(;;);
}
void HRPWM1_Config(period)
{
EPwm1Regs.TBPRD = period;
EPwm1Regs.TBPHS.half.TBPHS = 0x0000;
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.CMPA.half.CMPA = 1500;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //1,Enable event time-base counter equal to zero.(TBCTR = 0x0000)
EPwm1Regs.ETSEL.bit.INTEN = 1; //Enable EPWMx_INT generation
EPwm1Regs.ETPS.bit.INTPRD = ET_3RD; //1,Generate an interrupt on the first event INTCNT = 01 (first event)
EPwm1Regs.ETCLR.bit.INT=1; //清楚中断标志位
EPwm1Regs.DBCTL.all = 0xb;
EPwm1Regs.DBRED=60; // Dead-band rising edge delay
EPwm1Regs.DBFED=60; // Dead-band falling edge delay
}
// INT 3.1
interrupt void EPWM1_INT_ISR(void) // EPWM-1
{
if(k >= PRD)
{
k = 0;
}
EPwm1Regs.CMPA.half.CMPA = (Uint32)TonC[k];
k++;
EPwm1Regs.ETCLR.bit.INT = 1; //Clears the ETFLG[INT] flag bit and enable further interrupts pulses to be generated
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
囧:
中断是PWM计数器匹配事件才发生,而你的代码在初始化PWM的时候已经允许PWM发出,和进中断没有关系
我调试中遇到的问题是,当我 屏蔽掉主程序中的 PieCtrlRegs.PIEIER3.bit.INTx1 = 1;和 PieVectTable.EPWM1_INT = &EPWM1_INT_ISR;时,28335也能输出方波。我明明是设置了中断模式的,怎么会不进中断也有数据输出呢?
另外正常进中断时,用示波器测量28335的输出波形,每产生7.5ms的方波,就有2.5ms的低电平。如果不进中断,则一直有方波输出,没有长时间的低电平。请问,为什么会出现这种情况?
请高手予以指教,谢谢!
我的程序如下:
void main(void)
{
InitSysCtrl();
EALLOW;
InitEPwm1Gpio();
DINT;
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.EPWM1_INT = &EPWM1_INT_ISR;
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
HRPWM1_Config(3750);
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
IER = M_INT3 ;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
EINT;
ERTM;
for(;;);
}
void HRPWM1_Config(period)
{
EPwm1Regs.TBPRD = period;
EPwm1Regs.TBPHS.half.TBPHS = 0x0000;
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.CMPA.half.CMPA = 1500;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //1,Enable event time-base counter equal to zero.(TBCTR = 0x0000)
EPwm1Regs.ETSEL.bit.INTEN = 1; //Enable EPWMx_INT generation
EPwm1Regs.ETPS.bit.INTPRD = ET_3RD; //1,Generate an interrupt on the first event INTCNT = 01 (first event)
EPwm1Regs.ETCLR.bit.INT=1; //清楚中断标志位
EPwm1Regs.DBCTL.all = 0xb;
EPwm1Regs.DBRED=60; // Dead-band rising edge delay
EPwm1Regs.DBFED=60; // Dead-band falling edge delay
}
// INT 3.1
interrupt void EPWM1_INT_ISR(void) // EPWM-1
{
if(k >= PRD)
{
k = 0;
}
EPwm1Regs.CMPA.half.CMPA = (Uint32)TonC[k];
k++;
EPwm1Regs.ETCLR.bit.INT = 1; //Clears the ETFLG[INT] flag bit and enable further interrupts pulses to be generated
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
w zh:
回复 囧:
您好,谢谢回复!
您说的是 EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;这两句代码吗?
允许PWM发出的代码应该是放在中断服务程序里吧?可是不管是哪句,在一次中断结束后,不都是允许了PWM发出吗?配合上一次取得的PWM计数器匹配事件,不就成了只要进一次中断PWM信号就一直产生了吗?
请问,我的理解错在了哪里?
谢谢!
我调试中遇到的问题是,当我 屏蔽掉主程序中的 PieCtrlRegs.PIEIER3.bit.INTx1 = 1;和 PieVectTable.EPWM1_INT = &EPWM1_INT_ISR;时,28335也能输出方波。我明明是设置了中断模式的,怎么会不进中断也有数据输出呢?
另外正常进中断时,用示波器测量28335的输出波形,每产生7.5ms的方波,就有2.5ms的低电平。如果不进中断,则一直有方波输出,没有长时间的低电平。请问,为什么会出现这种情况?
请高手予以指教,谢谢!
我的程序如下:
void main(void)
{
InitSysCtrl();
EALLOW;
InitEPwm1Gpio();
DINT;
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.EPWM1_INT = &EPWM1_INT_ISR;
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
HRPWM1_Config(3750);
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
IER = M_INT3 ;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
EINT;
ERTM;
for(;;);
}
void HRPWM1_Config(period)
{
EPwm1Regs.TBPRD = period;
EPwm1Regs.TBPHS.half.TBPHS = 0x0000;
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.CMPA.half.CMPA = 1500;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //1,Enable event time-base counter equal to zero.(TBCTR = 0x0000)
EPwm1Regs.ETSEL.bit.INTEN = 1; //Enable EPWMx_INT generation
EPwm1Regs.ETPS.bit.INTPRD = ET_3RD; //1,Generate an interrupt on the first event INTCNT = 01 (first event)
EPwm1Regs.ETCLR.bit.INT=1; //清楚中断标志位
EPwm1Regs.DBCTL.all = 0xb;
EPwm1Regs.DBRED=60; // Dead-band rising edge delay
EPwm1Regs.DBFED=60; // Dead-band falling edge delay
}
// INT 3.1
interrupt void EPWM1_INT_ISR(void) // EPWM-1
{
if(k >= PRD)
{
k = 0;
}
EPwm1Regs.CMPA.half.CMPA = (Uint32)TonC[k];
k++;
EPwm1Regs.ETCLR.bit.INT = 1; //Clears the ETFLG[INT] flag bit and enable further interrupts pulses to be generated
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
囧:
回复 w zh:
PWM的产生跟中断没关系,你只要使能了PWM的时钟,配置了AQ模块,PWM就开始输出了。
我调试中遇到的问题是,当我 屏蔽掉主程序中的 PieCtrlRegs.PIEIER3.bit.INTx1 = 1;和 PieVectTable.EPWM1_INT = &EPWM1_INT_ISR;时,28335也能输出方波。我明明是设置了中断模式的,怎么会不进中断也有数据输出呢?
另外正常进中断时,用示波器测量28335的输出波形,每产生7.5ms的方波,就有2.5ms的低电平。如果不进中断,则一直有方波输出,没有长时间的低电平。请问,为什么会出现这种情况?
请高手予以指教,谢谢!
我的程序如下:
void main(void)
{
InitSysCtrl();
EALLOW;
InitEPwm1Gpio();
DINT;
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.EPWM1_INT = &EPWM1_INT_ISR;
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
HRPWM1_Config(3750);
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
IER = M_INT3 ;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
EINT;
ERTM;
for(;;);
}
void HRPWM1_Config(period)
{
EPwm1Regs.TBPRD = period;
EPwm1Regs.TBPHS.half.TBPHS = 0x0000;
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.CMPA.half.CMPA = 1500;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //1,Enable event time-base counter equal to zero.(TBCTR = 0x0000)
EPwm1Regs.ETSEL.bit.INTEN = 1; //Enable EPWMx_INT generation
EPwm1Regs.ETPS.bit.INTPRD = ET_3RD; //1,Generate an interrupt on the first event INTCNT = 01 (first event)
EPwm1Regs.ETCLR.bit.INT=1; //清楚中断标志位
EPwm1Regs.DBCTL.all = 0xb;
EPwm1Regs.DBRED=60; // Dead-band rising edge delay
EPwm1Regs.DBFED=60; // Dead-band falling edge delay
}
// INT 3.1
interrupt void EPWM1_INT_ISR(void) // EPWM-1
{
if(k >= PRD)
{
k = 0;
}
EPwm1Regs.CMPA.half.CMPA = (Uint32)TonC[k];
k++;
EPwm1Regs.ETCLR.bit.INT = 1; //Clears the ETFLG[INT] flag bit and enable further interrupts pulses to be generated
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
w zh:
回复 囧:
你好,谢谢回复!
我按以上 代码经过了逆变器MC33186,输出波形如下图所示。蓝色部分是由大量类似的毛刺组成,这些毛刺的频率与28335输出的频率一样。请问出现这种问题,是我的代码问题吗?
还有,我要用中断方式产生PWM波时,请问正确设置PWM时钟和配置AQ模块的方式是什么?
谢谢!

TI中文支持网



