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.

LaunchXL_F28377S Epwm

In my study, I use epwm2A-2B, epwm6A-6B and epwm7A-7B moduls(six pwm port used). And, I use only epwm2 interrupt rutine to update the all pwm compare registers (ewpm 2a-2b-6a-6b-7a-7b) and also all pwm ports have same frequency(10khz), all pwm ports counters are synchronized.  I try to creat spwm so every interrupt my code calculate new sin value and update the compare value of the pwms.

Q) In evrey zero points of the sin value, I expect pwm 2A- 6A-7A ports change the position same time but not change same time a time delay occure between them.how can I fix these problem.

//
// Included Files
//
#include "F28x_Project.h"
#include "math.h"


#define EPWM2_TIMER_TBPRD  2500  // 10kHz PWM Period register
#define PI 3.14159265358979323846

void InitEPwm2Example(void);
void InitEPwm6Example(void);
void InitEPwm7Example(void);
__interrupt void epwm2_isr(void);

unsigned int i=0,m=0;
float a=0,k=0;


// Main

void main(void)
 {

    InitSysCtrl();
   //InitGpio();
    EALLOW;
   // InitEPwm6Gpio();
    GpioCtrlRegs.GPAPUD.bit.GPIO10 = 1;    // Disable pull-up on GPIO10 (EPWM6A)
        GpioCtrlRegs.GPAPUD.bit.GPIO11 = 1;
        GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 1;   // Configure GPIO10 as EPWM6A
            GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 1;
    //InitEPwm2Gpio();
    GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;    // Disable pull-up on GPIO2 (EPWM2A)
        GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;
        GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;   // Configure GPIO2 as EPWM2A
            GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;
   // InitEPwm7Gpio();
    GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;    // Disable pull-up on GPIO12 (EPWM7A)
        GpioCtrlRegs.GPAPUD.bit.GPIO13 = 1;
        GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 1;   // Configure GPIO12 as EPWM7A
            GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 1;
    EDIS;

    DINT;

    InitPieCtrl();

    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

    EALLOW;

    PieVectTable.EPWM2_INT = &epwm2_isr;

    EDIS;
    EALLOW;

    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;

    EDIS;

    InitEPwm2Example();
    InitEPwm6Example();
    InitEPwm7Example();
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;

    EDIS;
    IER |= M_INT3;

    PieCtrlRegs.PIEIER3.bit.INTx2 = 1;

    CpuSysRegs.PCLKCR2.bit.EPWM2=1;

    EINT;  // Enable Global interrupt INTM
    ERTM;  // Enable Global realtime interrupt DBGM

    for(;;)
    {
        asm ("    NOP");
    }
}


__interrupt void epwm2_isr(void)
{
if(i<200)i++;
else i=0;
	a=sin(2*PI*50*i/10000);
	k=2400*a;
if (k>0){
	
	    EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
	    EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;
	    EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR;
	    EPwm2Regs.AQCTLB.bit.CBD = AQ_SET;
	    EPwm2Regs.CMPA.bit.CMPA = k;
	    EPwm2Regs.CMPB.bit.CMPB = k;
	            EPwm6Regs.AQCTLA.bit.CAU = AQ_SET;
	            EPwm6Regs.AQCTLA.bit.CAD = AQ_SET;
	    	    EPwm6Regs.AQCTLB.bit.CBU = AQ_SET;
	    	    EPwm6Regs.AQCTLB.bit.CBD = AQ_SET;
	    	    EPwm6Regs.CMPA.bit.CMPA = 2499;
	    	    EPwm6Regs.CMPB.bit.CMPB = 2499;
	    	                    EPwm7Regs.AQCTLA.bit.CAU = AQ_SET;
	    	     	            EPwm7Regs.AQCTLA.bit.CAD = AQ_CLEAR;
	    	    	    	    EPwm7Regs.AQCTLB.bit.CBU = AQ_SET;
	    	    	    	    EPwm7Regs.AQCTLB.bit.CBD = AQ_CLEAR;
	    	    	    	    EPwm7Regs.CMPA.bit.CMPA = k;
	    	    	    	    EPwm7Regs.CMPB.bit.CMPB = k;
}
else {

	    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
	    EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;
        EPwm2Regs.AQCTLB.bit.CBU = AQ_SET;
        EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR;
        EPwm2Regs.CMPB.bit.CMPB = -k;
        EPwm2Regs.CMPA.bit.CMPA = -k;
                EPwm6Regs.AQCTLA.bit.CAU = AQ_CLEAR;
        	    EPwm6Regs.AQCTLA.bit.CAD = AQ_SET;
                EPwm6Regs.AQCTLB.bit.CBU = AQ_CLEAR;
                EPwm6Regs.AQCTLB.bit.CBD = AQ_SET;
                EPwm6Regs.CMPB.bit.CMPB = -k;
                EPwm6Regs.CMPA.bit.CMPA = -k;
                                EPwm7Regs.AQCTLA.bit.CAU = AQ_SET;
                        	    EPwm7Regs.AQCTLA.bit.CAD = AQ_SET;
                                EPwm7Regs.AQCTLB.bit.CBU = AQ_SET;
                                EPwm7Regs.AQCTLB.bit.CBD = AQ_SET;
                                EPwm7Regs.CMPB.bit.CMPB = 2600;
                                EPwm7Regs.CMPA.bit.CMPA = 2600;
}

    EPwm2Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}


