diff --git a/MATLAB/MCU_Wrapper/mcu_wrapper.c b/MATLAB/MCU_Wrapper/mcu_wrapper.c index d1e01dc..6948f4d 100644 --- a/MATLAB/MCU_Wrapper/mcu_wrapper.c +++ b/MATLAB/MCU_Wrapper/mcu_wrapper.c @@ -38,7 +38,8 @@ const int inOffsets[IN_PORT_NUMB] = { const int outLengths[OUT_PORT_NUMB] = { THYR_PORT_1_WIDTH, PM_PORT_2_WIDTH, - OUT_PORT_3_WIDTH + ANGLE_PORT_3_WIDTH, + OUT_PORT_4_WIDTH }; /** * @brief Таблица смещений в выходном массиве OUT @@ -46,7 +47,8 @@ const int outLengths[OUT_PORT_NUMB] = { const int outOffsets[OUT_PORT_NUMB] = { OFFSET_OUT_ARRAY_1, OFFSET_OUT_ARRAY_2, - OFFSET_OUT_ARRAY_3 + OFFSET_OUT_ARRAY_3, + OFFSET_OUT_ARRAY_4 }; // INPUT/OUTPUTS AUTO-PARAMS END diff --git a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h index 8108130..dcc6ce4 100644 --- a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h +++ b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h @@ -57,10 +57,11 @@ #define ADC_PORT_1_WIDTH 6 #define IN_PORT_2_WIDTH 16 -#define OUT_PORT_NUMB 3 +#define OUT_PORT_NUMB 4 #define THYR_PORT_1_WIDTH 6 #define PM_PORT_2_WIDTH 32 -#define OUT_PORT_3_WIDTH 16 +#define ANGLE_PORT_3_WIDTH 16 +#define OUT_PORT_4_WIDTH 16 // INPUT/OUTPUTS PARAMS END /** WRAPPER_CONF @@ -99,12 +100,13 @@ #define OFFSET_IN_ARRAY_2 (OFFSET_IN_ARRAY_1 + ADC_PORT_1_WIDTH) /// === Полный размер буфера === -#define TOTAL_OUT_SIZE (THYR_PORT_1_WIDTH + PM_PORT_2_WIDTH + OUT_PORT_3_WIDTH) +#define TOTAL_OUT_SIZE (THYR_PORT_1_WIDTH + PM_PORT_2_WIDTH + ANGLE_PORT_3_WIDTH + OUT_PORT_4_WIDTH) /// === Смещения массивов (внутри общего буфера) === #define OFFSET_OUT_ARRAY_1 0 #define OFFSET_OUT_ARRAY_2 (OFFSET_OUT_ARRAY_1 + THYR_PORT_1_WIDTH) #define OFFSET_OUT_ARRAY_3 (OFFSET_OUT_ARRAY_2 + PM_PORT_2_WIDTH) +#define OFFSET_OUT_ARRAY_4 (OFFSET_OUT_ARRAY_3 + ANGLE_PORT_3_WIDTH) // INPUT/OUTPUTS AUTO-PARAMS END diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index 3a9aad0..1c8806f 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -59,8 +59,24 @@ void Write_PowerMonitor(real_T* Buffer, int ind_port) WriteOutputArray(upp.pm.measured.final.I[2], ind_port, nn++); WriteOutputArray(upp.pm.measured.final.Fmean, ind_port, nn++); } +} + + +void Write_AngleControl(real_T* Buffer, int ind_port) +{ + int nn = 0; + + WriteOutputArray(iref_dbg, ind_port, nn++); + WriteOutputArray(upp.pm.measured.final.Iamp, ind_port, nn++); + WriteOutputArray(upp.hangle.alpha, ind_port, nn++); + + + WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR1) - upp.hangle.htim->Instance->CNT, 2, nn++); + WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR2) - upp.hangle.htim->Instance->CNT, 2, nn++); + WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR3) - upp.hangle.htim->Instance->CNT, 2, nn++); } + /** * @brief Функция для записи входов в приложение МК * @param u - массив входных значений @@ -96,17 +112,11 @@ void app_writeOutputBuffer(real_T* Buffer) { Write_PowerMonitor(Buffer, 1); + Write_AngleControl(Buffer, 2); int nn = 0; - WriteOutputArray(iref_dbg, 2, nn++); - WriteOutputArray(upp.pm.measured.final.Iamp, 2, nn++); - WriteOutputArray(upp.hangle.alpha, 2, nn++); //WriteOutputArray(upp.hangle.htim->Instance->CNT, 2, nn++); - //WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR1) - upp.hangle.htim->Instance->CNT, 2, nn++); - //WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR2) - upp.hangle.htim->Instance->CNT, 2, nn++); - //WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR3) - upp.hangle.htim->Instance->CNT, 2, nn++); - //WriteOutputArray(dbg[0], 2, nn++); //WriteOutputArray(dbg[1], 2, nn++); //WriteOutputArray(dbg[2], 2, nn++); diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index d76bf53..aa05084 100644 Binary files a/MATLAB/upp_r2023.slx and b/MATLAB/upp_r2023.slx differ diff --git a/UPP/Core/UPP/angle_control.c b/UPP/Core/UPP/angle_control.c index c76cee4..1fd8a2e 100644 --- a/UPP/Core/UPP/angle_control.c +++ b/UPP/Core/UPP/angle_control.c @@ -59,13 +59,16 @@ void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement) if(assert_upp(hangle)) return; + + /* Ошибка регулирования = уставка - измеренное */ float err = setpoint - measurement; - /* Вычисляем выход PID */ - float angle = arm_pid_f32(&hangle->pid, err); // делта подаём как ошибку + /* ПИД регулирование */ + float reverse_angle = arm_pid_f32(&hangle->pid, err); // 0 - открыть максимально поздно, 1 - открыть макситмально рано /* Ограничиваем диапазон и сохраняем в alpha */ - if(angle > hangle->Config.AngleMax) angle = hangle->Config.AngleMax; + float angle = hangle->Config.AngleMax - reverse_angle; + if (angle > hangle->Config.AngleMax) angle = hangle->Config.AngleMax; if(angle < hangle->Config.AngleMin) angle = hangle->Config.AngleMin; Angle_SetAngle(hangle, angle); diff --git a/UPP/Core/UPP/upp_control.c b/UPP/Core/UPP/upp_control.c index 6f675cc..67d727d 100644 --- a/UPP/Core/UPP/upp_control.c +++ b/UPP/Core/UPP/upp_control.c @@ -129,7 +129,7 @@ void UPP_Control_InternalParams(void) // Обновление регулятора угла открытия if(alpha_update) { - Angle_SetRange(&upp.hangle, angle_max, angle_max); + Angle_SetRange(&upp.hangle, angle_min, angle_max); Angle_PID_Init(&upp.hangle, angle_pid_kp, angle_pid_ki, angle_pid_kd); } // Обновление АЦП конфигов