Ничего не понятно. При регулировании и плавном уменьшении угла ток в какой-то момент резко взлетает и все уходит в колебательный процесс.
This commit is contained in:
parent
e1d6f1139d
commit
5d8dc1183b
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
clear all
|
||||
|
||||
Ts = 5e-6;
|
||||
Vnom = 690;
|
||||
Vnom = 400;
|
||||
Fnom = 50;
|
||||
|
||||
Temperature1 = 2.22; % 20 градусов
|
||||
|
||||
Binary file not shown.
@ -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
|
||||
|
||||
|
||||
@ -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 - открыть макситмально рано
|
||||
|
||||
@ -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; ///< ПИД регулятор для управления углом
|
||||
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);
|
||||
|
||||
// ====== УПРАВЛЕНИЕ ==========
|
||||
/* Управление углом через ПИД регулятор */
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user