коэфи пида вновь приведены к диапзаону 0-6.5535, коэф Ki сделан независимым от dt
This commit is contained in:
@@ -175,9 +175,9 @@ void app_readInputs(const real_T* Buffer) {
|
|||||||
MB_INTERNAL.param.nominal.U = ReadInputArray(2, 2) * 10;
|
MB_INTERNAL.param.nominal.U = ReadInputArray(2, 2) * 10;
|
||||||
MB_INTERNAL.param.nominal.I = ReadInputArray(2, 3) * 10;
|
MB_INTERNAL.param.nominal.I = ReadInputArray(2, 3) * 10;
|
||||||
|
|
||||||
MB_INTERNAL.param.angle.PID_Kp = ReadInputArray(2, 4) * 65535;
|
MB_INTERNAL.param.angle.PID_Kp = ReadInputArray(2, 4) * 10000;
|
||||||
MB_INTERNAL.param.angle.PID_Ki = ReadInputArray(2, 5) * 65535;
|
MB_INTERNAL.param.angle.PID_Ki = ReadInputArray(2, 5) * 10000;
|
||||||
/*MB_INTERNAL.param.angle.PID_Kd*/dbg_err_limit = ReadInputArray(2, 6);
|
MB_INTERNAL.param.angle.PID_Kd = ReadInputArray(2, 6) * 10000;
|
||||||
|
|
||||||
MB_INTERNAL.param.angle.Angle_Max = ReadInputArray(2, 7)/180 * 65535;
|
MB_INTERNAL.param.angle.Angle_Max = ReadInputArray(2, 7)/180 * 65535;
|
||||||
MB_INTERNAL.param.angle.Angle_Min = ReadInputArray(2, 8)/180 * 65535;
|
MB_INTERNAL.param.angle.Angle_Min = ReadInputArray(2, 8)/180 * 65535;
|
||||||
|
|||||||
23
MATLAB/calc_pi.m
Normal file
23
MATLAB/calc_pi.m
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
clc, clear all
|
||||||
|
%% Ввод данных
|
||||||
|
Ku = 0.03; % Твой Ku
|
||||||
|
Tu = 0.0847; % Твой Tu
|
||||||
|
Ts = 0.0005; % Твой Ts
|
||||||
|
|
||||||
|
%% Расч
|
||||||
|
Kp = 0.45 * Ku;
|
||||||
|
Ti = 0.85 * Tu;
|
||||||
|
Ki_abs = Kp / Ti; % Абсолютное Ki
|
||||||
|
Ki_disc = Ki_abs * Ts; % Дискретное Ki (если программа делит на Ts)
|
||||||
|
|
||||||
|
%% Вывод
|
||||||
|
fprintf('Kp = %.3f\n', Kp);
|
||||||
|
fprintf('Ki абсолютное = %.3f\n', Ki_abs);
|
||||||
|
fprintf('Ki дискретное = %.6f (если программа делит на Ts)\n', Ki_disc);
|
||||||
|
|
||||||
|
%% Рекомендация (с запасом)
|
||||||
|
Kp_safe = Kp * 0.7;
|
||||||
|
Ki_safe = Ki_abs * 0.7;
|
||||||
|
fprintf('\nС запасом 30%%:\n');
|
||||||
|
fprintf('Kp = %.3f\n', Kp_safe);
|
||||||
|
fprintf('Ki = %.3f\n', Ki_safe);
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
clear all
|
clear all
|
||||||
|
|
||||||
IadcMax = 200;
|
IadcMax = 200;%50;
|
||||||
VadcMax = 1216;
|
VadcMax = 1216;
|
||||||
|
|
||||||
Ts = 5e-6;
|
Ts = 5e-6;
|
||||||
Vnom = 400;
|
Vnom = 400;
|
||||||
Inom = 25;
|
Inom = 30;%4.2;
|
||||||
Fnom = 50;
|
Fnom = 50;
|
||||||
|
|
||||||
Temperature1 = 2.22; % 20 градусов
|
Temperature1 = 2.22; % 20 градусов
|
||||||
|
|||||||
Binary file not shown.
@@ -112,7 +112,7 @@
|
|||||||
|
|
||||||
/* Параметри мониторинга сети */
|
/* Параметри мониторинга сети */
|
||||||
#define PM_RMS_WINDOW_PERIOD_US_DEFAULT 20000
|
#define PM_RMS_WINDOW_PERIOD_US_DEFAULT 20000
|
||||||
#define PM_RMS_EXT_TAU_US_DEFAULT 0.2
|
#define PM_RMS_EXT_TAU_US_DEFAULT 0.02*3 // 3 периода 50 Гц
|
||||||
|
|
||||||
/* Параметры АЦП */
|
/* Параметры АЦП */
|
||||||
#define ADC_U_MAX_V_DEFAULT 1216.0
|
#define ADC_U_MAX_V_DEFAULT 1216.0
|
||||||
|
|||||||
@@ -80,22 +80,11 @@ void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement, float
|
|||||||
hangle->Imeas = measurement;
|
hangle->Imeas = measurement;
|
||||||
/* Ошибка регулирования = уставка - измеренное */
|
/* Ошибка регулирования = уставка - измеренное */
|
||||||
float err = hangle->Iref - hangle->Imeas;
|
float err = hangle->Iref - hangle->Imeas;
|
||||||
/* Ограничение скорости изменения */
|
|
||||||
// extern float dbg_err_limit;
|
|
||||||
// if(err > dbg_err_limit)
|
|
||||||
// {
|
|
||||||
// err = dbg_err_limit;
|
|
||||||
// }
|
|
||||||
// else if (err < -dbg_err_limit)
|
|
||||||
// {
|
|
||||||
// err = -dbg_err_limit;
|
|
||||||
// }
|
|
||||||
|
|
||||||
/* ПИД регулирование */
|
/* ПИД регулирование */
|
||||||
float open_level = arm_pid_f32(&hangle->pid, err); // 0 - открыть максимально поздно, 1 - открыть макситмально рано
|
float open_level = arm_pid_f32(&hangle->pid, err); // 0 - открыть максимально поздно, 1 - открыть макситмально рано
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Ограничиваем диапазон */
|
/* Ограничиваем диапазон */
|
||||||
if (open_level > 1)
|
if (open_level > 1)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ void UPP_Params_ControlInternal(void)
|
|||||||
float angle_max = upp.hangle.Config.AngleMax;
|
float angle_max = upp.hangle.Config.AngleMax;
|
||||||
float angle_min = upp.hangle.Config.AngleMin;
|
float angle_min = upp.hangle.Config.AngleMin;
|
||||||
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)PM_SLOW_PERIOD_US/1000000);
|
||||||
float angle_pid_kd = upp.hangle.pid.Kd;
|
float angle_pid_kd = upp.hangle.pid.Kd;
|
||||||
// временная переменная для параметров каналов АЦП
|
// временная переменная для параметров каналов АЦП
|
||||||
float adc_channel_max[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
|
float adc_channel_max[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
|
||||||
@@ -141,15 +141,15 @@ void UPP_Params_ControlInternal(void)
|
|||||||
{
|
{
|
||||||
alpha_update = 1;
|
alpha_update = 1;
|
||||||
}
|
}
|
||||||
if(__CheckParamF(&angle_pid_kp, PARAM_INTERNAL.angle.PID_Kp, 65535))
|
if(__CheckParamF(&angle_pid_kp, PARAM_INTERNAL.angle.PID_Kp, 10000))
|
||||||
{
|
{
|
||||||
alpha_update = 1;
|
alpha_update = 1;
|
||||||
}
|
}
|
||||||
if(__CheckParamF(&angle_pid_ki, PARAM_INTERNAL.angle.PID_Ki, 65535))
|
if(__CheckParamF(&angle_pid_ki, PARAM_INTERNAL.angle.PID_Ki, 10000))
|
||||||
{
|
{
|
||||||
alpha_update = 1;
|
alpha_update = 1;
|
||||||
}
|
}
|
||||||
if(__CheckParamF(&angle_pid_kd, PARAM_INTERNAL.angle.PID_Kd, 65535))
|
if(__CheckParamF(&angle_pid_kd, PARAM_INTERNAL.angle.PID_Kd, 10000))
|
||||||
{
|
{
|
||||||
alpha_update = 1;
|
alpha_update = 1;
|
||||||
}
|
}
|
||||||
@@ -226,7 +226,10 @@ void UPP_Params_ControlInternal(void)
|
|||||||
{
|
{
|
||||||
if(Angle_SetRange(&upp.hangle, angle_min, angle_max) == HAL_OK)
|
if(Angle_SetRange(&upp.hangle, angle_min, angle_max) == HAL_OK)
|
||||||
{
|
{
|
||||||
if(Angle_PID_Init(&upp.hangle, angle_pid_kp, angle_pid_ki, angle_pid_kd, upp.hangle.refFilter.alpha) == HAL_OK)
|
if(Angle_PID_Init(&upp.hangle, angle_pid_kp,
|
||||||
|
angle_pid_ki*((float)PM_SLOW_PERIOD_US/1000000),
|
||||||
|
angle_pid_kd,
|
||||||
|
upp.hangle.refFilter.alpha) == HAL_OK)
|
||||||
{
|
{
|
||||||
alpha_update = 0;
|
alpha_update = 0;
|
||||||
}
|
}
|
||||||
@@ -279,9 +282,9 @@ HAL_StatusTypeDef UPP_Params_Init(void)
|
|||||||
/*====== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ angle_control ======*/
|
/*====== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ angle_control ======*/
|
||||||
// Инициализация ПИД
|
// Инициализация ПИД
|
||||||
if(Angle_PID_Init(&upp.hangle,
|
if(Angle_PID_Init(&upp.hangle,
|
||||||
u2f(PARAM_INTERNAL.angle.PID_Kp, 65535),
|
u2f(PARAM_INTERNAL.angle.PID_Kp, 10000),
|
||||||
u2f(PARAM_INTERNAL.angle.PID_Ki, 65535),
|
u2f(PARAM_INTERNAL.angle.PID_Ki, 10000)*((float)PM_SLOW_PERIOD_US/1000000),
|
||||||
u2f(PARAM_INTERNAL.angle.PID_Kd, 65535),
|
u2f(PARAM_INTERNAL.angle.PID_Kd, 10000),
|
||||||
PUI_Tnt_CalcAlpha(u2f(PARAM_PUI.Tnt, 1000), PM_SLOW_PERIOD_US)) != HAL_OK)
|
PUI_Tnt_CalcAlpha(u2f(PARAM_PUI.Tnt, 1000), PM_SLOW_PERIOD_US)) != HAL_OK)
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
|
|
||||||
@@ -456,9 +459,9 @@ void UPP_Params_SetDefault(int pui_default, int internal_default)
|
|||||||
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*65535;
|
PARAM_INTERNAL.angle.PID_Kp = ANGLE_PID_KP_COEF_DEFAULT*10000;
|
||||||
PARAM_INTERNAL.angle.PID_Ki = ANGLE_PID_KI_COEF_DEFAULT*65535;
|
PARAM_INTERNAL.angle.PID_Ki = ANGLE_PID_KI_COEF_DEFAULT*10000;
|
||||||
PARAM_INTERNAL.angle.PID_Kd = ANGLE_PID_KD_COEF_DEFAULT*65535;
|
PARAM_INTERNAL.angle.PID_Kd = ANGLE_PID_KD_COEF_DEFAULT*10000;
|
||||||
PARAM_INTERNAL.angle.Angle_Max = ANGLE_MAX_PERCENT_DEFAULT*65535;
|
PARAM_INTERNAL.angle.Angle_Max = ANGLE_MAX_PERCENT_DEFAULT*65535;
|
||||||
PARAM_INTERNAL.angle.Angle_Min = ANGLE_MIN_PERCENT_DEFAULT*65535;
|
PARAM_INTERNAL.angle.Angle_Min = ANGLE_MIN_PERCENT_DEFAULT*65535;
|
||||||
PARAM_INTERNAL.angle.PulseLengthReserve = ANGLE_PULSE_LENGTH_RESERVE_PERCENT_DEFAULT*100;
|
PARAM_INTERNAL.angle.PulseLengthReserve = ANGLE_PULSE_LENGTH_RESERVE_PERCENT_DEFAULT*100;
|
||||||
|
|||||||
Reference in New Issue
Block a user