коэфи пида вновь приведены к диапзаону 0-6.5535, коэф Ki сделан независимым от dt
This commit is contained in:
parent
9234b4508b
commit
67be0b2304
@ -175,9 +175,9 @@ void app_readInputs(const real_T* Buffer) {
|
||||
MB_INTERNAL.param.nominal.U = ReadInputArray(2, 2) * 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_Ki = ReadInputArray(2, 5) * 65535;
|
||||
/*MB_INTERNAL.param.angle.PID_Kd*/dbg_err_limit = ReadInputArray(2, 6);
|
||||
MB_INTERNAL.param.angle.PID_Kp = ReadInputArray(2, 4) * 10000;
|
||||
MB_INTERNAL.param.angle.PID_Ki = ReadInputArray(2, 5) * 10000;
|
||||
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_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
|
||||
|
||||
IadcMax = 200;
|
||||
IadcMax = 200;%50;
|
||||
VadcMax = 1216;
|
||||
|
||||
Ts = 5e-6;
|
||||
Vnom = 400;
|
||||
Inom = 25;
|
||||
Inom = 30;%4.2;
|
||||
Fnom = 50;
|
||||
|
||||
Temperature1 = 2.22; % 20 градусов
|
||||
|
||||
Binary file not shown.
@ -112,7 +112,7 @@
|
||||
|
||||
/* Параметри мониторинга сети */
|
||||
#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
|
||||
|
||||
@ -80,22 +80,11 @@ void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement, float
|
||||
hangle->Imeas = measurement;
|
||||
/* Ошибка регулирования = уставка - измеренное */
|
||||
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 - открыть макситмально рано
|
||||
|
||||
|
||||
|
||||
/* Ограничиваем диапазон */
|
||||
if (open_level > 1)
|
||||
{
|
||||
|
||||
@ -113,7 +113,7 @@ void UPP_Params_ControlInternal(void)
|
||||
float angle_max = upp.hangle.Config.AngleMax;
|
||||
float angle_min = upp.hangle.Config.AngleMin;
|
||||
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 adc_channel_max[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
|
||||
@ -141,15 +141,15 @@ void UPP_Params_ControlInternal(void)
|
||||
{
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
@ -226,7 +226,10 @@ void UPP_Params_ControlInternal(void)
|
||||
{
|
||||
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;
|
||||
}
|
||||
@ -279,9 +282,9 @@ HAL_StatusTypeDef UPP_Params_Init(void)
|
||||
/*====== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ angle_control ======*/
|
||||
// Инициализация ПИД
|
||||
if(Angle_PID_Init(&upp.hangle,
|
||||
u2f(PARAM_INTERNAL.angle.PID_Kp, 65535),
|
||||
u2f(PARAM_INTERNAL.angle.PID_Ki, 65535),
|
||||
u2f(PARAM_INTERNAL.angle.PID_Kd, 65535),
|
||||
u2f(PARAM_INTERNAL.angle.PID_Kp, 10000),
|
||||
u2f(PARAM_INTERNAL.angle.PID_Ki, 10000)*((float)PM_SLOW_PERIOD_US/1000000),
|
||||
u2f(PARAM_INTERNAL.angle.PID_Kd, 10000),
|
||||
PUI_Tnt_CalcAlpha(u2f(PARAM_PUI.Tnt, 1000), PM_SLOW_PERIOD_US)) != HAL_OK)
|
||||
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.angle.PID_Kp = ANGLE_PID_KP_COEF_DEFAULT*65535;
|
||||
PARAM_INTERNAL.angle.PID_Ki = ANGLE_PID_KI_COEF_DEFAULT*65535;
|
||||
PARAM_INTERNAL.angle.PID_Kd = ANGLE_PID_KD_COEF_DEFAULT*65535;
|
||||
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.Angle_Max = ANGLE_MAX_PERCENT_DEFAULT*65535;
|
||||
PARAM_INTERNAL.angle.Angle_Min = ANGLE_MIN_PERCENT_DEFAULT*65535;
|
||||
PARAM_INTERNAL.angle.PulseLengthReserve = ANGLE_PULSE_LENGTH_RESERVE_PERCENT_DEFAULT*100;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user