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.
#include "main.h" float AdcIgrid[3] = {0}; float AdcVgrid[3] = {0}; float AdcItrack[3] = {0}; float AdcVdc = 0; float AdcResults[12]={0}; float TEMPResults[4]={0}; float receivedV_CMD = 0.0f; uint16_t modbus485_flag = 0; uint16_t scictr = 0; uint16_t check_Vdctime; void main(void) { InitSysCtrl();//sysclk = 200MHz DINT; InitPieCtrl(); IER = 0x0000; //Disable CPU interrupts IFR = 0x0000; //clear all CPU interrupt flags InitPieVectTable(); ConfigPie(); InitCpuTimers(); ConfigCpuTimer(&CpuTimer0, 200, 20000);//20ms freq:200Mhz period:50us ConfigCpuTimer(&CpuTimer1, 200, 2000);//2ms ConfigCpuTimer(&CpuTimer2, 200, 20000);//20ms ConfigGpio(); ConfigAdc(); ConfigEpwm(); // ConfigSci(); ConfigSciModbus(); ConfigCAN(); //user init function StateUpdate_GlobalParaInit(); //disable epwm,safe restart set,set to idle state Init_Sample_Para(); //sample flag,counter,realvalue initial Init_Protection_Para(); EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM //StartCpuTimer0(); StartCpuTimer1(); StartCpuTimer2(); while (1) { ScanKey(); LightBeepCMD(); // CAN_SendSystemState(Sys_Current_State); // CAN_SendCurrentData(Sample_CalcResult.Itrack_Ave); // ���Դ��� static uint32_t counter = 0; if(counter++ % 100 == 0) { // ÿ100��ѭ������һ�� uint16_t testData[2] = {0xAA55, counter}; GpioDataRegs.GPCTOGGLE.bit.GPIO89 = 1; // ����ָʾ�� CAN_SendData(16, 0x123, testData, 2); GpioDataRegs.GPCTOGGLE.bit.GPIO89 = 1; // ����ָʾ�� } if (modbus485_flag == 1) { modbus485_flag = 0; Deal_Modbus485(); } } } void ConfigPie(void)//�ж����� { EALLOW; PieVectTable.TIMER0_INT = &CpuTimer0_ISR; PieVectTable.TIMER1_INT = &CpuTimer1_2ms_ISR; PieVectTable.TIMER2_INT = &CpuTimer2_20ms_ISR; PieVectTable.ADCD1_INT = &Adcd_ISR; PieVectTable.SCIA_RX_INT = &SciaModbusRxFifo_ISR; PieVectTable.CANA0_INT = &CAN_ISR; EDIS; PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//cputimer0 PieCtrlRegs.PIEIER1.bit.INTx6 = 1;//adcd PieCtrlRegs.PIEIER9.bit.INTx3 = 1;//scia rx PieCtrlRegs.PIEIER9.bit.INTx1 = 1;//can int IER |= M_INT1;//cputimer0 adcd IER |= M_INT13;//cputimer1 IER |= M_INT14;//cputimer2 IER |= M_INT9;//scia rx } void ConfigGpio(void) { EALLOW; //output //led88 GpioCtrlRegs.GPCPUD.bit.GPIO88 = 1; //PUD DISl:1��ENABLE:0 GpioCtrlRegs.GPCDIR.bit.GPIO88 = 1; //1:OUT;0:IN GpioCtrlRegs.GPCMUX2.bit.GPIO88 = 0; //GPIO GpioDataRegs.GPCCLEAR.bit.GPIO88 = 1; //DATA CLEAR //led89 GpioCtrlRegs.GPCPUD.bit.GPIO89 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO89 = 1; GpioCtrlRegs.GPCMUX2.bit.GPIO89 = 0; GpioDataRegs.GPCCLEAR.bit.GPIO89 = 1; //led90 GpioCtrlRegs.GPCPUD.bit.GPIO90 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO90 = 1; GpioCtrlRegs.GPCMUX2.bit.GPIO90 = 0; GpioDataRegs.GPCCLEAR.bit.GPIO90 = 1; //ACContactor_Ctrl GpioCtrlRegs.GPBPUD.bit.GPIO44 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO44 = 1; GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 0; GpioDataRegs.GPBCLEAR.bit.GPIO44 = 1; //fan ctrl GpioCtrlRegs.GPBPUD.bit.GPIO63 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO63 = 1; GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 0; GpioDataRegs.GPBCLEAR.bit.GPIO63 = 1; //Light_Yellow GpioCtrlRegs.GPCPUD.bit.GPIO64 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO64 = 1; GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 0; GpioDataRegs.GPCCLEAR.bit.GPIO64 = 1; //Light_Green GpioCtrlRegs.GPCPUD.bit.GPIO65 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO65 = 1; GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 0; GpioDataRegs.GPCCLEAR.bit.GPIO65 = 1; //Light_Red GpioCtrlRegs.GPCPUD.bit.GPIO66 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO66 = 1; GpioCtrlRegs.GPCMUX1.bit.GPIO66 = 0; GpioDataRegs.GPCCLEAR.bit.GPIO66 = 1; //IGBT GpioCtrlRegs.GPBPUD.bit.GPIO60 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0; GpioDataRegs.GPBCLEAR.bit.GPIO60 = 1; //RELAY GpioCtrlRegs.GPBPUD.bit.GPIO59 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO59 = 1; GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 0; GpioDataRegs.GPBCLEAR.bit.GPIO59 = 1; //���� GpioCtrlRegs.GPBPUD.bit.GPIO58 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO58 = 1; GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 0; GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1; //TEMP0 GpioCtrlRegs.GPCPUD.bit.GPIO68 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO68 = 1; GpioCtrlRegs.GPCMUX1.bit.GPIO68 = 0; GpioDataRegs.GPCCLEAR.bit.GPIO68 = 1; //TEMP1 GpioCtrlRegs.GPCPUD.bit.GPIO69 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO69 = 1; GpioCtrlRegs.GPCMUX1.bit.GPIO69 = 0; GpioDataRegs.GPCCLEAR.bit.GPIO69 = 1; //input //key reset GpioCtrlRegs.GPAPUD.bit.GPIO8 = 1; //1:DISABLE;0:ENABLE GpioCtrlRegs.GPADIR.bit.GPIO8 = 0; //1:OUT;0:IN GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0; //0:GPIO GpioDataRegs.GPACLEAR.bit.GPIO8 = 1; //1:CLEAR //key start GpioCtrlRegs.GPAPUD.bit.GPIO9 = 1; GpioCtrlRegs.GPADIR.bit.GPIO9= 0; GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 0; GpioDataRegs.GPACLEAR.bit.GPIO9 = 1; //key stop GpioCtrlRegs.GPDPUD.bit.GPIO99 = 1; GpioCtrlRegs.GPDDIR.bit.GPIO99 = 0; GpioCtrlRegs.GPDMUX1.bit.GPIO99 = 0; GpioDataRegs.GPDCLEAR.bit.GPIO99 = 1; //ac contactor return GpioCtrlRegs.GPAPUD.bit.GPIO5 = 1; GpioCtrlRegs.GPADIR.bit.GPIO5 = 0; GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0; GpioDataRegs.GPACLEAR.bit.GPIO5 = 1; // Track Temp check GpioCtrlRegs.GPBPUD.bit.GPIO62 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO62 = 0; GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 0; GpioDataRegs.GPBCLEAR.bit.GPIO62 = 1; // IGBT check GpioCtrlRegs.GPBPUD.bit.GPIO61 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO61 = 0; GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0; GpioDataRegs.GPBCLEAR.bit.GPIO61 = 1; //Itrack hardware protection signal from CPLD(PRO2) GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO43 = 0; // gpio input GpioCtrlRegs.GPBPUD.bit.GPIO43 = 1; //disable pull-up GpioCtrlRegs.GPBQSEL1.bit.GPIO43 = 3; //async input mode GpioDataRegs.GPBSET.bit.GPIO43 = 1; //Vdc hardware protection signal from CPLD(PRO1) GpioCtrlRegs.GPCMUX1.bit.GPIO67 = 0; GpioCtrlRegs.GPCDIR.bit.GPIO67 = 0; // gpio input GpioCtrlRegs.GPCPUD.bit.GPIO67 = 1; //disable pull-up GpioCtrlRegs.GPCQSEL1.bit.GPIO67 = 3; //async input mode GpioDataRegs.GPCDAT.bit.GPIO67 = 1; //pro3 // GpioCtrlRegs.GPBPUD.bit.GPIO43 = 1; // GpioCtrlRegs.GPBDIR.bit.GPIO43= 0; // GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 0; // GpioDataRegs.GPBCLEAR.bit.GPIO43=1; //����GPIO // GpioCtrlRegs.GPAPUD.bit.GPIO22 = 1; // GpioCtrlRegs.GPADIR.bit.GPIO22 = 1; // GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // GpioDataRegs.GPACLEAR.bit.GPIO22 = 1; EALLOW; //config gpio87 for scib rx GpioCtrlRegs.GPCPUD.bit.GPIO87 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO87 = 0; GpioCtrlRegs.GPCMUX2.bit.GPIO87 = 0; GpioDataRegs.GPCCLEAR.bit.GPIO87 = 1; // GpioDataRegs.GPCDAT.bit.GPIO87 = 0; //config gpio86 for scib tx GpioCtrlRegs.GPCPUD.bit.GPIO86 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO86 = 1; GpioCtrlRegs.GPCMUX2.bit.GPIO86 = 0; GpioDataRegs.GPCCLEAR.bit.GPIO86 = 1; //config gpio86 for scib re GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;//disable pull-up GpioDataRegs.GPASET.bit.GPIO0 = 1; //zhujifasong EDIS; EALLOW; //config gpio25 for MOSI send GpioCtrlRegs.GPAPUD.bit.GPIO25 = 1; GpioCtrlRegs.GPADIR.bit.GPIO25 = 1; GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0; GpioDataRegs.GPACLEAR.bit.GPIO25 = 1; //config gpio25 for MISO receive GpioCtrlRegs.GPAPUD.bit.GPIO22 = 1; GpioCtrlRegs.GPADIR.bit.GPIO22 = 0; GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; GpioDataRegs.GPACLEAR.bit.GPIO22 = 1; // GpioDataRegs.GPADAT.bit.GPIO22 = 0; //// config gpio70 for CAN TX // GpioCtrlRegs.GPCPUD.bit.GPIO71 = 1; // GpioCtrlRegs.GPCDIR.bit.GPIO71 = 0; // GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 0; // GpioDataRegs.GPCCLEAR.bit.GPIO71 = 1; // // //config gpio70 for CAN RX // GpioCtrlRegs.GPCPUD.bit.GPIO70 = 1; // GpioCtrlRegs.GPCDIR.bit.GPIO70 = 0; // GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 0; // GpioDataRegs.GPCCLEAR.bit.GPIO70 = 1; EDIS; EDIS; } #define TIMER_TBPRD 1250 // Period register Uint32 CMPANUM = 625; // CMPA Uint32 CMPBNUM = 470; // CMPB Uint32 CMPANUMSCR = 0; // CMPA1 Uint32 CMPBNUMSCR = 0; // CMPB1 #define DB_DURATION 160 //160 3.2us//100*20ns=2us;D=48% void ConfigEpwm(void) { #ifdef CODE_MASTER EALLOW; SyncSocRegs.SYNCSELECT.bit.SYNCOUT = 0x2; //select epwm7 sync signal to syncout //config gpio24 for output xbar1 GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1;//mux: output xbar1 GpioCtrlRegs.GPAPUD.bit.GPIO24 = 1; //disable pull-up GpioCtrlRegs.GPADIR.bit.GPIO24 = 1;//output //config gpio25 for output xbar2 GpioCtrlRegs.GPAPUD.bit.GPIO25 = 1; //disable pull-up GpioCtrlRegs.GPADIR.bit.GPIO25 = 1;//output GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;//mux: output xbar2 //config output xbar1 for external sync out OutputXbarRegs.OUTPUT1MUX0TO15CFG.bit.MUX14 = 0x3; //select external sync out OutputXbarRegs.OUTPUT1MUXENABLE.bit.MUX14 = 0x1; //enable xbar mux //config output xbar2 for external sync out OutputXbarRegs.OUTPUT2MUX0TO15CFG.bit.MUX14 = 0x3; //select external sync out OutputXbarRegs.OUTPUT2MUXENABLE.bit.MUX14 = 0x1; //enable xbar mux EDIS; #endif #ifdef CODE_SLAVE EALLOW; //Config Gpio23 for syncin GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0; GpioCtrlRegs.GPADIR.bit.GPIO23 = 0; // gpio input GpioCtrlRegs.GPAPUD.bit.GPIO23 = 1; //disable pull-up GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0; //sync input mode //config input xbar5 to link gpio23 and EXTSYNCIN1 InputXbarRegs.INPUT5SELECT = 23;//select gpio 23 //select external sync for epwm7 SyncSocRegs.SYNCSELECT.bit.EPWM7SYNCIN = 0x5; //select EXTSYNCIN1 EDIS; #endif InitEPwm6Gpio(); //epwm.c,EPWM IO INIT ,100MHz by default InitEPwm7Gpio(); InitEPwm8Gpio(); //pro3��disable TZ EALLOW; ////Config Gpio42 PRO3 for ~TZ1 GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO42 = 0; // gpio input GpioCtrlRegs.GPBPUD.bit.GPIO42 = 1; //disable pull-up GpioCtrlRegs.GPBQSEL1.bit.GPIO42 = 2; //6 Samples Qualification GpioCtrlRegs.GPBCTRL.bit.QUALPRD1 = 10; //qualification window = 2 * (PRD1 * 2) * 5ns * 5(Samples) = 1us //input xbar InputXbarRegs.INPUT1SELECT = 42;//select gpio 42 EDIS; // //pro4 // EALLOW; // //Config Gpio42 PRO3 for ~TZ1 // GpioCtrlRegs.GPBMUX1.bit.GPIO47 = 0; // GpioCtrlRegs.GPBDIR.bit.GPIO47 = 0; // gpio input // GpioCtrlRegs.GPBPUD.bit.GPIO47 = 1; //disable pull-up // GpioCtrlRegs.GPBQSEL1.bit.GPIO47 = 3; //async input mode // //input xbar // InputXbarRegs.INPUT1SELECT = 47;//select gpio 47 // EDIS; EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;//turn off epwm clk,turn on after config // Setup TBCLK EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count upDOWM EPwm6Regs.TBPRD = TIMER_TBPRD; // Set timer period EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading EPwm6Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0 EPwm6Regs.TBCTR = 0x0000; // Clear counter EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV2; //tbclk = 100M / 2 = 50M // EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count upDOWM EPwm7Regs.TBPRD = TIMER_TBPRD; // Set timer period #ifdef CODE_MASTER EPwm7Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading #endif #ifdef CODE_SLAVE EPwm7Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Enable phase loading EPwm7Regs.TBCTL.bit.PHSDIR = 1; //count up after sync #endif EPwm7Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0 EPwm7Regs.TBCTR = 0x0000; // Clear counter EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT EPwm7Regs.TBCTL.bit.CLKDIV = TB_DIV2; EPwm7Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm8Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count upDOWM EPwm8Regs.TBPRD = TIMER_TBPRD; // Set timer period EPwm8Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Enable phase loading EPwm8Regs.TBPHS.bit.TBPHS = 1180; // Phase is 170 , under initial condition EPwm8Regs.TBCTL.bit.PHSDIR = 0; //count down after sync EPwm8Regs.TBCTR = 0x0000; // Clear counter EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT EPwm8Regs.TBCTL.bit.CLKDIV = TB_DIV2; // EPwm8Regs.TBCTL.bit.SYNCOSEL=TB_CTR_ZERO; // Setup shadow register load on ZERO EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm7Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm7Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm7Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm7Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm8Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm8Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm8Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm8Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // Set Compare values // EPwm6Regs.CMPA.bit.CMPA = CMPANUMSCR; // Set compare A value EPwm6Regs.CMPB.bit.CMPB = CMPBNUMSCR; // Set Compare B value EPwm7Regs.CMPA.bit.CMPA = CMPANUM; // Set compare A value // EPwm7Regs.CMPC = 1180;// Phase is 170 , under initial condition EPwm8Regs.CMPA.bit.CMPA = CMPANUM; // Set compare A value EPwm8Regs.CMPB.bit.CMPB = CMPBNUM; // Set Compare B value // Set actions //EPWM6B:0-5V EPWM6A:0-20mA, choose one EPwm6Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Clear PWM2A on Period EPwm6Regs.AQCTLA.bit.CAD = AQ_SET; // Set PWM2A on event A, // up count EPwm6Regs.AQCTLB.bit.CAU = AQ_CLEAR; // Clear PWM2B on Period EPwm6Regs.AQCTLB.bit.CAD = AQ_SET; // Set PWM2B on event B, EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Clear PWM2A on Period EPwm7Regs.AQCTLA.bit.CAD = AQ_SET; // Set PWM2B on event B, EPwm8Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Clear PWM2A on Period EPwm8Regs.AQCTLA.bit.CAD = AQ_SET; // Set PWM2A on event A, EPwm8Regs.AQCTLA.bit.CBD = AQ_SET; // Set PWM2A on event A, // Active Low complementary PWMs - setup the deadband // EPwm6Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // EPwm6Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // EPwm6Regs.DBCTL.bit.IN_MODE = DBA_RED_DBB_FED; // EPwm6Regs.DBRED.bit.DBRED = DB_DURATION; // EPwm6Regs.DBFED.bit.DBFED = DB_DURATION; EPwm7Regs.DBCTL.bit.IN_MODE = DBA_ALL; //A:UP EDGE;B:FALL EDGE DBA_RED_DBB_FED EPwm7Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //11:TOTAL ENABLE;00:DISABLE EPwm7Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //10:only B invert EPwm7Regs.DBRED.bit.DBRED = DB_DURATION; //UP DELAY EPwm7Regs.DBFED.bit.DBFED = DB_DURATION; //FALL DELAY EPwm8Regs.DBCTL.bit.IN_MODE = DBA_ALL; EPwm8Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; EPwm8Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; EPwm8Regs.DBRED.bit.DBRED = DB_DURATION; EPwm8Regs.DBFED.bit.DBFED = DB_DURATION; EPwm8Regs.DBCTL.bit.OUTSWAP = 3; //ADC trig setting EPwm7Regs.ETSEL.bit.SOCASEL = ET_CTR_PRDZERO; //SOC event choose EPwm7Regs.ETSEL.bit.SOCAEN = 1; //enable SOCA EPwm7Regs.ETPS.bit.SOCAPRD = 1; //1-3times trig ADC // EPwm7Regs.ETSEL.bit.SOCBSEL = ET_CTR_PRDZERO; // EPwm7Regs.ETSEL.bit.SOCBEN = 1; // EPwm7Regs.ETPS.bit.SOCBPRD = 1; //TZ SETTING //EPwm6Regs.TZSEL.bit.CBC1 = 1;//select TZ1 cbc EPwm6Regs.TZCTL.bit.TZA = TZ_FORCE_LO; EPwm6Regs.TZCTL.bit.TZB = TZ_FORCE_LO; //EPwm6Regs.TZCLR.bit.CBCPULSE = 0; //cbc clear when CTR = 0 //EPwm6Regs.TZCLR.bit.OST = 1; EPwm6Regs.TZFRC.bit.OST = 1; //force oneshot TZ at start EPwm7Regs.TZSEL.bit.CBC1 = 1;//select TZ1 cbc EPwm7Regs.TZCTL.bit.TZA = TZ_FORCE_LO; EPwm7Regs.TZCTL.bit.TZB = TZ_FORCE_LO; EPwm7Regs.TZCLR.bit.CBCPULSE = 0; //cbc clear when CTR = 0 //EPwm7Regs.TZCLR.bit.OST = 1; EPwm7Regs.TZFRC.bit.OST = 1; EPwm8Regs.TZSEL.bit.CBC1 = 1;//select TZ1 cbc EPwm8Regs.TZCTL.bit.TZA = TZ_FORCE_LO; EPwm8Regs.TZCTL.bit.TZB = TZ_FORCE_LO; EPwm8Regs.TZCLR.bit.CBCPULSE = 0; //cbc clear when CTR = 0 //EPwm8Regs.TZCLR.bit.OST = 1; EPwm8Regs.TZFRC.bit.OST = 1; EDIS; EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; } void ConfigAdc(void) { EALLOW; AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to 200M/4=50M AdcbRegs.ADCCTL2.bit.PRESCALE = 6; AdccRegs.ADCCTL2.bit.PRESCALE = 6; AdcdRegs.ADCCTL2.bit.PRESCALE = 6; //12 bit single mode AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); AdcSetMode(ADC_ADCC, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); AdcSetMode(ADC_ADCD, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); //Set pulse positions to late AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1; //1:EOC convert�O0: AFTER SAMPLE AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdcdRegs.ADCCTL1.bit.INTPULSEPOS = 1; //power up the ADC AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; //ADC power up //delay for 1ms to allow ADC time to power up DELAY_US(1000); //delay 1ms then power up AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1; DELAY_US(1000); AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1; DELAY_US(1000); AdcdRegs.ADCCTL1.bit.ADCPWDNZ = 1; DELAY_US(1000); Uint16 acqps; // // Determine minimum acquisition window (in SYSCLKS) based on resolution // if(ADC_RESOLUTION_12BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION) { acqps = 14; //75ns } else //resolution is 16-bit { acqps = 63; //320ns } //ADCINA0 VgridA AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps; AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 17; //ADCINB0 VgridC AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps; AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 17; //ADCINC2 IgridA AdccRegs.ADCSOC0CTL.bit.CHSEL = 2; AdccRegs.ADCSOC0CTL.bit.ACQPS = acqps; AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 17; //ADCIND1 IHbridge AdcdRegs.ADCSOC0CTL.bit.CHSEL = 1; AdcdRegs.ADCSOC0CTL.bit.ACQPS = acqps; AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 17; //ADCINB2 VgridB AdcbRegs.ADCSOC1CTL.bit.CHSEL = 2; AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps; AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 17; //ADCINC3 IgridB AdccRegs.ADCSOC1CTL.bit.CHSEL = 3; AdccRegs.ADCSOC1CTL.bit.ACQPS = acqps; AdccRegs.ADCSOC1CTL.bit.TRIGSEL = 17; //ADCIND2 Itrack AdcdRegs.ADCSOC1CTL.bit.CHSEL = 2; AdcdRegs.ADCSOC1CTL.bit.ACQPS = acqps; AdcdRegs.ADCSOC1CTL.bit.TRIGSEL = 17; //ADCINB3 Vdc AdcbRegs.ADCSOC2CTL.bit.CHSEL = 3; AdcbRegs.ADCSOC2CTL.bit.ACQPS = acqps; AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = 17; //ADCINC4 IgridC AdccRegs.ADCSOC2CTL.bit.CHSEL = 4; //SOC0 will convert pin C4 AdccRegs.ADCSOC2CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdccRegs.ADCSOC2CTL.bit.TRIGSEL = 17; //trigger on ePWM7 SOCA/C //ADCIND3 Itrack AdcdRegs.ADCSOC2CTL.bit.CHSEL = 3; AdcdRegs.ADCSOC2CTL.bit.ACQPS = acqps; AdcdRegs.ADCSOC2CTL.bit.TRIGSEL = 17; //ADCIN15 Vref AdcaRegs.ADCSOC15CTL.bit.CHSEL = 15; AdcaRegs.ADCSOC15CTL.bit.ACQPS = acqps; AdcaRegs.ADCSOC15CTL.bit.TRIGSEL = 17; //ADCIND4 TempIGBT AdcdRegs.ADCSOC3CTL.bit.CHSEL = 4; AdcdRegs.ADCSOC3CTL.bit.ACQPS = acqps; AdcdRegs.ADCSOC3CTL.bit.TRIGSEL = 17; //TEMP ��� AdcdRegs.ADCSOC0CTL.bit.CHSEL = 0; AdcdRegs.ADCSOC0CTL.bit.ACQPS = acqps; AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 17; //ADC interrupt AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 3; //end of SOC3 will set INT1 flag AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 17; //make sure INT1 flag is cleared EDIS; } void ConfigSciModbus() { EALLOW; //config gpio85 for scia rx GpioCtrlRegs.GPCMUX2.bit.GPIO85 = 1; GpioCtrlRegs.GPCGMUX2.bit.GPIO85 = 1; GpioCtrlRegs.GPCQSEL2.bit.GPIO85 = 3;//async input mode GpioCtrlRegs.GPCPUD.bit.GPIO85 = 1;//disable pull-up //config gpio84 for scia tx GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 1; GpioCtrlRegs.GPCGMUX2.bit.GPIO84 = 1; GpioCtrlRegs.GPCPUD.bit.GPIO84 = 1;//disable pull-up //config gpio83 for scia re GpioCtrlRegs.GPCMUX2.bit.GPIO83 = 0; GpioCtrlRegs.GPCDIR.bit.GPIO83 = 1; GpioCtrlRegs.GPCPUD.bit.GPIO83 = 1;//disable pull-up GpioDataRegs.GPCCLEAR.bit.GPIO83 = 1;//clear gpio to rx EDIS; //low speed clk = sysclk/4 by default EALLOW; ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 1;//low speed clk = sysclk/2 = 100M EDIS; //config scib SciaRegs.SCICCR.bit.STOPBITS = 0; //1 stop bit SciaRegs.SCICCR.bit.PARITY = 0; //0 for odd, 1 for even parity SciaRegs.SCICCR.bit.PARITYENA = 0; //disable parity SciaRegs.SCICCR.bit.LOOPBKENA = 0; //disable loop back SciaRegs.SCICCR.bit.SCICHAR = 7; //8 data bit SciaRegs.SCICTL1.bit.RXERRINTENA = 1; //disable rx err int SciaRegs.SCICTL1.bit.SWRESET = 0; //reset sci, later need to re-enable by write 1 here SciaRegs.SCICTL1.bit.SLEEP = 0; //disable sleep mode SciaRegs.SCICTL1.bit.TXWAKE = 0; //no need to use tx feature for addr frame SciaRegs.SCICTL1.bit.RXENA = 1; //enable rx SciaRegs.SCICTL1.bit.TXENA = 1; // enable tx SciaRegs.SCICTL2.bit.RXBKINTENA = 0; //disable rxbk int for both rxrdy and brkdt SciaRegs.SCICTL2.bit.TXINTENA = 0; //disable tx int for txrdy //config sci fifo SciaRegs.SCIFFTX.bit.SCIRST = 1;//sci not reset SciaRegs.SCIFFTX.bit.SCIFFENA = 1; //enable fifo SciaRegs.SCIFFTX.bit.TXFIFORESET = 0;// reset tx fifo pointer and hold SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1; //clear the fifo int flag SciaRegs.SCIFFTX.bit.TXFFIENA = 0; //disable fifo int SciaRegs.SCIFFTX.bit.TXFFIL = 0;//fifo int level = 0 SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;//clear fifo overflow flag SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; //clear fifo int flag SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;// reset rx fifo pointer and hold SciaRegs.SCIFFRX.bit.RXFFIENA = 1;//enable fifo int SciaRegs.SCIFFRX.bit.RXFFIL = 8;//fifo int level = 0x11111 by default //SCI Baud = LSPCLK / ((BRR + 1) *8) = 100M / ((1301 + 1) *8) = 38400.0 bps, BRR = 324 //4800 2603 0xa2b //9600 515h SciaRegs.SCIHBAUD.all = 0x5; SciaRegs.SCILBAUD.all = 0x15; SciaRegs.SCIFFTX.bit.TXFIFORESET = 1;// re-enable tx fifo SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;// re-enable rx fifo SciaRegs.SCICTL1.bit.SWRESET = 1; } void ConfigSci() { EALLOW; //config gpio87 for scib rx GpioCtrlRegs.GPCPUD.bit.GPIO87 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO87 = 0; GpioCtrlRegs.GPCMUX2.bit.GPIO87 = 0; GpioDataRegs.GPCCLEAR.bit.GPIO87 = 1; //config gpio86 for scib tx GpioCtrlRegs.GPCPUD.bit.GPIO86 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO86 = 1; GpioCtrlRegs.GPCMUX2.bit.GPIO86 = 0; GpioDataRegs.GPCCLEAR.bit.GPIO86 = 1; //config gpio86 for scib re GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;//disable pull-up GpioDataRegs.GPASET.bit.GPIO0 = 1; EDIS; //low speed clk = sysclk/4 by default EALLOW; ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 1;//low speed clk = sysclk/2 = 100M EDIS; //config scib ScibRegs.SCICCR.bit.STOPBITS = 0; //1 stop bit ScibRegs.SCICCR.bit.PARITY = 0; //0 for odd, 1 for even parity ScibRegs.SCICCR.bit.PARITYENA = 0; //disable parity ScibRegs.SCICCR.bit.LOOPBKENA = 0; //disable loop back ScibRegs.SCICCR.bit.SCICHAR = 7; //8 data bit ScibRegs.SCICTL1.bit.RXERRINTENA = 0; //disable rx err int ScibRegs.SCICTL1.bit.SWRESET = 0; //reset sci, later need to re-enable by write 1 here ScibRegs.SCICTL1.bit.SLEEP = 0; //disable sleep mode ScibRegs.SCICTL1.bit.TXWAKE = 0; //no need to use tx feature for addr frame ScibRegs.SCICTL1.bit.RXENA = 1; //enable rx ScibRegs.SCICTL1.bit.TXENA = 1; // enable tx ScibRegs.SCICTL2.bit.RXBKINTENA = 0; //disable rxbk int for both rxrdy and brkdt ScibRegs.SCICTL2.bit.TXINTENA = 0; //disable tx int for txrdy //config sci fifo ScibRegs.SCIFFTX.bit.SCIRST = 1;//sci not reset ScibRegs.SCIFFTX.bit.SCIFFENA = 1; //enable fifo ScibRegs.SCIFFTX.bit.TXFIFORESET = 0;// reset tx fifo pointer and hold ScibRegs.SCIFFTX.bit.TXFFINTCLR = 1; //clear the fifo int flag ScibRegs.SCIFFTX.bit.TXFFIENA = 0; //disable fifo int ScibRegs.SCIFFTX.bit.TXFFIL = 0;//fifo int level = 0 ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 1;//clear fifo overflow flag ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1; //clear fifo int flag ScibRegs.SCIFFRX.bit.RXFIFORESET = 0;// reset rx fifo pointer and hold ScibRegs.SCIFFRX.bit.RXFFIENA = 0;//disable fifo int ScibRegs.SCIFFRX.bit.RXFFIL = 4;//fifo int level = 0x11111 by default //SCI Baud = LSPCLK / ((BRR + 1) *8) = 100M / ((1301 + 1) *8) = 38400.0 bps, BRR = 324 //4800 2603 0xa2b ScibRegs.SCIHBAUD.all = 0xA; ScibRegs.SCILBAUD.all = 0x2b; ScibRegs.SCIFFTX.bit.TXFIFORESET = 1;// re-enable tx fifo ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;// re-enable rx fifo ScibRegs.SCICTL1.bit.SWRESET = 1; } void Sci_SendByte(char a) { //set 485 RE GpioDataRegs.GPASET.bit.GPIO0 = 1; while (ScibRegs.SCIFFTX.bit.TXFFST != 0) {} ScibRegs.SCITXBUF.bit.TXDT = a; //ScibRegs.SCITXBUF.all = a; } void Sci_SendData2Vofa() { float scisysstate = (float)Sys_Current_State; uint16_t* pResult = (uint16_t*)&(Sample_CalcResult.Itrack_Ave);//send sample calc value uint16_t i = 0; for (i = 0; i < 24; i++, pResult++) { Sci_SendByte(*pResult & 0xFF); Sci_SendByte(*pResult >> 8); } pResult = (uint16_t*)&scisysstate; for (i = 0; i < 2; i++, pResult++)//send sysstate { Sci_SendByte(*pResult & 0xFF); Sci_SendByte(*pResult >> 8); } pResult = (uint16_t*)&Vdc_Ctrl_Filter.Out; for (i = 0; i < 2; i++, pResult++)//send sysstate { Sci_SendByte(*pResult & 0xFF); Sci_SendByte(*pResult >> 8); } pResult = (uint16_t*)&Vdc_Ctrl_PI.Error; for (i = 0; i < 2; i++, pResult++)//send sysstate { Sci_SendByte(*pResult & 0xFF); Sci_SendByte(*pResult >> 8); } pResult = (uint16_t*)&Vdc_Ctrl_PI.PI_Out; for (i = 0; i < 2; i++, pResult++)//send sysstate { Sci_SendByte(*pResult & 0xFF); Sci_SendByte(*pResult >> 8); } Sci_SendByte(0x00); Sci_SendByte(0x00); Sci_SendByte(0x80); Sci_SendByte(0x7f); } //canͨ�� void ConfigCAN(void) { EALLOW; // ����GPIO70����CAN RX GpioCtrlRegs.GPCPUD.bit.GPIO70 = 1; // �������� GpioCtrlRegs.GPCDIR.bit.GPIO70 = 0; // ���� GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 3; // ����ΪCANRXA���� // ����GPIO71����CAN TX GpioCtrlRegs.GPCPUD.bit.GPIO71 = 1; // �������� GpioCtrlRegs.GPCDIR.bit.GPIO71 = 1; // ��� GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 3; // ����ΪCANTXA���� EDIS; EALLOW; // ����CANʱ�� CpuSysRegs.PCLKCR10.bit.CAN_A = 1; EDIS; // �ȴ��������� while(CanaRegs.CAN_CTL.bit.Init != 1) {} EALLOW; // �����ʼ��ģʽ CanaRegs.CAN_CTL.bit.Init = 1; CanaRegs.CAN_CTL.bit.CCE = 1; // ����CANλ��ʱ // ����ϵͳʱ��100MHz��Ŀ�겨����1Mbps // Tq = (BRP+1)/100MHz = 100ns (BRP=0) // ͬ����=1Tq, ʱ���1=4Tq, ʱ���2=3Tq, ��ʱ��=8Tq CanaRegs.CAN_BTR.bit.BRP = 19 ; CanaRegs.CAN_BTR.bit.TSEG1 = 15; CanaRegs.CAN_BTR.bit.TSEG2 = 2; CanaRegs.CAN_BTR.bit.SJW = 1; // �˳���ʼ��ģʽ CanaRegs.CAN_CTL.bit.Init = 0; CanaRegs.CAN_CTL.bit.CCE = 0; EDIS; // �ȴ���ʼ����� while(CanaRegs.CAN_CTL.bit.Init == 1) {} // ��ʼ����Ϣ����16���ڷ��͵������� EALLOW; CanaRegs.CAN_IF1CMD.bit.MSG_NUM = 16; CanaRegs.CAN_IF1ARB.bit.ID = 0x101; // ��������ID CanaRegs.CAN_IF1ARB.bit.Xtd = 0; // ��ID CanaRegs.CAN_IF1ARB.bit.Dir = 0; // ���ͷ��� CanaRegs.CAN_IF1ARB.bit.MsgVal = 1; // ��Ϣ��Ч CanaRegs.CAN_IF1MCTL.bit.DLC = 4; // ���ݳ���4�ֽ� CanaRegs.CAN_IF1MCTL.bit.TxIE = 1; // ʹ�ܷ����ж� EDIS; // ��ʼ����Ϣ����17���ڷ���ϵͳ״̬ EALLOW; CanaRegs.CAN_IF1CMD.bit.MSG_NUM = 17; CanaRegs.CAN_IF1ARB.bit.ID = 0x102; // ϵͳ״̬ID CanaRegs.CAN_IF1ARB.bit.Xtd = 0; // ��ID CanaRegs.CAN_IF1ARB.bit.Dir = 0; // ���ͷ��� CanaRegs.CAN_IF1ARB.bit.MsgVal = 1; // ��Ϣ��Ч CanaRegs.CAN_IF1MCTL.bit.DLC = 2; // ���ݳ���2�ֽ� CanaRegs.CAN_IF1MCTL.bit.TxIE = 1; // ʹ�ܷ����ж� EDIS; EALLOW; CanaRegs.CAN_IF2CMD.bit.MSG_NUM = 0; // ѡ������0 CanaRegs.CAN_IF2ARB.bit.ID = 0x123; // ���ý���ID CanaRegs.CAN_IF2ARB.bit.Xtd = 0; // ��֡ CanaRegs.CAN_IF2ARB.bit.Dir = 1; // ���շ��� CanaRegs.CAN_IF2MCTL.bit.DLC = 4; // Ԥ�ڽ���4�ֽ� CanaRegs.CAN_IF2MCTL.bit.RxIE = 1; // ʹ�ܽ����ж� EDIS; } // ����ֱ����ѹ���� void CAN_SendData(uint16_t msgNum, uint32_t id, uint16_t* data, uint16_t length) { EALLOW; // ������Ϣ���� CanaRegs.CAN_IF1CMD.bit.MSG_NUM = msgNum; // ѡ����Ϣ���� CanaRegs.CAN_IF1CMD.bit.DIR = 1; // д�뷽�� CanaRegs.CAN_IF1CMD.bit.Arb = 1; // �����ٲ��� CanaRegs.CAN_IF1CMD.bit.Control = 1; // ���¿����� CanaRegs.CAN_IF1CMD.bit.DATA_A = 1; // ��������A�� CanaRegs.CAN_IF1CMD.bit.DATA_B = 1; // ��������B�� // ������ϢID������ CanaRegs.CAN_IF1ARB.bit.ID = id; // ������ϢID CanaRegs.CAN_IF1ARB.bit.Xtd = 0; // ��ID CanaRegs.CAN_IF1ARB.bit.Dir = 0; // ���ͷ��� CanaRegs.CAN_IF1ARB.bit.MsgVal = 1; // ��Ϣ��Ч // �������ݳ��� CanaRegs.CAN_IF1MCTL.bit.DLC = length; // ���ݳ��� CanaRegs.CAN_IF1MCTL.bit.TxIE = 1; // ʹ�ܷ����ж� // �������� if(length > 0) CanaRegs.CAN_IF1DATA.all = *((uint32_t*)&data[0]); if(length > 4) CanaRegs.CAN_IF1DATB.all = *((uint32_t*)&data[4]); CanaRegs.CAN_IF1MCTL.bit.TxRqst = 1; EDIS; } // ���͵������� void CAN_SendCurrentData(float current) { uint16_t data[4]; *(float*)data = current; CAN_SendData(16, 0x101, data, 4); // ʹ��ID 0x101���͵������� } // ����ϵͳ״̬ void CAN_SendSystemState(uint16_t state) { uint16_t data[2]; data[0] = state & 0xFF; data[1] = (state >> 8) & 0xFF; CAN_SendData(17, 0x102, data, 2); // ʹ��ID 0x102����ϵͳ״̬ } // ����CAN���� interrupt void CAN_ISR(void) { // �����յ�����Ϣ if (CanaRegs.CAN_IF2MCTL.bit.NewDat == 1) { uint32_t id = CanaRegs.CAN_IF2ARB.bit.ID; uint16_t length = CanaRegs.CAN_IF2MCTL.bit.DLC; uint32_t dataLow = CanaRegs.CAN_IF2DATA.all; uint32_t dataHigh = CanaRegs.CAN_IF2DATB.all; // ����ID�����ͬ��Ϣ switch(id) { case 0x123: // ��ѹ���� receivedV_CMD = *(float*)&dataLow; break; // ������Ӹ�����Ϣ���� } // ��������ݱ�־ CanaRegs.CAN_IF2MCTL.bit.NewDat = 0; } if(CanaRegs.CAN_ES.bit.BOff) { // ���߹رջָ����� CanaRegs.CAN_CTL.bit.Init = 1; while(!CanaRegs.CAN_CTL.bit.Init); CanaRegs.CAN_CTL.bit.Init = 0; } // ����жϱ�־ PieCtrlRegs.PIEACK.bit.ACK9 = 1; } void DisplayChartHEX(float *signal, Uint16 signal_num) { char i, temp2; for(i=0; i<signal_num; i++) { temp2 = *((int32 *)&signal[i]); Sci_SendByte(temp2); temp2 = *((int32 *)&signal[i]) >> 8; Sci_SendByte(temp2); temp2 = *((int32 *)&signal[i]) >> 16; Sci_SendByte(temp2); temp2 = *((int32 *)&signal[i]) >> 24; Sci_SendByte(temp2); } // Sci_SendByte(0x00); // Sci_SendByte(0x00); // Sci_SendByte(0x80); // Sci_SendByte(0x7f); } void PWM_Enable(void) { EALLOW; EPwm7Regs.TZCLR.bit.OST = 1; EPwm8Regs.TZCLR.bit.OST = 1; EDIS; } void PWM_Disable(void) { EALLOW; EPwm7Regs.TZFRC.bit.OST = 1; EPwm8Regs.TZFRC.bit.OST = 1; EDIS; } void SCR_PWM_Enable(void) { EALLOW; EPwm6Regs.TZCLR.bit.OST = 1; EDIS; } void SCR_PWM_Disable(void) { EALLOW; EPwm6Regs.TZFRC.bit.OST = 1; EDIS; } void ScanKey(void)//run in while loop of main function { if(KeyStart_PinState == 1 || KeyReset_PinState == 1 || KeyStop_PinState == 1) { DELAY_US(8000); //delay 8ms if(KeyStart_PinState == 1) { Peripheral_Switch_State.bit.Key_Start = 1; } if(KeyReset_PinState == 1) { Peripheral_Switch_State.bit.Key_Reset = 1; } if(KeyStop_PinState == 1) { Peripheral_Switch_State.bit.Key_Stop = 1; } } else { Peripheral_Switch_State.byte.Byte2 = 0; } } void Epwm78Test(void) { uint16_t temp; static uint16_t dir = 1; temp = EPwm8Regs.TBPHS.bit.TBPHS; if(dir) { temp += 10; } else { temp -= 10; } if((temp > 1250) || (temp <= 0)) { dir = !dir; } EPwm8Regs.TBPHS.bit.TBPHS = temp; } void KeyNRelayTest(void) { if (KeyStart_PinState) { AC_Contactor_On(); Light_Green_On(); } else { AC_Contactor_Off(); Light_Green_Off(); } if (KeyStop_PinState) { Light_Red_On(); } else { Light_Red_Off(); } if (KeyReset_PinState) { Light_Yellow_On(); } else { Light_Yellow_Off(); } if (ACContactor_ReturnState) { Fan_On(); } else { Fan_Off(); } } //Uint32 TEMPSEL = 0; //TEMPSEL //void TEMP_SEL(void) //{ //// if(TEMPSEL == 0) //// { //// GpioDataRegs.GPCDAT.bit.GPIO68 = 1; //// GpioDataRegs.GPCDAT.bit.GPIO69 = 1; //// //// } //// else if(TEMPSEL == 1) //// { //// GpioDataRegs.GPCSET.bit.GPIO68 = 1; //// GpioDataRegs.GPCCLEAR.bit.GPIO69 = 1; //// //// } //// else if(TEMPSEL == 2) //// { //// GpioDataRegs.GPCCLEAR.bit.GPIO68 = 1; //// GpioDataRegs.GPCSET.bit.GPIO69 = 1; //// } //// else if(TEMPSEL == 3) //// { //// GpioDataRegs.GPCSET.bit.GPIO68 = 1; //// GpioDataRegs.GPCSET.bit.GPIO69 = 1; //// } // TempIGBT_Sel0 = TEMPSEL & 0x1; // TempIGBT_Sel1 = TEMPSEL >> 1; // TEMPSEL++; // if(TEMPSEL >= 4) // { // TEMPSEL = 0; // } //} interrupt void CpuTimer0_ISR(void) { //GpioDataRegs.GPCTOGGLE.bit.GPIO88 = 1; CpuTimer0.InterruptCount++; if(CpuTimer0.InterruptCount >= 100) { CpuTimer0.InterruptCount = 0; //DisplayChartHEX(AdcResults, 12); //DisplayChartHEX(AdcIgrid, 3); //DisplayChartHEX(&AdcItrack[0], 1); //DisplayChartHEX(AdcVgrid, 3); //DisplayChartHEX(&AdcVdc, 1); } CpuTimer0Regs.TCR.bit.TIF = 1; CpuTimer0Regs.TCR.bit.TRB = 1; PieCtrlRegs.PIEACK.bit.ACK1 = 1; } /**************************************************************** * 2ms state change *************************************************************/ interrupt void CpuTimer1_2ms_ISR(void) { Toggle_Led90(); if ((Sys_Current_State == State_Check) || (Sys_Current_State == State_PreCharge) || (Sys_Current_State == State_Running)) { if (Peripheral_Switch_State.bit.Key_Stop == 1) { StateUpdate_ParaInit_Once = 0; Sys_Current_State = State_Stop; } } Check_HardwarePro(); StateSwitch(); if (Sys_Current_State == State_PreCharge) //vdc soft start { if (All_State_Flag.bit.Vdc_Slowup == 1) { Slowup_Vdc_Ref(); // EPwm6Regs.CMPB.bit.CMPB = Vdc_Ref.Ref_CMD * 1.125f;//D=0.45 1.125 D=0.4 1.0 // //D=0.5 1.25 1.5 D=0.6 1.5//500V -> duty 0.75 -> 938, 938 / 500 = 1.875 // EPwm6Regs.CMPA.bit.CMPA = Vdc_Ref.Ref_CMD * 1.125f; //ref:500V,TBPRD1250,D=CMPA/1250,cmpa=x*500 EPwm6Regs.CMPB.bit.CMPB = Vdc_Ref.Ref_CMD * 1.102f;//D=0.45 1.102 EPwm6Regs.CMPA.bit.CMPA = Vdc_Ref.Ref_CMD * 1.102f; //ref:510V,TBPRD1250,D=CMPA/1250,cmpa=x*510 } } if (Sys_Current_State == State_Running) //Itrack soft start { if (All_State_Flag.bit.Itrack_Slowup == 1) { Slowup_Itrack_Ref(); EPwm8Regs.TBPHS.bit.TBPHS = 1180 - Itrack_Ref.Ref_CMD * 23.6f; // EPwm8Regs.TBPHS.bit.TBPHS = 1180 - Itrack_Ref.Ref_CMD * 39.3f; } } // if ((Sys_Current_State == State_Running)||(Sys_Current_State == State_PreCharge)) // { // GpioDataRegs.GPCSET.bit.GPIO86 = 1; // } // else // { // GpioDataRegs.GPCCLEAR.bit.GPIO86 = 1; // } // if (Sys_Current_State == State_Running) // { // if(GpioDataRegs.GPADAT.bit.GPIO22 == 0) // { // Vdc_Ref.Ref = 510.0f; // Vdc_Ref.Ref_CMD = 510.0f; // Vdc_Ctrl_PI.Upper_Limit = 0.8f; // } //// if(GpioDataRegs.GPADAT.bit.GPIO22 == 1) //// { //// Vdc_Ref.Ref = 250.0f; //// Vdc_Ref.Ref_CMD = 250.0f; //// Vdc_Ctrl_PI.Upper_Limit = 0.45f; //// } // } // if (Sys_Current_State == State_Running) // { // if(Vdc_Ref.Ref_CMD == 510.0f) // { // if(GpioDataRegs.GPADAT.bit.GPIO22 == 1) // { // check_Vdctime++; // if(check_Vdctime>=17500) // { // Vdc_Ref.Ref = 250.0f; // Vdc_Ref.Ref_CMD = 250.0f; // Vdc_Ctrl_PI.Upper_Limit = 0.45f; // check_Vdctime=0; // } // // } // // } // } // if ( (Sys_Current_State == State_Running) || (Sys_Current_State == State_PreCharge) ) // { // if( (Vdc_Ref.Ref_CMD >=240) && (Vdc_Ref.Ref_CMD <=250) ) // { // GpioDataRegs.GPCCLEAR.bit.GPIO86 = 1; // } // } // else // { // GpioDataRegs.GPCSET.bit.GPIO86 = 1; // } // // if (Sys_Current_State == State_Running) // { // if(GpioDataRegs.GPADAT.bit.GPIO22 == 1) // { //// if( Sample_CalcResult.Track_Ave <= 1.0f) //// { // Vdc_Ref.Ref = 510.0f; // Vdc_Ref.Ref_CMD = 510.0f; // Vdc_Ctrl_PI.Upper_Limit = 0.85f; //// } //// else //// { //// Fault_Flag.bit.Fault_Generate = 1; //// } // } // if(GpioDataRegs.GPADAT.bit.GPIO22 == 0) // { // Vdc_Ref.Ref = 250.0f; // Vdc_Ref.Ref_CMD = 250.0f; // Vdc_Ctrl_PI.Upper_Limit = 0.55f; // } // } if (Sys_Current_State == State_Running) { if ((Sample_CalcResult.TempIGBT1 >= 85.0f) || (Sample_CalcResult.TempIGBT2 >= 85.0f) || (Sample_CalcResult.TempIGBT3 >= 85.0f) || (Sample_CalcResult.TempIGBT4 >= 85.0f)) // (Sample_CalcResult.TempIGBT5 >= 85.0f) || // (Sample_CalcResult.TempIGBT6 >= 85.0f) || // (Sample_CalcResult.TempIGBT7 >= 85.0f) || // (Sample_CalcResult.TempIGBT8 >= 85.0f) { Fault_Flag.bit.temp_warming = 1; } if (Peripheral_Switch_State.bit.Key_Reset == 1) { Clear_AllFault(); } } } /************************************************`**************** * 20ms RMS AVE CALCULATION * SOFT START *************************************************************/ interrupt void CpuTimer2_20ms_ISR(void) { Task_GridPeriod(); if (Sys_Current_State == State_Running) //vdc crtl { Run_Vdc_Ctrl(); EPwm6Regs.CMPB.bit.CMPB = Vdc_Ctrl_PI.PI_Out * 1250.0f; EPwm6Regs.CMPA.bit.CMPA = Vdc_Ctrl_PI.PI_Out * 1250.0f; } } /**************************************************************** * AD INTERRUPT * get real value * clear interrupt flag * close loop control *************************************************************/ interrupt void Adcd_ISR(void) { // AdcResults[0] = (float)AdcaResultRegs.ADCRESULT0;//A0 VgridA // AdcResults[1] = (float)AdcbResultRegs.ADCRESULT0;//B0 VgridC // AdcResults[2] = (float)AdccResultRegs.ADCRESULT0;//C2 IgridA // AdcResults[3] = (float)AdcdResultRegs.ADCRESULT0;//D1 IHbridge // AdcResults[4] = (float)AdcbResultRegs.ADCRESULT1;//B2 VgridB // AdcResults[5] = (float)AdccResultRegs.ADCRESULT1;//C3 IgridB // AdcResults[6] = (float)AdcdResultRegs.ADCRESULT1;//D2 Itrack // AdcResults[7] = (float)AdcbResultRegs.ADCRESULT2;//B3 Vdc // AdcResults[8] = (float)AdccResultRegs.ADCRESULT2;//C4 IgridC // AdcResults[9] = (float)AdcdResultRegs.ADCRESULT2;//D3 Itrack // AdcResults[10] = (float)AdcdResultRegs.ADCRESULT3;//D4 TempIGBT // AdcResults[11] = (float)AdcaResultRegs.ADCRESULT15;//A15 Vref // AdcResults[0] = (float)AdcaResultRegs.ADCRESULT0;//A0 VgridA // AdcResults[1] = (float)AdcbResultRegs.ADCRESULT1;//B2 VgridB // AdcResults[2] = (float)AdcbResultRegs.ADCRESULT0;//B0 VgridC // AdcResults[3] = (float)AdccResultRegs.ADCRESULT0;//C2 IgridA // AdcResults[4] = (float)AdccResultRegs.ADCRESULT1;//C3 IgridB // AdcResults[5] = (float)AdccResultRegs.ADCRESULT2;//C4 IgridC // AdcResults[6] = (float)AdcbResultRegs.ADCRESULT2;//B3 Vdc // AdcResults[7] = (float)AdcdResultRegs.ADCRESULT1;//D2 Itrack // AdcResults[8] = (float)AdcdResultRegs.ADCRESULT2;//D3 Itrack // AdcResults[9] = (float)AdcdResultRegs.ADCRESULT0;//D1 IHbridge // AdcResults[10] = (float)AdcdResultRegs.ADCRESULT3;//D4 TempIGBT // AdcResults[11] = (float)AdcaResultRegs.ADCRESULT15;//A15 Vref // if(TEMPSEL == 0) TEMPResults[0] = (float)AdcdResultRegs.ADCRESULT3;//D4 TempIGBT // else if(TEMPSEL == 1) TEMPResults[1] = (float)AdcdResultRegs.ADCRESULT3;//D4 TempIGBT // else if(TEMPSEL == 2) TEMPResults[2] = (float)AdcdResultRegs.ADCRESULT3;//D4 TempIGBT // else if(TEMPSEL == 3) TEMPResults[3] = (float)AdcdResultRegs.ADCRESULT3;//D4 TempIGBT // AdcIgrid[0] = (float)((AdccResultRegs.ADCRESULT0 - 1861.81f) * 1.61133E-03f); // AdcIgrid[1] = (float)((AdccResultRegs.ADCRESULT1 - 1861.81f) * 1.61133E-03f); // AdcIgrid[2] = (float)((AdccResultRegs.ADCRESULT2 - 1861.81f) * 1.61133E-03f); // AdcItrack[0] = (float)((AdcdResultRegs.ADCRESULT1 - 8.05E-4f) * 1.0f); //AdcVdc = (float)((ADResultReg_Vdc - 2.0f) * 0.152472f);//ok // AdcVgrid[0] = (float)((ADResultReg_Vgrid_Phase_A - 1851.89f) * 1.0f); // AdcVgrid[1] = (float)((ADResultReg_Vgrid_Phase_B - 1851.81f) * 1.0f); // AdcVgrid[2] = (float)((ADResultReg_Vgrid_Phase_C - 1851.81f) * 1.0f); Get_Sample_RealValue(); Calc_Sample_AccValue(); if ((Sys_Current_State != State_Stop) && (Sys_Current_State != State_Fault)) { if (All_State_Flag.bit.ADOffset_CheckOver == 1) { SoftWare_FastProtect(); } } //Vdc_PI // if ((Sys_Current_State == State_PreCharge) || (Sys_Current_State == State_Running)) //vdc crtl // { // Run_Vdc_Ctrl(); // EPwm6Regs.CMPB.bit.CMPB = Vdc_Ctrl_PI.PI_Out * 1250.0f; // EPwm6Regs.CMPA.bit.CMPA = Vdc_Ctrl_PI.PI_Out * 1250.0f; // } //Vdc_PI // if (Sys_Current_State == State_Running) //vdc crtl // { // Run_Vdc_Ctrl(); // EPwm6Regs.CMPB.bit.CMPB = Vdc_Ctrl_PI.PI_Out * 1250.0f; // EPwm6Regs.CMPA.bit.CMPA = Vdc_Ctrl_PI.PI_Out * 1250.0f; // } AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag if(1 == AdcdRegs.ADCINTOVF.bit.ADCINT1)// Check if overflow has occurred { AdcdRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; //clear INT1 overflow flag AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag } PieCtrlRegs.PIEACK.bit.ACK1 = 1; } interrupt void AD_ISR(void) { // if ((Sys_Current_State == State_PreCharge) && (Sys_Current_State == State_Running)) // { // Run_Irack_Ctrl(); // } } interrupt void SciaModbusRxFifo_ISR(void) { if(SciaRegs.SCIRXST.bit.RXERROR == 1) { SciaRegs.SCICTL1.bit.SWRESET = 0; SciaRegs.SCIFFRX.bit.RXFIFORESET = 0; SciaRegs.SCIFFRX.bit.RXFIFORESET = 1; SciaRegs.SCICTL1.bit.SWRESET = 1; } else { Uint16 i; for(i = 0; i < 8; i++) { Rx_ADU_Buffer[i] = SciaRegs.SCIRXBUF.bit.SAR; } modbus485_flag = 1; } SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1; // Clear Overflow flag SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; // Clear Interrupt flag PieCtrlRegs.PIEACK.bit.ACK9 = 1; } void LightBeepCMD(void) { switch (Sys_Current_State) { case State_Idle: { Light_Yellow_Off(); Light_Green_On(); Light_Red_Off(); // Beep_Off(); break; } case State_Fault: { Light_Yellow_On(); Light_Green_Off(); Light_Red_Off(); // Beep_On(); break; } default: { Light_Yellow_Off(); Light_Green_Off(); Light_Red_On(); if (Sys_Current_State == State_Check) { // Beep_On(); } else { // Beep_Off(); } if (Sys_Current_State == State_Running) { if(Fault_Flag.bit.Relay_Fan_Fault == 1 || Fault_Flag.bit.temp_warming == 1) { Light_Yellow_On(); Light_Green_Off(); Light_Red_Off(); } } break; } } }