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 generation

Other Parts Discussed in Thread: TMS320F28027

Hi,

         i'm using TMS320F28027 controller to drive a dc motor. my PWM generation table is given below, first the C signal should be in ON condition and in next stage C and D should be in ON condition and then only D should be in ON condition like wise the sequence goes.  I need to create the sequence of signals  like c, cd ,d,da,a,ab,b, bc ,again c , i tried this and i'm getting only  sequence of signals as c,cd,d,da,a,ab and c so i need to know how this b,bc sequence can be generated. can any body guide me how to create the fourth sequence???

Program:
#include "DSP28x_Project.h"
#include "F2802x_Device.h"

void epwm_init(void);
void epwm_init_1(void);
void epwm_init_2(void);
void epwm_init_3(void);

int main(void)
{

    InitGpio();
     InitSysCtrl();
     InitEPwm1Gpio();
     InitEPwm2Gpio();
     InitEPwm3Gpio();
     EALLOW;
     SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
        EDIS;
        epwm_init();
        epwm_init_1();
        epwm_init_2();
        epwm_init_3();
        EALLOW;
              SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
              EDIS;
            EALLOW;
            GpioCtrlRegs.GPAPUD.bit.GPIO6 = 1;    // Disable pull-up on GPIO6 (EPWM4A)
            GpioCtrlRegs.GPAPUD.bit.GPIO7 = 1;    // Disable pull-up on GPIO7 (EPWM4B)
               GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1;   // Configure GPIO6 as EPWM4A
               GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 1;   // Configure GPIO7 as EPWM4B
             EDIS;
       while(1);
}
void epwm_init(void)
{
    EPwm1Regs.TBPRD = 60000;                        // Set timer period
    EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // Phase is 0
    EPwm1Regs.TBCTR = 0x0000;                      // Clear counter
   // Setup TBCLK
   EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
   EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUTTB_COUNT_DOWN
   EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;
   EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;
   //EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_CTR_ZERO;
   EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
//   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
   EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
//   EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

   // Setup compare
   EPwm1Regs.CMPA.half.CMPA = 15000;
 // EPwm1Regs.CMPB = 15000;

   // Set actions
   EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;             // Set PWM1A on Zero
  EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
   EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;          // Set PWM1A on Zero
   EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;

       }

void epwm_init_1(void)
{

    EPwm2Regs.TBPRD = 60000;                        // Set timer period
    EPwm2Regs.TBPHS.half.TBPHS = 40000;
    EPwm2Regs.TBCTL.bit.PHSEN=1;
        EPwm2Regs.TBCTR = 0x0000;                      // Clear counter
       // Setup TBCLK
       EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
       EPwm2Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;
      // EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
       EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
       EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUTTB_COUNT_DOWN
       EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV4;
       EPwm2Regs.TBCTL.bit.PHSDIR=TB_DOWN;
     //  EPwm2Regs.TBPHS.all=30000;
       EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
    //   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
       EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    //   EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

       // Setup compare
       EPwm2Regs.CMPA.half.CMPA = 30000;
      EPwm2Regs.CMPB = 30000;
       // Set actions
       EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;             // Set PWM1A on Zero
       EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;


       EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR;          // Set PWM1A on Zero
       EPwm2Regs.AQCTLB.bit.CAD = AQ_SET;

       }

void epwm_init_2(void)
{
    EPwm3Regs.TBPRD = 60000;                        // Set timer period
        EPwm3Regs.TBPHS.half.TBPHS = 60000;
        EPwm3Regs.TBCTL.bit.PHSEN=1;
            EPwm3Regs.TBCTR = 0x0000;                      // Clear counter
           // Setup TBCLK
           EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
           EPwm3Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;
          // EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
           EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;
           EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUTTB_COUNT_DOWN
           EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV4;
           EPwm3Regs.TBCTL.bit.PHSDIR=TB_DOWN;
         //  EPwm2Regs.TBPHS.all=30000;
           EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
        //   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
           EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
        //   EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

           // Setup compare
           EPwm3Regs.CMPA.half.CMPA = 30000;
          EPwm3Regs.CMPB = 30000;
           // Set actions
           EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;             // Set PWM1A on Zero
           EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR;


           EPwm3Regs.AQCTLB.bit.CAU = AQ_CLEAR;          // Set PWM1A on Zero
           EPwm3Regs.AQCTLB.bit.CAD = AQ_SET;

       }
void epwm_init_3(void)
{

    EPwm4Regs.TBPRD = 60000;                        // Set timer period
        EPwm4Regs.TBPHS.half.TBPHS = 60000;           // Phase is 0
        EPwm4Regs.TBCTR = 0x0000;                      // Clear counter

       // Setup TBCLK
       EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
       EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE;        // Disable phase loading
       EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW;
       EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUTTB_COUNT_DOWN
       EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV4;
       EPwm4Regs.TBCTL.bit.PHSDIR=TB_DOWN;
     //  EPwm2Regs.TBPHS.all=30000;
       EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
    //   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
       EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    //   EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

       // Setup compare
       EPwm4Regs.CMPA.half.CMPA = 30000;

       // Set actions
       EPwm4Regs.AQCTLA.bit.CAU = AQ_SET;             // Set PWM1A on Zero
       EPwm4Regs.AQCTLA.bit.CAD = AQ_CLEAR;


       EPwm4Regs.AQCTLB.bit.CAU = AQ_CLEAR;          // Set PWM1A on Zero
       EPwm4Regs.AQCTLB.bit.CAD = AQ_SET;

       }

Stage
Commutation Logic
Sensor Status
A
B
D
S1
0
0
1
0
S2
0
0
1
1
S3
0
0
0
1
S4
1
0
0
1
S5
1
0
0
0
S6
1
1
0
0
S7
0
1
0
0
S8
0
1
1
0
S9
0
0
1
0
S10
0
0
1
1

Stage Commutation Logic Energising Phase
Sensor Status
A B C D Start  Run
S1 0 0 1 0 B B
S2 0 0 1 1 BA A
S3 0 0 0 1 A A
S4 1 0 0 1 AD D
S5 1 0 0 0 D D
S6 1 1 0 0 DC C
S7 0 1 0 0 C C
S8 0 1 1 0 CB B
S9 0 0 1 0 B B
S10 0 0 1 1 BA A