Tool/software:
Hi All,
I am testing for Single Phase and three Phase DC/AC power. Especially Single Phase Inverter, I run the code and check with scope, the switching pattern is not what i wanted. Anybody can help? Appreciate.
Below is the code what i programmed to my PCB.
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "IQmathLib.h"
#include <math.h>
// external function prototypes
extern void InitSysCtrl(void);
extern void InitPieCtrl(void);
extern void InitPieVectTable(void);
// Prototypes statements for functions found this file
void Gpio_select(void);
void Setup_ePWM(void);
interrupt void ePWMA_compare_isr(void);
#define PI 3.14159265358979323846
unsigned int i=0,m=0;
float a=0;
unsigned int b[101]={0};
#define EPWM1_TIMER_TBPRD 1000 // Period register
void main(void)
{
InitSysCtrl(); // Basic Core Init from DSP2833x_SysCtrl.c
for(m=0;m<100;m++)
{
b[m]=2500*(1+sin(PI*0.02*m));
}
b[100]=0;
Gpio_select(); // To select required pins as output
DINT; // Disable all interrupts
InitPieCtrl(); // basic setup of PIE table
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable(); // default ISR's in PIE
EALLOW;
PieVectTable.EPWM1_INT = &ePWMA_compare_isr;
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
Setup_ePWM(); // init of ePWM pins
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
IER |= M_INT3;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK=1;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;)
{
asm (" NOP");
}
}
// End of main()
void Gpio_select(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.all = 0; // GPIO15 ... GPIO0 = General Puropse I/O
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // ePWM1A active
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // ePWM1B active
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // ePWM2A active
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; // ePWM2B active
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; // ePWM3A active
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1; // ePWM3B active
GpioCtrlRegs.GPAMUX2.all = 0; // GPIO31 ... GPIO16 = General Purpose I/O
GpioCtrlRegs.GPBMUX1.all = 0; // GPIO47 ... GPIO32 = General Purpose I/O
GpioCtrlRegs.GPBMUX2.all = 0; // GPIO63 ... GPIO48 = General Purpose I/O
GpioCtrlRegs.GPCMUX1.all = 0; // GPIO79 ... GPIO64 = General Purpose I/O
GpioCtrlRegs.GPCMUX2.all = 0; // GPIO87 ... GPIO80 = General Purpose I/O
GpioCtrlRegs.GPADIR.all = 0;
GpioCtrlRegs.GPBDIR.all = 0xFFFFFFFF;
GpioCtrlRegs.GPCDIR.all = 0xFFFFDFFF;
EDIS;
}
void Setup_ePWM(void)
{
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // TBCTR = 0
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on 1st event
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up and down
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4; // Clock ratio to SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE;
EPwm1Regs.CMPA.half.CMPA =0000;
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; // Set timer period 801 TBCLKs
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter // Generate pulse on 1st event
}
interrupt void ePWMA_compare_isr(void)
{
a=sin(PI*0.02*i);
if (a>=0)
{
EPwm1Regs.AQCTLA.bit.CAU = 1; // Set PWM2A on event A, up
EPwm1Regs.AQCTLA.bit.CAD = 2; // Clear PWM2A on event B, down
EPwm1Regs.CMPA.half.CMPA =b[i];
}
else
{
EPwm1Regs.AQCTLA.bit.CAU = 2; // Set PWM2A on event A, up
EPwm1Regs.AQCTLA.bit.CAD = 1; // Clear PWM2A on event B, down
EPwm1Regs.CMPA.half.CMPA =b[i];
}
i++;
if (i==101)
{
i=0;
}
EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}