Gate Driver and Power Board of Three Phase Inverter
The gate driver circuit has been redesigned to mitigate electromagnetic interference (EMI) issues. To improve isolation, the ground plane on the high-side (driver side) has been removed, thereby increasing electrical clearance and reducing parasitic ca pacitance between the low-side and high-side circuits. This modification minimizes unintended conductive and capacitive coupling paths, preventing noise from propagat ing across the isolation barrier. Additionally, a proper PCB cutout has been introduced around the gate driver to further enhance creepage and clearance distances, improving overall EMI robustness. However, these changes introduce certain trade-offs. The removal of the ground plane can lead to poorly defined return paths, increasing loop area and potentially contributing to EMI. It may also increase parasitic inductance in the gate drive loop, resulting in switching noise and ringing. To address these challenges, it is recommended to use split ground planes for high-side and low-side sections while maintaining adequate clearance, minimize the gate drive loop area through short and closely routed traces, apply selective copper removal only in high dv/dt regions, and place decoupling capacitors close to the gate driver supply pins to ensure a tight current loop. Overall, the redesign improves isolation and reduces capacitive coupling, but careful attention is required to control loop inductance and maintain proper return paths to achieve optimal EMI performance.
//SINE TRIANGLE PWM
#include "F28x_Project.h"
#include "F2837xD_device.h"
#include "math.h"
#define PI 3.1415926f
#define SAMPLES_PER_CHANNEL 100
#define CHANNELS 8
#define TOTAL_SAMPLES (SAMPLES_PER_CHANNEL * CHANNELS)
#define FRAME_H1 0xAA
#define FRAME_H2 0x55
interrupt void epwm1_isr(void);
interrupt void adca_isr(void);
interrupt void adcb_isr(void);
interrupt void adcc_isr(void);
__interrupt void dmach1_isr(void);
int compvalue = 4000, TBPRD_VALUE = 8000;
unsigned int d1 = 0;
volatile Uint16 d1_buf[100];
unsigned int d2 = 0;
volatile Uint16 d2_buf[100];
unsigned int d3 = 0;
volatile Uint16 d3_buf[100];
unsigned int d4 = 0;
volatile Uint16 d4_buf[100];
unsigned int d5 = 0;
volatile Uint16 d5_buf[100];
unsigned int d6 = 0;
volatile Uint16 d6_buf[100];
unsigned int d7 = 0;
volatile Uint16 d7_buf[100];
unsigned int d8 = 0;
volatile Uint16 d8_buf[100];
volatile Uint16 wr = 0;
volatile Uint16 wr1 = 0;
volatile Uint16 wr2 = 0;
volatile uint16_t comp_raw = 0;
volatile uint32_t tzsel1 = 0;
volatile uint32_t tzflg1 = 0;
void InitCMPSS_XBAR_TZ(void);
void ClearAllEPWMTZ(void);
void InitEPWM(void);
void InitADC(void);
void DMAInit(void);
void InitSCI(void);
void scia_fifo_init(void);
void sendBufferSCI(volatile Uint16 *buf);
unsigned long int i = 0;
unsigned long int k = 0;
unsigned long int i1 = 0;
#pragma DATA_SECTION(bufferA, "ramgs0");
#pragma DATA_SECTION(bufferB, "ramgs1");
#pragma DATA_SECTION(adc_shadow, "ramgs2");
volatile Uint16 adc_shadow[CHANNELS]; //
volatile Uint16 bufferA[TOTAL_SAMPLES];
volatile Uint16 bufferB[TOTAL_SAMPLES];
volatile Uint16 *activeBuffer = bufferA;
volatile Uint16 *sendBuffer = bufferB;
volatile int bufferToggle = 0;
volatile int bufferReadyToSend = 0;
volatile Uint16 done;
float dint=0;
float theta=0, pi=3.1416, Tsw=2e-4;
#define ALPHA_F (2.0f * 3.1415926f * 5.0f * Tsw)
int f=50;
float omega;
float m=0.9;
float V_DC, V_R, I_R;
float k1=0.93908, k2= 0.03045, Y1prev = 0, X1prev = 0, Y2prev = 0, X2prev = 0,Y1=0, Y2=0, V_beta=0, temp=0;
float Y1iprev= 0, X1iprev= 0, Y2iprev= 0, X2iprev= 0, B1=0,B2=0, I_beta=0;
float P,Q, Pf,Qf ;
float W0 = 2.0f * PI * 50.0f;
float V0 = 10.0f * 1.4142f;
float mp = 3e-5f;
float nq = 8e-4f;
float W = 0.0f;
float Vstar = 0.0f;
float theta1 = 0.0f;
float theta_prev = 0.0f;
float theta_req = 0.0f;
void main(void)
{
// #ifdef _FLASH
// memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
// #endif
Uint16 resultsIndex;
InitSysCtrl();
EALLOW;
ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL=1;
ClkCfgRegs.SYSPLLMULT.bit.FMULT=0;
ClkCfgRegs.SYSPLLMULT.bit.IMULT=32;
ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN=1;
ClkCfgRegs.SYSPLLCTL1.bit.PLLEN=1;
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV=1;
ClkCfgRegs.LOSPCP.bit.LSPCLKDIV=1;
EDIS;// here sysclk=160MHz
EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
CpuSysRegs.PCLKCR13.bit.ADC_A = 1;
CpuSysRegs.PCLKCR13.bit.ADC_B = 1;
CpuSysRegs.PCLKCR13.bit.ADC_C = 1;
CpuSysRegs.PCLKCR14.bit.CMPSS1 = 1;
CpuSysRegs.PCLKCR14.bit.CMPSS5 = 1;
CpuSysRegs.PCLKCR7.bit.SCI_A = 1;
CpuSysRegs.PCLKCR0.bit.DMA = 1;
EDIS;
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
InitEPWM();
InitADC();
InitCMPSS_XBAR_TZ();
InitSCI();
scia_fifo_init();
DMAInit();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.EPWM1_INT = &epwm1_isr;
PieVectTable.ADCA1_INT = &adca_isr;
PieVectTable.ADCB1_INT = &adcb_isr;
PieVectTable.ADCC1_INT = &adcc_isr;
PieVectTable.DMA_CH1_INT = &dmach1_isr;
EDIS;
IER |= M_INT3;
IER |= M_INT1;
IER |= M_INT7;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
PieCtrlRegs.PIEIER1.bit.INTx2 = 1;
PieCtrlRegs.PIEIER1.bit.INTx3 = 1;
// PieCtrlRegs.PIEIER7.bit.INTx1 = 1;
PieCtrlRegs.PIEIER7.bit.INTx1 = 1;
EINT;
ERTM;
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
for (resultsIndex = 0; resultsIndex < TOTAL_SAMPLES; resultsIndex++)
{
bufferA[resultsIndex] = 0;
bufferB[resultsIndex] = 0;
}
EALLOW;
DmaRegs.CH1.CONTROL.bit.PERINTCLR = 1;
AdcaRegs.ADCINTFLGCLR.all = 0x3;
EPwm1Regs.ETCNTINITCTL.bit.SOCAINITFRC = 1;
EPwm1Regs.ETCLR.bit.SOCA = 1;
EDIS;
StartDMACH1();
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
while (1)
{
comp_raw = Cmpss1Regs.COMPSTS.bit.COMPHSTS;
tzsel1 = EPwm1Regs.TZSEL.all;
tzflg1 = EPwm1Regs.TZFLG.all;
// EPwm1Regs.TZFRC.bit.OST = 1; // Disable PWM
// EPwm2Regs.TZFRC.bit.OST = 1; // Disable PWM
EALLOW;
// if (EPwm1Regs.TZFLG.bit.OST == 1)
// EPwm1Regs.TZCLR.bit.OST = 1;
// if (EPwm2Regs.TZFLG.bit.OST == 1)
// EPwm2Regs.TZCLR.bit.OST = 1;
EDIS;
if (bufferReadyToSend)
{
// GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;
sendBufferSCI(sendBuffer);
bufferReadyToSend = 0;
}
}
}
#pragma CODE_SECTION(sendBufferSCI, ".TI.ramfunc");
void sendBufferSCI(volatile Uint16 *buf)
{
// -------- FRAME HEADER (3 bytes) --------
while (SciaRegs.SCIFFTX.bit.TXFFST>=15);
SciaRegs.SCITXBUF.all = FRAME_H1;
while (SciaRegs.SCIFFTX.bit.TXFFST>=15);
SciaRegs.SCITXBUF.all = FRAME_H2;
// -------- PAYLOAD --------
for (i1 = 0; i1 < TOTAL_SAMPLES; i1++)
{
while (SciaRegs.SCIFFTX.bit.TXFFST>=15);
SciaRegs.SCITXBUF.all = (buf[i1] >> 8) & 0xFF;
while (SciaRegs.SCIFFTX.bit.TXFFST>=15);
SciaRegs.SCITXBUF.all = buf[i1] & 0xFF;
}
}
#pragma CODE_SECTION(dmach1_isr, ".TI.ramfunc");
__interrupt void dmach1_isr(void)
{
bufferToggle ^= 1;
if (bufferToggle)
{
activeBuffer = bufferB;
sendBuffer = bufferA;
}
else
{
activeBuffer = bufferA;
sendBuffer = bufferB;
}
DmaRegs.CH1.CONTROL.bit.HALT = 1;
DMACH1AddrConfig(activeBuffer, &adc_shadow[0]);
bufferReadyToSend = 1;
DmaRegs.CH1.CONTROL.bit.RUN = 1;
DmaRegs.CH1.CONTROL.bit.HALT = 0;
DmaRegs.CH1.CONTROL.bit.PERINTCLR = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP7;
}
void InitEPWM(void)
{
EALLOW;
GpioCtrlRegs.GPBGMUX1.bit.GPIO32 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1;
GpioCtrlRegs.GPCGMUX1.bit.GPIO67 = 0;
GpioCtrlRegs.GPCMUX1.bit.GPIO67 = 0;
GpioCtrlRegs.GPCDIR.bit.GPIO67 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
// GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0;
//GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
//GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;
GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
GpioCtrlRegs.GPAGMUX1.bit.GPIO2 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;
GpioCtrlRegs.GPAGMUX1.bit.GPIO3 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO15=1; //
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 2; // Configure GPIO12 as TZ1
GpioCtrlRegs.GPAGMUX1.bit.GPIO15 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO11 = 0; // Enable pull-up on GPIO12 (TZ1)
GpioCtrlRegs.GPAQSEL1.bit.GPIO11 = 3; // Asynch input GPIO12 (TZ1)
GpioCtrlRegs.GPADIR.bit.GPIO11=0; //
GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 0; // Configure GPIO12 as TZ1
InputXbarRegs.INPUT1SELECT = 11;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;// here epwmclk= 160mhz/1=160MHz
EPwm1Regs.TBPRD = TBPRD_VALUE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;
EPwm1Regs.TBCTL.bit.CLKDIV = 0x0;// here TBCLK= 160/(1*2) = 80MHz.
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPA.bit.CMPA = 4000;
EPwm1Regs.AQCTLA.bit.CAU = 1;
EPwm1Regs.AQCTLA.bit.CAD = 2;
EPwm1Regs.DBCTL.bit.IN_MODE = 0;
EPwm1Regs.DBRED.bit.DBRED = 150;
EPwm1Regs.DBFED.bit.DBFED = 150;
EPwm1Regs.DBCTL.bit.POLSEL = 2;
EPwm1Regs.DBCTL.bit.OUT_MODE = 3;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
EPwm1Regs.ETSEL.bit.INTEN = 1;
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;
EPwm2Regs.TBPRD = TBPRD_VALUE;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 1;
EPwm2Regs.TBCTL.bit.CLKDIV = 0x0;
EPwm2Regs.TBCTR = 0x0000;
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPA.bit.CMPA = 4000;
EPwm2Regs.AQCTLA.bit.CAU = 1;
EPwm2Regs.AQCTLA.bit.CAD = 2;
EPwm2Regs.DBCTL.bit.IN_MODE = 0;
EPwm2Regs.DBRED.bit.DBRED = 150;
EPwm2Regs.DBFED.bit.DBFED = 150;
EPwm2Regs.DBCTL.bit.POLSEL = 2;
EPwm2Regs.DBCTL.bit.OUT_MODE = 3;
EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
EPwm2Regs.ETSEL.bit.INTEN = 1;
EPwm2Regs.ETPS.bit.INTPRD = ET_1ST;
EDIS;
EALLOW;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
EPwm1Regs.ETSEL.bit.SOCASEL = 1;
EPwm1Regs.ETPS.bit.SOCAPRD = 1;
EDIS;
}
void InitADC(void)
{
EALLOW;
AdcaRegs.ADCCTL2.bit.PRESCALE = 6;
AdcbRegs.ADCCTL2.bit.PRESCALE = 6;
AdccRegs.ADCCTL2.bit.PRESCALE = 6;
AdcaRegs.ADCCTL2.bit.RESOLUTION = 1;
AdcbRegs.ADCCTL2.bit.RESOLUTION = 1;
AdccRegs.ADCCTL2.bit.RESOLUTION = 0;
AdcaRegs.ADCCTL2.bit.SIGNALMODE = 1;
AdcbRegs.ADCCTL2.bit.SIGNALMODE = 1;
AdccRegs.ADCCTL2.bit.SIGNALMODE = 0;
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;
DELAY_US(1000);
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14;
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 4;
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 14;
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5;
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 1;
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 2;
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 14;
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 4;
AdcbRegs.ADCSOC1CTL.bit.ACQPS = 14;
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 5;
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 1;
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
AdccRegs.ADCSOC0CTL.bit.CHSEL = 2;
AdccRegs.ADCSOC0CTL.bit.ACQPS = 14;
AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
AdccRegs.ADCSOC1CTL.bit.CHSEL = 3;
AdccRegs.ADCSOC1CTL.bit.ACQPS = 14;
AdccRegs.ADCSOC1CTL.bit.TRIGSEL = 5;
AdccRegs.ADCSOC2CTL.bit.CHSEL = 4;
AdccRegs.ADCSOC2CTL.bit.ACQPS = 14;
AdccRegs.ADCSOC2CTL.bit.TRIGSEL = 5;
AdccRegs.ADCSOC3CTL.bit.CHSEL = 5;
AdccRegs.ADCSOC3CTL.bit.ACQPS = 14;
AdccRegs.ADCSOC3CTL.bit.TRIGSEL = 5;
AdccRegs.ADCINTSEL1N2.bit.INT1SEL = 3;
AdccRegs.ADCINTSEL1N2.bit.INT1E = 1;
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
EDIS;
}
void DMAInit(void)
{
DMAInitialize();
DMACH1AddrConfig(activeBuffer, &adc_shadow[0]);
EALLOW;
DmaRegs.CH1.BURST_SIZE.all = CHANNELS - 1;
DmaRegs.CH1.SRC_BURST_STEP = 1;
DmaRegs.CH1.DST_BURST_STEP = 1;
DmaRegs.CH1.TRANSFER_SIZE = SAMPLES_PER_CHANNEL - 1;
DmaRegs.CH1.SRC_TRANSFER_STEP = -7;
DmaRegs.CH1.DST_TRANSFER_STEP = 1;
DmaClaSrcSelRegs.DMACHSRCSEL1.bit.CH1 = DMA_ADCCINT1;
DmaRegs.CH1.MODE.bit.PERINTSEL = 1;
DmaRegs.CH1.MODE.bit.PERINTE = 1;
DmaRegs.CH1.MODE.bit.CONTINUOUS = 1;
DmaRegs.CH1.MODE.bit.DATASIZE = 0;
DmaRegs.CH1.MODE.bit.CHINTMODE = 1;
DmaRegs.CH1.MODE.bit.CHINTE = 1;
DmaRegs.CH1.CONTROL.bit.PERINTCLR = 1;
DmaRegs.CH1.CONTROL.bit.ERRCLR = 1;
EDIS;
}
interrupt void epwm1_isr(void)
{
EPwm1Regs.CMPA.bit.CMPA = 4000+(4000*m*sinf(theta));
EPwm2Regs.CMPA.bit.CMPA = 4000-(4000*m*sinf(theta));
omega=2*pi*f;
theta=theta+omega*Tsw;
if(theta > 6.2832)
{
theta = theta - 6.2832;
}
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
EPwm1Regs.ETCLR.bit.INT = 1;
}
interrupt void adca_isr(void)
{
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
return;
}
interrupt void adcb_isr(void)
{
// ch4 <-- NEW
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
return;
}
interrupt void adcc_isr(void)
{
// GpioDataRegs.GPBSET.bit.GPIO32 = 1;
// GpioDataRegs.GPCSET.bit.GPIO67 = 1;
wr2 = (wr2 + 1) % 100;
adc_shadow[0] = AdcaResultRegs.ADCRESULT0; // d1
adc_shadow[1] = AdcaResultRegs.ADCRESULT1; // d1
// adc_shadow[2] = (AdcbResultRegs.ADCRESULT0)*1; // d2
adc_shadow[3] = (AdcbResultRegs.ADCRESULT1)*1; // d3
adc_shadow[4] = (AdccResultRegs.ADCRESULT0);
adc_shadow[5] = (AdccResultRegs.ADCRESULT1)*1; // ch5 <-- NEW
adc_shadow[6] = (AdccResultRegs.ADCRESULT2)*1;
V_DC = adc_shadow[4]*0.1119;
V_R = ((float)adc_shadow[5] - 1890.0f) * 0.10894f;
Y1 = k1*Y1prev + k2*(V_R + X1prev);
Y1prev = Y1;
X1prev = V_R;
Y2 = k1*Y2prev + k2*(Y1 + X2prev);
Y2prev = Y2;
X2prev = Y1;
V_beta = 2 * Y2;
temp = V_beta * 9.18f + 1890.0f;
if (temp < 0.0f)
temp = 0.0f;
else if (temp > 4095.0f)
temp = 4095.0f;
I_R = ((float)adc_shadow[1] - 32800.0f) * 0.002808f;
B1 = k1*Y1iprev + k2*(I_R + X1iprev);
Y1iprev = B1;
X1iprev = I_R;
B2 = k1*Y2iprev + k2*(B1 + X2iprev);
Y2iprev = B2;
X2iprev = B1;
I_beta = 2.0f * B2;
temp = (I_beta * 356.13f) + 32800.0f;
if (temp < 0.0f)
temp = 0.0f;
else if (temp > 65535.0f)
temp = 65535.0f;
// Instantaneous Power
P = V_R * I_R + V_beta * I_beta;
Q = -V_beta * I_R + V_R * I_beta;
// LPF
Pf = Pf + ALPHA_F * (P - Pf);
Qf = Qf + ALPHA_F * (Q - Qf);
// -------- DROOP --------
W = W0 - mp * Pf;
Vstar = V0 - nq * Qf;
// -------- ANGLE INTEGRATION --------
theta1 = theta_prev + W * Tsw;
// -------- ANGLE WRAPPING --------
if (theta1 >= 2.0f * PI)
theta1 -= 2.0f * PI;
else if (theta1 < 0.0f)
theta1 += 2.0f * PI;
theta_req = theta1;
theta_prev = theta_req;
temp = theta_req*50;
adc_shadow[2] = (uint16_t)temp;
adc_shadow[7] = AdccResultRegs.ADCRESULT3; // d1
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
return;
}
void InitCMPSS_XBAR_TZ(void)
{
// ConfigureCMPSS1_DAC_and_Filter_simple();
//ConfigureAllEPWMs_for_TRIP4_OneShot();
}
void ConfigureCMPSS1_DAC_and_Filter_simple(void)
{
EALLOW;
Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = 0; // CMPSS pin
Cmpss1Regs.COMPCTL.bit.COMPHINV = 0; // non-inverted
Cmpss1Regs.COMPCTL.bit.COMPDACE = 1; // enable DAC
Cmpss1Regs.COMPCTL.bit.ASYNCHEN = 1; // async path
/* VERY IMPORTANT */
Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = 0; // raw COMPH
Cmpss1Regs.COMPCTL.bit.CTRIPOUTHSEL = 0; // CTRIPOUT = COMPH (ASYNC)
Cmpss1Regs.COMPDACCTL.bit.SELREF = 0; // VDDA
Cmpss1Regs.COMPDACCTL.bit.SWLOADSEL = 1;
Cmpss1Regs.DACHVALS.bit.DACVAL = 2048;
Cmpss1Regs.DACHVALA.bit.DACVAL =Cmpss1Regs.DACHVALS.bit.DACVAL;
Cmpss1Regs.DACLVALS.bit.DACVAL = 0;
Cmpss1Regs.COMPSTSCLR.bit.HLATCHCLR = 1;
Cmpss1Regs.COMPSTSCLR.bit.HLATCHCLR = 0;
EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX0 = 0; // 0 = CMPSS1H
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX0 = 1;
EPwmXbarRegs.TRIPOUTINV.bit.TRIP4 = 0; // no invert
/* TRIP4 → DCAH */
EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 3; // TRIPIN4
Cmpss5Regs.COMPCTL.bit.COMPHSOURCE = 0;
Cmpss5Regs.COMPCTL.bit.COMPHINV = 0;
Cmpss5Regs.COMPCTL.bit.COMPDACE = 1;
Cmpss5Regs.COMPCTL.bit.ASYNCHEN = 0;
Cmpss5Regs.COMPCTL.bit.CTRIPHSEL = 0;
Cmpss5Regs.COMPCTL.bit.CTRIPOUTHSEL = 0;
Cmpss5Regs.COMPDACCTL.bit.SELREF = 0;
Cmpss5Regs.COMPDACCTL.bit.SWLOADSEL = 1;
Cmpss5Regs.DACHVALS.bit.DACVAL = 2500;
Cmpss5Regs.DACHVALA.bit.DACVAL = Cmpss5Regs.DACHVALS.bit.DACVAL;
Cmpss5Regs.DACLVALS.bit.DACVAL = 0;
Cmpss5Regs.COMPSTSCLR.bit.HLATCHCLR = 1;
Cmpss5Regs.COMPSTSCLR.bit.HLATCHCLR = 0;
Cmpss5Regs.COMPSTS.bit.COMPHSTS = 0;
Cmpss5Regs.COMPSTS.bit.COMPHLATCH = 0;
EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX8 = 0; // 0 = CMPSS1H
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX8 = 1;
OutputXbarRegs.OUTPUT4MUX0TO15CFG.bit.MUX2 = 0;
OutputXbarRegs.OUTPUT4MUXENABLE.bit.MUX2 = 1;
OutputXbarRegs.OUTPUTINV.bit.OUTPUT4 = 1;
EDIS;
}
void ConfigureAllEPWMs_for_TRIP4_OneShot(void)
{
EALLOW;
/* TRIP4 → DCAH */
EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 3; // TRIPIN4
/* DCAEVT1 when DCAH HIGH */
EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 2; // DCAH High
EPwm1Regs.DCACTL.bit.EVT1SRCSEL = 0; // DCAH
EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = 1; // Async
/* One-shot trip */
EPwm1Regs.TZSEL.bit.DCAEVT1 = 1;
/* Force low when tripped */
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
/* Clear old flags */
EPwm1Regs.TZCLR.bit.OST = 1;
EPwm1Regs.TZCLR.bit.DCAEVT1 = 1;
EDIS;
}
void InitSCI(void)
{
EALLOW;
GpioCtrlRegs.GPBGMUX1.bit.GPIO42 = 3;
GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 3;
GpioCtrlRegs.GPBGMUX1.bit.GPIO43 = 3;
GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 3;
SciaRegs.SCICCR.all = 0x0007;
SciaRegs.SCICTL1.all = 0x0003;
SciaRegs.SCICTL2.bit.TXINTENA = 1;
SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
SciaRegs.SCIHBAUD.all = 0x0000;
SciaRegs.SCILBAUD.all = 9;
SciaRegs.SCICTL1.all = 0x0023;
EDIS;
}
void scia_fifo_init(void)
{
SciaRegs.SCIFFTX.all = 0xE040;
SciaRegs.SCIFFRX.all = 0x0021;
SciaRegs.SCIFFCT.all = 0x0;
SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
}
Gate Driver and Power Board of Three Phase Inverter
*PCBWay community is a sharing platform. We are not responsible for any design issues and parameter issues (board thickness, surface finish, etc.) you choose.
Raspberry Pi 5 7 Inch Touch Screen IPS 1024x600 HD LCD HDMI-compatible Display for RPI 4B 3B+ OPI 5 AIDA64 PC Secondary Screen(Without Speaker)
BUY NOW- Comments(0)
- Likes(0)
- 0 USER VOTES
- YOUR VOTE 0.00 0.00
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
More by Engineer
-
Programmable Mist Maker - XIAO / QT PY Extension
56 0 0 -
RadioHAT - Raspberry Pi radio development platform
80 0 0 -
-
-
-
-
ARPS-2 – Arduino-Compatible Robot Project Shield for Arduino UNO
2708 0 5 -
-
A Compact Charging Breakout Board For Waveshare ESP32-C3
3204 3 8 -
AI-driven LoRa & LLM-enabled Kiosk & Food Delivery System
3459 2 2







