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.

Compiler/LAUNCHXL-F28377S: Epwm Frequency Problem

Part Number: LAUNCHXL-F28377S

Tool/software: TI C/C++ Compiler

Hi everyone,

I know that, there are many topics related to this problem. But,i am still having problems. I use the launch F28377s in my project. I want to generate the 10kHz SPWM. I use the up-down count mode and so that I used the formula (TPWM = 2 x T_BPRD x T_TBCLK) to determine the pwm frequency. if the epwm module clock frequency is equal to the 100Mhz (1/T_TBCLK),  T_BPRD must be equal to 5000. But by using the simple code above I get the 5kHz pwm signal.

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


    #define EPWM2_TIMER_TBPRD  5000 
    #define PI 3.14159265358979323846

    void InitEPwm7Example(void);
    void InitEPwm8Example(void);
    void poweroff(void);
    void poweron(void);
    __interrupt void epwm8_isr(void);

    unsigned int i=0,m=0,sample_number=0,start_button=0,stop_button=0;
    float a=0,sin_value=0;
    int sin_array[100]={0};

    // Main

    void main(void)
     {


    	InitSysCtrl();

        CpuSysRegs.PCLKCR2.bit.EPWM7=1;
        CpuSysRegs.PCLKCR2.bit.EPWM8=1;
       //InitGpio();
        EALLOW;
poweroff();
        EDIS;

        DINT;

        InitPieCtrl();

        IER = 0x0000;
        IFR = 0x0000;

        InitPieVectTable();

        EALLOW;

        PieVectTable.EPWM8_INT = &epwm8_isr;

        EDIS;
        EALLOW;

        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;

        EDIS;

        InitEPwm7Example();
        InitEPwm8Example();

        EALLOW;
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;

        EDIS;
        IER |= M_INT3;

        PieCtrlRegs.PIEIER3.bit.INTx8 = 1;

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

        for(sample_number=0;sample_number<100;sample_number++){
    sin_value=4800*sin(sample_number*PI*0.02);
    //if(sin_value<0){sin_value=sin_value;}
    sin_array[sample_number]=(int)sin_value;}
        //sin_array[400]=0;


     /*   for(;;)
        {
           asm ("    NOP");

            }*/


        //adulhocadan aldım!!!!!!!!
        git01:
        	if (GpioDataRegs.GPCDAT.bit.GPIO78 == 1 && start_button == 100)
         	{poweron();
         	}
        	if (stop_button == 100)
        	{poweroff();
        	i=0;
        	}
        	goto git01;
        //buraya kadar!!!!!!!




    }

    __interrupt void epwm8_isr(void)
    {
    	if (GpioDataRegs.GPCDAT.bit.GPIO78 == 1)
    	 	{if(start_button<100)  start_button++;
    	 	stop_button=0;}
    		else
    		{if(stop_button<100) stop_button++;
    		start_button=0;}

    if(i<99)i++;
    else i=0;


    if (sin_array[i]>0){


    	    EPwm7Regs.CMPA.bit.CMPA = sin_array[i]+100;
    	    EPwm7Regs.CMPB.bit.CMPB = 1;
    	    EPwm8Regs.CMPA.bit.CMPA = sin_array[i]+100;
    	    EPwm8Regs.CMPB.bit.CMPB = sin_array[i]+100;

    	    EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR; // S5 anahtarına
    	    EPwm7Regs.AQCTLA.bit.CAD =AQ_SET;


    	    EPwm7Regs.AQCTLB.bit.CBU = AQ_CLEAR;// deadtime üretirken ters üretiyo // S1-S4  anahtarlarına gidiyor
    	    EPwm7Regs.AQCTLB.bit.CBD = AQ_CLEAR;


    	    EPwm8Regs.AQCTLA.bit.CAU = AQ_CLEAR;  // S6 anahtarına
    	    EPwm8Regs.AQCTLA.bit.CAD = AQ_SET;

    	    EPwm8Regs.AQCTLB.bit.CBU = AQ_CLEAR; // S2-S3 anahtarlarına gidiyor.  tersleneerek cıkısa veriliyor deadtime dan dolayı
    	    EPwm8Regs.AQCTLB.bit.CBD = AQ_SET;


    }
    else {

    	        EPwm7Regs.CMPB.bit.CMPB = (-sin_array[i])+100;
    	        EPwm7Regs.CMPA.bit.CMPA = (-sin_array[i])+100;
    	 	    EPwm8Regs.CMPA.bit.CMPA = (-sin_array[i])+100;
    	 	    EPwm8Regs.CMPB.bit.CMPB = 1;

    	        EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR;  // S5
    		    EPwm7Regs.AQCTLA.bit.CAD = AQ_SET;

    	        EPwm7Regs.AQCTLB.bit.CBU = AQ_CLEAR; //S1-S4   tersleneerek cıkısa veriliyor deadtime dan dolayı
    	        EPwm7Regs.AQCTLB.bit.CBD = AQ_SET;

    		    EPwm8Regs.AQCTLA.bit.CAU = AQ_CLEAR;  //S6
    		    EPwm8Regs.AQCTLA.bit.CAD = AQ_SET;

    		    EPwm8Regs.AQCTLB.bit.CBU = AQ_CLEAR;  //S2-S3 anahtarlarına   tersleneerek cıkısa veriliyor deadtime dan dolayı
    		    EPwm8Regs.AQCTLB.bit.CBD = AQ_CLEAR;

    }

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


void poweroff()
{
	EALLOW;
        /*GpioCtrlRegs.GPAPUD.bit.GPIO12  = 1;    // Disable pull-up on GPIO12 (EPWM7A)
        GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;    // Configure GPIO12 as GPIO PIN 40
        GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;      //Configure GPIO78 as Input*/



	    GpioCtrlRegs.GPAPUD.bit.GPIO12  = 1;    // Disable pull-up on GPIO13 (EPWM7B)
	    GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;    // Configure GPIO13 as GPIO PIN 39
	    GpioCtrlRegs.GPADIR.bit.GPIO12 = 1;      //Configure GPIO78 as output
	    GpioDataRegs.GPACLEAR.bit.GPIO12=1;       //set 0

        GpioCtrlRegs.GPAPUD.bit.GPIO13  = 1;    // Disable pull-up on GPIO13 (EPWM7B)
        GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;    // Configure GPIO13 as GPIO PIN 39
        GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;      //Configure GPIO78 as Input
        GpioDataRegs.GPACLEAR.bit.GPIO13=1;


        GpioCtrlRegs.GPAPUD.bit.GPIO14  = 1;    // Disable pull-up on GPIO13 (EPWM7B)
        GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;    // Configure GPIO13 as GPIO PIN 39
        GpioCtrlRegs.GPADIR.bit.GPIO14 = 1;      //Configure GPIO78 as Input
        GpioDataRegs.GPACLEAR.bit.GPIO14=1;

        GpioCtrlRegs.GPAPUD.bit.GPIO15  = 1;    // Disable pull-up on GPIO13 (EPWM7B)
        GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0;    // Configure GPIO13 as GPIO PIN 39
        GpioCtrlRegs.GPADIR.bit.GPIO15 = 1;      //Configure GPIO78 as Input
        GpioDataRegs.GPACLEAR.bit.GPIO15=1;

        GpioCtrlRegs.GPCPUD.bit.GPIO78 = 1;      //Disable pull-up on GPIO71 PIN11
        GpioCtrlRegs.GPCMUX1.bit.GPIO78= 0;      //Configure GPIO2 as GPIO PIN11
        GpioCtrlRegs.GPCDIR.bit.GPIO78 = 0;      //Configure GPIO78 as Input
        EDIS;
	}

void poweron()
{EALLOW;
	GpioCtrlRegs.GPAPUD.bit.GPIO12  = 1;    // Disable pull-up on GPIO12 (EPWM7A)
	GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 1;    // Configure GPIO12 as EPWM7A PIN 40
	GpioCtrlRegs.GPAPUD.bit.GPIO13  = 1;    // Disable pull-up on GPIO13 (EPWM7B)
	GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 1;    // Configure GPIO13 as EPWM7B PIN 39
	GpioCtrlRegs.GPAPUD.bit.GPIO14  = 1;    // Disable pull-up on GPIO14 (EPWM8A)
	GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 1;    // Configure GPIO14 as EPWM8A PIN 38
	GpioCtrlRegs.GPAPUD.bit.GPIO15  = 1;    // Disable pull-up on GPIO15 (EPWM8B)
	GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 1;    // Configure GPIO15 as EPWM8B PIN 37
	GpioCtrlRegs.GPCPUD.bit.GPIO78 =  1;      //Disable pull-up on GPIO71 PIN11
    GpioCtrlRegs.GPCMUX1.bit.GPIO78=  0;      //Configure GPIO2 as GPIO PIN11
	GpioCtrlRegs.GPCDIR.bit.GPIO78 =  0;      //Configure GPIO78 as Input
	EDIS;
}



    void InitEPwm7Example()
    {
        //PWM clock normaly 100MHz, but here divided by two so 50MHz frequency is used
        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;

        //EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
        //EPwm2Regs.TBCTL.bit.SWFSYNC = 1;
        EPwm7Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

       //EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
      /// EPwm2Regs.CMPCTL.bit.LOADAMODE=0;
       //EPwm2Regs.CMPCTL.bit.LOADASYNC=0;


        EPwm7Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE;
        EPwm7Regs.CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE;

       //EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
       //EPwm2Regs.CMPCTL.bit.LOADBMODE=0;
      //EPwm2Regs.CMPCTL.bit.LOADBSYNC=0;

        EPwm7Regs.AQCTL.bit.SHDWAQAMODE=0;
        //EPwm2Regs.AQCTL.bit.LDAQAMODE=0;
        //EPwm2Regs.AQCTL.bit.LDAQASYNC=0;

        EPwm7Regs.AQCTL.bit.SHDWAQBMODE=0;
        //EPwm2Regs.AQCTL.bit.LDAQBMODE=0;
        //EPwm2Regs.AQCTL.bit.LDAQBSYNC=0;

        EPwm7Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
        EPwm7Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
        EPwm7Regs.DBCTL.bit.IN_MODE = DBA_RED_DBB_FED;
        EPwm7Regs.DBRED.bit.DBRED = 80;
        EPwm7Regs.DBFED.bit.DBFED = 80;

        EPwm7Regs.TBPRD = EPWM2_TIMER_TBPRD;         // Set timer period 801 TBCLKs
        EPwm7Regs.TBPHS.bit.TBPHS = 0x0000;          // Phase is 0
        EPwm7Regs.TBCTR = 0x0000;                    // Clear counter

    }

    void InitEPwm8Example()
    {
        EPwm8Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;    // hem zero hemde TBPRD zamanında intrrupt alıyo.
        EPwm8Regs.ETSEL.bit.INTEN = 1;               // Enable INT
        EPwm8Regs.ETPS.bit.INTPRD = ET_1ST;          // Generate INT on 1st event

        EPwm8Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up and down
        EPwm8Regs.TBCTL.bit.PHSEN = TB_ENABLE;        // Disable phase loading
        EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
        EPwm8Regs.TBCTL.bit.CLKDIV = TB_DIV2;

        //EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;
        //EPwm3Regs.TBCTL.bit.SWFSYNC = 1;
        EPwm8Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

        EPwm8Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE;
        EPwm8Regs.CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE;
       //EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
       //EPwm3Regs.CMPCTL.bit.LOADAMODE=0;
        //EPwm3Regs.CMPCTL.bit.LOADASYNC=0;

        EPwm8Regs.AQCTL.bit.SHDWAQAMODE=0;
        EPwm8Regs.AQCTL.bit.SHDWAQBMODE=0;
        //EPwm3Regs.AQCTL.bit.LDAQAMODE=0;
        //EPwm3Regs.AQCTL.bit.LDAQASYNC=0;

        EPwm8Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
        EPwm8Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
        EPwm8Regs.DBCTL.bit.IN_MODE = DBA_RED_DBB_FED;
        EPwm8Regs.DBRED.bit.DBRED = 80;
        EPwm8Regs.DBFED.bit.DBFED = 80;

        EPwm8Regs.TBPRD = EPWM2_TIMER_TBPRD;         // Set timer period 801 TBCLKs
        EPwm8Regs.TBPHS.bit.TBPHS = 0x0000;          // Phase is 0
        EPwm8Regs.TBCTR = 0x0000;                    // Clear counter

    }

  • I know that, there are many topics related to this problem. But,i am still having problems. I use the launch F28377s in my project. I want to generate the 10kHz SPWM. I use the up-down count mode and so that I used the formula (TPWM = 2 x T_BPRD x T_TBCLK) to determine the pwm frequency. if the epwm module clock frequency is equal to the 100Mhz (1/T_TBCLK),  T_BPRD must be equal to 5000. But by using the simple code above I get the 5kHz pwm signal.

    EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT

    EPwm8Regs.TBCTL.bit.CLKDIV = TB_DIV2;

     

    Hi Enes,

    With above hspclkdiv & clkdiv setting the TBCLK will be 50MHz and hence the TBPRD value should be 2500 to get 10KHz signal. Please refer below figure for the relation betwn epwmclk & tbclk.


    Thanks

    Vasudha