//-------------------------------------------------------// // Project Code : V2H6K01-23-ENEMAN // File Name : GateCtrl.cpp // Created on : 2023. 07. 24. // Description : // Author : KimJeongWoo // Last modified Date : //-------------------------------------------------------// #include "Cpu1DeviceDefine.h" float InvPwmFreq = 40.0e3; //Set Inverter PWM Frequency float BoostPwmFreq = 40.0e3; //Set Boost PWM Frequency float DabPwmFreq = 40.0e3; //Set DAB PWM Frequency unsigned int InvPwmPrd = 0; //Initialize Inverter PWM Period unsigned int BoostPwmPrd = 0; //Initialize Boost PWM Period unsigned int DabPwmPrd = 0; //Initialize DAB PWM Period float InvDeadtime = 0.7e-6; //Set Inverter Dead Time float BoostDeadtime = 0.7e-6; //Set Boost Dead Time float DabDeadtime = 0.7e-6; //Set DAB Dead Time unsigned int TestCnt1 = 0; //Initialize PWM Test Count1 unsigned int TestCnt2 = 0; //Initialize PWM Test Count2 unsigned int TestCnt3 = 0; //Initialize PWM Test Count3 unsigned int TestCnt4 = 0; //Initialize PWM Test Count4 unsigned int TestCnt5 = 0; //Initialize PWM Test Count5 unsigned int TestCnt6 = 0; //Initialize PWM Test Count6 unsigned int TestCnt7 = 0; //Initialize PWM Test Count7 int FlagTestInvGatingInput = 0; //Initialize Inverter PWM Gating Test Flag int FlagTestBoostGatingInput = 0; //Initialize Boost PWM Gating Test Flag int FlagTestDabGatingInput = 0; //Initialize DAB PWM Gating Test Flag void InitEPwm() //EPWM Initialize Function { SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); //Disable Peripheral SysCtl_setEPWMClockDivider(SYSCTL_EPWMCLK_DIV_1); //EPWMClock = system_clock / SYSCTL_EPWMCLK_DIV InitEPwm1Gpio(); //Initialize PWM1 GPIO InitEPwm2Gpio(); //Initialize PWM2 GPIO InitEPwm3Gpio(); //Initialize PWM3 GPIO InitEPwm4Gpio(); //Initialize PWM4 GPIO InitEPwm5Gpio(); //Initialize PWM5 GPIO InitEPwm6Gpio(); //Initialize PWM6 GPIO InitEPwm7Gpio(); //Initialize PWM7 GPIO InitGateEnbGpio(); //Initialize PWM Gate Enable GPIO //Booster InitEPwm1(BoostPwmFreq, BoostDeadtime, TB_COUNT_UPDOWN, 0); //Initialize PWM1 BoostPwmPrd = EPwm1Regs.TBPRD; //Set Boost PWM Period //Dab //LvSide InitEPwm2(DabPwmFreq, DabDeadtime, TB_COUNT_UPDOWN, 0); //Initialize PWM2 InitEPwm3(DabPwmFreq, DabDeadtime, TB_COUNT_UPDOWN, 0); //Initialize PWM3 //HvSide InitEPwm4(DabPwmFreq, DabDeadtime, TB_COUNT_UPDOWN, 0); //Initialize PWM4 InitEPwm5(DabPwmFreq, DabDeadtime, TB_COUNT_UPDOWN, 0); //Initialize PWM5 DabPwmPrd = EPwm2Regs.TBPRD; //Set DAB PWM Period //Inverter InitEPwm6(InvPwmFreq, InvDeadtime, TB_COUNT_UPDOWN, 0); //Initialize PWM6 InitEPwm7(InvPwmFreq, InvDeadtime, TB_COUNT_UPDOWN, 0); //Initialize PWM7 InvPwmPrd = EPwm6Regs.TBPRD; //Set Inverter PWM Period SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); //Enable Peripheral } void PwmTestCode() //Define PWM Test Function { // if (FlagTestBoostGatingInput == 1) //If Boost Gating Input Test Flag is TRUE // { // EPwm1Regs.CMPA.bit.CMPA = TestCnt1; //Set Compare Register // FlagBoostGatingInput = 1; //Set Boost Gating Input Flag // } // else //Other Case // { // FlagBoostGatingInput = 0; //Set Boost Gating Input Flag // EPwm1Regs.CMPA.bit.CMPA = 0; //Reset Compare Register // } // // if (FlagTestDabGatingInput == 1) //If DAB Gating Input Test Flag is TRUE // { // // EPwm2Regs.CMPA.bit.CMPA = TestCnt2; //Set Compare Register // EPwm3Regs.CMPA.bit.CMPA = TestCnt3; //Set Compare Register // //EPWM3번은 EPWM2번에 대해 상보 // EPwm4Regs.CMPA.bit.CMPA = TestCnt4; //Set Compare Register // EPwm5Regs.CMPA.bit.CMPA = TestCnt5; //Set Compare Register // //EPWM5번은 EPWM4번에 대해 상보 // // EPwm2Regs.TBPHS.bit.TBPHS = 0; //Reset Phase Shift Register // EPwm3Regs.TBPHS.bit.TBPHS = 0; //Reset Phase Shift Register // EPwm4Regs.TBPHS.bit.TBPHS = TdabPhCnt; //Set Phase Shift Register // EPwm5Regs.TBPHS.bit.TBPHS = TdabPhCnt; //Set Phase Shift Register // // FlagDabGatingInput = 1; //Set DAB Gating Input Flag // } // else // { // // EPwm2Regs.CMPA.bit.CMPA = 0; //Reset Compare Register // EPwm3Regs.CMPA.bit.CMPA = 0; //Reset Compare Register // EPwm4Regs.CMPA.bit.CMPA = 0; //Reset Compare Register // EPwm5Regs.CMPA.bit.CMPA = 0; //Reset Compare Register // // EPwm2Regs.TBPHS.bit.TBPHS = 0; //Reset Phase Shift Register // EPwm3Regs.TBPHS.bit.TBPHS = 0; //Reset Phase Shift Register // EPwm4Regs.TBPHS.bit.TBPHS = 0; //Reset Phase Shift Register // EPwm5Regs.TBPHS.bit.TBPHS = 0; //Reset Phase Shift Register // // FlagDabGatingInput = 0; //Reset DAB Gating Input Flag // } // // if (FlagTestInvGatingInput == 1) //If Inverter Gating Input Test Flag is TRUE // { // EPwm6Regs.CMPA.bit.CMPA = TestCnt6; //Set Compare Register // EPwm7Regs.CMPA.bit.CMPA = TestCnt7; //Set Compare Register // // FlagInvGatingInput = 1; //Set Inverter Gating Input Flag // } // else //Other Case // { // EPwm6Regs.CMPA.bit.CMPA = 0; //Reset Compare Register // EPwm7Regs.CMPA.bit.CMPA = 0; //Reset Compare Register // FlagInvGatingInput = 0; //Reset Inverter Gating Input Flag // } // // GateOutEnable(); //Call Gate Out Enable Function } void GateOutEnable(void) //Define Gate Out Enable Function { // if(FlagBoostGating == 1) //If Boost Gating Flag is TRUE // { // EALLOW; //Release Register Protection // EPwm1Regs.TZCLR.bit.OST = 1; //One-Shot Flag Clear // EDIS; //Lock Register Protection // } // else // { // EALLOW; //Release Register Protection // EPwm1Regs.TZFRC.bit.OST = 1; //Force Trip Zones One Shot Event // EDIS; //Lock Register Protection // } // // if(FlagDabGating == 1) // { // EALLOW; //Release Register Protection // EPwm2Regs.TZCLR.bit.OST = 1; //One-Shot Flag Clear // EPwm3Regs.TZCLR.bit.OST = 1; //One-Shot Flag Clear // EPwm4Regs.TZCLR.bit.OST = 1; //One-Shot Flag Clear // EPwm5Regs.TZCLR.bit.OST = 1; //One-Shot Flag Clear // EDIS; //Lock Register Protection // } // else // { // EALLOW; //Release Register Protection // EPwm2Regs.TZFRC.bit.OST = 1; //Force Trip Zones One Shot Event // EPwm3Regs.TZFRC.bit.OST = 1; //Force Trip Zones One Shot Event // EPwm4Regs.TZFRC.bit.OST = 1; //Force Trip Zones One Shot Event // EPwm5Regs.TZFRC.bit.OST = 1; //Force Trip Zones One Shot Event // EDIS; //Lock Register Protection // } // // if(FlagInvGating == 1) // { // EALLOW; //Release Register Protection // EPwm6Regs.TZCLR.bit.OST = 1; //One-Shot Flag Clear // EPwm7Regs.TZCLR.bit.OST = 1; //One-Shot Flag Clear // EDIS; //Lock Register Protection // } // else // { // EALLOW; //Release Register Protection // EPwm6Regs.TZFRC.bit.OST = 1; //Force Trip Zones One Shot Event // EPwm7Regs.TZFRC.bit.OST = 1; //Force Trip Zones One Shot Event // EDIS; //Lock Register Protection // } // // // GPIO_GATE_ENB = ~(FlagInvGating | FlagBoostGating | FlagDabGating);//GPIO GATE Enable Pin = Enable = FALSE } void GateOutDisable(void) //Define GPIO Gate Out Disable Function { GPIO_GATE_ENB = ~(0); //GPIO GATE Enable Pin = Disable = TRUE } int DabPwmComp = 0; //Initialize DAB PWM Compare void PwmCntUpDate(void) //Define PWM Count Update Function { // //Boost // EPwm1Regs.CMPA.bit.CMPA = TboostCnt; //Set Compare Register Boost Count // // //For Buck-Boost Test Start // //LvSide //// EPwm2Regs.CMPA.bit.CMPA = DabPwmPrd + DabPwmComp; //Set Compare Register DAB Count + Full Duty * 1/2 //// EPwm3Regs.CMPA.bit.CMPA = DabPwmPrd + DabPwmComp; //Set Compare Register DAB Count + Full Duty * 1/2 // //For Buck-Boost Test End // // //LvSide // EPwm2Regs.CMPA.bit.CMPA = DabPwmPrd * 0.5 + DabPwmComp; //Set Compare Register DAB Count + Full Duty * 1/2 // EPwm3Regs.CMPA.bit.CMPA = DabPwmPrd * 0.5 + DabPwmComp; //Set Compare Register DAB Count + Full Duty * 1/2 // // //For Inverter Test Start // //HvSide // EPwm4Regs.CMPA.bit.CMPA = DabPwmPrd + DabPwmComp; //Set Compare Register DAB Count + Full Duty * 1/2 // EPwm5Regs.CMPA.bit.CMPA = DabPwmPrd + DabPwmComp; //Set Compare Register DAB Count + Full Duty * 1/2 // //For Inverter Test End // //// //HvSide //// EPwm4Regs.CMPA.bit.CMPA = DabPwmPrd * 0.5 + DabPwmComp; //Set Compare Register DAB Count + Full Duty * 1/2 //// EPwm5Regs.CMPA.bit.CMPA = DabPwmPrd * 0.5 + DabPwmComp; //Set Compare Register DAB Count + Full Duty * 1/2 // // EPwm2Regs.TBPHS.bit.TBPHS = 0; //Set Phase Shift = 0 // EPwm3Regs.TBPHS.bit.TBPHS = 0; //Set Phase Shift = 0 // EPwm4Regs.TBPHS.bit.TBPHS = TdabPhCnt; //Set Phase Shift = DAB Phase Shift Count // EPwm5Regs.TBPHS.bit.TBPHS = TdabPhCnt; //Set Phase Shift = DAB Phase Shift Count // // // //Inverter // EPwm6Regs.CMPA.bit.CMPA = TinvACnt; //Set Compare Register Inverter Count // EPwm7Regs.CMPA.bit.CMPA = TinvBCnt; //Set Compare Register Inverter Count // // GateOutEnable(); //Call Gate Out Enable Function } void InitGateEnbGpio() //Define Initialize Gate Enable GPIO Function { GPIO_setMasterCore(95, GPIO_CORE_CPU1); //CPU1 Control GPIO 95 Pin GPIO_setPinConfig(GPIO_95_GPIO95); //Select GPIO 95 Pin GPIO_setDirectionMode(95, GPIO_DIR_MODE_OUT); //GPIO 95 Pin Output GPIO_setPadConfig(95, GPIO_PIN_TYPE_STD); //GPIO 95 Pin Push-pull output GPIO_setQualificationMode(95, GPIO_QUAL_ASYNC); //GPIO 95 Pin No synchronization GPIO_writePin(95, 1); //GPIO 95 Pin HIGH = Disable } void GatePulseGenerate() //Define Gate Pulse Generate Function { // TinvACnt = LIMITER((unsigned int) (TinvA * InvPwmPrd), (InvPwmPrd - 30), 0.); //Inverter PWM Count of A Branch // TinvBCnt = LIMITER((unsigned int) (TinvB * InvPwmPrd), (InvPwmPrd - 30), 0.); //Inverter PWM Count of B Branch // TboostCnt = LIMITER((unsigned int) (Tboost * BoostPwmPrd), (BoostPwmPrd - 200), 200.); //Boost PWM Count // //// TdabPh = PiIbat.out; //DAB Phase Shift Time //// TdabPh = LIMITER(TdabPh, 1, -1); //DAB Phase Shift Time Limit -1 = Min, 1 = Max // // if(TdabPh <= 0) //DAB Phase Shift Time Limit Smaller than 0 // { // EPwm4Regs.TBCTL.bit.PHSDIR = TB_UP; //DAB Phase Direction = 1 // EPwm5Regs.TBCTL.bit.PHSDIR = TB_UP; //DAB Phase Direction = 1 // } // else // { // EPwm4Regs.TBCTL.bit.PHSDIR = TB_DOWN; //DAB Phase Direction = 0 // EPwm5Regs.TBCTL.bit.PHSDIR = TB_DOWN; //DAB Phase Direction = 0 // } // // TdabPhCnt = LIMITER((fabs(TdabPh) * DabPwmPrd), DabPwmPrd, -DabPwmPrd); //DAB PWM Count }