TI中文支持网
TI专业的中文技术问题搜集分享网站

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发出,和进中断没有关系

我调试中遇到的问题是,当我 屏蔽掉主程序中的 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模块的方式是什么?

谢谢!

赞(0)
未经允许不得转载:TI中文支持网 » pwm不进中断也有输出的问题
分享到: 更多 (0)