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.

TMS320F28335-Q1: 28335 ePWM同時關斷

Part Number: TMS320F28335-Q1

我需要兩個ePWM波形

ePWM1可放大縮小,但ePWM2須維持固定大小,並與ePWM1同時關斷

兩個訊號Duty不同,但在同一時間關斷

因為令    EPwm2Regs.CMPA.half.CMPA = Vc1-0.1*1499;  (EPwm2中GPIO3是GPIO2的反向訊號)

因此目前是 ePWM1 GPIO0為主要訊號,可使ePWM2 GPIO3可在GPIO0關斷前導通一段時間,但GPIO3在GPIO0關斷時仍繼續導通

需要的是GPIO3與GPIO0同時關斷

或者是能有甚麼方式可以控制這樣的訊號

#include "DSP28x_Project.h"

typedef struct
{
   volatile struct EPWM_REGS *EPwmRegHandle;
   Uint16 EPwm_CMPA_Direction;
   Uint16 EPwm_CMPB_Direction;
   Uint16 EPwmTimerIntCount;
   Uint16 EPwmMaxCMPA;
   Uint16 EPwmMinCMPA;
   Uint16 EPwmMaxCMPB;
   Uint16 EPwmMinCMPB;
}
EPWM_INFO;

void InitEpwm1(void);

__interrupt void adc_isr(void);
__interrupt void epwm_isr(void);

int count = 0;
int x = 0;
int S4DBR = 0;
Uint16 LoopCount;
Uint16 ConversionCount;
float Voltage1;
float VoltageFB;
float Vcmd;
float Verror;
float Verror1;
float Kp;
float Ki;
float Vc;
float Vc1;
float Vc_last;
float DeadTime;
float Td;
float D0DT;
float S34DB;
float S3Duty;

#define EPWM1_TIMER_TBPRD   1499
#define EPWM1_MAX_CMPA      1499
#define EPWM1_MIN_CMPA      700

#define EPWM2_TIMER_TBPRD   1499
#define EPWM2_MAX_CMPA      1499
#define EPWM2_MIN_CMPA      700

#define EPWM3_TIMER_TBPRD   1499
#define EPWM3_MAX_CMPA     1499
#define EPWM3_MIN_CMPA      700

main()
{
   InitSysCtrl();

   EALLOW;
   #if (CPU_FRQ_150MHZ)
     #define ADC_MODCLK 0x3
   #endif
   #if (CPU_FRQ_100MHZ)
     #define ADC_MODCLK 0x2
   #endif
   EDIS;

   EALLOW;
   SysCtrlRegs.HISPCP.all = ADC_MODCLK;
   EDIS;

   InitEPwm1Gpio();
   InitEPwm2Gpio();
   InitEPwm3Gpio();

   DINT;

   InitPieCtrl();

   IER = 0x0000;
   IFR = 0x0000;

   InitPieVectTable();

   EALLOW;
        PieVectTable.ADCINT = &adc_isr;
        PieVectTable.EPWM1_INT = &epwm_isr;
   EDIS;

   InitAdc();

   InitEpwm1();

   IER |= M_INT1;

   IER |= M_INT3;
           PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
           PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
           PieCtrlRegs.PIEIER3.bit.INTx3 = 1;
           PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
       EALLOW;
           SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
           SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;
           SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;
           SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1;
       EDIS;

   EINT;
   ERTM;

//////////////////////////////////////////////////////
   LoopCount = 0;
   ConversionCount = 0;
   Vcmd = 3100;
   Kp = 0.75;
   Ki = 0.005;


   S34DB = 0.15;
   DeadTime = 40;
   S4DBR = 0;
   count = 0;
   x = 0;
//////////////////////////////////////////////////////
   for(;;)
   {
       DELAY_US(5000);
       if(x == 0)
       {
           count++;
           if(count == 500)
           {
               x = 1;
           }
       }
       else
       {
           count--;
           if(count == 0)
           {
               x = 0;
           }
       }
   }

      AdcRegs.ADCMAXCONV.all = 0x0001;
      AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
      //AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2;
      AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;
      AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;
      EPwm1Regs.ETSEL.bit.SOCAEN = 1;
      EPwm1Regs.ETSEL.bit.SOCASEL = 4;
      EPwm1Regs.ETPS.bit.SOCAPRD = 1;

      EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;
      EPwm1Regs.TBCTL.bit.CTRMODE = 0;

      EPwm2Regs.ETSEL.bit.SOCAEN = 1;
      EPwm2Regs.ETSEL.bit.SOCASEL = 4;
      EPwm2Regs.ETPS.bit.SOCAPRD = 1;

      EPwm2Regs.TBPRD = EPWM1_TIMER_TBPRD;
      EPwm2Regs.TBCTL.bit.CTRMODE = 0;

      EPwm3Regs.ETSEL.bit.SOCAEN = 1;
      EPwm3Regs.ETSEL.bit.SOCASEL = 4;
      EPwm3Regs.ETPS.bit.SOCAPRD = 1;

      EPwm3Regs.TBPRD = EPWM1_TIMER_TBPRD;
      EPwm3Regs.TBCTL.bit.CTRMODE = 0;

      EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;
      EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;
      EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;
   for(;;)
      {
          asm("      NOP");
          LoopCount++;
      }
}

