diff --git a/Inu/app_wrapper/app_configs.h b/Inu/app_wrapper/app_configs.h index 4b9bb68..b3f246c 100644 --- a/Inu/app_wrapper/app_configs.h +++ b/Inu/app_wrapper/app_configs.h @@ -11,7 +11,7 @@ // , (30 .) #define SHIFT -#define ALG_MODE_SIMULINK ALG_MODE_SCALAR_OBOROTS +#define ALG_MODE_SIMULINK ALG_MODE_FOC_OBOROTS /* ALG_MODE_UF_CONST, ALG_MODE_SCALAR_OBOROTS, @@ -26,6 +26,69 @@ V_PWM24_PHASE_SEQ_REVERS_ACB, V_PWM24_PHASE_SEQ_REVERS_CBA, V_PWM24_PHASE_SEQ_REVERS_BAC - */ +*/ + + + +// +#define PI2 6.283185307179586476925286766559 //pi*2 +#define SQRT2 1.4142135623730950488016887242097 //sqrt(2) +#define SQRT3 1.7320508075688772935274463415059 //sqrt(3) +#define ISQRT3 0.57735026918962576450914878050196 //1./sqrt(3) +// +// ... , +#define P_NOM (6300e3) +// ... , (ampl) +#define U_NOM (3300.*SQRT2) +// ... , / +#define N_NOM 180. +// ... +#define PP 6. +// ... +#define COS_FI_ 0.87 +// ... +#define EFF 0.968 +// ... , *^2 +#define J (87e3*0.50) +// ... , +#define S_NOM (P_NOM/(COS_FI_*EFF)) +// ... , / +#define WM_NOM (N_NOM/60.*PI2) +// ... , * +#define M_NOM (P_NOM/WM_NOM) + + +// +// ... , BA +#define S_BAZ S_NOM +// ... , (ampl) +#define U_BAZ U_NOM +// ... , (ampl) +#define I_BAZ (S_BAZ*2./(U_BAZ*SQRT3)*0.5) //0.5 - .. +// ... , / +#define N_BAZ N_NOM +// ... , / +#define WM_BAZ (N_BAZ/60.*PI2) +// ... , / +#define WE_BAZ (WM_BAZ*PP) +// ... , * +#define M_BAZ (S_BAZ/WM_BAZ) +// ... , +#define PSI_BAZ (U_BAZ/(WE_BAZ*SQRT3)) +// ... , +#define L_BAZ (PSI_BAZ/I_BAZ) +// ... , +#define R_BAZ (U_BAZ/(I_BAZ*SQRT3)) + + +// +#define U_2_Y (T1_PRD*SQRT3/U_BAZ) + +// . , . 2048, +#define UDC_SENS_MAX (U_BAZ*1.15*1.3) +// , . 2048, (ampl) +#define IAC_SENS_MAX (I_BAZ*1.5) +#define IDC_SENS_MAX 5000.0 + #endif //_APP_CONFIG diff --git a/Inu/app_wrapper/app_includes.h b/Inu/app_wrapper/app_includes.h index 02ece35..e6933ea 100644 --- a/Inu/app_wrapper/app_includes.h +++ b/Inu/app_wrapper/app_includes.h @@ -29,6 +29,12 @@ #include "global_time.h" #include "PWMTools.h" #include "alg_simple_scalar.h" +#include "can_bs2bs.h" +#include "log_to_mem.h" +#include "optical_bus.h" +#include "sync_tools.h" +#include "oscil_can.h" +#include "alarm_log_can.h" #include #include diff --git a/Inu/app_wrapper/app_init.c b/Inu/app_wrapper/app_init.c index acc02e7..3e8234c 100644 --- a/Inu/app_wrapper/app_init.c +++ b/Inu/app_wrapper/app_init.c @@ -166,232 +166,3 @@ void set_zadanie_u_charge_matlab(void) } -void init_ramp_all_zadanie(void) -{ - _iq rampafloat; - - // rmp_fzad - edrk.zadanie.rmp_fzad.RampLowLimit = _IQ(-MAX_ZADANIE_F / NORMA_FROTOR); //0 - edrk.zadanie.rmp_fzad.RampHighLimit = _IQ(MAX_ZADANIE_F / NORMA_FROTOR); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_F)); - edrk.zadanie.rmp_fzad.RampPlus = rampafloat; - edrk.zadanie.rmp_fzad.RampMinus = -rampafloat; - - edrk.zadanie.rmp_fzad.DesiredInput = 0; - edrk.zadanie.rmp_fzad.Out = 0; - - // rmp_oborots_hz - edrk.zadanie.rmp_oborots_zad_hz.RampLowLimit = _IQ(MIN_ZADANIE_OBOROTS_ROTOR / 60.0 / NORMA_FROTOR); //0 - edrk.zadanie.rmp_oborots_zad_hz.RampHighLimit = _IQ(MAX_ZADANIE_OBOROTS_ROTOR / 60.0 / NORMA_FROTOR); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_OBOROTS_ROTOR)); - edrk.zadanie.rmp_oborots_zad_hz.RampPlus = rampafloat; - edrk.zadanie.rmp_oborots_zad_hz.RampMinus = -rampafloat; - - edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = 0; - edrk.zadanie.rmp_oborots_zad_hz.Out = 0; - - - // - edrk.zadanie.rmp_Izad.RampLowLimit = _IQ(0); //0 - edrk.zadanie.rmp_Izad.RampHighLimit = _IQ(MAX_ZADANIE_I_M / NORMA_ACP); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_I_M)); - edrk.zadanie.rmp_Izad.RampPlus = rampafloat; - edrk.zadanie.rmp_Izad.RampMinus = -rampafloat; - - edrk.zadanie.rmp_Izad.DesiredInput = 0; - edrk.zadanie.rmp_Izad.Out = 0; - - // - edrk.zadanie.rmp_ZadanieU_Charge.RampLowLimit = _IQ(0); //0 - edrk.zadanie.rmp_ZadanieU_Charge.RampHighLimit = _IQ(MAX_ZADANIE_U_CHARGE / NORMA_ACP); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_U_CHARGE)); - edrk.zadanie.rmp_ZadanieU_Charge.RampPlus = rampafloat; - edrk.zadanie.rmp_ZadanieU_Charge.RampMinus = -rampafloat; - - edrk.zadanie.rmp_ZadanieU_Charge.DesiredInput = 0; - edrk.zadanie.rmp_ZadanieU_Charge.Out = 0; - - - - // - edrk.zadanie.rmp_k_u_disbalance.RampLowLimit = _IQ(0); //0 - edrk.zadanie.rmp_k_u_disbalance.RampHighLimit = _IQ(MAX_ZADANIE_K_U_DISBALANCE); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_K_U_DISBALANCE)); - edrk.zadanie.rmp_k_u_disbalance.RampPlus = rampafloat; - edrk.zadanie.rmp_k_u_disbalance.RampMinus = -rampafloat; - - edrk.zadanie.rmp_k_u_disbalance.DesiredInput = 0; - edrk.zadanie.rmp_k_u_disbalance.Out = 0; - - - // - edrk.zadanie.rmp_kplus_u_disbalance.RampLowLimit = _IQ(0); //0 - edrk.zadanie.rmp_kplus_u_disbalance.RampHighLimit = _IQ(MAX_ZADANIE_KPLUS_U_DISBALANCE); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_KPLUS_U_DISBALANCE)); - edrk.zadanie.rmp_kplus_u_disbalance.RampPlus = rampafloat; - edrk.zadanie.rmp_kplus_u_disbalance.RampMinus = -rampafloat; - - edrk.zadanie.rmp_kplus_u_disbalance.DesiredInput = 0; - edrk.zadanie.rmp_kplus_u_disbalance.Out = 0; - - - - // - edrk.zadanie.rmp_kzad.RampLowLimit = _IQ(0); //0 - edrk.zadanie.rmp_kzad.RampHighLimit = _IQ(MAX_ZADANIE_K_M); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_K_M)); - edrk.zadanie.rmp_kzad.RampPlus = rampafloat; - edrk.zadanie.rmp_kzad.RampMinus = -rampafloat; - - edrk.zadanie.rmp_kzad.DesiredInput = 0; - edrk.zadanie.rmp_kzad.Out = 0; - - - - - - // - edrk.zadanie.rmp_powers_zad.RampLowLimit = _IQ(MIN_ZADANIE_POWER * 1000.0 / (NORMA_MZZ * NORMA_MZZ)); //0 - edrk.zadanie.rmp_powers_zad.RampHighLimit = _IQ(MAX_ZADANIE_POWER * 1000.0 / (NORMA_MZZ * NORMA_MZZ)); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_POWER)); - edrk.zadanie.rmp_powers_zad.RampPlus = rampafloat; - edrk.zadanie.rmp_powers_zad.RampMinus = -rampafloat; - - edrk.zadanie.rmp_powers_zad.DesiredInput = 0; - edrk.zadanie.rmp_powers_zad.Out = 0; - - // - edrk.zadanie.rmp_limit_powers_zad.RampLowLimit = _IQ(0); //0 - edrk.zadanie.rmp_limit_powers_zad.RampHighLimit = _IQ(MAX_ZADANIE_POWER * 1000.0 / (NORMA_MZZ * NORMA_MZZ)); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_POWER)); - edrk.zadanie.rmp_limit_powers_zad.RampPlus = rampafloat; - edrk.zadanie.rmp_limit_powers_zad.RampMinus = -rampafloat; - - edrk.zadanie.rmp_limit_powers_zad.DesiredInput = 0; - edrk.zadanie.rmp_limit_powers_zad.Out = 0; - - // - - -} - -void ramp_all_zadanie(int flag_set_zero) -{ - ////////////////////////////////////////////// - if (flag_set_zero == 0) - edrk.zadanie.rmp_Izad.DesiredInput = edrk.zadanie.iq_Izad; - else - if (flag_set_zero == 2) - { - edrk.zadanie.rmp_Izad.DesiredInput = 0; - edrk.zadanie.rmp_Izad.Out = 0; - } - else - edrk.zadanie.rmp_Izad.DesiredInput = 0; - - edrk.zadanie.rmp_Izad.calc(&edrk.zadanie.rmp_Izad); - edrk.zadanie.iq_Izad_rmp = edrk.zadanie.rmp_Izad.Out; - ////////////////////////////////////////////// - edrk.zadanie.rmp_ZadanieU_Charge.DesiredInput = edrk.zadanie.iq_ZadanieU_Charge; - edrk.zadanie.rmp_ZadanieU_Charge.calc(&edrk.zadanie.rmp_ZadanieU_Charge); - edrk.zadanie.iq_ZadanieU_Charge_rmp = edrk.zadanie.rmp_ZadanieU_Charge.Out; - ////////////////////////////////////////////// - if (flag_set_zero == 0) - edrk.zadanie.rmp_fzad.DesiredInput = edrk.zadanie.iq_fzad; - else - if (flag_set_zero == 2) - { - edrk.zadanie.rmp_fzad.DesiredInput = 0; - edrk.zadanie.rmp_fzad.Out = 0; - } - else - edrk.zadanie.rmp_fzad.DesiredInput = 0; - - edrk.zadanie.rmp_fzad.calc(&edrk.zadanie.rmp_fzad); - edrk.zadanie.iq_fzad_rmp = edrk.zadanie.rmp_fzad.Out; - ////////////////////////////////////////////// - edrk.zadanie.rmp_k_u_disbalance.DesiredInput = edrk.zadanie.iq_k_u_disbalance; - edrk.zadanie.rmp_k_u_disbalance.calc(&edrk.zadanie.rmp_k_u_disbalance); - edrk.zadanie.iq_k_u_disbalance_rmp = edrk.zadanie.rmp_k_u_disbalance.Out; - ////////////////////////////////////////////// - edrk.zadanie.rmp_kplus_u_disbalance.DesiredInput = edrk.zadanie.iq_kplus_u_disbalance; - edrk.zadanie.rmp_kplus_u_disbalance.calc(&edrk.zadanie.rmp_kplus_u_disbalance); - edrk.zadanie.iq_kplus_u_disbalance_rmp = edrk.zadanie.rmp_kplus_u_disbalance.Out; - ////////////////////////////////////////////// - if (flag_set_zero == 0) - edrk.zadanie.rmp_kzad.DesiredInput = edrk.zadanie.iq_kzad; - else - if (flag_set_zero == 2) - { - edrk.zadanie.rmp_kzad.DesiredInput = 0; - edrk.zadanie.rmp_kzad.Out = 0; - } - else - edrk.zadanie.rmp_kzad.DesiredInput = 0; - edrk.zadanie.rmp_kzad.calc(&edrk.zadanie.rmp_kzad); - edrk.zadanie.iq_kzad_rmp = edrk.zadanie.rmp_kzad.Out; - ////////////////////////////////////////////// - if (flag_set_zero == 0) - edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = edrk.zadanie.iq_oborots_zad_hz; - else - if (flag_set_zero == 2) - { - edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = 0; - edrk.zadanie.rmp_oborots_zad_hz.Out = 0; - } - else - edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = 0; - - edrk.zadanie.rmp_oborots_zad_hz.calc(&edrk.zadanie.rmp_oborots_zad_hz); - edrk.zadanie.iq_oborots_zad_hz_rmp = edrk.zadanie.rmp_oborots_zad_hz.Out; - - ////////////////////////////////////////////// - if (flag_set_zero == 0) - edrk.zadanie.rmp_limit_powers_zad.DesiredInput = edrk.zadanie.iq_limit_power_zad; - else - if (flag_set_zero == 2) - { - edrk.zadanie.rmp_limit_powers_zad.DesiredInput = 0; - edrk.zadanie.rmp_limit_powers_zad.Out = 0; - } - else - edrk.zadanie.rmp_limit_powers_zad.DesiredInput = 0; - - edrk.zadanie.rmp_limit_powers_zad.calc(&edrk.zadanie.rmp_limit_powers_zad); - edrk.zadanie.iq_limit_power_zad_rmp = edrk.zadanie.rmp_limit_powers_zad.Out; - - - - ////////////////////////////////////////////// - if (flag_set_zero == 0) - { - if (edrk.zadanie.iq_power_zad > edrk.zadanie.iq_limit_power_zad_rmp) - edrk.zadanie.rmp_powers_zad.DesiredInput = edrk.zadanie.iq_limit_power_zad_rmp; - else - edrk.zadanie.rmp_powers_zad.DesiredInput = edrk.zadanie.iq_power_zad; - } - else - if (flag_set_zero == 2) - { - edrk.zadanie.rmp_powers_zad.DesiredInput = 0; - edrk.zadanie.rmp_powers_zad.Out = 0; - } - else - edrk.zadanie.rmp_powers_zad.DesiredInput = 0; - - edrk.zadanie.rmp_powers_zad.calc(&edrk.zadanie.rmp_powers_zad); - edrk.zadanie.iq_power_zad_rmp = edrk.zadanie.rmp_powers_zad.Out; - - - - -} diff --git a/Inu/app_wrapper/app_io.c b/Inu/app_wrapper/app_io.c index d6e2c21..bd23ae3 100644 --- a/Inu/app_wrapper/app_io.c +++ b/Inu/app_wrapper/app_io.c @@ -16,14 +16,14 @@ RS_DATA_STRUCT rs_a = RS_DATA_STRUCT_DEFAULT, rs_b = RS_DATA_STRUCT_DEFAULT; // void readInputParameters(const real_T* u) { - iq_norm_ADC[0][0] = _IQ(AdcSim.udc1.adc_val); - iq_norm_ADC[0][1] = _IQ(AdcSim.udc2.adc_val); - iq_norm_ADC[0][2] = _IQ(AdcSim.ia1.adc_val); - iq_norm_ADC[0][3] = _IQ(AdcSim.ib1.adc_val); - iq_norm_ADC[0][4] = _IQ(AdcSim.ic1.adc_val); - iq_norm_ADC[0][5] = _IQ(AdcSim.ia2.adc_val); - iq_norm_ADC[0][6] = _IQ(AdcSim.ib2.adc_val); - iq_norm_ADC[0][7] = _IQ(AdcSim.ic2.adc_val); + iq_norm_ADC[0][0] = _IQ(AdcSim.udc1.adc_norm); + iq_norm_ADC[0][1] = _IQ(AdcSim.udc2.adc_norm); + iq_norm_ADC[0][2] = _IQ(AdcSim.ia1.adc_norm); + iq_norm_ADC[0][3] = _IQ(AdcSim.ib1.adc_norm); + iq_norm_ADC[0][4] = _IQ(AdcSim.ic1.adc_norm); + iq_norm_ADC[0][5] = _IQ(AdcSim.ia2.adc_norm); + iq_norm_ADC[0][6] = _IQ(AdcSim.ib2.adc_norm); + iq_norm_ADC[0][7] = _IQ(AdcSim.ic2.adc_norm); int nn = 8; WRotor.iqWRotorCalcBeforeRegul1 = _IQ(u[nn++] / (PI*2) / NORMA_FROTOR); @@ -121,12 +121,12 @@ void writeOutputParameters(real_T* xD) { - xD[nn++] = (AdcSim.udc1.adc_val); - xD[nn++] = (AdcSim.udc2.adc_val); - xD[nn++] = (AdcSim.ia1.adc_val); - xD[nn++] = (AdcSim.ib1.adc_val); - xD[nn++] = (AdcSim.ic1.adc_val); - xD[nn++] = (AdcSim.ia2.adc_val); - xD[nn++] = (AdcSim.ib2.adc_val); - xD[nn++] = (AdcSim.ic2.adc_val); + xD[nn++] = _IQtoF(iq_norm_ADC[0][0]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][1]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][2]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][3]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][4]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][5]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][6]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][7]); } \ No newline at end of file diff --git a/Inu/app_wrapper/app_wrapper.c b/Inu/app_wrapper/app_wrapper.c index 3c59e79..e5ff313 100644 --- a/Inu/app_wrapper/app_wrapper.c +++ b/Inu/app_wrapper/app_wrapper.c @@ -9,6 +9,21 @@ T_project project = {0}; WINDING a; EDRK edrk = EDRK_DEFAULT; FLAG f = FLAG_DEFAULTS; +//X_PARALLEL_BUS x_parallel_bus_project = X_PARALLEL_BUS_DEFAULTS; +//int Unites2SecondBS[SIZE_ARR_CAN_UNITES_BS2BS] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ +// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ +// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ +// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\ +//}; +//LOGSPARAMS logpar = LOGSPARAMS_DEFAULTS; +//OPTICAL_BUS_DATA optical_write_data = OPTICAL_BUS_DATA_DEFAULT; +//OPTICAL_BUS_DATA optical_read_data = OPTICAL_BUS_DATA_DEFAULT; +//SYNC_TOOLS_DATA sync_data = SYNC_TOOLS_DATA_DEFAULT; +//int flag_enable_can_from_mpu = 0; +//UNITES_CAN_SETUP unites_can_setup = UNITES_CAN_SETUP_DEFAULT; +//OSCIL_CAN oscil_can = OSCIL_CAN_DEFAULTS; +//int flag_special_mode_rs = 0; +//ALARM_LOG_CAN alarm_log_can = ALARM_LOG_CAN_CAN_DEFAULTS; WRotorValues WRotor = WRotorValues_DEFAULTS; WRotorValuesAngle WRotorPBus = WRotorValuesAngle_DEFAULTS; @@ -121,7 +136,235 @@ void mcu_simulate_step(void) +void init_ramp_all_zadanie(void) +{ + _iq rampafloat; + // rmp_fzad + edrk.zadanie.rmp_fzad.RampLowLimit = _IQ(-MAX_ZADANIE_F / NORMA_FROTOR); //0 + edrk.zadanie.rmp_fzad.RampHighLimit = _IQ(MAX_ZADANIE_F / NORMA_FROTOR); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_F)); + edrk.zadanie.rmp_fzad.RampPlus = rampafloat; + edrk.zadanie.rmp_fzad.RampMinus = -rampafloat; + + edrk.zadanie.rmp_fzad.DesiredInput = 0; + edrk.zadanie.rmp_fzad.Out = 0; + + // rmp_oborots_hz + edrk.zadanie.rmp_oborots_zad_hz.RampLowLimit = _IQ(MIN_ZADANIE_OBOROTS_ROTOR / 60.0 / NORMA_FROTOR); //0 + edrk.zadanie.rmp_oborots_zad_hz.RampHighLimit = _IQ(MAX_ZADANIE_OBOROTS_ROTOR / 60.0 / NORMA_FROTOR); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_OBOROTS_ROTOR)); + edrk.zadanie.rmp_oborots_zad_hz.RampPlus = rampafloat; + edrk.zadanie.rmp_oborots_zad_hz.RampMinus = -rampafloat; + + edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = 0; + edrk.zadanie.rmp_oborots_zad_hz.Out = 0; + + + // + edrk.zadanie.rmp_Izad.RampLowLimit = _IQ(0); //0 + edrk.zadanie.rmp_Izad.RampHighLimit = _IQ(MAX_ZADANIE_I_M / NORMA_ACP); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_I_M)); + edrk.zadanie.rmp_Izad.RampPlus = rampafloat; + edrk.zadanie.rmp_Izad.RampMinus = -rampafloat; + + edrk.zadanie.rmp_Izad.DesiredInput = 0; + edrk.zadanie.rmp_Izad.Out = 0; + + // + edrk.zadanie.rmp_ZadanieU_Charge.RampLowLimit = _IQ(0); //0 + edrk.zadanie.rmp_ZadanieU_Charge.RampHighLimit = _IQ(MAX_ZADANIE_U_CHARGE / NORMA_ACP); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_U_CHARGE)); + edrk.zadanie.rmp_ZadanieU_Charge.RampPlus = rampafloat; + edrk.zadanie.rmp_ZadanieU_Charge.RampMinus = -rampafloat; + + edrk.zadanie.rmp_ZadanieU_Charge.DesiredInput = 0; + edrk.zadanie.rmp_ZadanieU_Charge.Out = 0; + + + + // + edrk.zadanie.rmp_k_u_disbalance.RampLowLimit = _IQ(0); //0 + edrk.zadanie.rmp_k_u_disbalance.RampHighLimit = _IQ(MAX_ZADANIE_K_U_DISBALANCE); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_K_U_DISBALANCE)); + edrk.zadanie.rmp_k_u_disbalance.RampPlus = rampafloat; + edrk.zadanie.rmp_k_u_disbalance.RampMinus = -rampafloat; + + edrk.zadanie.rmp_k_u_disbalance.DesiredInput = 0; + edrk.zadanie.rmp_k_u_disbalance.Out = 0; + + + // + edrk.zadanie.rmp_kplus_u_disbalance.RampLowLimit = _IQ(0); //0 + edrk.zadanie.rmp_kplus_u_disbalance.RampHighLimit = _IQ(MAX_ZADANIE_KPLUS_U_DISBALANCE); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_KPLUS_U_DISBALANCE)); + edrk.zadanie.rmp_kplus_u_disbalance.RampPlus = rampafloat; + edrk.zadanie.rmp_kplus_u_disbalance.RampMinus = -rampafloat; + + edrk.zadanie.rmp_kplus_u_disbalance.DesiredInput = 0; + edrk.zadanie.rmp_kplus_u_disbalance.Out = 0; + + + + // + edrk.zadanie.rmp_kzad.RampLowLimit = _IQ(0); //0 + edrk.zadanie.rmp_kzad.RampHighLimit = _IQ(MAX_ZADANIE_K_M); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_K_M)); + edrk.zadanie.rmp_kzad.RampPlus = rampafloat; + edrk.zadanie.rmp_kzad.RampMinus = -rampafloat; + + edrk.zadanie.rmp_kzad.DesiredInput = 0; + edrk.zadanie.rmp_kzad.Out = 0; + + + + + + // + edrk.zadanie.rmp_powers_zad.RampLowLimit = _IQ(MIN_ZADANIE_POWER * 1000.0 / (NORMA_MZZ * NORMA_MZZ)); //0 + edrk.zadanie.rmp_powers_zad.RampHighLimit = _IQ(MAX_ZADANIE_POWER * 1000.0 / (NORMA_MZZ * NORMA_MZZ)); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_POWER)); + edrk.zadanie.rmp_powers_zad.RampPlus = rampafloat; + edrk.zadanie.rmp_powers_zad.RampMinus = -rampafloat; + + edrk.zadanie.rmp_powers_zad.DesiredInput = 0; + edrk.zadanie.rmp_powers_zad.Out = 0; + + // + edrk.zadanie.rmp_limit_powers_zad.RampLowLimit = _IQ(0); //0 + edrk.zadanie.rmp_limit_powers_zad.RampHighLimit = _IQ(MAX_ZADANIE_POWER * 1000.0 / (NORMA_MZZ * NORMA_MZZ)); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_POWER)); + edrk.zadanie.rmp_limit_powers_zad.RampPlus = rampafloat; + edrk.zadanie.rmp_limit_powers_zad.RampMinus = -rampafloat; + + edrk.zadanie.rmp_limit_powers_zad.DesiredInput = 0; + edrk.zadanie.rmp_limit_powers_zad.Out = 0; + + // + + +} + +void ramp_all_zadanie(int flag_set_zero) +{ + ////////////////////////////////////////////// + if (flag_set_zero == 0) + edrk.zadanie.rmp_Izad.DesiredInput = edrk.zadanie.iq_Izad; + else + if (flag_set_zero == 2) + { + edrk.zadanie.rmp_Izad.DesiredInput = 0; + edrk.zadanie.rmp_Izad.Out = 0; + } + else + edrk.zadanie.rmp_Izad.DesiredInput = 0; + + edrk.zadanie.rmp_Izad.calc(&edrk.zadanie.rmp_Izad); + edrk.zadanie.iq_Izad_rmp = edrk.zadanie.rmp_Izad.Out; + ////////////////////////////////////////////// + edrk.zadanie.rmp_ZadanieU_Charge.DesiredInput = edrk.zadanie.iq_ZadanieU_Charge; + edrk.zadanie.rmp_ZadanieU_Charge.calc(&edrk.zadanie.rmp_ZadanieU_Charge); + edrk.zadanie.iq_ZadanieU_Charge_rmp = edrk.zadanie.rmp_ZadanieU_Charge.Out; + ////////////////////////////////////////////// + if (flag_set_zero == 0) + edrk.zadanie.rmp_fzad.DesiredInput = edrk.zadanie.iq_fzad; + else + if (flag_set_zero == 2) + { + edrk.zadanie.rmp_fzad.DesiredInput = 0; + edrk.zadanie.rmp_fzad.Out = 0; + } + else + edrk.zadanie.rmp_fzad.DesiredInput = 0; + + edrk.zadanie.rmp_fzad.calc(&edrk.zadanie.rmp_fzad); + edrk.zadanie.iq_fzad_rmp = edrk.zadanie.rmp_fzad.Out; + ////////////////////////////////////////////// + edrk.zadanie.rmp_k_u_disbalance.DesiredInput = edrk.zadanie.iq_k_u_disbalance; + edrk.zadanie.rmp_k_u_disbalance.calc(&edrk.zadanie.rmp_k_u_disbalance); + edrk.zadanie.iq_k_u_disbalance_rmp = edrk.zadanie.rmp_k_u_disbalance.Out; + ////////////////////////////////////////////// + edrk.zadanie.rmp_kplus_u_disbalance.DesiredInput = edrk.zadanie.iq_kplus_u_disbalance; + edrk.zadanie.rmp_kplus_u_disbalance.calc(&edrk.zadanie.rmp_kplus_u_disbalance); + edrk.zadanie.iq_kplus_u_disbalance_rmp = edrk.zadanie.rmp_kplus_u_disbalance.Out; + ////////////////////////////////////////////// + if (flag_set_zero == 0) + edrk.zadanie.rmp_kzad.DesiredInput = edrk.zadanie.iq_kzad; + else + if (flag_set_zero == 2) + { + edrk.zadanie.rmp_kzad.DesiredInput = 0; + edrk.zadanie.rmp_kzad.Out = 0; + } + else + edrk.zadanie.rmp_kzad.DesiredInput = 0; + edrk.zadanie.rmp_kzad.calc(&edrk.zadanie.rmp_kzad); + edrk.zadanie.iq_kzad_rmp = edrk.zadanie.rmp_kzad.Out; + ////////////////////////////////////////////// + if (flag_set_zero == 0) + edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = edrk.zadanie.iq_oborots_zad_hz; + else + if (flag_set_zero == 2) + { + edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = 0; + edrk.zadanie.rmp_oborots_zad_hz.Out = 0; + } + else + edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = 0; + + edrk.zadanie.rmp_oborots_zad_hz.calc(&edrk.zadanie.rmp_oborots_zad_hz); + edrk.zadanie.iq_oborots_zad_hz_rmp = edrk.zadanie.rmp_oborots_zad_hz.Out; + + ////////////////////////////////////////////// + if (flag_set_zero == 0) + edrk.zadanie.rmp_limit_powers_zad.DesiredInput = edrk.zadanie.iq_limit_power_zad; + else + if (flag_set_zero == 2) + { + edrk.zadanie.rmp_limit_powers_zad.DesiredInput = 0; + edrk.zadanie.rmp_limit_powers_zad.Out = 0; + } + else + edrk.zadanie.rmp_limit_powers_zad.DesiredInput = 0; + + edrk.zadanie.rmp_limit_powers_zad.calc(&edrk.zadanie.rmp_limit_powers_zad); + edrk.zadanie.iq_limit_power_zad_rmp = edrk.zadanie.rmp_limit_powers_zad.Out; + + + + ////////////////////////////////////////////// + if (flag_set_zero == 0) + { + if (edrk.zadanie.iq_power_zad > edrk.zadanie.iq_limit_power_zad_rmp) + edrk.zadanie.rmp_powers_zad.DesiredInput = edrk.zadanie.iq_limit_power_zad_rmp; + else + edrk.zadanie.rmp_powers_zad.DesiredInput = edrk.zadanie.iq_power_zad; + } + else + if (flag_set_zero == 2) + { + edrk.zadanie.rmp_powers_zad.DesiredInput = 0; + edrk.zadanie.rmp_powers_zad.Out = 0; + } + else + edrk.zadanie.rmp_powers_zad.DesiredInput = 0; + + edrk.zadanie.rmp_powers_zad.calc(&edrk.zadanie.rmp_powers_zad); + edrk.zadanie.iq_power_zad_rmp = edrk.zadanie.rmp_powers_zad.Out; + + + + +} unsigned int ReadMemory(unsigned long addr) @@ -215,145 +458,103 @@ _iq break_result_4 = 0; // } -void update_uom(void) -{ -} -void inc_RS_timeout_cicle(void) -{ -} -void inc_CAN_timeout_cicle(void) -{ -} - -void pause_1000(void) -{ - -} - -int xerror(unsigned int er_ID, void* CallBackRef) -{ -}; +void start_pwm(void) {} +void stop_pwm(void) {} +int get_real_in_mbox(int a, int b) {} +void update_uom(void) {} +void inc_RS_timeout_cicle(void) {} +void inc_CAN_timeout_cicle(void) {} +void pause_1000(void) {} +int xerror(unsigned int er_ID, void* CallBackRef) {} void func_unpack_answer_from_Ingeteam(unsigned int a) {} void unpack_answer_from_MPU_SVU_CAN(unsigned int a) {} -int get_real_in_mbox(int a, int b) {} - -void start_pwm(void) -{ - // mPWM_a = 1; - // mPWM_b = 1; -} - -void stop_pwm(void) -{ - // mPWM_a = 0; - // mPWM_b = 0; - - // svgen_set_time_keys_closed(&svgen_pwm24_1); - // svgen_set_time_keys_closed(&svgen_pwm24_2); - // WriteMemory(ADR_TK_MASK_0, 0xFFFF); - // WriteMemory(ADR_PWM_START_STOP, 0x8000); -} -void start_break_pwm() { - -} - - -void stop_break_pwm() { - -} - -void stop_wdog() { - -} - -void start_pwm_b() { - -} -void start_pwm_a() { - -} -void stop_pwm_b() { - -} -void stop_pwm_a() { - -} - -void fillADClogs() { - -} -void break_resistor_managment_calc(){ - -} - - -void break_resistor_managment_init(){ - -} - - -void break_resistor_managment_update(){ - -} - - -void break_resistor_recup_calc(){ - -} - - -void break_resistor_set_closed(){ - -} - - -void DetectI_Out_BreakFase(){ - -} - - -void test_mem_limit(){ - -} - - -void set_start_mem(){ - -} - - -void getFastLogs(){ - -} - - -//void detect_I_M_overload{ -// -// } - - -void sync_inc_error(){ - -} - - -void optical_bus_read(){ - -} - - -void optical_bus_write(void){ - -} +void start_break_pwm() {} +void stop_break_pwm() {} +void stop_wdog() {} +void start_pwm_b() {} +void start_pwm_a() {} +void stop_pwm_b() {} +void stop_pwm_a() {} +void fillADClogs() {} +void break_resistor_managment_calc() {} +void break_resistor_managment_init() {} +void break_resistor_managment_update() {} +void break_resistor_recup_calc() {} +void break_resistor_set_closed() {} +void DetectI_Out_BreakFase() {} +void test_mem_limit() {} +void set_start_mem() {} +void getFastLogs() {} +void detect_I_M_overload() {} +void sync_inc_error() {} +void optical_bus_read() {} +void optical_bus_write(void){} void i_led1_on_off(int i) {} void modbus_table_can_in(void) {} + + +//void init_eva_timer2() {} +//void init_evb_timer3() {} +//void start_eva_timer2() {} +//void start_evb_timer3() {} +//int enable_er0_control() {} +//void i_led2_on_off() {} +//int InitXilinxSpartan2E(void (*int_handler)()) {} +//void start_int13_interrupt() {} +//void project_read_errors_controller() {} +//void project_run_init_all_plates() {} +//void calc_temper_acdrive() {} +//void calc_temper_edrk() {} +//void SendAll2SecondBS() {} +//void clear_errors() {} +//void clear_warnings() {} +//void detect_error_all() {} +//void read_plane_errors() {} +//void init_detect_overloads() {} +//void check_all_power_limits() {} +//void clear_mem() {} +//void modbusNetworkSharing() {} +//void modbusNetworkSharingCAN() {} +//void fillLogArea() {} +//void clear_table_remoute() {} +//void update_progress_load_hmi() {} +//void get_command_HMI() {} +//void update_svu_modbus_table() {} +//void calc_limit_overheat() {} +//void project_prepare_config() {} +//void pump_control() {} +//void start_wdog() {} +//void global_time_interrupt() {} +//void optical_bus_read_write_interrupt() {} +//void setup_sync_line() {} +//void setup_sync_int() {} +//void start_sync_interrupt() {} +//void rotorInit() {} +//void get_adr_pcb_controller() {} +//void InitCan() {} +//void CAN_cycle_send() {} +//int CAN_cycle_free(int box) {} +//int CAN_cycle_full_free(int box, int statistics_flag) {} +//int get_real_out_mbox(int type_box, int box) {} +//int CAN_may_be_send_cycle_fifo(void) {} +//void start_can_interrupt() {} +//void clear_modbus_table_in() {} +//void clear_modbus_table_out() {} +//void initModbusTable() {} +//void RS232_WorkingWith() {} +//void sbor_shema() {} +//void pwm_test_lines_start() {} +//void pwm_test_lines_stop() {} +//void KickDog() {} + + void init_flag_a(void) { @@ -363,10 +564,4 @@ void init_flag_a(void) *(pStr + i) = 0; } - *pStr = (int*)&a; - for (i = 0; i < sizeof(a) / sizeof(int); i++) { - *(pStr + i) = 0; - } - - } diff --git a/Inu/xilinx_wrapper/adc_sim.c b/Inu/xilinx_wrapper/adc_sim.c index d6ec37d..6c8d225 100644 --- a/Inu/xilinx_wrapper/adc_sim.c +++ b/Inu/xilinx_wrapper/adc_sim.c @@ -22,14 +22,14 @@ void Simulate_ADC(SimStruct* S) void Init_ADC_Simulation() { adcInitConvertion(&AdcSim.convertion, NORMA_ACP, 2.5, 4096); - adcInitMeasure(&AdcSim.udc1, K_LEM_ADC[0], R_ADC[0], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.udc2, K_LEM_ADC[1], R_ADC[1], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.ia1, K_LEM_ADC[2], R_ADC[2], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.ib1, K_LEM_ADC[3], R_ADC[3], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.ic1, K_LEM_ADC[4], R_ADC[4], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.ia2, K_LEM_ADC[5], R_ADC[5], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.ib2, K_LEM_ADC[6], R_ADC[6], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.ic2, K_LEM_ADC[7], R_ADC[7], DEFAULT_ZERO_ADC, 0); + adcInitMeasure(&AdcSim.udc1, K_LEM_ADC[0], R_ADC[0], DEFAULT_ZERO_ADC, UDC_SENS_MAX); + adcInitMeasure(&AdcSim.udc2, K_LEM_ADC[1], R_ADC[1], DEFAULT_ZERO_ADC, UDC_SENS_MAX); + adcInitMeasure(&AdcSim.ia1, K_LEM_ADC[2], R_ADC[2], DEFAULT_ZERO_ADC, IAC_SENS_MAX); + adcInitMeasure(&AdcSim.ib1, K_LEM_ADC[3], R_ADC[3], DEFAULT_ZERO_ADC, IAC_SENS_MAX); + adcInitMeasure(&AdcSim.ic1, K_LEM_ADC[4], R_ADC[4], DEFAULT_ZERO_ADC, IAC_SENS_MAX); + adcInitMeasure(&AdcSim.ia2, K_LEM_ADC[5], R_ADC[5], DEFAULT_ZERO_ADC, IAC_SENS_MAX); + adcInitMeasure(&AdcSim.ib2, K_LEM_ADC[6], R_ADC[6], DEFAULT_ZERO_ADC, IAC_SENS_MAX); + adcInitMeasure(&AdcSim.ic2, K_LEM_ADC[7], R_ADC[7], DEFAULT_ZERO_ADC, IAC_SENS_MAX); } @@ -69,6 +69,8 @@ void adcConvert(AdcConvertionHandle* hconv, AdcMeasureHandle* hmeasure, double r else if (realMeasure < -hmeasure->real_satur) realMeasure = -hmeasure->real_satur; } - hmeasure->adc_val = - (unsigned short)(realMeasure / hmeasure->k_lem_adc * hmeasure->r_adc / hconv->norma_adc / hconv->adc_amplitude * hconv->adc_bit_depth + (float)hmeasure->offset); + + hmeasure->adc_norm = realMeasure / hconv->norma_adc; + //hmeasure->adc_val = + // (unsigned short)(realMeasure / hmeasure->k_lem_adc * hmeasure->r_adc / hconv->norma_adc / hconv->adc_amplitude * hconv->adc_bit_depth + (float)hmeasure->offset); } \ No newline at end of file diff --git a/Inu/xilinx_wrapper/adc_sim.h b/Inu/xilinx_wrapper/adc_sim.h index 57453d1..bb5621e 100644 --- a/Inu/xilinx_wrapper/adc_sim.h +++ b/Inu/xilinx_wrapper/adc_sim.h @@ -34,6 +34,7 @@ typedef struct typedef struct { int adc_val; + double adc_norm; double real_satur; int r_adc; diff --git a/README.md b/README.md index 0713dda..aefd7b6 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ S-Function работает особым образом: на шаге `n` он Конфигурации оболочки: - `RUN_APP_MAIN_FUNC_THREAD` - создание и запуск отдельного потока для main() -- `DEKSTOP_CYCLES_FOR_MCU_APP` - количество циклов пустого for(;;), в течении которого будет работать поток main() +- `DEKSTOP_CYCLES_FOR_MCU_APP` - количество циклов пустого `for(;;)`, в течении которого будет работать поток main() - `MCU_CORE_CLOCK` - частота симулируемого процессора (пока нигде не используется) - `IN_PORT_WIDTH` - размерность входного вектора S-Function - `IN_PORT_NUMB` - количество входных векторов S-Function @@ -57,7 +57,7 @@ _Note: дефайн `RUN_APP_MAIN_FUNC_THREAD` пока выключен и по _Note for future: разные вектора можно использовать для разных плат_ ### Оболочка программы -Оболочка для программы позволяет имитировать реальный алгоритм программы. Она инициализирует её, запускает необходимые для её работы функции и связывает её с входами/выходами S-Function +Оболочка программы позволяет имитировать ёё реальный алгоритм. Оболочка инициализирует программу, запускает необходимые для её работы функции и связывает её с входами/выходами S-Function Ниже приведен перечень всех файлов и краткое описание зачем они нужны: - ***app_includes.h***     - включает все необходимые для симуляции заголовочные файлы программы @@ -72,13 +72,14 @@ _Note for future: разные вектора можно использоват Данная папка содержит исходный код приложения МК. При этом стандартные библиотеки, которые общие для всех проектов следует помещать в [папку с оболочкой программы](#оболочка-программы). Чтобы не редактировать исходники общих библиотек в каждом проекте. ### Симуляция плат -Модули в этой папке моделируют внешние платы. Пока более-менее сделан только ШИМ, но в будущем планируется расширение и вывод их в отельные S-Function. Чтобы сделать подобие корзины. +Модули в этой папке моделируют внешние платы. Пока более-менее сделан ШИМ и АЦП, но в будущем планируется расширение и вывод их в отельные S-Function. Чтобы сделать подобие корзины. -###### adc_sim -***adc_sim.c/.h*** - симуляция АЦП (пока просто заготовка) +###### Cимуляция АЦП (adc_sim.c/.h) +Пока не особо работает. Надо разобраться как конкретно преобразовывать физические величины в АЦПшные значения + +###### Cимуляция ШИМ (pwm_sim.c/.h) +Настраивает счетчик как в Xilinx и симулирует его работу. Есть главный таймер, каждое прерывание которого вызывается алгоритм управления. -###### pwm_sim -***pwm_sim.c/.h*** - симуляция ШИМ Поддерживает два режимы формирования ШИМ: - `PWM_SIMULATION_MODE_REGULAR_PWM` - формирование ШИМ для каждого таймера отдельно - `PWM_SIMULATION_MODE_TK_LINES` - через линии ТК для всей фазы разом diff --git a/init.m b/init.m index 202a5ac..824a92b 100644 --- a/init.m +++ b/init.m @@ -2,7 +2,7 @@ clear;% Ts = 10e-6;% -Decim = 20;% +Decim = 1;% Limit = 2000000;%- % Scope- tt tt = Ts*Decim*Limit; @@ -67,15 +67,15 @@ Inom = Snom/(Unom*SQRT3)*SQRT2*0.5;%0.5 - % Lls = Xls/(Fe*PI2);% % Llr = Xlr/(Fe*PI2);% % Lm = Xm/(Fe*PI2);% -Rs = 0.0362;% +Rs = 0.002%0.0362;% Xls = 0.4016;% -Rr = 0.139;% +Rr = 0.0021%0.139;% Xlr = 0.2006;% Xm = 5.2796;% -Fe = 18.2;% -Lls = Xls/(Fe*PI2);% -Llr = Xlr/(Fe*PI2);% -Lm = Xm/(Fe*PI2);% +Fe = 50;% +Lls = 0.0001467%Xls/(Fe*PI2);% +Llr = 0.00000923%Xlr/(Fe*PI2);% +Lm = 0.00421%Xm/(Fe*PI2);% % INU, Cdc = 50e-3; diff --git a/inu_23550.slx b/inu_23550.slx index 88a966b..bf91070 100644 Binary files a/inu_23550.slx and b/inu_23550.slx differ