This commit is contained in:
Razvalyaev 2025-01-23 15:34:55 +03:00
parent 864a2dfcac
commit 9cb2d2c231
10 changed files with 444 additions and 405 deletions

View File

@ -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

View File

@ -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 <params.h>
#include <params_alg.h>

View File

@ -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;
}

View File

@ -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]);
}

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -34,6 +34,7 @@ typedef struct
typedef struct
{
int adc_val;
double adc_norm;
double real_satur;
int r_adc;

View File

@ -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*** &emsp;&emsp;&emsp; - включает все необходимые для симуляции заголовочные файлы программы
@ -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` - через линии ТК для всей фазы разом

14
init.m
View File

@ -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;

Binary file not shown.