__interrupt void  adc_isr(void)
{
    Voltage1 = AdcRegs.ADCRESULT0 >>4;
    VoltageFB = ((float)Voltage1);

    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

__interrupt void  epwm_isr(void)
{
    Vc = 1000;
    Vc1 = Vc + count;
    if(Vc1 >= EPWM1_MAX_CMPA)
    {
            Vc1 = EPWM1_MAX_CMPA;
    }
    if(Vc1 <= EPWM1_MIN_CMPA)
    {
            Vc1 = EPWM1_MIN_CMPA;
    }
    Verror1 = Verror;
    Vc_last = Vc1;
    EPwm1Regs.CMPA.half.CMPA = Vc1;
    EPwm2Regs.CMPA.half.CMPA = Vc1-0.1*1499;
    EPwm3Regs.CMPA.half.CMPA = Vc1;
    EPwm1Regs.ETCLR.bit.INT = 1;
    EPwm2Regs.ETCLR.bit.INT = 1;
    EPwm3Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}

void InitEpwm1()
{
    EALLOW;
        GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;
        GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;
        GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
        GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;
    EDIS;

    EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;
    EPwm1Regs.TBPHS.half.TBPHS = 0x0000;
    EPwm1Regs.TBCTR = 0x0000;
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
    EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
    EPwm1Regs.TBCTL.bit.CLKDIV = 0;

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = 1;
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = 1;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    EPwm1Regs.AQCTLA.bit.CAU = 2;
    EPwm1Regs.AQCTLA.bit.CAD = 1;
    EPwm1Regs.AQCTLB.bit.CAU = 2;
    EPwm1Regs.AQCTLB.bit.CAD = 1;
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm1Regs.AQCTLB.bit.ZRO = 2;
    EPwm1Regs.AQCTLB.bit.CAU = 1;

    EPwm1Regs.DBCTL.bit.IN_MODE = 2;
    EPwm1Regs.DBCTL.bit.POLSEL = 2;
    EPwm1Regs.DBCTL.bit.OUT_MODE = 3;
    EPwm1Regs.DBRED = DeadTime;
    EPwm1Regs.DBFED = DeadTime;

    EPwm1Regs.ETSEL.bit.INTEN = 1;
    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
    EPwm1Regs.ETPS.bit.INTPRD = 1;

    EALLOW;
        SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;
////////////////////////////////////////////////////////////////////////////////////////////////////
    EALLOW;
        GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0;
        GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;
        GpioCtrlRegs.GPAMUX1.bit.GPIO2= 1;
        GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;
    EDIS;

    EPwm2Regs.TBPRD = EPWM1_TIMER_TBPRD;
    EPwm2Regs.TBPHS.half.TBPHS = 2;
    EPwm2Regs.TBCTR = 0x0000;
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0;
    EPwm2Regs.TBCTL.bit.CLKDIV = 0;

    EPwm2Regs.CMPCTL.bit.SHDWAMODE = 1;
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = 1;
    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    EPwm2Regs.AQCTLA.bit.CAU = 2;
    EPwm2Regs.AQCTLA.bit.CAD = 1;
    EPwm2Regs.AQCTLB.bit.CAU = 2;
    EPwm2Regs.AQCTLB.bit.CAD = 1;
    EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;
    EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm2Regs.AQCTLB.bit.ZRO = 2;
    EPwm2Regs.AQCTLB.bit.CAU = 1;

    EPwm2Regs.DBCTL.bit.IN_MODE = 2;
    EPwm2Regs.DBCTL.bit.POLSEL = 2;
    EPwm2Regs.DBCTL.bit.OUT_MODE = 3;
    EPwm2Regs.DBRED = DeadTime;
    EPwm2Regs.DBFED = DeadTime;
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    EALLOW;
            GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0;
            GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0;
            GpioCtrlRegs.GPAMUX1.bit.GPIO4= 1;
            GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1;
    EDIS;

    EPwm3Regs.TBPRD = EPWM1_TIMER_TBPRD;
    EPwm3Regs.TBPHS.half.TBPHS = 2;
    EPwm3Regs.TBCTR = 0x0000;
    EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
    EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; 
    EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;
    EPwm3Regs.TBCTL.bit.HSPCLKDIV = 0;
    EPwm3Regs.TBCTL.bit.CLKDIV = 0;
    EPwm3Regs.CMPCTL.bit.SHDWAMODE = 1;
    EPwm3Regs.CMPCTL.bit.SHDWBMODE = 1;
    EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    EPwm3Regs.AQCTLA.bit.CAU = 2;
    EPwm3Regs.AQCTLA.bit.CAD = 1;
    EPwm3Regs.AQCTLB.bit.CAU = 2;
    EPwm3Regs.AQCTLB.bit.CAD = 1;
    EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET;
    EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm3Regs.AQCTLB.bit.ZRO = 2;
    EPwm3Regs.AQCTLB.bit.CAU = 1;
    EPwm3Regs.DBCTL.bit.IN_MODE = 2;
    EPwm3Regs.DBCTL.bit.POLSEL = 2;
    EPwm3Regs.DBCTL.bit.OUT_MODE = 3;
    EPwm3Regs.DBRED = DeadTime;
    EPwm3Regs.DBFED = DeadTime;
}

  • GPIO0是怎么关断的?对GPIO1和GPIO2上的输出有要求吗?

  • GPIO0是依照回授訊號與內部3V三角波比較出來

    後續有成功了,換成使用deadTime控制GPIO0和GPIO2兩者間的大小控制的,一開始deadTime寫在另一個中斷程式,改至與PI補償同一個副程式中即可

    __interrupt void  epwm_isr(void)
    {
        Vc = 800;
        Vc1 = Vc + count;
        S3Duty = (((1-D0DT)*1499) - DeadTime);
        S4DBR = Vc1 - D0DT*1499;
        if(Vc1 >= EPWM1_MAX_CMPA)
        {
                Vc1 = 1050;
        }
        if(Vc1 <= EPWM1_MIN_CMPA)
        {
                Vc1 = 700;
        }
        Verror1 = Verror;
        Vc_last = Vc1;
    
        EPwm1Regs.CMPA.half.CMPA = Vc1;
        EPwm2Regs.CMPA.half.CMPA = S3Duty;
        EPwm3Regs.CMPA.half.CMPA = Vc1;
        EPwm1Regs.ETCLR.bit.INT = 1;
        EPwm2Regs.ETCLR.bit.INT = 1;
        EPwm3Regs.ETCLR.bit.INT = 1;
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
    
    
        EPwm3Regs.DBCTL.bit.IN_MODE = 2;
    
        EPwm3Regs.DBCTL.bit.POLSEL = 2;
    
        EPwm3Regs.DBCTL.bit.OUT_MODE = 3;
    
        EPwm3Regs.DBRED = S4DBR;
        EPwm3Regs.DBFED = DeadTime;
    }