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

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; 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.pm.measured.final.Iamp, ind_port, nn++);
WriteOutputArray(upp.hangle.alpha, 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_Kp = ReadInputArray(1, 4) * 10000;
MB_INTERNAL.param.angle.PID_Ki = ReadInputArray(1, 5) * 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_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 // USER APP INPUT END
} }

View File

@ -1,7 +1,7 @@
clear all clear all
Ts = 5e-6; Ts = 5e-6;
Vnom = 690; Vnom = 400;
Fnom = 50; Fnom = 50;
Temperature1 = 2.22; % 20 градусов 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_F_ERR 5000
#define ERRORS_DELAY_MS_DEFAULT 0.1f #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 #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 kp = to_float(PARAM_INTERNAL.angle.PID_Kp, 10000);
float ki = to_float(PARAM_INTERNAL.angle.PID_Ki, 10000); float ki = to_float(PARAM_INTERNAL.angle.PID_Ki, 10000);
float kd = to_float(PARAM_INTERNAL.angle.PID_Kd, 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); 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 hangle Указатель на таймер
* @param kp, ki kd Коэффициенты регулятора * @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)) if(assert_upp(hangle))
return; return;
// Сам ПИД регулятор
hangle->pid.Kp = kp; hangle->pid.Kp = kp;
hangle->pid.Ki = ki; hangle->pid.Ki = ki;
hangle->pid.Kd = kd; hangle->pid.Kd = kd;
arm_pid_init_f32(&hangle->pid, 1); 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)) if(assert_upp(hangle))
return; 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 - открыть макситмально рано float open_control = arm_pid_f32(&hangle->pid, err); // 0 - открыть максимально поздно, 1 - открыть макситмально рано

View File

@ -26,10 +26,11 @@ typedef struct
TIM_HandleTypeDef *htim; ///< Указатель на таймер для расчета угла TIM_HandleTypeDef *htim; ///< Указатель на таймер для расчета угла
Angle_Config_t Config; ///< Конфигурации алгоритма расчета угла открытия тиристоров Angle_Config_t Config; ///< Конфигурации алгоритма расчета угла открытия тиристоров
//float alpha_degree; ///< текущий угол открытия в градусах [0..180] float Iref; ///< текущее задание тока в о.е. [0..1]
float alpha; ///< текущий угол открытия в процентах от периода [0..1] float alpha; ///< текущий угол открытия в о.е. [0..1] (% от периода)
arm_pid_instance_f32 pid; ///< ПИД регулятор для управления углом arm_pid_instance_f32 pid; ///< ПИД регулятор для управления углом
FilterExp_t refFilter; ///< Фильтр для плавного нарастания регулирования
struct { struct {
unsigned Initialized : 1; ///< Структура инициализирована unsigned Initialized : 1; ///< Структура инициализирована
@ -42,7 +43,7 @@ typedef struct
/* Инициализация Таймера для рассчета угла открытия. */ /* Инициализация Таймера для рассчета угла открытия. */
HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle); 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_kp = upp.hangle.pid.Kp;
float angle_pid_ki = upp.hangle.pid.Ki; float angle_pid_ki = upp.hangle.pid.Ki;
float angle_pid_kd = upp.hangle.pid.Kd; 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}; float adc_channel_max[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
uint16_t adc_channel_zero[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; 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) if(alpha_update)
{ {
Angle_SetRange(&upp.hangle, angle_min, angle_max); 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++) 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.Hysteresis = ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT*100;
PARAM_INTERNAL.zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_CNT_DEFAULT; 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(); //__AngleSetLimit();
} }
} }

View File

@ -82,9 +82,10 @@ typedef struct
{ {
uint16_t Angle_Max; ///< Максимальный угол открытия тиристора [0..1 x 65535] uint16_t Angle_Max; ///< Максимальный угол открытия тиристора [0..1 x 65535]
uint16_t Angle_Min; ///< Минимальный угол открытия тиристора [0..1 x 65535] uint16_t Angle_Min; ///< Минимальный угол открытия тиристора [0..1 x 65535]
uint16_t PID_Kp; ///< Пропорциональный коэфициент ПИ регулятора угла [x 1000] uint16_t PID_Kp; ///< Пропорциональный коэфициент ПИ регулятора угла [x 10000]
uint16_t PID_Ki; ///< Интегральный коэфициент ПИ регулятора угла [x 1000] uint16_t PID_Ki; ///< Интегральный коэфициент ПИ регулятора угла [x 10000]
uint16_t PID_Kd; ///< Интегральный коэфициент ПИ регулятора угла [x 1000] uint16_t PID_Kd; ///< Интегральный коэфициент ПИ регулятора угла [x 10000]
uint16_t PID_ExpAlpha; ///< Коэффициент сглаживающего фильтра задания регулятора [0..1 x 65535]
}angle; }angle;