void InitEPwm2Example()
{
    EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;    // hem zero hemde TBPRD zamanında intrrupt alıyo.
    EPwm2Regs.ETSEL.bit.INTEN = 1;               // Enable INT
    EPwm2Regs.ETPS.bit.INTPRD = ET_1ST;          // Generate INT on 1st event
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up and down
    EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV2;
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE;
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE;
    EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;         // Set timer period 801 TBCLKs
    EPwm2Regs.TBPHS.bit.TBPHS = 0x0000;          // Phase is 0
    EPwm2Regs.TBCTR = 0x0000;// Clear counter

}

void InitEPwm6Example()
{
    //EPwm6Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;    // hem zero hemde TBPRD zamanında intrrupt alıyo.
    //EPwm6Regs.ETSEL.bit.INTEN = 1;               // Enable INT
    //EPwm6Regs.ETPS.bit.INTPRD = ET_1ST;          // Generate INT on 1st event
    EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up and down
    EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
    EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
    EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV2;
    EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE;
    EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE;
    EPwm6Regs.TBPRD = EPWM2_TIMER_TBPRD;         // Set timer period 801 TBCLKs
    EPwm6Regs.TBPHS.bit.TBPHS = 0x0000;          // Phase is 0
    EPwm6Regs.TBCTR = 0x0000;// Clear counter

}
void InitEPwm7Example()
{
    //EPwm6Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;    // hem zero hemde TBPRD zamanında intrrupt alıyo.
    //EPwm6Regs.ETSEL.bit.INTEN = 1;               // Enable INT
    //EPwm6Regs.ETPS.bit.INTPRD = ET_1ST;          // Generate INT on 1st event
    EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up and down
    EPwm7Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
    EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
    EPwm7Regs.TBCTL.bit.CLKDIV = TB_DIV2;
    EPwm7Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE;
    EPwm7Regs.CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE;
    EPwm7Regs.TBPRD = EPWM2_TIMER_TBPRD;         // Set timer period 801 TBCLKs
    EPwm7Regs.TBPHS.bit.TBPHS = 0x0000;          // Phase is 0
    EPwm7Regs.TBCTR = 0x0000;// Clear counter

}

  • Enes,

    Probably the reason is when k is small the counter has already passed the compare threshold before the AQ registers have been written.  To change PWM patterns in a deterministic way it's best to use the shadow mode.  When you initialise the three PWM modules, set bits 4 & 6 of the AQCTL register to 1.  In the same register, set both LDAQxMODE fields to 00, and LDAQxSYNC fields to 00.  This will force the AQ register updates to take place automatically on the next CTR = zero event after you have made the changes in the ISR.  Hopefully that will do what you want.

    Regards,

    Richard

  • Richard,

    Thank you so much for your reply. I will try the suggestions and I give you feadback
    Regards.
  • Hi Richard,
    I have tried the your suggestion but I still have same problem. I will try TBCTL register SWFSYNC bit to synchronize the pwm module.