From 4de878ee68fb8a4e54ff7278bc2363c4abc0acc6 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Tue, 14 Jan 2025 13:26:48 +0300 Subject: [PATCH] =?UTF-8?q?#4=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=A8=D0=98=D0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #3 Добавлена запись ШИМ в выходы SFunction Алгоритм тот же, что и раньше просто оптимизирован в структуры и функции. Вроде даже что-то формирует, но не совсем понятно что. Надо дальше разбираться --- Inu/Src/main_matlab/init28335.c | 3 + Inu/Src/main_matlab/main_matlab.c | 36 +- Inu/Src/main_matlab/param.c | 63 +++ Inu/controller.c | 715 +----------------------------- Inu/controller.h | 191 +------- Inu/main.c | 144 ------ Inu/main.h | 17 - Inu/pwm_sim.c | 153 +++++++ Inu/pwm_sim.h | 60 +++ Inu/wrapper_inu.h | 2 +- inu_im_2wnd_3lvl.slx | Bin 80516 -> 80639 bytes run_mex.bat | 1 + 12 files changed, 316 insertions(+), 1069 deletions(-) delete mode 100644 Inu/main.c delete mode 100644 Inu/main.h create mode 100644 Inu/pwm_sim.c create mode 100644 Inu/pwm_sim.h diff --git a/Inu/Src/main_matlab/init28335.c b/Inu/Src/main_matlab/init28335.c index 756ee53..af74fd7 100644 --- a/Inu/Src/main_matlab/init28335.c +++ b/Inu/Src/main_matlab/init28335.c @@ -21,6 +21,9 @@ void init28335(void) { Init_Adc_Variables(); + //svgen_pwm24_1.phase_sequence = SIMULINK_SEQUENCE; + //svgen_pwm24_2.phase_sequence = SIMULINK_SEQUENCE; + } //void init28335(void) void edrk_init_variables_matlab(void) diff --git a/Inu/Src/main_matlab/main_matlab.c b/Inu/Src/main_matlab/main_matlab.c index eb2bc3f..6fe85ef 100644 --- a/Inu/Src/main_matlab/main_matlab.c +++ b/Inu/Src/main_matlab/main_matlab.c @@ -28,6 +28,7 @@ void mcu_simulate_step(void) { int ff = 0; static _iq Uzad1 = 0, Fzad = 0, Uzad2 = 0, Izad_out = 0, Uzad_from_master = 0; + int pwm_enable_calc_main; _iq wd; if (edrk.flag_second_PCH == 0) { @@ -37,23 +38,18 @@ void mcu_simulate_step(void) wd = uf_alg.winding_displacement_bs2; } - //parse_parameters_from_all_control_station(); - - //ff = control_station.active_array_cmd[CONTROL_STATION_CMD_SET_ROTOR]; - //control_station.array_cmd[CONTROL_STATION_INGETEAM_PULT_RS485][CONTROL_STATION_CMD_SET_ROTOR] = ff; - //control_station.array_cmd[CONTROL_STATION_VPU_CAN][CONTROL_STATION_CMD_SET_ROTOR] = ff; - //control_station.array_cmd[CONTROL_STATION_ZADATCHIK_CAN][CONTROL_STATION_CMD_SET_ROTOR] = ff; - - //ff = control_station.active_array_cmd[CONTROL_STATION_CMD_SET_POWER]; - //control_station.array_cmd[CONTROL_STATION_INGETEAM_PULT_RS485][CONTROL_STATION_CMD_SET_POWER] = ff; + detect_level_interrupt(edrk.flag_second_PCH); + if (xpwm_time.where_interrupt == PWM_LOW_LEVEL_INTERRUPT || + xpwm_time.one_or_two_interrupts_run == PWM_ONE_INTERRUPT_RUN) + { + pwm_enable_calc_main = 1; + } + else + { + pwm_enable_calc_main = 0; + } - //if (control_station.active_array_cmd[CONTROL_STATION_CMD_ROTOR_POWER]) - //{ - // control_station.array_cmd[CONTROL_STATION_ZADATCHIK_CAN][CONTROL_STATION_CMD_SET_ROTOR] = 0; - // control_station.array_cmd[CONTROL_STATION_VPU_CAN][CONTROL_STATION_CMD_SET_ROTOR] = 0; - //} - //parse_analog_data_from_active_control_station_to_alg(); calc_norm_ADC_0(0); @@ -77,6 +73,16 @@ void mcu_simulate_step(void) analog.PowerFOC = edrk.P_to_master; Fzad = vect_control.iqFstator; Izad_out = edrk.Iq_to_slave; + + if (xpwm_time.one_or_two_interrupts_run == PWM_ONE_INTERRUPT_RUN) + write_swgen_pwm_times(PWM_MODE_RELOAD_FORCE); + else + { + if (pwm_enable_calc_main) + write_swgen_pwm_times(PWM_MODE_RELOAD_LEVEL_HIGH); + else + write_swgen_pwm_times(PWM_MODE_RELOAD_LEVEL_LOW); + } } diff --git a/Inu/Src/main_matlab/param.c b/Inu/Src/main_matlab/param.c index 24392f4..ef4357a 100644 --- a/Inu/Src/main_matlab/param.c +++ b/Inu/Src/main_matlab/param.c @@ -50,4 +50,67 @@ void readInputParameters(const real_T *u) { void writeOutputParameters(real_T* xD) { + int nn = 0; + + xD[nn++] = t1sim.ciA; + xD[nn++] = t2sim.ciA; + xD[nn++] = t1sim.ciB; + xD[nn++] = t2sim.ciB; + + xD[nn++] = t3sim.ciA; + xD[nn++] = t4sim.ciA; + xD[nn++] = t3sim.ciB; + xD[nn++] = t4sim.ciB; + + xD[nn++] = t5sim.ciA; + xD[nn++] = t6sim.ciA; + xD[nn++] = t5sim.ciB; + xD[nn++] = t6sim.ciB; + + + xD[nn++] = t7sim.ciA; + xD[nn++] = t8sim.ciA; + xD[nn++] = t7sim.ciB; + xD[nn++] = t8sim.ciB; + + xD[nn++] = t9sim.ciA; + xD[nn++] = t10sim.ciA; + xD[nn++] = t9sim.ciB; + xD[nn++] = t10sim.ciB; + + xD[nn++] = t11sim.ciA; + xD[nn++] = t12sim.ciA; + xD[nn++] = t11sim.ciB; + xD[nn++] = t12sim.ciB; + + // + xD[nn++] = _IQtoF(0); + xD[nn++] = _IQtoF(0); + + xD[nn++] = 0; + xD[nn++] = 0; + xD[nn++] = 0; + + xD[nn++] = 0; + xD[nn++] = 0; + + xD[nn++] = 0; + xD[nn++] = _IQtoF(0);//rs.wmZ; + xD[nn++] = _IQtoF(0) * NORMA_FROTOR * 60.0 / N_BAZ;//csp.wmLimZi; + + xD[nn++] = 0;///P_NOM; + xD[nn++] = 0;///P_NOM; + xD[nn++] = 0;///P_NOM; + + xD[nn++] = _IQtoF(vect_control.iqId2);//_IQtoF(vect_control.iqPzad); + xD[nn++] = _IQtoF(vect_control.iqIq2);// * NORMA_ACP; + xD[nn++] = _IQtoF(vect_control.iqId1);//_IQtoF(vect_control.iqUqCompensation1);// + xD[nn++] = _IQtoF(vect_control.iqIq1); + xD[nn++] = _IQtoF(vect_control.Iq_zad1); + xD[nn++] = _IQtoF(vect_control.Id_zad1);//iqZ; + + xD[nn++] = 0; + + xD[nn++] = xpwm_time.Ta0_0; + xD[nn++] = xpwm_time.Ta0_1; } \ No newline at end of file diff --git a/Inu/controller.c b/Inu/controller.c index ef0e290..1a5f80f 100644 --- a/Inu/controller.c +++ b/Inu/controller.c @@ -15,46 +15,13 @@ #include "param.h" -extern UMotorMeasure motor; - -extern TimerSimHandle t1sim; -extern TimerSimHandle t2sim; -extern TimerSimHandle t3sim; -extern TimerSimHandle t4sim; -extern TimerSimHandle t5sim; -extern TimerSimHandle t6sim; -extern TimerSimHandle t7sim; -extern TimerSimHandle t8sim; -extern TimerSimHandle t9sim; -extern TimerSimHandle t10sim; -extern TimerSimHandle t11sim; -extern TimerSimHandle t12sim; - -extern DeadBandSimHandle dt1sim; -extern DeadBandSimHandle dt2sim; -extern DeadBandSimHandle dt3sim; -extern DeadBandSimHandle dt4sim; -extern DeadBandSimHandle dt5sim; -extern DeadBandSimHandle dt6sim; -extern DeadBandSimHandle dt7sim; -extern DeadBandSimHandle dt8sim; -extern DeadBandSimHandle dt9sim; -extern DeadBandSimHandle dt10sim; -extern DeadBandSimHandle dt11sim; -extern DeadBandSimHandle dt12sim; - -extern void init28335(void); -extern void detcoeff(void); -extern void isr(void); -extern void input_param(unsigned short num, unsigned short val); -// extern void init_DQ_pid(); -int calcAlgUpr = 0; - -int timers_adc = 0; -int timers_pwm = 0; - - +UMotorMeasure motor; +double dt; +// +int j; +unsigned short paramNo; +unsigned short paramNew[PAR_NUMBER]; void processSFunctionIfChanged(SimStruct *S, int_T *iW) { // S-Function , @@ -83,7 +50,7 @@ void processSFunctionIfChanged(SimStruct *S, int_T *iW) { } // (begin) int nn = 0; - double dt = paramScal[nn++];// ( S-function !) + dt = paramScal[nn++];// ( S-function !) // (end) } //if ( iW[0] == 1 ) @@ -94,216 +61,13 @@ void initialisationOnStart(int_T *iW) { // - if ( iW[1] == 1 ) { iW[1] = 0; - + Init_Timers(); init28335(); } //if ( iW[1] == 1 ) } -void simulatePWMcounterAndReadComarators(void) { - - //// Time-Base Submodule, Counter-Compare Submodule - //// Event-Trigger Submodule - //// ePWM1 (up-down-count mode) - //// ------------------------- - //t1cntAuxPrev = t1cntAux; - //t1cntAux += TxCntPlus; - //if ( t1cntAux > T1Pr ) { - // t1cntAux -= T1Pr*2.; - // // active CMPA load from shadow when TBCTR == TBPRD - // cmp1A = (double)EPwm1Regs.CMPA.half.CMPA; - // // - // // tAdc = Tadc; - // // nAdc = 0; - // calcAlgUpr = 1; // - //} - //if ( (t1cntAuxPrev < 0) && (t1cntAux >= 0) ) { - // // active CMPA load from shadow when TBCTR == 0 - // cmp1A = (double)EPwm1Regs.CMPA.half.CMPA; - // // - // // tAdc = Tadc; - // // nAdc = 0; - // calcAlgUpr = 1; // - //} - //t1cnt = fabs(t1cntAux); - - //// ePWM2 (up-down-count mode) - //// ------------------------- - //t2cntAuxPrev = t2cntAux; - //t2cntAux += TxCntPlus; - //if ( t2cntAux > T2Pr ) { - // t2cntAux -= T2Pr*2.; - // // active CMPA load from shadow when TBCTR == TBPRD - // cmp2A = (double)EPwm2Regs.CMPA.half.CMPA; - //} - //if ( (t2cntAuxPrev < 0) && (t2cntAux >= 0) ) { - // // active CMPA load from shadow when TBCTR == 0 - // cmp2A = (double)EPwm2Regs.CMPA.half.CMPA; - //} - //t2cnt = fabs(t2cntAux); - - //// ePWM3 (up-down-count mode) - //// ------------------------- - //t3cntAuxPrev = t3cntAux; - //t3cntAux += TxCntPlus; - //if ( t3cntAux > T3Pr ) { - // t3cntAux -= T3Pr*2.; - // // active CMPA load from shadow when TBCTR == TBPRD - // cmp3A = (double)EPwm3Regs.CMPA.half.CMPA; - //} - //if ( (t3cntAuxPrev < 0) && (t3cntAux >= 0) ) { - // // active CMPA load from shadow when TBCTR == 0 - // cmp3A = (double)EPwm3Regs.CMPA.half.CMPA; - //} - //t3cnt = fabs(t3cntAux); - - //// ePWM4 (up-down-count mode) - //// ------------------------- - //t4cntAuxPrev = t4cntAux; - //t4cntAux += TxCntPlus; - //if ( t4cntAux > T4Pr ) { - // t4cntAux -= T4Pr*2.; - // // active CMPA load from shadow when TBCTR == TBPRD - // cmp4A = (double)EPwm4Regs.CMPA.half.CMPA; - //} - //if ( (t4cntAuxPrev < 0) && (t4cntAux >= 0) ) { - // // active CMPA load from shadow when TBCTR == 0 - // cmp4A = (double)EPwm4Regs.CMPA.half.CMPA; - //} - //t4cnt = fabs(t4cntAux); - - //// ePWM5 (up-down-count mode) - //// ------------------------- - //t5cntAuxPrev = t5cntAux; - //t5cntAux += TxCntPlus; - //if ( t5cntAux > T5Pr ) { - // t5cntAux -= T5Pr*2.; - // // active CMPA load from shadow when TBCTR == TBPRD - // cmp5A = (double)EPwm5Regs.CMPA.half.CMPA; - //} - //if ( (t5cntAuxPrev < 0) && (t5cntAux >= 0) ) { - // // active CMPA load from shadow when TBCTR == 0 - // cmp5A = (double)EPwm5Regs.CMPA.half.CMPA; - //} - //t5cnt = fabs(t5cntAux); - - //// ePWM6 (up-down-count mode) - //// ------------------------- - //t6cntAuxPrev = t6cntAux; - //t6cntAux += TxCntPlus; - //if ( t6cntAux > T6Pr ) { - // t6cntAux -= T6Pr*2.; - // // active CMPA load from shadow when TBCTR == TBPRD - // cmp6A = (double)EPwm6Regs.CMPA.half.CMPA; - //} - //if ( (t6cntAuxPrev < 0) && (t6cntAux >= 0) ) { - // // active CMPA load from shadow when TBCTR == 0 - // cmp6A = (double)EPwm6Regs.CMPA.half.CMPA; - //} - //t6cnt = fabs(t6cntAux); - - //// ePWM7 (up-down-count mode) - //// ------------------------- - //t7cntAuxPrev = t7cntAux; - //t7cntAux += TxCntPlus; - //if (t7cntAux > T7Pr) { - // t7cntAux -= T7Pr*2.; - // // active CMPA load from shadow when TBCTR == TBPRD - // cmp7A = (double)EPwm7Regs.CMPA.half.CMPA; - //} - //if ( (t7cntAuxPrev < 0) && (t7cntAux >= 0) ) { - // // active CMPA load from shadow when TBCTR == 0 - // cmp7A = (double)EPwm7Regs.CMPA.half.CMPA; - //} - //t7cnt = fabs(t7cntAux); - - //// ePWM8 (up-down-count mode) - //// ------------------------- - //t8cntAuxPrev = t8cntAux; - //t8cntAux += TxCntPlus; - //if(t8cntAux > T8Pr) { - // t8cntAux -= T8Pr*2.; - // // active CMPA load from shadow when TBCTR == TBPRD - // cmp8A = (double)EPwm8Regs.CMPA.half.CMPA; - //} - //if((t8cntAuxPrev < 0) && (t8cntAux >= 0)) { - // // active CMPA load from shadow when TBCTR == 0 - // cmp8A = (double)EPwm8Regs.CMPA.half.CMPA; - //} - //t8cnt = fabs(t8cntAux); - - //// ePWM9 (up-down-count mode) - //// ------------------------- - //t9cntAuxPrev = t9cntAux; - //t9cntAux += TxCntPlus; - //if(t9cntAux > T9Pr) { - // t9cntAux -= T9Pr*2.; - // // active CMPA load from shadow when TBCTR == TBPRD - // cmp9A = (double)EPwm9Regs.CMPA.half.CMPA; - //} - //if((t9cntAuxPrev < 0) && (t9cntAux >= 0)) { - // // active CMPA load from shadow when TBCTR == 0 - // cmp9A = (double)EPwm9Regs.CMPA.half.CMPA; - //} - //t9cnt = fabs(t9cntAux); - - //// ePWM10 (up-down-count mode) - //// ------------------------- - //t10cntAuxPrev = t10cntAux; - //t10cntAux += TxCntPlus; - //if(t10cntAux > T10Pr) { - // t10cntAux -= T10Pr*2.; - // // active CMPA load from shadow when TBCTR == TBPRD - // cmp10A = (double)EPwm10Regs.CMPA.half.CMPA; - //} - //if((t10cntAuxPrev < 0) && (t10cntAux >= 0)) { - // // active CMPA load from shadow when TBCTR == 0 - // cmp10A = (double)EPwm10Regs.CMPA.half.CMPA; - //} - //t10cnt = fabs(t10cntAux); - - //// ePWM11 (up-down-count mode) - //// ------------------------- - //t11cntAuxPrev = t11cntAux; - //t11cntAux += TxCntPlus; - //if(t11cntAux > T11Pr) { - // t11cntAux -= T11Pr*2.; - // // active CMPA load from shadow when TBCTR == TBPRD - // cmp11A = (double)EPwm11Regs.CMPA.half.CMPA; - //} - //if((t11cntAuxPrev < 0) && (t11cntAux >= 0)) { - // // active CMPA load from shadow when TBCTR == 0 - // cmp11A = (double)EPwm11Regs.CMPA.half.CMPA; - //} - //t11cnt = fabs(t11cntAux); - - //// ePWM12 (up-down-count mode) - //// ------------------------- - //t12cntAuxPrev = t12cntAux; - //t12cntAux += TxCntPlus; - //if(t12cntAux > T12Pr) { - // t12cntAux -= T12Pr*2.; - // // active CMPA load from shadow when TBCTR == TBPRD - // cmp12A = (double)EPwm12Regs.CMPA.half.CMPA; - //} - //if((t12cntAuxPrev < 0) && (t12cntAux >= 0)) { - // // active CMPA load from shadow when TBCTR == 0 - // cmp12A = (double)EPwm12Regs.CMPA.half.CMPA; - //} - //t12cnt = fabs(t12cntAux); - - - //// eQEP - //qposcnt += wm_ml/PI2*NOP*4.*dt; - //if ( qposcnt >= (Qposmax + 1.) ) - // qposcnt -= (Qposmax + 1.); - //else if ( qposcnt < 0 ) - // qposcnt += (Qposmax + 1.); - //EQep2Regs.QPOSCNT = (short)qposcnt; - -} - void update_norm_ADC_array() { @@ -463,461 +227,6 @@ void simulateAdcAndCallIsr() { } -void simulateActionActionQualifierSubmodule(void) { - //// Action-Qualifier Submodule - //// ... ePWM1 - //if ( cmp1A > t1cnt ) { - // ci1A = 0; - // ci1B = 1; - //} - //else if ( cmp1A < t1cnt ) { - // ci1A = 1; - // ci1B = 0; - //} - //// ... ePWM2 - //if ( cmp2A > t2cnt ) { - // ci2A = 0; - // ci2B = 1; - //} - //else if ( cmp2A < t2cnt ) { - // ci2A = 1; - // ci2B = 0; - //} - //// ... ePWM3 - //if ( cmp3A > t3cnt ) { - // ci3A = 0; - // ci3B = 1; - //} - //else if ( cmp3A < t3cnt ) { - // ci3A = 1; - // ci3B = 0; - //} - //// ... ePWM4 - //if ( cmp4A > t4cnt ) { - // ci4A = 0; - // ci4B = 1; - //} - //else if ( cmp4A < t4cnt ) { - // ci4A = 1; - // ci4B = 0; - //} - //// ... ePWM5 - //if ( cmp5A > t5cnt ) { - // ci5A = 0; - // ci5B = 1; - //} - //else if ( cmp5A < t5cnt ) { - // ci5A = 1; - // ci5B = 0; - //} - //// ... ePWM6 - //if ( cmp6A > t6cnt ) { - // ci6A = 0; - // ci6B = 1; - //} - //else if ( cmp6A < t6cnt ) { - // ci6A = 1; - // ci6B = 0; - //} - //// ... ePWM7 - //if ( cmp7A > t7cnt ) { - // ci7A = 0; - // ci7B = 1; - //} - //else if ( cmp7A < t7cnt ) { - // ci7A = 1; - // ci7B = 0; - //} - //// ... ePWM8 - //if ( cmp8A > t8cnt ) { - // ci8A = 0; - // ci8B = 1; - //} - //else if ( cmp8A < t8cnt ) { - // ci8A = 1; - // ci8B = 0; - //} - //// ... ePWM9 - //if ( cmp9A > t9cnt ) { - // ci9A = 0; - // ci9B = 1; - //} - //else if ( cmp9A < t9cnt ) { - // ci9A = 1; - // ci9B = 0; - //} - //// ... ePWM10 - //if ( cmp10A > t10cnt ) { - // ci10A = 0; - // ci10B = 1; - //} - //else if ( cmp10A < t10cnt ) { - // ci10A = 1; - // ci10B = 0; - //} - //// ... ePWM11 - //if ( cmp11A > t11cnt ) { - // ci11A = 0; - // ci11B = 1; - //} - //else if ( cmp11A < t11cnt ) { - // ci11A = 1; - // ci11B = 0; - //} - //// ... ePWM12 - //if ( cmp12A > t12cnt ) { - // ci12A = 0; - // ci12B = 1; - //} - //else if ( cmp12A < t12cnt ) { - // ci12A = 1; - // ci12B = 0; - //} - - -} - -void simulateDeadBendSubmodule(void) { - - //// Dead-Band Submodule - //// ... ePWM1 - //if ( stateDt1 == 1 ) { - // ci1A_DT = ci1A; - // ci1B_DT = 0; - // if ( ci1A == 1 ) - // cntDt1 = CntDt; - // if ( cntDt1 > 0 ) - // cntDt1--; - // else - // stateDt1 = 2; - //} - //else if ( stateDt1 == 2 ) { - // ci1A_DT = 0; - // ci1B_DT = ci1B; - // if ( ci1B == 1 ) - // cntDt1 = CntDt; - // if ( cntDt1 > 0 ) - // cntDt1--; - // else - // stateDt1 = 1; - //} - //// ... ePWM2 - //if ( stateDt2 == 1 ) { - // ci2A_DT = ci2A; - // ci2B_DT = 0; - // if ( ci2A == 1 ) - // cntDt2 = CntDt; - // if ( cntDt2 > 0 ) - // cntDt2--; - // else - // stateDt2 = 2; - //} - //else if ( stateDt2 == 2 ) { - // ci2A_DT = 0; - // ci2B_DT = ci2B; - // if ( ci2B == 1 ) - // cntDt2 = CntDt; - // if ( cntDt2 > 0 ) - // cntDt2--; - // else - // stateDt2 = 1; - //} - //// ... ePWM3 - //if ( stateDt3 == 1 ) { - // ci3A_DT = ci3A; - // ci3B_DT = 0; - // if ( ci3A == 1 ) - // cntDt3 = CntDt; - // if ( cntDt3 > 0 ) - // cntDt3--; - // else - // stateDt3 = 2; - //} - //else if ( stateDt3 == 2 ) { - // ci3A_DT = 0; - // ci3B_DT = ci3B; - // if ( ci3B == 1 ) - // cntDt3 = CntDt; - // if ( cntDt3 > 0 ) - // cntDt3--; - // else - // stateDt3 = 1; - //} - //// ... ePWM4 - //if ( stateDt4 == 1 ) { - // ci4A_DT = ci4A; - // ci4B_DT = 0; - // if ( ci4A == 1 ) - // cntDt4 = CntDt; - // if ( cntDt4 > 0 ) - // cntDt4--; - // else - // stateDt4 = 2; - //} - //else if ( stateDt4 == 2 ) { - // ci4A_DT = 0; - // ci4B_DT = ci4B; - // if ( ci4B == 1 ) - // cntDt4 = CntDt; - // if ( cntDt4 > 0 ) - // cntDt4--; - // else - // stateDt4 = 1; - //} - //// ... ePWM5 - //if ( stateDt5 == 1 ) { - // ci5A_DT = ci5A; - // ci5B_DT = 0; - // if ( ci5A == 1 ) - // cntDt5 = CntDt; - // if ( cntDt5 > 0 ) - // cntDt5--; - // else - // stateDt5 = 2; - //} - //else if ( stateDt5 == 2 ) { - // ci5A_DT = 0; - // ci5B_DT = ci5B; - // if ( ci5B == 1 ) - // cntDt5 = CntDt; - // if ( cntDt5 > 0 ) - // cntDt5--; - // else - // stateDt5 = 1; - //} - //// ... ePWM6 - //if ( stateDt6 == 1 ) { - // ci6A_DT = ci6A; - // ci6B_DT = 0; - // if ( ci6A == 1 ) - // cntDt6 = CntDt; - // if ( cntDt6 > 0 ) - // cntDt6--; - // else - // stateDt6 = 2; - //} - //else if ( stateDt6 == 2 ) { - // ci6A_DT = 0; - // ci6B_DT = ci6B; - // if ( ci6B == 1 ) - // cntDt6 = CntDt; - // if ( cntDt6 > 0 ) - // cntDt6--; - // else - // stateDt6 = 1; - //} - //// ... ePWM7 - //if ( stateDt7 == 1 ) { - // ci7A_DT = ci7A; - // ci7B_DT = 0; - // if ( ci7A == 1 ) - // cntDt7 = CntDt; - // if ( cntDt7 > 0 ) - // cntDt7--; - // else - // stateDt7 = 2; - //} - //else if ( stateDt7 == 2 ) { - // ci7A_DT = 0; - // ci7B_DT = ci7B; - // if ( ci7B == 1 ) - // cntDt7 = CntDt; - // if ( cntDt7 > 0 ) - // cntDt7--; - // else - // stateDt7 = 1; - //} - //// ... ePWM8 - //if ( stateDt8 == 1 ) { - // ci8A_DT = ci8A; - // ci8B_DT = 0; - // if ( ci8A == 1 ) - // cntDt8 = CntDt; - // if ( cntDt8 > 0 ) - // cntDt8--; - // else - // stateDt8 = 2; - //} - //else if ( stateDt8 == 2 ) { - // ci8A_DT = 0; - // ci8B_DT = ci8B; - // if ( ci8B == 1 ) - // cntDt8 = CntDt; - // if ( cntDt8 > 0 ) - // cntDt8--; - // else - // stateDt8 = 1; - //} - //// ... ePWM9 - //if ( stateDt9 == 1 ) { - // ci9A_DT = ci9A; - // ci9B_DT = 0; - // if ( ci9A == 1 ) - // cntDt9 = CntDt; - // if ( cntDt9 > 0 ) - // cntDt9--; - // else - // stateDt9 = 2; - //} - //else if ( stateDt9 == 2 ) { - // ci9A_DT = 0; - // ci9B_DT = ci9B; - // if ( ci9B == 1 ) - // cntDt9 = CntDt; - // if ( cntDt9 > 0 ) - // cntDt9--; - // else - // stateDt9 = 1; - //} - //// ... ePWM10 - //if ( stateDt10 == 1 ) { - // ci10A_DT = ci10A; - // ci10B_DT = 0; - // if ( ci10A == 1 ) - // cntDt10 = CntDt; - // if ( cntDt10 > 0 ) - // cntDt10--; - // else - // stateDt10 = 2; - //} - //else if ( stateDt10 == 2 ) { - // ci10A_DT = 0; - // ci10B_DT = ci10B; - // if ( ci10B == 1 ) - // cntDt10 = CntDt; - // if ( cntDt10 > 0 ) - // cntDt10--; - // else - // stateDt10 = 1; - //} - //// ... ePWM11 - //if ( stateDt11 == 1 ) { - // ci11A_DT = ci11A; - // ci11B_DT = 0; - // if ( ci11A == 1 ) - // cntDt11 = CntDt; - // if ( cntDt11 > 0 ) - // cntDt11--; - // else - // stateDt11 = 2; - //} - //else if ( stateDt11 == 2 ) { - // ci11A_DT = 0; - // ci11B_DT = ci11B; - // if ( ci11B == 1 ) - // cntDt11 = CntDt; - // if ( cntDt11 > 0 ) - // cntDt11--; - // else - // stateDt11 = 1; - //} - //// ... ePWM12 - //if ( stateDt12 == 1 ) { - // ci12A_DT = ci12A; - // ci12B_DT = 0; - // if ( ci12A == 1 ) - // cntDt12 = CntDt; - // if ( cntDt12 > 0 ) - // cntDt12--; - // else - // stateDt12 = 2; - //} - //else if ( stateDt12 == 2 ) { - // ci12A_DT = 0; - // ci12B_DT = ci12B; - // if ( ci12B == 1 ) - // cntDt12 = CntDt; - // if ( cntDt12 > 0 ) - // cntDt12--; - // else - // stateDt12 = 1; - //} - -} - - -void simulateTripZoneSubmodule(void) { - -//// Trip-Zone Submodule -// // ... clear flag for one-shot trip latch -// if ( EPwm1Regs.TZCLR.all == 0x0004 ) { -// EPwm1Regs.TZCLR.all = 0x0000; -// EPwm1Regs.TZFRC.all = 0x0000; -// } -// if ( EPwm2Regs.TZCLR.all == 0x0004 ) { -// EPwm2Regs.TZCLR.all = 0x0000; -// EPwm2Regs.TZFRC.all = 0x0000; -// } -// if ( EPwm3Regs.TZCLR.all == 0x0004 ) { -// EPwm3Regs.TZCLR.all = 0x0000; -// EPwm3Regs.TZFRC.all = 0x0000; -// } -// if ( EPwm4Regs.TZCLR.all == 0x0004 ) { -// EPwm4Regs.TZCLR.all = 0x0000; -// EPwm4Regs.TZFRC.all = 0x0000; -// } -// if ( EPwm5Regs.TZCLR.all == 0x0004 ) { -// EPwm5Regs.TZCLR.all = 0x0000; -// EPwm5Regs.TZFRC.all = 0x0000; -// } -// if ( EPwm6Regs.TZCLR.all == 0x0004 ) { -// EPwm6Regs.TZCLR.all = 0x0000; -// EPwm6Regs.TZFRC.all = 0x0000; -// } -// if ( EPwm7Regs.TZCLR.all == 0x0004 ) { -// EPwm7Regs.TZCLR.all = 0x0000; -// EPwm7Regs.TZFRC.all = 0x0000; -// } -// if ( EPwm8Regs.TZCLR.all == 0x0004 ) { -// EPwm8Regs.TZCLR.all = 0x0000; -// EPwm8Regs.TZFRC.all = 0x0000; -// } -// if ( EPwm9Regs.TZCLR.all == 0x0004 ) { -// EPwm9Regs.TZCLR.all = 0x0000; -// EPwm9Regs.TZFRC.all = 0x0000; -// } -// if ( EPwm10Regs.TZCLR.all == 0x0004 ) { -// EPwm10Regs.TZCLR.all = 0x0000; -// EPwm10Regs.TZFRC.all = 0x0000; -// } -// if ( EPwm11Regs.TZCLR.all == 0x0004 ) { -// EPwm11Regs.TZCLR.all = 0x0000; -// EPwm11Regs.TZFRC.all = 0x0000; -// } -// if ( EPwm12Regs.TZCLR.all == 0x0004 ) { -// EPwm12Regs.TZCLR.all = 0x0000; -// EPwm12Regs.TZFRC.all = 0x0000; -// } -// // ... forces a one-shot trip event -// if ( EPwm1Regs.TZFRC.all == 0x0004 ) -// ci1A_DT = ci1B_DT = 0; -// if ( EPwm2Regs.TZFRC.all == 0x0004 ) -// ci2A_DT = ci2B_DT = 0; -// if ( EPwm3Regs.TZFRC.all == 0x0004 ) -// ci3A_DT = ci3B_DT = 0; -// if ( EPwm4Regs.TZFRC.all == 0x0004 ) -// ci4A_DT = ci4B_DT = 0; -// if ( EPwm5Regs.TZFRC.all == 0x0004 ) -// ci5A_DT = ci5B_DT = 0; -// if ( EPwm6Regs.TZFRC.all == 0x0004 ) -// ci6A_DT = ci6B_DT = 0; -// if ( EPwm7Regs.TZFRC.all == 0x0004 ) -// ci7A_DT = ci7B_DT = 0; -// if ( EPwm8Regs.TZFRC.all == 0x0004 ) -// ci8A_DT = ci8B_DT = 0; -// if ( EPwm9Regs.TZFRC.all == 0x0004 ) -// ci9A_DT = ci9B_DT = 0; -// if ( EPwm10Regs.TZFRC.all == 0x0004 ) -// ci10A_DT = ci10B_DT = 0; -// if ( EPwm11Regs.TZFRC.all == 0x0004 ) -// ci11A_DT = ci11B_DT = 0; -// if ( EPwm12Regs.TZFRC.all == 0x0004 ) -// ci12A_DT = ci12B_DT = 0; - - -} - - void controller(SimStruct *S, const real_T *u, real_T *xD, real_T *rW, int_T *iW) { @@ -927,17 +236,11 @@ void controller(SimStruct *S, const real_T *u, real_T *xD, real_T *rW, int_T *iW processSFunctionIfChanged(S, iW); initialisationOnStart(iW); - simulatePWMcounterAndReadComarators(); + Simulate_Timers(); simulateAdcAndCallIsr(); - simulateActionActionQualifierSubmodule(); - // convertSVGenTimesToTkLines(); - simulateDeadBendSubmodule(); - - // xilinxPwm3LevelSimulation(); - simulateTripZoneSubmodule(); writeOutputParameters(xD); diff --git a/Inu/controller.h b/Inu/controller.h index a16fe3b..a5f0e99 100644 --- a/Inu/controller.h +++ b/Inu/controller.h @@ -2,6 +2,10 @@ #include "wrapper_inu.h" #include "def.h" +#include "pwm_sim.h" + + + #include "edrk_main.h" #include "vector.h" #include "vector_control.h" @@ -15,6 +19,7 @@ #include "CAN_Setup.h" #include "RS_Functions.h" #include "master_slave.h" +#include "xp_write_xpwm_time.h" #include #include @@ -54,190 +59,4 @@ typedef struct }UMotorMeasure; extern UMotorMeasure motor; -// -int j; -unsigned short paramNo; -unsigned short paramNew[PAR_NUMBER]; - -// Event Manager -// ... Time-Base Submodule, Counter-Compare Submodule Event-Trigger Submodule -typedef struct -{ - double TxCntPlus; - double TPr; - double tcntAux; - double tcntAuxPrev; - double tcnt; - double cmp1A; - double cmp1B; -}TimerSimHandle; -extern TimerSimHandle t1sim; -extern TimerSimHandle t2sim; -extern TimerSimHandle t3sim; -extern TimerSimHandle t4sim; -extern TimerSimHandle t5sim; -extern TimerSimHandle t6sim; -extern TimerSimHandle t7sim; -extern TimerSimHandle t8sim; -extern TimerSimHandle t9sim; -extern TimerSimHandle t10sim; -extern TimerSimHandle t11sim; -extern TimerSimHandle t12sim; - - -// ... Action-Qualifier Submodule -int ci1A; -int ci1B; -int ci2A; -int ci2B; -int ci3A; -int ci3B; -int ci4A; -int ci4B; -int ci5A; -int ci5B; -int ci6A; -int ci6B; -int ci7A; -int ci7B; -int ci8A; -int ci8B; -int ci9A; -int ci9B; -int ci10A; -int ci10B; -int ci11A; -int ci11B; -int ci12A; -int ci12B; -// ... Dead-Band Submodule -typedef struct -{ - int CntDt; - int stateDt; - int cntDt; - int ciA_DT; - int ciB_DT; -}DeadBandSimHandle; -extern DeadBandSimHandle dt1sim; -extern DeadBandSimHandle dt2sim; -extern DeadBandSimHandle dt3sim; -extern DeadBandSimHandle dt4sim; -extern DeadBandSimHandle dt5sim; -extern DeadBandSimHandle dt6sim; -extern DeadBandSimHandle dt7sim; -extern DeadBandSimHandle dt8sim; -extern DeadBandSimHandle dt9sim; -extern DeadBandSimHandle dt10sim; -extern DeadBandSimHandle dt11sim; -extern DeadBandSimHandle dt12sim; - -// eQEP -double Qposmax; -double qposcnt; - -// ADC -int tAdc; -int Tadc; -int nAdc; -//######################################################################### -// , controller.c (end) - - - - -// , controller.c (begin) -//######################################################################### -// isr.c -//------------------------------------------------------------------------- -extern struct Offset offset; -extern volatile struct Result result; -extern volatile short state; -extern volatile short faultNo; -extern volatile struct Out out; -// Udc -extern float Kudc; -extern volatile float udc1Nf; -extern volatile float udc1; -extern volatile float udc2Nf; -extern volatile float udc2; -// Iac -extern volatile float ia1Nf; -extern volatile float ib1Nf; -extern volatile float ix1; -extern volatile float iy1; -extern volatile float iac1Nf; -extern volatile float ia2Nf; -extern volatile float ib2Nf; -extern volatile float ix2; -extern volatile float iy2; -extern volatile float iac2Nf; -// Wm -extern float Kwm; -extern volatile float wmNf; -extern volatile float wm; -extern volatile float wmAbs; -// Me -extern volatile float kMe; -extern float KmeCorr; -extern float Kme; -extern volatile float meNf; -extern volatile float me; -// Pm -extern volatile float pm; -// -extern struct Protect protect; -extern volatile struct Emerg emerg; -extern short csmSuccess; -// -extern volatile short onceShutdown; -extern volatile short testParamFaultNo; -extern volatile short onceFaultReset; -extern volatile short stopPause; -extern volatile short inuWork; -// -extern struct Mst mst; - - - -// main.c -//------------------------------------------------------------------------- -extern struct Eprom eprom; - - - -// upr.c -//------------------------------------------------------------------------- -extern volatile short onceUpr; -extern struct SgmPar sgmPar; -extern struct Rf rf; -extern struct Rs rs; -extern struct Rp rp; - -extern float IzLim; -extern volatile float psi; -extern float idZ; -extern float iqZ; -extern float iZ; -extern float ws; -extern float sinTheta; -extern float cosTheta; -extern float id1; -extern float iq1; -extern float id2; -extern float iq2; -extern struct Cc cc; -extern struct Cf cf; -extern struct Csp csp; -extern struct Ivc ivc; -extern struct Ip ip; - - - -// param.c -//------------------------------------------------------------------------- -extern unsigned short param[]; -//######################################################################### -// , controller.c (end) - #endif //__WRAPPER_CONTROLLER_H \ No newline at end of file diff --git a/Inu/main.c b/Inu/main.c deleted file mode 100644 index 05cade6..0000000 --- a/Inu/main.c +++ /dev/null @@ -1,144 +0,0 @@ -/************************************************************************** - Description: INU. - / / . - - : .. - : 2021.10.05 -**************************************************************************/ - - -#include "def.h" -#include "main.h" - - -void control_processor_led(void); -void talk_with_desk(void); -void talk_with_mst(void); -void write_eeprom(void); -extern void detcoeff(void); -extern void init28335(void); - - -#ifndef ML -void main(void) { - // disable the watchdog - EALLOW; - SysCtrlRegs.WDCR = 0x0068; - EDIS; - - // - init28335(); - - // - detcoeff(); - - // re-enable the watchdog - EALLOW; - SysCtrlRegs.WDCR = 0x00A8; - // ... clear the WD counter - SysCtrlRegs.WDKEY = 0x55; - SysCtrlRegs.WDKEY = 0xAA; - EDIS; - - // clear Interrupt Flag ADC Sequencer 1 - AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; - // clear PIEIFR1 register - PieCtrlRegs.PIEIFR1.all = 0; - - // before we can start we have to enable interrupt mask in the PIE unit - PieCtrlRegs.PIEIER1.bit.INTx6 = 1; - // core line 1 (INT1) - IER |= M_INT1; - // enable global interrupts and higher priority real-time debug events - EINT; - ERTM; - - // (up-down-count mode) - EPwm1Regs.TBCTL.bit.CTRMODE = 2; - EPwm2Regs.TBCTL.bit.CTRMODE = 2; - EPwm3Regs.TBCTL.bit.CTRMODE = 2; - EPwm4Regs.TBCTL.bit.CTRMODE = 2; - EPwm5Regs.TBCTL.bit.CTRMODE = 2; - EPwm6Regs.TBCTL.bit.CTRMODE = 2; -#ifdef ML - EPwm7Regs.TBCTL.bit.CTRMODE = 2; - EPwm8Regs.TBCTL.bit.CTRMODE = 2; - EPwm9Regs.TBCTL.bit.CTRMODE = 2; - EPwm10Regs.TBCTL.bit.CTRMODE = 2; - EPwm11Regs.TBCTL.bit.CTRMODE = 2; - EPwm12Regs.TBCTL.bit.CTRMODE = 2; -#endif - - // loop forever - while(1) { - // - // ( -> mst) - talk_with_mst(); - // - // ( -> param[], eprom.writeRequestNumber) - talk_with_desk(); - // EEPROM - // (param[], eprom.writeRequestNumber -> eprom.writeRequestNumber) - if ( eprom.writeRequestNumber > 0 ) { - write_eeprom(); - } - - // - control_processor_led(); - } //while(1) -} //void main(void) - - - -// -void control_processor_led(void) { - static unsigned short Tled = (unsigned short)(0.5/TY); - static unsigned short tLed = 0; - - if ( tLed < Tled ) { - tLed++; - } - else { - tLed = 1; - // . - if ( state == STATE_SHUTDOWN ) { - LED_GREEN1_OFF; - LED_GREEN2_OFF; - LED_RED_TOGGLE; - } - // . - else if ( state == STATE_STOP ) { - LED_GREEN1_TOGGLE; - LED_GREEN2_OFF; - LED_RED_OFF; - } - // . - else { - LED_GREEN1_OFF; - LED_GREEN2_TOGGLE; - LED_RED_OFF; - } - } -} //void control_processor_led(void) - - - -// -// ( -> param[], eprom.writeRequestNumber) -void talk_with_desk(void) { -} - - - -// -// ( -> mst) -void talk_with_mst(void) { -} - - - -// EEPROM -// (param[], eprom.writeRequestNumber -> eprom.writeRequestNumber) -void write_eeprom(void) { -} -#endif //ML diff --git a/Inu/main.h b/Inu/main.h deleted file mode 100644 index f93fa02..0000000 --- a/Inu/main.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef MAIN -#define MAIN - -// , main.c (begin) -//######################################################################### -struct Eprom eprom; -//######################################################################### -// , main.c (end) - - - -// , main.c (begin) -//######################################################################### -extern volatile short state; -//######################################################################### -// , main.c (end) -#endif //MAIN diff --git a/Inu/pwm_sim.c b/Inu/pwm_sim.c new file mode 100644 index 0000000..ecc2b63 --- /dev/null +++ b/Inu/pwm_sim.c @@ -0,0 +1,153 @@ +#include "pwm_sim.h" +#include "xp_write_xpwm_time.h" +#include "main_matlab.h" +#include "wrapper_inu.h" +#include "params_pwm24.h" +#include "def.h" + +TimerSimHandle t1sim; +TimerSimHandle t2sim; +TimerSimHandle t3sim; +TimerSimHandle t4sim; +TimerSimHandle t5sim; +TimerSimHandle t6sim; +TimerSimHandle t7sim; +TimerSimHandle t8sim; +TimerSimHandle t9sim; +TimerSimHandle t10sim; +TimerSimHandle t11sim; +TimerSimHandle t12sim; + +void Simulate_Timers(void) +{ + SimulateMainPWM(&t1sim, xpwm_time.Ta0_0); + SimulatePWM(&t2sim, xpwm_time.Ta0_1); + SimulatePWM(&t3sim, xpwm_time.Tb0_0); + SimulatePWM(&t4sim, xpwm_time.Tb0_1); + SimulatePWM(&t5sim, xpwm_time.Tc0_0); + SimulatePWM(&t6sim, xpwm_time.Tc0_1); + SimulatePWM(&t7sim, xpwm_time.Ta1_0); + SimulatePWM(&t8sim, xpwm_time.Ta1_1); + SimulatePWM(&t9sim, xpwm_time.Tb1_0); + SimulatePWM(&t10sim, xpwm_time.Tb1_1); + SimulatePWM(&t11sim, xpwm_time.Tc1_0); + SimulatePWM(&t12sim, xpwm_time.Tc1_1); +} + +void Init_Timers(void) +{ + initSimulateTim(&t1sim, FREQ_INTERNAL_GENERATOR_XILINX_TMS / FREQ_PWM, FREQ_INTERNAL_GENERATOR_XILINX_TMS * dt); + initSimulateTim(&t2sim, FREQ_INTERNAL_GENERATOR_XILINX_TMS / FREQ_PWM, FREQ_INTERNAL_GENERATOR_XILINX_TMS * dt); + initSimulateTim(&t3sim, FREQ_INTERNAL_GENERATOR_XILINX_TMS / FREQ_PWM, FREQ_INTERNAL_GENERATOR_XILINX_TMS * dt); + initSimulateTim(&t4sim, FREQ_INTERNAL_GENERATOR_XILINX_TMS / FREQ_PWM, FREQ_INTERNAL_GENERATOR_XILINX_TMS * dt); + initSimulateTim(&t5sim, FREQ_INTERNAL_GENERATOR_XILINX_TMS / FREQ_PWM, FREQ_INTERNAL_GENERATOR_XILINX_TMS * dt); + initSimulateTim(&t6sim, FREQ_INTERNAL_GENERATOR_XILINX_TMS / FREQ_PWM, FREQ_INTERNAL_GENERATOR_XILINX_TMS * dt); + initSimulateTim(&t7sim, FREQ_INTERNAL_GENERATOR_XILINX_TMS / FREQ_PWM, FREQ_INTERNAL_GENERATOR_XILINX_TMS * dt); + initSimulateTim(&t8sim, FREQ_INTERNAL_GENERATOR_XILINX_TMS / FREQ_PWM, FREQ_INTERNAL_GENERATOR_XILINX_TMS * dt); + initSimulateTim(&t9sim, FREQ_INTERNAL_GENERATOR_XILINX_TMS / FREQ_PWM, FREQ_INTERNAL_GENERATOR_XILINX_TMS * dt); + initSimulateTim(&t10sim, FREQ_INTERNAL_GENERATOR_XILINX_TMS / FREQ_PWM, FREQ_INTERNAL_GENERATOR_XILINX_TMS * dt); + initSimulateTim(&t11sim, FREQ_INTERNAL_GENERATOR_XILINX_TMS / FREQ_PWM, FREQ_INTERNAL_GENERATOR_XILINX_TMS * dt); + initSimulateTim(&t12sim, FREQ_INTERNAL_GENERATOR_XILINX_TMS / FREQ_PWM, FREQ_INTERNAL_GENERATOR_XILINX_TMS * dt); +} + + + + +void initSimulateTim(TimerSimHandle* tsim, int period, double step) +{ + tsim->dtsim.stateDt = 1; + tsim->TPr = period/2; + tsim->TxCntPlus = step; + tsim->dtsim.DtCntPeriod = (int)(DT / dt); +} + +void SimulateMainPWM(TimerSimHandle* tsim, int compare) +{ + if (simulateTimAndGetCompare(tsim, compare)) + mcu_simulate_step(); + simulateActionActionQualifierSubmodule(tsim); + simulateDeadBendSubmodule(tsim); + simulateTripZoneSubmodule(tsim); +} + +void SimulatePWM(TimerSimHandle* tsim, int compare) +{ + simulateTimAndGetCompare(tsim, compare); + simulateActionActionQualifierSubmodule(tsim); + tsim->ciA = tsim->dtsim.ciA_DT; + tsim->ciB = tsim->dtsim.ciB_DT; + //simulateDeadBendSubmodule(tsim); + //simulateTripZoneSubmodule(tsim); +} + + +int simulateTimAndGetCompare(TimerSimHandle *tsim, int compare) +{ + int interruptflag = 0; + tsim->tcntAuxPrev = tsim->tcntAux; + tsim->tcntAux += tsim->TxCntPlus; + + if (tsim->tcntAux > tsim->TPr) { + tsim->tcntAux -= tsim->TPr * 2.; + tsim->cmpA = compare; + interruptflag = 1; + } + if ((tsim->tcntAuxPrev < 0) && (tsim->tcntAux >= 0)) { + tsim->cmpA = compare; + interruptflag = 1; + } + tsim->tcnt = fabs(tsim->tcntAux); + return interruptflag; +} + + + +void simulateActionActionQualifierSubmodule(TimerSimHandle* tsim) +{ + // Action-Qualifier Submodule + if (tsim->cmpA > tsim->tcnt) { + tsim->dtsim.ciA_DT = 0; + tsim->dtsim.ciB_DT = 1; + } + else if (tsim->cmpA < tsim->tcnt) { + tsim->dtsim.ciA_DT = 1; + tsim->dtsim.ciB_DT = 0; + } +} + +void simulateDeadBendSubmodule(TimerSimHandle* tsim) +{ + // Dead-Band Submodule + if (tsim->dtsim.stateDt == 1) { + tsim->ciA = tsim->dtsim.ciA_DT; + tsim->ciB = 0; + if (tsim->dtsim.ciA_DT == 1) + tsim->dtsim.dtcnt = tsim->dtsim.DtCntPeriod; + if (tsim->dtsim.dtcnt > 0) + tsim->dtsim.dtcnt--; + else + tsim->dtsim.stateDt = 2; + } + else if (tsim->dtsim.stateDt == 2) { + tsim->ciA = 0; + tsim->ciB = tsim->dtsim.ciB_DT; + if (tsim->dtsim.ciB_DT == 1) + tsim->dtsim.dtcnt = tsim->dtsim.DtCntPeriod; + if (tsim->dtsim.dtcnt > 0) + tsim->dtsim.dtcnt--; + else + tsim->dtsim.stateDt = 1; + } +} + +void simulateTripZoneSubmodule(TimerSimHandle* tsim) +{ + //// Trip-Zone Submodule + // // ... clear flag for one-shot trip latch + //if (EPwm1Regs.TZCLR.all == 0x0004) { + // EPwm1Regs.TZCLR.all = 0x0000; + // EPwm1Regs.TZFRC.all = 0x0000; + //} // ... forces a one-shot trip event + //if (EPwm1Regs.TZFRC.all == 0x0004) + // ci1A_DT = ci1B_DT = 0; +} \ No newline at end of file diff --git a/Inu/pwm_sim.h b/Inu/pwm_sim.h new file mode 100644 index 0000000..5cb7e28 --- /dev/null +++ b/Inu/pwm_sim.h @@ -0,0 +1,60 @@ +#include "DSP281x_Device.h" +#include "v_pwm24_v2.h" + +#ifndef PWM_SIM +#define PWM_SIM + + +// Event Manager +// ... Dead-Band Submodule +typedef struct +{ + int DtCntPeriod; + int stateDt; + int dtcnt; + int ciA_DT; + int ciB_DT; +}DeadBandSimHandle; +// ... Time-Base Submodule, Counter-Compare Submodule Event-Trigger Submodule +typedef struct +{ + + double TxCntPlus; + double TPr; + double tcntAux; + double tcntAuxPrev; + double tcnt; + double cmpA; + double cmpB; + int ciA; + int ciB; + DeadBandSimHandle dtsim; +}TimerSimHandle; + +extern TimerSimHandle t1sim; +extern TimerSimHandle t2sim; +extern TimerSimHandle t3sim; +extern TimerSimHandle t4sim; +extern TimerSimHandle t5sim; +extern TimerSimHandle t6sim; +extern TimerSimHandle t7sim; +extern TimerSimHandle t8sim; +extern TimerSimHandle t9sim; +extern TimerSimHandle t10sim; +extern TimerSimHandle t11sim; +extern TimerSimHandle t12sim; + + + +void Simulate_Timers(void); +void Init_Timers(void); + + +void initSimulateTim(TimerSimHandle* tsim, int period, double step); +void SimulateMainPWM(TimerSimHandle* tsim, int compare); +void SimulatePWM(TimerSimHandle* tsim, int compare); +int simulateTimAndGetCompare(TimerSimHandle* tsim, int compare); +void simulateActionActionQualifierSubmodule(TimerSimHandle* tsim); +void simulateDeadBendSubmodule(TimerSimHandle* tsim); +void simulateTripZoneSubmodule(TimerSimHandle* tsim); +#endif //PWM_SIM diff --git a/Inu/wrapper_inu.h b/Inu/wrapper_inu.h index 5ee02d5..ff0dcb2 100644 --- a/Inu/wrapper_inu.h +++ b/Inu/wrapper_inu.h @@ -21,5 +21,5 @@ void controller(SimStruct *S, const real_T *u, real_T *xD, real_T *rW, int_T *iW); - +extern double dt; #endif diff --git a/inu_im_2wnd_3lvl.slx b/inu_im_2wnd_3lvl.slx index 38a1ae1a387b31495632080a1f8aa930f0904c81..a0cb9bded9fb4e830ee996744e1e943f6f9259c3 100644 GIT binary patch delta 31414 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 diff --git a/run_mex.bat b/run_mex.bat index fd9494e..fdc23ce 100644 --- a/run_mex.bat +++ b/run_mex.bat @@ -21,6 +21,7 @@ set params_i=-I"..\device_support_ml\include"^ set params_o=-outdir "." set params_wrapper_c=.\Inu\controller.c^ + .\Inu\pwm_sim.c^ .\Inu\Src\main_matlab\init28335.c^ .\Inu\Src\main_matlab\param.c^ .\Inu\Src\main_matlab\main_matlab.c^