коэфи пида вновь приведены к диапзаону 0-6.5535, коэф Ki сделан независимым от dt

This commit is contained in:
Razvalyaev 2025-12-07 18:12:58 +03:00
parent 9234b4508b
commit 67be0b2304
7 changed files with 43 additions and 28 deletions

View File

@ -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
View 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);

View File

@ -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.

View File

@ -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

View File

@ -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)
{

View File

@ -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;