Ничего не понятно. При регулировании и плавном уменьшении угла ток в какой-то момент резко взлетает и все уходит в колебательный процесс.

This commit is contained in:
Razvalyaev 2025-11-18 23:45:03 +03:00
parent e1d6f1139d
commit 5d8dc1183b
8 changed files with 50 additions and 13 deletions

View File

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

View File

@ -1,7 +1,7 @@
clear all
Ts = 5e-6;
Vnom = 690;
Vnom = 400;
Fnom = 50;
Temperature1 = 2.22; % 20 градусов

Binary file not shown.

View File

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

View File

@ -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 - открыть макситмально рано

View File

@ -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);
// ====== УПРАВЛЕНИЕ ==========
/* Управление углом через ПИД регулятор */

View File

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

View File

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