diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index d9af256..4766238 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -9,6 +9,24 @@ float dbg[16]; #define PIN_READ(_verbname_) (_verbname_##_GPIO_Port->ODR & (_verbname_##_Pin)) ? 1 : 0 +void pwm_wtf(PWM_State_t state1, PWM_State_t state2, int* pwm_pin) +{ + if ((*pwm_pin == 0) && (state1 == PWM_THYR_TIM_ACTIVE)) + { + *pwm_pin = 1; + } + else if ((*pwm_pin == 1) && (state2 == PWM_THYR_TIM_ACTIVE)) + { + *pwm_pin = 0; + } +} + +int pwm1_pin = 0; +int pwm2_pin = 0; +int pwm3_pin = 0; +int pwm4_pin = 0; +int pwm5_pin = 0; +int pwm6_pin = 0; void Write_UPP_Outputs(real_T* Buffer, int ind_port) { //int pwm1_pin = PIN_READ(PWM1); @@ -23,6 +41,13 @@ void Write_UPP_Outputs(real_T* Buffer, int ind_port) int pwm4_pin = (upp.hpwm.AllPhases[PHASE_B_NEG].State == PWM_THYR_TIM_ACTIVE); int pwm5_pin = (upp.hpwm.AllPhases[PHASE_C_POS].State == PWM_THYR_TIM_ACTIVE); int pwm6_pin = (upp.hpwm.AllPhases[PHASE_C_NEG].State == PWM_THYR_TIM_ACTIVE); + + //pwm_wtf(upp.hpwm.AllPhases[PHASE_A_POS].State, upp.hpwm.AllPhases[PHASE_A_NEG].State, &pwm1_pin); + //pwm_wtf(upp.hpwm.AllPhases[PHASE_A_NEG].State, upp.hpwm.AllPhases[PHASE_A_POS].State, &pwm2_pin); + //pwm_wtf(upp.hpwm.AllPhases[PHASE_B_POS].State, upp.hpwm.AllPhases[PHASE_B_NEG].State, &pwm3_pin); + //pwm_wtf(upp.hpwm.AllPhases[PHASE_B_NEG].State, upp.hpwm.AllPhases[PHASE_B_POS].State, &pwm4_pin); + //pwm_wtf(upp.hpwm.AllPhases[PHASE_C_POS].State, upp.hpwm.AllPhases[PHASE_C_NEG].State, &pwm5_pin); + //pwm_wtf(upp.hpwm.AllPhases[PHASE_C_NEG].State, upp.hpwm.AllPhases[PHASE_C_POS].State, &pwm6_pin); int err = PIN_READ(RDO1); int work = PIN_READ(RDO2); int ready = PIN_READ(RDO3); @@ -140,14 +165,19 @@ void app_readInputs(const real_T* Buffer) { MB_DATA.HoldRegs.pui_params.Tdelay = ReadInputArray(1, 8); MB_DATA.HoldRegs.pui_params.Interlace = ReadInputArray(1, 9); - MB_INTERNAL.param.angle.Angle_Max = ReadInputArray(2, 0) * 65535; - MB_INTERNAL.param.angle.Angle_Min = ReadInputArray(2, 1) * 65535; - MB_INTERNAL.param.angle.PID_Kp = ReadInputArray(2, 2) * 10000; - MB_INTERNAL.param.angle.PID_Ki = ReadInputArray(2, 3) * 10000; - MB_INTERNAL.param.angle.PID_Kd = ReadInputArray(2, 4) * 10000; + MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UAC] = ReadInputArray(2, 0) * 10; + MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UBA] = ReadInputArray(2, 0) * 10; + MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_IA] = ReadInputArray(2, 1) * 10; + MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_IC] = ReadInputArray(2, 1) * 10; + + MB_INTERNAL.param.nominal.U = ReadInputArray(2, 2) * 10; + MB_INTERNAL.param.nominal.I = ReadInputArray(2, 3) * 10; + + MB_INTERNAL.param.angle.PID_Kp = ReadInputArray(2, 4) * 10000; + MB_INTERNAL.param.angle.PID_Ki = ReadInputArray(2, 5) * 10000; + MB_INTERNAL.param.angle.PID_Kd = ReadInputArray(2, 6) * 10000; + MB_INTERNAL.param.angle.PulseLengthReserve = ReadInputArray(2, 7); - MB_INTERNAL.param.nominal.U = ReadInputArray(2, 5) * 10; - MB_INTERNAL.param.nominal.I = ReadInputArray(2, 6) * 10; } // USER APP INPUT END } diff --git a/MATLAB/upp_init.m b/MATLAB/upp_init.m index 7aaf9df..a281ef9 100644 --- a/MATLAB/upp_init.m +++ b/MATLAB/upp_init.m @@ -1,5 +1,8 @@ clear all +IadcMax = 50; +VadcMax = 1216; + Ts = 5e-6; Vnom = 400; Inom = 30; diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index d3d073e..28f1a56 100644 Binary files a/MATLAB/upp_r2023.slx and b/MATLAB/upp_r2023.slx differ diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index 33dee81..a66829e 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -79,7 +79,7 @@ /* Параметры регулятора угла */ #define ANGLE_PULSE_LENGTH_RESERVE_PERCENT_DEFAULT 1.0 -#define ANGLE_MAX_PERCENT_DEFAULT 0.8 +#define ANGLE_MAX_PERCENT_DEFAULT 1 #define ANGLE_MIN_PERCENT_DEFAULT 0.1 #define ANGLE_PID_KP_COEF_DEFAULT 0.0001 #define ANGLE_PID_KI_COEF_DEFAULT 0.0001 diff --git a/UPP/Core/UPP/angle_control.c b/UPP/Core/UPP/angle_control.c index 81c3077..2e4ccaf 100644 --- a/UPP/Core/UPP/angle_control.c +++ b/UPP/Core/UPP/angle_control.c @@ -142,7 +142,7 @@ HAL_StatusTypeDef Angle_SetAngle(Angle_Handle_t *hangle, float OpenLevel) float OpenLevelForCos = (OpenLevel*2)-1; float alpha_rad = acosf(OpenLevelForCos); // угол в радианах - float alpha = alpha_rad/PI; // время открытие в процентах от периода - когда открыть + float alpha = alpha_rad/PI* hangle->Config.PeriodLimit; // время открытие в процентах от периода - когда открыть if(alpha > hangle->Config.AngleMax) alpha = hangle->Config.AngleMax; diff --git a/UPP/Core/UPP/upp_params.c b/UPP/Core/UPP/upp_params.c index 1b95a27..2960e55 100644 --- a/UPP/Core/UPP/upp_params.c +++ b/UPP/Core/UPP/upp_params.c @@ -290,10 +290,10 @@ void UPP_Params_Saturate(void) SATURATE_U16(PARAM_INTERNAL.nominal.F_deviation_minus, 0, 100*100); SATURATE_U16(PARAM_INTERNAL.nominal.I, 0, ADC_I_MAX_A_DEFAULT*10); - SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UBA], 0, ADC_U_MAX_V_DEFAULT*10); - SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UAC], 0, ADC_U_MAX_V_DEFAULT*10); - SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IC], 0, ADC_I_MAX_A_DEFAULT*10); - SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IA], 0, ADC_I_MAX_A_DEFAULT*10); + SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UBA], 0, 5000*10); + SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UAC], 0, 5000*10); + SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IC], 0, 1000*10); + SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IA], 0, 1000*10); SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UBA], 1848, 2248); SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UAC], 1848, 2248); SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IC], 1848, 2248);