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
}