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.

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;

}

  • 中断是PWM计数器匹配事件才发生,而你的代码在初始化PWM的时候已经允许PWM发出,和进中断没有关系

  • 您好,谢谢回复!

    您说的是 EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;          EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;这两句代码吗?

    允许PWM发出的代码应该是放在中断服务程序里吧?可是不管是哪句,在一次中断结束后,不都是允许了PWM发出吗?配合上一次取得的PWM计数器匹配事件,不就成了只要进一次中断PWM信号就一直产生了吗?

    请问,我的理解错在了哪里?

    谢谢!

  • PWM的产生跟中断没关系,你只要使能了PWM的时钟,配置了AQ模块,PWM就开始输出了。

  • 你好,谢谢回复!

    我按以上 代码经过了逆变器MC33186,输出波形如下图所示。蓝色部分是由大量类似的毛刺组成,这些毛刺的频率与28335输出的频率一样。请问出现这种问题,是我的代码问题吗?

    还有,我要用中断方式产生PWM波时,请问正确设置PWM时钟和配置AQ模块的方式是什么?

    谢谢!