diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index 3eca712..80d5b11 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -91,7 +91,7 @@ void Write_AngleControl(real_T* Buffer, int ind_port) { int nn = 0; - WriteOutputArray(iref_dbg, ind_port, nn++); + WriteOutputArray(upp.hangle.Iref, ind_port, nn++); WriteOutputArray(upp.pm.measured.final.Iamp, ind_port, nn++); WriteOutputArray(upp.hangle.alpha, ind_port, nn++); @@ -123,6 +123,10 @@ void app_readInputs(const real_T* Buffer) { MB_INTERNAL.param.angle.PID_Kp = ReadInputArray(1, 4) * 10000; MB_INTERNAL.param.angle.PID_Ki = ReadInputArray(1, 5) * 10000; MB_INTERNAL.param.angle.PID_Kd = ReadInputArray(1, 6) * 10000; + MB_INTERNAL.param.angle.PID_ExpAlpha = ReadInputArray(1, 7) * 65535; + + MB_INTERNAL.param.nominal.U = ReadInputArray(1, 8) * 10000; + MB_INTERNAL.param.nominal.I = ReadInputArray(1, 9) * 65535; // USER APP INPUT END } diff --git a/MATLAB/upp_init.m b/MATLAB/upp_init.m index 15834cb..cf3093d 100644 --- a/MATLAB/upp_init.m +++ b/MATLAB/upp_init.m @@ -1,7 +1,7 @@ clear all Ts = 5e-6; -Vnom = 690; +Vnom = 400; Fnom = 50; Temperature1 = 2.22; % 20 градусов diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index f9989dc..3576746 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 5b47806..d883d87 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -71,6 +71,15 @@ #define ERRORS_DELAY_MS_F_ERR 5000 #define ERRORS_DELAY_MS_DEFAULT 0.1f + +/* Параметры регулятора угла */ +#define ANGLE_MAX_PERCENT_DEFAULT 0.8 +#define ANGLE_MIN_PERCENT_DEFAULT 0.1 +#define ANGLE_PID_KP_COEF_DEFAULT 1.0 +#define ANGLE_PID_KI_COEF_DEFAULT 0.1 +#define ANGLE_PID_KD_COEF_DEFAULT 0 +#define ANGLE_REF_ALPHA_COEF_DEFAULT 0.01 + /* Параметри мониторинга сети */ #define PM_EXP_ALPHA_COEF_DEFAULT 0.01 diff --git a/UPP/Core/UPP/angle_control.c b/UPP/Core/UPP/angle_control.c index ef16bb1..76357a1 100644 --- a/UPP/Core/UPP/angle_control.c +++ b/UPP/Core/UPP/angle_control.c @@ -25,7 +25,8 @@ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle) float kp = to_float(PARAM_INTERNAL.angle.PID_Kp, 10000); float ki = to_float(PARAM_INTERNAL.angle.PID_Ki, 10000); float kd = to_float(PARAM_INTERNAL.angle.PID_Kd, 10000); - Angle_PID_Init(hangle, kp, ki, kd); + float ref_alpha = to_float(PARAM_INTERNAL.angle.PID_ExpAlpha, 65535); + Angle_PID_Init(hangle, kp, ki, kd, ref_alpha); // Инициализация каналов HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_1); @@ -53,15 +54,21 @@ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle) * @param hangle Указатель на таймер * @param kp, ki kd Коэффициенты регулятора */ -void Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd) +void Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd, float alpha) { if(assert_upp(hangle)) return; + // Сам ПИД регулятор hangle->pid.Kp = kp; hangle->pid.Ki = ki; hangle->pid.Kd = kd; arm_pid_init_f32(&hangle->pid, 1); + + // Сглаживающий фильтр для задания ПИД регулятора + FilterExp_Init(&hangle->refFilter, alpha); + Filter_Start(&hangle->refFilter); + Filter_Process(&hangle->refFilter, 0); } /** @@ -75,8 +82,10 @@ void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement) if(assert_upp(hangle)) return; + hangle->Iref = Filter_Process(&hangle->refFilter, setpoint); + /* Ошибка регулирования = уставка - измеренное */ - float err = setpoint - measurement; + float err = hangle->Iref - measurement; /* ПИД регулирование */ float open_control = arm_pid_f32(&hangle->pid, err); // 0 - открыть максимально поздно, 1 - открыть макситмально рано diff --git a/UPP/Core/UPP/angle_control.h b/UPP/Core/UPP/angle_control.h index 89e3902..b218f31 100644 --- a/UPP/Core/UPP/angle_control.h +++ b/UPP/Core/UPP/angle_control.h @@ -26,10 +26,11 @@ typedef struct TIM_HandleTypeDef *htim; ///< Указатель на таймер для расчета угла Angle_Config_t Config; ///< Конфигурации алгоритма расчета угла открытия тиристоров - //float alpha_degree; ///< текущий угол открытия в градусах [0..180] - float alpha; ///< текущий угол открытия в процентах от периода [0..1] + float Iref; ///< текущее задание тока в о.е. [0..1] + float alpha; ///< текущий угол открытия в о.е. [0..1] (% от периода) - arm_pid_instance_f32 pid; ///< ПИД регулятор для управления углом + arm_pid_instance_f32 pid; ///< ПИД регулятор для управления углом + FilterExp_t refFilter; ///< Фильтр для плавного нарастания регулирования struct { unsigned Initialized : 1; ///< Структура инициализирована @@ -42,7 +43,7 @@ typedef struct /* Инициализация Таймера для рассчета угла открытия. */ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle); /* Инициализация ПИД регулятора. */ -void Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd); +void Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd, float alpha); // ====== УПРАВЛЕНИЕ ========== /* Управление углом через ПИД регулятор */ diff --git a/UPP/Core/UPP/upp_params.c b/UPP/Core/UPP/upp_params.c index 54cef43..5ffaab6 100644 --- a/UPP/Core/UPP/upp_params.c +++ b/UPP/Core/UPP/upp_params.c @@ -35,6 +35,7 @@ void UPP_Params_InternalControl(void) float angle_pid_kp = upp.hangle.pid.Kp; float angle_pid_ki = upp.hangle.pid.Ki; float angle_pid_kd = upp.hangle.pid.Kd; + float angle_ref_alpha = upp.hangle.refFilter.alpha; // временная переменная для параметров каналов АЦП float adc_channel_max[ADC_NUMB_OF_REGULAR_CHANNELS] = {0}; uint16_t adc_channel_zero[ADC_NUMB_OF_REGULAR_CHANNELS] = {0}; @@ -71,6 +72,10 @@ void UPP_Params_InternalControl(void) { alpha_update = 1; } + if(__CheckSimpleParamF(&angle_ref_alpha, PARAM_INTERNAL.angle.PID_ExpAlpha, 65535)) + { + alpha_update = 1; + } @@ -130,7 +135,7 @@ void UPP_Params_InternalControl(void) if(alpha_update) { Angle_SetRange(&upp.hangle, angle_min, angle_max); - Angle_PID_Init(&upp.hangle, angle_pid_kp, angle_pid_ki, angle_pid_kd); + Angle_PID_Init(&upp.hangle, angle_pid_kp, angle_pid_ki, angle_pid_kd, angle_ref_alpha); } // Обновление АЦП конфигов for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++) @@ -221,6 +226,14 @@ void UPP_SetDefault(int pui_default, int internal_default) PARAM_INTERNAL.zc.Hysteresis = ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT*100; PARAM_INTERNAL.zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_CNT_DEFAULT; + + + 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.PID_ExpAlpha = ANGLE_REF_ALPHA_COEF_DEFAULT*65535; + PARAM_INTERNAL.angle.Angle_Max = ANGLE_MAX_PERCENT_DEFAULT*65535; + PARAM_INTERNAL.angle.Angle_Min = ANGLE_MIN_PERCENT_DEFAULT*65535; //__AngleSetLimit(); } } diff --git a/UPP/Core/UPP/upp_params.h b/UPP/Core/UPP/upp_params.h index d57e813..d502b1e 100644 --- a/UPP/Core/UPP/upp_params.h +++ b/UPP/Core/UPP/upp_params.h @@ -82,9 +82,10 @@ typedef struct { uint16_t Angle_Max; ///< Максимальный угол открытия тиристора [0..1 x 65535] uint16_t Angle_Min; ///< Минимальный угол открытия тиристора [0..1 x 65535] - uint16_t PID_Kp; ///< Пропорциональный коэфициент ПИ регулятора угла [x 1000] - uint16_t PID_Ki; ///< Интегральный коэфициент ПИ регулятора угла [x 1000] - uint16_t PID_Kd; ///< Интегральный коэфициент ПИ регулятора угла [x 1000] + uint16_t PID_Kp; ///< Пропорциональный коэфициент ПИ регулятора угла [x 10000] + uint16_t PID_Ki; ///< Интегральный коэфициент ПИ регулятора угла [x 10000] + uint16_t PID_Kd; ///< Интегральный коэфициент ПИ регулятора угла [x 10000] + uint16_t PID_ExpAlpha; ///< Коэффициент сглаживающего фильтра задания регулятора [0..1 x 65535] }angle;