Ничего не понятно. При регулировании и плавном уменьшении угла ток в какой-то момент резко взлетает и все уходит в колебательный процесс.
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;
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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.
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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 - открыть макситмально рано
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
// ====== УПРАВЛЕНИЕ ==========
|
// ====== УПРАВЛЕНИЕ ==========
|
||||||
/* Управление углом через ПИД регулятор */
|
/* Управление углом через ПИД регулятор */
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user