diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index 0264762..99b49ac 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -175,9 +175,9 @@ void app_readInputs(const real_T* Buffer) { 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) * 65535; - MB_INTERNAL.param.angle.PID_Ki = ReadInputArray(2, 5) * 65535; - /*MB_INTERNAL.param.angle.PID_Kd*/dbg_err_limit = ReadInputArray(2, 6); + 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.Angle_Max = ReadInputArray(2, 7)/180 * 65535; MB_INTERNAL.param.angle.Angle_Min = ReadInputArray(2, 8)/180 * 65535; diff --git a/MATLAB/calc_pi.m b/MATLAB/calc_pi.m new file mode 100644 index 0000000..b53a7c3 --- /dev/null +++ b/MATLAB/calc_pi.m @@ -0,0 +1,23 @@ +clc, clear all +%% Ввод данных +Ku = 0.03; % Твой Ku +Tu = 0.0847; % Твой Tu +Ts = 0.0005; % Твой Ts + +%% Расч +Kp = 0.45 * Ku; +Ti = 0.85 * Tu; +Ki_abs = Kp / Ti; % Абсолютное Ki +Ki_disc = Ki_abs * Ts; % Дискретное Ki (если программа делит на Ts) + +%% Вывод +fprintf('Kp = %.3f\n', Kp); +fprintf('Ki абсолютное = %.3f\n', Ki_abs); +fprintf('Ki дискретное = %.6f (если программа делит на Ts)\n', Ki_disc); + +%% Рекомендация (с запасом) +Kp_safe = Kp * 0.7; +Ki_safe = Ki_abs * 0.7; +fprintf('\nС запасом 30%%:\n'); +fprintf('Kp = %.3f\n', Kp_safe); +fprintf('Ki = %.3f\n', Ki_safe); \ No newline at end of file diff --git a/MATLAB/upp_init.m b/MATLAB/upp_init.m index b7ce115..a704a3c 100644 --- a/MATLAB/upp_init.m +++ b/MATLAB/upp_init.m @@ -1,11 +1,11 @@ clear all -IadcMax = 200; +IadcMax = 200;%50; VadcMax = 1216; Ts = 5e-6; Vnom = 400; -Inom = 25; +Inom = 30;%4.2; Fnom = 50; Temperature1 = 2.22; % 20 градусов diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index dbcc52e..3044084 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 1faf50e..e9301c9 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -112,7 +112,7 @@ /* Параметри мониторинга сети */ #define PM_RMS_WINDOW_PERIOD_US_DEFAULT 20000 -#define PM_RMS_EXT_TAU_US_DEFAULT 0.2 +#define PM_RMS_EXT_TAU_US_DEFAULT 0.02*3 // 3 периода 50 Гц /* Параметры АЦП */ #define ADC_U_MAX_V_DEFAULT 1216.0 diff --git a/UPP/Core/UPP/angle_control.c b/UPP/Core/UPP/angle_control.c index 78a65a2..83bd375 100644 --- a/UPP/Core/UPP/angle_control.c +++ b/UPP/Core/UPP/angle_control.c @@ -80,22 +80,11 @@ void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement, float hangle->Imeas = measurement; /* Ошибка регулирования = уставка - измеренное */ float err = hangle->Iref - hangle->Imeas; - /* Ограничение скорости изменения */ -// extern float dbg_err_limit; -// if(err > dbg_err_limit) -// { -// err = dbg_err_limit; -// } -// else if (err < -dbg_err_limit) -// { -// err = -dbg_err_limit; -// } /* ПИД регулирование */ float open_level = arm_pid_f32(&hangle->pid, err); // 0 - открыть максимально поздно, 1 - открыть макситмально рано - /* Ограничиваем диапазон */ if (open_level > 1) { diff --git a/UPP/Core/UPP/upp_params.c b/UPP/Core/UPP/upp_params.c index 9f36b8e..35ce7ca 100644 --- a/UPP/Core/UPP/upp_params.c +++ b/UPP/Core/UPP/upp_params.c @@ -113,7 +113,7 @@ void UPP_Params_ControlInternal(void) float angle_max = upp.hangle.Config.AngleMax; float angle_min = upp.hangle.Config.AngleMin; float angle_pid_kp = upp.hangle.pid.Kp; - float angle_pid_ki = upp.hangle.pid.Ki; + float angle_pid_ki = upp.hangle.pid.Ki/((float)PM_SLOW_PERIOD_US/1000000); float angle_pid_kd = upp.hangle.pid.Kd; // временная переменная для параметров каналов АЦП float adc_channel_max[ADC_NUMB_OF_REGULAR_CHANNELS] = {0}; @@ -141,15 +141,15 @@ void UPP_Params_ControlInternal(void) { alpha_update = 1; } - if(__CheckParamF(&angle_pid_kp, PARAM_INTERNAL.angle.PID_Kp, 65535)) + if(__CheckParamF(&angle_pid_kp, PARAM_INTERNAL.angle.PID_Kp, 10000)) { alpha_update = 1; } - if(__CheckParamF(&angle_pid_ki, PARAM_INTERNAL.angle.PID_Ki, 65535)) + if(__CheckParamF(&angle_pid_ki, PARAM_INTERNAL.angle.PID_Ki, 10000)) { alpha_update = 1; } - if(__CheckParamF(&angle_pid_kd, PARAM_INTERNAL.angle.PID_Kd, 65535)) + if(__CheckParamF(&angle_pid_kd, PARAM_INTERNAL.angle.PID_Kd, 10000)) { alpha_update = 1; } @@ -226,7 +226,10 @@ void UPP_Params_ControlInternal(void) { if(Angle_SetRange(&upp.hangle, angle_min, angle_max) == HAL_OK) { - if(Angle_PID_Init(&upp.hangle, angle_pid_kp, angle_pid_ki, angle_pid_kd, upp.hangle.refFilter.alpha) == HAL_OK) + if(Angle_PID_Init(&upp.hangle, angle_pid_kp, + angle_pid_ki*((float)PM_SLOW_PERIOD_US/1000000), + angle_pid_kd, + upp.hangle.refFilter.alpha) == HAL_OK) { alpha_update = 0; } @@ -279,9 +282,9 @@ HAL_StatusTypeDef UPP_Params_Init(void) /*====== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ angle_control ======*/ // Инициализация ПИД if(Angle_PID_Init(&upp.hangle, - u2f(PARAM_INTERNAL.angle.PID_Kp, 65535), - u2f(PARAM_INTERNAL.angle.PID_Ki, 65535), - u2f(PARAM_INTERNAL.angle.PID_Kd, 65535), + u2f(PARAM_INTERNAL.angle.PID_Kp, 10000), + u2f(PARAM_INTERNAL.angle.PID_Ki, 10000)*((float)PM_SLOW_PERIOD_US/1000000), + u2f(PARAM_INTERNAL.angle.PID_Kd, 10000), PUI_Tnt_CalcAlpha(u2f(PARAM_PUI.Tnt, 1000), PM_SLOW_PERIOD_US)) != HAL_OK) return HAL_ERROR; @@ -456,9 +459,9 @@ void UPP_Params_SetDefault(int pui_default, int internal_default) PARAM_INTERNAL.zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_CNT_DEFAULT; - PARAM_INTERNAL.angle.PID_Kp = ANGLE_PID_KP_COEF_DEFAULT*65535; - PARAM_INTERNAL.angle.PID_Ki = ANGLE_PID_KI_COEF_DEFAULT*65535; - PARAM_INTERNAL.angle.PID_Kd = ANGLE_PID_KD_COEF_DEFAULT*65535; + PARAM_INTERNAL.angle.PID_Kp = ANGLE_PID_KP_COEF_DEFAULT*10000; + PARAM_INTERNAL.angle.PID_Ki = ANGLE_PID_KI_COEF_DEFAULT*10000; + PARAM_INTERNAL.angle.PID_Kd = ANGLE_PID_KD_COEF_DEFAULT*10000; PARAM_INTERNAL.angle.Angle_Max = ANGLE_MAX_PERCENT_DEFAULT*65535; PARAM_INTERNAL.angle.Angle_Min = ANGLE_MIN_PERCENT_DEFAULT*65535; PARAM_INTERNAL.angle.PulseLengthReserve = ANGLE_PULSE_LENGTH_RESERVE_PERCENT_DEFAULT*100;