From b8871145106b2953b05f9bc02a37c11606576261 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Mon, 17 Nov 2025 18:49:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A7=D0=B5=D1=82=20=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D0=BB=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=83=20=D1=83?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=83?= =?UTF-8?q?=D0=B3=D0=BB=D0=BE=D0=BC=20=D0=B8=20=D0=BF=D0=BE=D0=BB=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D0=BB=D0=BE=D1=81=D1=8C=20=D0=B2=D1=81=D1=91...=20?= =?UTF-8?q?=D0=A3=D0=B3=D0=BE=D0=BB=20=D0=BD=D0=B5=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE=20=D1=80=D0=B0=D1=81=D1=81=D1=87?= =?UTF-8?q?=D0=B8=D1=82=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D0=B2=20=D1=82=D0=BE=20=D0=B2=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D1=8F=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D1=82=D0=B8=D1=80=D0=B8=D1=81=D1=82=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MATLAB/app_wrapper/app_io.c | 52 +++--- MATLAB/upp_r2023.slx | Bin 66561 -> 70227 bytes UPP/Core/Configs/upp_config.h | 19 ++- UPP/Core/Configs/upp_defs.h | 5 +- UPP/Core/PowerMonitor/phases_transform.c | 38 ++++- UPP/Core/PowerMonitor/phases_transform.h | 5 +- UPP/Core/PowerMonitor/power_monitor.c | 155 +++++++++++++----- UPP/Core/PowerMonitor/power_monitor.h | 100 +++++++----- UPP/Core/PowerMonitor/power_protect.c | 197 ++++++++++++++++++++++- UPP/Core/PowerMonitor/power_protect.h | 9 +- UPP/Core/Src/stm32f4xx_it.c | 2 - UPP/Core/UPP/angle_control.c | 105 +++++++++++- UPP/Core/UPP/angle_control.h | 27 +++- UPP/Core/UPP/pwm_thyristors.c | 1 - UPP/Core/UPP/upp_control.c | 46 +++++- UPP/Core/UPP/upp_control.h | 55 ++++--- UPP/Core/UPP/upp_errors.c | 179 +++++++++++++++++++- UPP/Core/UPP/upp_errors.h | 80 ++++++--- UPP/Core/UPP/upp_main.c | 143 ++++++++-------- UPP/Core/UPP/upp_main.h | 2 - 20 files changed, 976 insertions(+), 244 deletions(-) diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index 780a0bf..3a9aad0 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -7,7 +7,7 @@ #include "app_wrapper.h" float dbg[16]; - +extern float iref_dbg; #define PIN_READ(_verbname_) (_verbname_##_GPIO_Port->ODR & (_verbname_##_Pin)) ? 1 : 0 void Write_Thyristors(real_T* Buffer, int ind_port) @@ -33,7 +33,7 @@ void Write_PowerMonitor(real_T* Buffer, int ind_port) int nn = 0; for (int i = 0; i < 3; i++) { //0-2 - WriteOutputArray(upp.pm.measured.U[i], ind_port, nn++); + WriteOutputArray(upp.pm.measured.fast.U[i], ind_port, nn++); } for (int i = 0; i < 3; i++) { //3-5 @@ -41,23 +41,23 @@ void Write_PowerMonitor(real_T* Buffer, int ind_port) } for (int i = 0; i < 3; i++) { //6-8 - WriteOutputArray(upp.pm.measured.F[i], ind_port, nn++); + WriteOutputArray(upp.pm.measured.final.F[i], ind_port, nn++); } for (int i = 0; i < 3; i++) { //9-11 - WriteOutputArray(upp.pm.measured.I[i], ind_port, nn++); + WriteOutputArray(upp.pm.measured.fast.I[i], ind_port, nn++); } for (int i = 0; i < 2; i++) { //12-13 - WriteOutputArray(upp.pm.measured.T[i], ind_port, nn++); + WriteOutputArray(upp.pm.measured.final.T[i], ind_port, nn++); } { //14-19 - WriteOutputArray(upp.pm.measured.Uvec, ind_port, nn++); - WriteOutputArray(upp.pm.measured.Ivec, ind_port, nn++); - WriteOutputArray(upp.pm.measured.Imean[0], ind_port, nn++); - WriteOutputArray(upp.pm.measured.Imean[1], ind_port, nn++); - WriteOutputArray(upp.pm.measured.Imean[2], ind_port, nn++); - WriteOutputArray(upp.pm.measured.Fmean, ind_port, nn++); + WriteOutputArray(upp.pm.measured.final.Uamp, ind_port, nn++); + WriteOutputArray(upp.pm.measured.final.Iamp, ind_port, nn++); + WriteOutputArray(upp.pm.measured.final.I[0], ind_port, nn++); + WriteOutputArray(upp.pm.measured.final.I[1], ind_port, nn++); + WriteOutputArray(upp.pm.measured.final.I[2], ind_port, nn++); + WriteOutputArray(upp.pm.measured.final.Fmean, ind_port, nn++); } } @@ -74,8 +74,14 @@ void app_readInputs(const real_T* Buffer) { ADC_Set_Channel_Value(ADC3, 8, ReadInputArray(0,4)); ADC_Set_Channel_Value(ADC3, 10, ReadInputArray(0,5)); - alpha_dbg = ReadInputArray(1, 0); + iref_dbg = ReadInputArray(1, 0); upp.call->go = ReadInputArray(1, 1); + + MB_INTERNAL.param.angle.Angle_Max = ReadInputArray(1, 2)*65535; + MB_INTERNAL.param.angle.Angle_Min = ReadInputArray(1, 3)*65535; + 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_Kd = ReadInputArray(1, 6) * 10000; // USER APP INPUT END } @@ -92,20 +98,24 @@ void app_writeOutputBuffer(real_T* Buffer) { 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((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++); - WriteOutputArray(upp.hpwm.AllPhases[PHASE_A_POS].State, 2, nn++); - WriteOutputArray(upp.hpwm.AllPhases[PHASE_A_NEG].State, 2, nn++); - WriteOutputArray(upp.hpwm.AllPhases[PHASE_B_POS].State, 2, nn++); - WriteOutputArray(upp.hpwm.AllPhases[PHASE_B_NEG].State, 2, nn++); - WriteOutputArray(upp.hpwm.AllPhases[PHASE_C_POS].State, 2, nn++); - WriteOutputArray(upp.hpwm.AllPhases[PHASE_C_NEG].State, 2, nn++); + //WriteOutputArray(upp.hpwm.AllPhases[PHASE_A_POS].State, 2, nn++); + //WriteOutputArray(upp.hpwm.AllPhases[PHASE_A_NEG].State, 2, nn++); + //WriteOutputArray(upp.hpwm.AllPhases[PHASE_B_POS].State, 2, nn++); + //WriteOutputArray(upp.hpwm.AllPhases[PHASE_B_NEG].State, 2, nn++); + //WriteOutputArray(upp.hpwm.AllPhases[PHASE_C_POS].State, 2, nn++); + //WriteOutputArray(upp.hpwm.AllPhases[PHASE_C_NEG].State, 2, nn++); // USER APP OUTPUT END } \ No newline at end of file diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index 87e6520c10b87cf5156171fa12a500ee668320a7..d76bf531f127f6cfa68203ab298dc0d89c2748ec 100644 GIT binary patch delta 58857 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

YY{|xeUB^kJozKw@34vmrx+n3#HU`Fc@qqir^l0 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 M22$Lj!2bUCe}Vr9Jpcdz diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index 709f35b..97f0a05 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -18,24 +18,32 @@ #define assert_upp(_struct_) check_null_ptr_2(_struct_, (_struct_)->f.Initialized) /* Дефайны для индексов */ +/* Линейные напряжения */ #define U_BA 0 #define U_AC 1 #define U_BC 2 +/* Токи фаз */ #define I_C 0 #define I_A 1 #define I_B 2 +/* Температуры */ #define TEMP_1 0 #define TEMP_2 1 + /** * @addtogroup UPP_DEFAULT_PARAMS Default params for external flash * @ingroup UPP_CONFIG * @brief Дефолтные параметры для внешней памяти. Они применятся по команде или по ошибке * @{ */ -/* Параметри мониторинга сети */ -#define PM_EXP_ALPHA_COEF_DEFAULT 0.01 + + +/* Номинальные параметры */ +#define SETPOINT_TEMP_WARN 70 +#define SETPOINT_TEMP_ERR 85 + /* Номинальные параметры */ #define NOM_PHASE_NUMB 3 @@ -58,6 +66,12 @@ #define PUI_Tdelay_SECONDS_DEFAULT 30 #define PUI_Interlace_EN_DEFAULT 5000 +/* Дефолтное коливчество тиков для задержки выставления ошибки */ +#define ERRORS_DELAY_TICKS_DEFAULT 10 + +/* Параметри мониторинга сети */ +#define PM_EXP_ALPHA_COEF_DEFAULT 0.01 + /* Параметры АЦП */ #define ADC_U_MAX_V_DEFAULT 1216.0 #define ADC_I_MAX_A_DEFAULT 53.0 @@ -88,6 +102,7 @@ #define PM_SLOW_PERIOD_CNT 50 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US #define PM_TEMP_SLOW_PERIOD_CNT 200 ///< Период обновления датчиков температуры в тиках @ref PM_SLOW_PERIOD_CNT + /* Частоты таймеров в МГц*/ #define ADC_TIM8_FREQ_MZH 180 ///< Частота тиков таймера АЦП #define PWM_TIM1_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (1-4 каналы) diff --git a/UPP/Core/Configs/upp_defs.h b/UPP/Core/Configs/upp_defs.h index b1ce9bd..cd82f8c 100644 --- a/UPP/Core/Configs/upp_defs.h +++ b/UPP/Core/Configs/upp_defs.h @@ -59,6 +59,8 @@ typedef enum { Err_OverVoltage = 13, ///< Напряжение сети выше допустимого (см. Umах в @ref UPP_PUI_Params_t) Err_OverTemperature = 14, ///< Температура выше допустимой (плюс 85 °C) Err_UnderVoltage = 15, ///< Напряжение сети ниже допустимого (см. Umin в @ref UPP_PUI_Params_t) + Err_OverFrequency = 22, ///< Частота сети выше допустимой + Err_UnderFrequency = 23, ///< Частота сети ниже допустимой /* Ошибки по обрывам фаз */ Err_LossPhaseAll = 16, ///< Обрыв трёх фаз (см. Imin в @ref UPP_PUI_Params_t) @@ -69,8 +71,6 @@ typedef enum { /* Другие ошибки */ Err_LongStart = 20, ///< Затянутый пуск (ток не спадает за установленное время) (см. Tdelay в @ref UPP_PUI_Params_t) Err_Interlace = 21, ///< Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t) - Err_OverFrequency = 22, ///< Частота сети выше допустимой - Err_UnderFrequency = 23, ///< Частота сети ниже допустимой } UPP_ErrorType_t; @@ -148,6 +148,7 @@ typedef struct { * @brief Дефайны УПП которые используютяс исключительно внутри программы * @{ */ +#define PM_SLOW_PERIOD_US (PM_ADC_PERIOD_US*PM_SLOW_PERIOD_CNT) #define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000) /** diff --git a/UPP/Core/PowerMonitor/phases_transform.c b/UPP/Core/PowerMonitor/phases_transform.c index cf6ab63..e9cb632 100644 --- a/UPP/Core/PowerMonitor/phases_transform.c +++ b/UPP/Core/PowerMonitor/phases_transform.c @@ -11,7 +11,6 @@ /** * @brief Рассчитать результирующий вектор трехфазной системы по фазным величинам. * @return Длина вектора (модуль). - * @note Вызывается в DMA2_Stream0_IRQHandler() для обработки всего, что пришло по DMA. */ float vector_abs_phase_calc(float phase1, float phase2) { @@ -30,7 +29,6 @@ float vector_abs_phase_calc(float phase1, float phase2) /** * @brief Рассчитать результирующий вектор трехфазной системы по линейным величинам. * @return Длина вектора (модуль). - * @note Вызывается в DMA2_Stream0_IRQHandler() для обработки всего, что пришло по DMA. */ float vector_abs_linear_calc(float phase1, float phase2) { @@ -46,4 +44,40 @@ float vector_abs_linear_calc(float phase1, float phase2) return 0; } +/** + * @brief Рассчитать фазные напряжения из линейных (звезда) + * @param Ulin Линейные напряжения [Uba Uac Ubc] + * @param Uph Фазные напряжения [Ua Ub Uc] + */ +void linear_to_phase_star(float *Ulin, float *Uph) +{ + if(Ulin == NULL || Uph == NULL) + return; + // Соответствие макросам: Ulin[0] = UBA, Ulin[1] = UAC, Ulin[2] = UBC + float Uba = Ulin[0]; + float Uac = Ulin[1]; + float Ubc = Ulin[2]; + + // Формулы для звезды (сумма фаз = 0) + Uph[0] = (Uba - Ubc)/3.0f; // Ua + Uph[1] = (Ubc - Uac)/3.0f; // Ub + Uph[2] = (Uac - Uba)/3.0f; // Uc +} + +/** + * @brief Рассчитать фазные напряжения из линейных (треугольник) + * @param Ulin Линейные напряжения [Uba Uac Ubc] + * @param Uph Фазные напряжения [Ua Ub Uc] + */ +void linear_to_phase_delta(float *Ulin, float *Uph) +{ + if(Ulin == NULL || Uph == NULL) + return; + + // Соответствие макросам: Ulin[0] = UBA, Ulin[1] = UAC, Ulin[2] = UBC + // Для треугольника фазные напряжения равны линейным + Uph[0] = Ulin[0]; // Ua = Uba + Uph[1] = Ulin[2]; // Ub = Ubc + Uph[2] = Ulin[1]; // Uc = Uac +} diff --git a/UPP/Core/PowerMonitor/phases_transform.h b/UPP/Core/PowerMonitor/phases_transform.h index 5d78003..c031840 100644 --- a/UPP/Core/PowerMonitor/phases_transform.h +++ b/UPP/Core/PowerMonitor/phases_transform.h @@ -12,5 +12,8 @@ float vector_abs_phase_calc(float phase1, float phase2); /* Рассчитать результирующий вектор трехфазной системы по линейным величинам. */ float vector_abs_linear_calc(float phase1, float phase2); - +/* Рассчитать фазные напряжения из линейных (звезда) */ +void linear_to_phase_star(float *Ulin, float *UphUc); +/* Рассчитать фазные напряжения из линейных (треугольник) */ +void linear_to_phase_delta(float *Ulin, float *Uph); #endif /* _PHASES_TRANSFORM_H_ */ diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c index aeb06ec..5f11c17 100644 --- a/UPP/Core/PowerMonitor/power_monitor.c +++ b/UPP/Core/PowerMonitor/power_monitor.c @@ -6,12 +6,21 @@ * @details ******************************************************************************/ #include "power_monitor.h" +#include "power_protect.h" #include "phases_transform.h" #include "adc.h" #include "tim.h" +#define U_BC_calc(_u1_, _u2_) (-((_u1_) + (_u2_))) +#define I_B_calc(_i1_, _i2_) (-((_i1_) + (_i2_))) + static void __SynchAvgFilters(PowerMonitor_t *hpm); +/** + * @brief Инициализация мониторинга сети. + * @param hpm Указатель на структуру мониторинга сети + * @details Инициализирует: АЦП, Алгоритм перехода через ноль, Фильтры + */ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm) { if(hpm == NULL) @@ -24,31 +33,31 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm) /* Инициализация каналов АЦП */ if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UBA, MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_UBA], - MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UBA], + to_float(MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UBA], 10), 4095) != HAL_OK) return HAL_ERROR; if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UAC, MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_UAC], - MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UAC], + to_float(MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UAC], 10), 4095) != HAL_OK) return HAL_ERROR; if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_IC, MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_IC], - MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_IC], + to_float(MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_IC], 10), 4095) != HAL_OK) return HAL_ERROR; if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_IA, MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_IA], - MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_IA], + to_float(MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_IA], 10), 4095) != HAL_OK) return HAL_ERROR; /* Инициализация алгоритма перехода через ноль */ - if(ZC_Init(&hpm->zc, 3, (float)MB_INTERNAL.param.zc.Hysteresis/100, MB_INTERNAL.param.zc.DebouneCouner) != HAL_OK) + if(ZC_Init(&hpm->zc, 3, to_float(MB_INTERNAL.param.zc.Hysteresis, 100), MB_INTERNAL.param.zc.DebouneCouner) != HAL_OK) return HAL_ERROR; /* Инициализация каналов алгоритма перехода через ноль */ @@ -63,7 +72,7 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm) /* Инициализация экпоненциального фильтра медленного алга */ for(int i = 0; i < EXP_ALL; i++) { - if(FilterExp_Init(&hpm->exp[i], (float)MB_INTERNAL.param.pm.mean_alpha/65535)) + if(FilterExp_Init(&hpm->exp[i], to_float(MB_INTERNAL.param.pm.mean_alpha,65535))) return HAL_ERROR; Filter_Start(&hpm->exp[i]); } @@ -88,6 +97,11 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm) } +/** + * @brief Запустить мониторинг сети. + * @param hpm Указатель на структуру мониторинга сети + * @details Запускает АЦП с периодом @ref PM_ADC_PERIOD_US + */ HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm) { if(hpm == NULL) @@ -100,51 +114,68 @@ HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm) } -void PowerMonitor_SlowHandle(PowerMonitor_t *hpm) +/** + * @brief Медленные расчеты АЦП. + * @param hpm Указатель на структуру мониторинга сети + * @details Вызывается в main после накопления @ref PM_SLOW_PERIOD_CNT выборок АЦП. + * Делаются всякие расчеты для более подробного мониторинга сети и защит. + * Сам АЦП считывается в @ref PowerMonitor_FastCalc + */ +void PowerMonitor_SlowCalc(PowerMonitor_t *hpm) { if(hpm == NULL) return; - if(!hpm->f.runSlow) - return; PowerMonitor_Measured_t *meas = &hpm->measured; /* Обработка температур */ float t1 = hpm->adc.Data[ADC_CHANNEL_TEMP1]; float t2 = hpm->adc.Data[ADC_CHANNEL_TEMP2]; - meas->T[TEMP_1] = Filter_Process(&hpm->avg[ADC_CHANNEL_TEMP1], t1); - meas->T[TEMP_2] = Filter_Process(&hpm->avg[ADC_CHANNEL_TEMP2], t2); + meas->final.T[TEMP_1] = Filter_Process(&hpm->avg[ADC_CHANNEL_TEMP1], t1); + meas->final.T[TEMP_2] = Filter_Process(&hpm->avg[ADC_CHANNEL_TEMP2], t2); /* Расчет третьей фазы */ - meas->Uslow[U_BC] = -meas->Uslow[U_BA] - meas->Uslow[U_AC]; - meas->Islow[I_B] = -meas->Islow[I_A] - meas->Islow[I_C]; - + meas->slow.U[U_BC] = U_BC_calc(meas->slow.U[U_BA], meas->slow.U[U_AC]); + meas->slow.I[I_B] = I_B_calc(meas->slow.I[I_A], meas->slow.I[I_C]); + /* Расчет всякого для трех фаз отдельно */ float fmean = 0; // средняя частота по трем фазам float iphase_mean = 0; // средний ток каждой фазы + float uphase_mean = 0; // среднее напряжение каждой фазы for(int i = 0; i < 3; i++) { /* Получение частоты фазы */ - meas->F[i] = ZC_GetFrequency(&hpm->zc, i) / 2; - fmean += meas->F[i]; + meas->final.F[i] = ZC_GetFrequency(&hpm->zc, i) / 2; + fmean += meas->final.F[i]; + + /* Средниее напряжение фазы */ + uphase_mean = fabsf(meas->slow.U[i]); + meas->final.U[i] = Filter_Process(&hpm->exp[EXP_UBA+i], uphase_mean); /* Средний ток фазы */ - iphase_mean = fabsf(meas->Islow[i]); - meas->Imean[i] = Filter_Process(&hpm->exp[EXP_IC+i], iphase_mean); + iphase_mean = fabsf(meas->slow.I[i]); + meas->final.I[i] = Filter_Process(&hpm->exp[EXP_IC+i], iphase_mean); } /* Получение средней частоты по трем фазам */ - fmean /= 3; - meas->Fmean = Filter_Process(&hpm->exp[EXP_F], fmean); + + meas->final.Fmean = fmean / 3; - /* Расчет результирущих векторов трехфазной сети */ - float uvec = vector_abs_linear_calc(meas->Uslow[U_BA], meas->Uslow[U_AC]); - float ivec = vector_abs_phase_calc(meas->Islow[I_A], meas->Islow[I_C]); - meas->Uvec = Filter_Process(&hpm->exp[EXP_U], uvec); - meas->Ivec = Filter_Process(&hpm->exp[EXP_I], ivec); - hpm->f.runSlow = 0; + /* Расчет амплитуд трехфазной сети */ + float uamp = vector_abs_linear_calc(meas->slow.U[U_BA], meas->slow.U[U_AC]); + float iamp = vector_abs_phase_calc(meas->slow.I[I_A], meas->slow.I[I_C]); + meas->final.Uamp = Filter_Process(&hpm->exp[EXP_U], uamp); + meas->final.Iamp = Filter_Process(&hpm->exp[EXP_I], iamp); + } -void PowerMonitor_Handle(PowerMonitor_t *hpm) +/** + * @brief Считывание АЦП и быстрые расчеты. + * @param hpm Указатель на структуру мониторинга сети + * @details Вызывается в прерывании АЦП по получению данных. + * Далее данные считываются и делаются базовые преобразования + * Более подробные расчеты в @ref PowerMonitor_SlowCalc + */ +void PowerMonitor_FastCalc(PowerMonitor_t *hpm) { if(hpm == NULL) return; @@ -153,31 +184,32 @@ void PowerMonitor_Handle(PowerMonitor_t *hpm) /* Заполняем величины Напряжений/Токов */ PowerMonitor_Measured_t *meas = &hpm->measured; - meas->U[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA]; - meas->U[U_AC] = hpm->adc.Data[ADC_CHANNEL_UAC]; - meas->U[U_BC] = -meas->U[U_BA] - meas->U[U_AC]; - meas->I[I_C] = hpm->adc.Data[ADC_CHANNEL_IC]; - meas->I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA]; - meas->I[I_B] = -meas->I[I_A] - meas->I[I_C]; + meas->real.U[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA]; + meas->real.U[U_AC] = hpm->adc.Data[ADC_CHANNEL_UAC]; + meas->real.U[U_BC] = U_BC_calc(meas->real.U[U_BA], meas->real.U[U_AC]); + + meas->real.I[I_C] = hpm->adc.Data[ADC_CHANNEL_IC]; + meas->real.I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA]; + meas->real.I[I_B] = I_B_calc(meas->real.I[I_A], meas->real.I[I_C]); /* Преобразуем в относительные единицы (о.е.) */ for(int i = 0; i < 3; i++) { - meas->Ufast[i] = 10*meas->U[i]/MB_INTERNAL.param.nominal.U; - meas->Ifast[i] = 10*meas->I[i]/MB_INTERNAL.param.nominal.I; + meas->fast.U[i] = 10*meas->real.U[i]/MB_INTERNAL.param.nominal.U; + meas->fast.I[i] = 10*meas->real.I[i]/MB_INTERNAL.param.nominal.I; } /* Ищем переход через ноль */ - ZC_ProcessAllChannels(&hpm->zc, meas->Ufast, usTick); + ZC_ProcessAllChannels(&hpm->zc, meas->fast.U, usTick); /* Вообще фильтры должны рабтоать синхронно, но на всякий синхронизация */ __SynchAvgFilters(hpm); - /* Накопление Average для медленной фильтрации */ - meas->Uslow[U_BA] = Filter_Process(&hpm->avg[ADC_CHANNEL_UBA], meas->Ufast[U_BA]); - meas->Uslow[U_AC] = Filter_Process(&hpm->avg[ADC_CHANNEL_UAC], meas->Ufast[U_AC]); - meas->Islow[I_C] = Filter_Process(&hpm->avg[ADC_CHANNEL_IC], meas->Ifast[I_C]); - meas->Islow[I_A] = Filter_Process(&hpm->avg[ADC_CHANNEL_IA], meas->Ifast[I_A]); + /* Average для медленной фильтрации */ + meas->slow.U[U_BA] = Filter_Process(&hpm->avg[ADC_CHANNEL_UBA], meas->fast.U[U_BA]); + meas->slow.U[U_AC] = Filter_Process(&hpm->avg[ADC_CHANNEL_UAC], meas->fast.U[U_AC]); + meas->slow.I[I_C] = Filter_Process(&hpm->avg[ADC_CHANNEL_IC], meas->fast.I[I_C]); + meas->slow.I[I_A] = Filter_Process(&hpm->avg[ADC_CHANNEL_IA], meas->fast.I[I_A]); /* Запускаем медленную обработку через slow_period прерываний */ @@ -186,7 +218,6 @@ void PowerMonitor_Handle(PowerMonitor_t *hpm) /* Берем 0 фильтр, просто так, потому что они все должны работать синхронно */ if(Filter_isDataReady(&hpm->avg[0])) { - hpm->isr_cnt = 0; if(!hpm->f.runSlow) { @@ -204,6 +235,46 @@ void PowerMonitor_Handle(PowerMonitor_t *hpm) } } + +/** + * @brief Проверяет защиты питания и температур. + * @param measure Указатель на структуру с измеренными значениями + * @param Running Флаг: + * - 1 - УПП в работе, + * - 0 - УПП ожидает команды + * @return 1 - была обнаружена ощибка, 0 - все ок + */ +int PowerMonitor_Protect(PowerMonitor_t *hpm, uint8_t Running) +{ + if(hpm == NULL) + return 1; + + PowerMonitor_Measured_t *measure = &hpm->measured; + UPP_PUI_Params_t *protect = &MB_DATA.HoldRegs.pui_params; + UPP_ParamsNominal_t *nominal = &MB_INTERNAL.param.nominal; + + /*=============== ЗАЩИТЫ ПО НАПРЯЖЕНИЮ ==================*/ + hpm->f.isU = Protect_Voltages(measure, protect, nominal); + + /* Если УПП в работе */ + if(Running) + { + /*=============== ЗАЩИТЫ ПО ТОКУ ==================*/ + hpm->f.isI = Protect_Currents(measure, protect, nominal); + } + + /*=============== ЗАЩИТЫ ВСЯКИЕ ДРУГИЕ ==================*/ + Protect_Misc(measure, protect, nominal); + + + if(errors.prvt.f.all) + return 1; + else + return 0; +} + + + /* Синхронизация фильтров. Но вообще не должна никогда отрабатывать */ static void __SynchAvgFilters(PowerMonitor_t *hpm) { diff --git a/UPP/Core/PowerMonitor/power_monitor.h b/UPP/Core/PowerMonitor/power_monitor.h index 6d0d54a..2b9ef4a 100644 --- a/UPP/Core/PowerMonitor/power_monitor.h +++ b/UPP/Core/PowerMonitor/power_monitor.h @@ -11,58 +11,72 @@ #include "zero_cross.h" /* Индексы экспоненциальных фильтров */ -#define EXP_ALL 6 +#define EXP_ALL 8 #define EXP_U 0 -#define EXP_I 1 -#define EXP_IC 2 -#define EXP_IA 3 -#define EXP_IB 4 -#define EXP_F 5 +#define EXP_UBA 1 +#define EXP_UAC 2 +#define EXP_UBC 3 +#define EXP_I 4 +#define EXP_IC 5 +#define EXP_IA 6 +#define EXP_IB 7 +/** + * @brief Флаги Мониторинга сети + */ typedef struct { unsigned runSlow:1; ///< Запустить медленный алгоритм в while(1) unsigned isU:1; ///< Есть ли напряжение unsigned isI:1; ///< Есть ли ток - - unsigned protectUmax:1; ///< Отработка защиты по макс. напряжению - unsigned protectUmin:1; ///< Отработка защиты по мак с. напряжению - unsigned protectImax:1; ///< Отработка защиты по макс. току - unsigned protectImin:1; ///< Отработка защиты по мин. току }PowerMonitor_Flags_t; +/** + * @brief Измеренные и приведенные значения с АЦП + */ typedef struct { - /* Усредненные величины (о.е.) */ - float Uvec; ///< Результирующий вектор Напряжения по трем фазам - float Ivec; ///< Результирующий вектор Тока по трем фазам - float Imean[3]; ///< Средний Ток по трем фазам - float Fmean; ///< Средняя Частота по трем фазам + /** @brief Усредненные величины (о.е.) */ + struct + { + float Uamp; ///< Результирующий вектор Напряжения по трем фазам + float Iamp; ///< Результирующий вектор Тока по трем фазам + float U[3]; ///< Среднее Наряжение по трем фазам + float I[3]; ///< Средний Ток по трем фазам + float Fmean; ///< Средняя Частота по трем фазам + float F[3]; ///< Частота от Zero Cross (обновляется в main) + float T[2]; ///< Температура (обновляется в main) + }final; - /* Быстрые величины (в о.е.) - обновляются в каждом прерывании АЦП */ - float Ufast[3]; ///< Напряжение - float Ifast[3]; ///< Ток - - /* Медленные величины (в о.е.) - обновляются в main в @ref PowerMonitor_SlowHandle */ - float Uslow[3]; ///< Напряжение - float Islow[3]; ///< Ток - - /* Реальные величины - обновляются кто где, и содержат значения в В/А/Цельсиях */ - float U[3]; ///< Напряжение (обновляется в прерывании АЦП) - float I[3]; ///< Ток (обновляется в прерывании АЦП) - float F[3]; ///< Частота от Zero Cross (обновляется в main) - float T[2]; ///< Температура (обновляется в main) + /** @brief Быстрые величины (в о.е.) - обновляются в каждом прерывании АЦП @ref PowerMonitor_FastCalc */ + struct + { + float U[3]; ///< Напряжение + float I[3]; ///< Ток + }fast; + /** @brief Медленные величины (в о.е.) - обновляются в main в @ref PowerMonitor_SlowCalc */ + struct + { + float U[3]; ///< Напряжение + float I[3]; ///< Ток + }slow; + + /** @brief Реальные величины - обновляются кто где, и содержат значения в В/А */ + struct + { + float U[3]; ///< Напряжение (обновляется в прерывании АЦП) + float I[3]; ///< Ток (обновляется в прерывании АЦП) + }real; }PowerMonitor_Measured_t; -typedef struct -{ -}PowerMonitor_Filters_t; - +/** + * @brief Структура для мониторинга сети + */ typedef struct { ADC_Periodic_t adc; ///< Хендл периодического АЦП @@ -70,22 +84,24 @@ typedef struct PowerMonitor_Measured_t measured; ///< Измеренные/рассчитанные величины - FilterExp_t exp[EXP_ALL]; ///< Фильтры для mean - FilterAverage_t avg[ADC_NUMB_OF_CHANNELS]; ///< Фильтры для avg + FilterExp_t exp[EXP_ALL]; ///< Фильтры для сглаживания мговенного значения Напряжения/Токов + FilterAverage_t avg[ADC_NUMB_OF_CHANNELS]; ///< Фильтры для сглаживания медленных величин АЦП PowerMonitor_Flags_t f; ///< Флаги мониторинга - - - uint32_t slow_period; - uint32_t isr_cnt; + uint32_t isr_cnt; }PowerMonitor_t; extern PowerMonitor_t pm; - +/* Инициализация мониторинга сети */ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm); +/* Запустить мониторинг сети */ HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm); -void PowerMonitor_SlowHandle(PowerMonitor_t *hpm); -void PowerMonitor_Handle(PowerMonitor_t *hpm); +/* Медленные расчеты АЦП */ +void PowerMonitor_SlowCalc(PowerMonitor_t *hpm); +/* Считывание АЦП и быстрые расчеты */ +void PowerMonitor_FastCalc(PowerMonitor_t *hpm); +/* Проверяет защиты питания и температур */ +int PowerMonitor_Protect(PowerMonitor_t *hpm, uint8_t Running); #endif /* _POWER_MONITOR_H_ */ diff --git a/UPP/Core/PowerMonitor/power_protect.c b/UPP/Core/PowerMonitor/power_protect.c index 99d8aeb..b67dae8 100644 --- a/UPP/Core/PowerMonitor/power_protect.c +++ b/UPP/Core/PowerMonitor/power_protect.c @@ -5,4 +5,199 @@ ****************************************************************************** * @details ******************************************************************************/ -#include "power_protect.h" \ No newline at end of file +#include "power_protect.h" + + +/** + * @brief Проверяет защиты по напряжению. + * @note Заполняет флаги prvt ошибок (приватные). + * Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ + * @return 1 - напряжение есть, 0 - напряжения нет + */ +int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal) +{ + /* Переводим уставки ПУИ в удобный вид */ + float lUmin = to_float(protect->Umin, 100)/**to_float(nominal->U, 10)*/; + float lUmax = to_float(protect->Umax, 100)/**to_float(nominal->U, 10)*/; + float lPhaseSequence = to_float(nominal->PhaseSequence, 100); + + /* Общее напряжение */ + if(measure->final.Uamp > lUmax) + { + errors.prvt.f.err.uamp_max = 1; + } + else if (measure->final.Uamp < lUmin) + { + errors.prvt.f.err.uamp_min = 1; + } + else + { + errors.prvt.f.err.uamp_max = 0; + errors.prvt.f.err.uamp_min = 0; + } + + /* Последовательность фаз */ + int realPhaseSequence = 0; + if(realPhaseSequence != lPhaseSequence) + { + errors.prvt.f.err.interlance = 1; + } + else + { + errors.prvt.f.err.interlance = 0; + } + + return (errors.prvt.f.err.uamp_min == 0); +} + +/** + * @brief Проверяет защиты по току. + * @note Заполняет флаги prvt ошибок (приватные). + * Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ + */ +int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal) +{ + /* Переводим уставки ПУИ в удобный вид */ + float lIref = to_float(protect->Iref, 100)/**to_float(nominal->I, 10)*/; + float lImax = to_float(protect->Imax, 100)/**to_float(nominal->I, 10)*/; + float lImin = to_float(protect->Imin, 100)/**to_float(nominal->I, 10)*/; + + /* Общий ток */ + if(measure->final.Iamp > lImax) + { + errors.prvt.f.err.iamp_max = 1; + } + else if (measure->final.Iamp < lImin) + { + errors.prvt.f.err.iamp_min = 1; + } + else + { + errors.prvt.f.err.iamp_max = 0; + errors.prvt.f.err.iamp_min = 0; + } + + /* Ток по фазам */ + if(measure->final.I[I_A] > lImax) + { + errors.prvt.f.err.ia_max = 1; + } + else if (measure->final.I[I_A] < lImin) + { + errors.prvt.f.err.ia_min = 1; + } + else + { + errors.prvt.f.err.ia_max = 0; + errors.prvt.f.err.ia_min = 0; + } + + if(measure->final.I[I_B] > lImax) + { + errors.prvt.f.err.ib_max = 1; + } + else if (measure->final.I[I_B] < lImin) + { + errors.prvt.f.err.ib_min = 1; + } + else + { + errors.prvt.f.err.ib_max = 0; + errors.prvt.f.err.ib_min = 0; + } + + if(measure->final.I[I_C] > lImax) + { + errors.prvt.f.err.ic_max = 1; + } + else if (measure->final.I[I_C] < lImin) + { + errors.prvt.f.err.ic_min = 1; + } + else + { + errors.prvt.f.err.ic_max = 0; + errors.prvt.f.err.ic_min = 0; + } + + return (errors.prvt.f.err.iamp_min == 0); +} + + + +/** + * @brief Проверяет всякие другие защиты (частота, температура). + * @note Заполняет флаги prvt ошибок (приватные). + * Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ + */ +void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal) +{ + /* Переводим внутренние уставки в удобный вид */ + float lFnom = to_float(MB_INTERNAL.param.nominal.F, 100); + float lFmin = lFnom - lFnom*to_float(MB_INTERNAL.param.nominal.F_deviation_minus, 100); + float lFmax = lFnom + lFnom*to_float(MB_INTERNAL.param.nominal.F_deviation_plus, 100); + + float lTwarn = to_float(MB_INTERNAL.param.setpoints.TemperatureWarn, 100); + float lTerr = to_float(MB_INTERNAL.param.setpoints.TemperatureWarn, 100); + + + /*=============== ЗАЩИТЫ ПО ЧАСТОТЕ ==================*/ + if(measure->final.F[U_AC] > lFmax) + { + errors.prvt.f.err.fac_max = 1; + } + else if (measure->final.F[U_AC] < lFmin) + { + errors.prvt.f.err.fac_min = 1; + } + else + { + errors.prvt.f.err.fac_max = 0; + errors.prvt.f.err.fac_min = 0; + } + + if(measure->final.F[U_BA] > lFmax) + { + errors.prvt.f.err.fba_max = 1; + } + else if (measure->final.F[U_BA] < lFmin) + { + errors.prvt.f.err.fba_min = 1; + } + else + { + errors.prvt.f.err.fba_max = 0; + errors.prvt.f.err.fba_min = 0; + } + + if(measure->final.F[U_BC] > lFmax) + { + errors.prvt.f.err.fbc_max = 1; + } + else if (measure->final.F[U_BC] < lFmin) + { + errors.prvt.f.err.fbc_min = 1; + } + else + { + errors.prvt.f.err.fbc_max = 0; + errors.prvt.f.err.fbc_min = 0; + } + + + + /*=============== ЗАЩИТЫ ПО ТЕМПЕРАТУРЕ ==================*/ + if(measure->final.T[TEMP_1] > lTerr) + { + errors.prvt.f.err.temp_err = 1; + } + else if (measure->final.T[TEMP_1] > lTwarn) + { + errors.prvt.f.err.temp_warn = 1; + } + else + { + errors.prvt.f.err.temp_err = 0; + errors.prvt.f.err.temp_warn = 0; + } +} diff --git a/UPP/Core/PowerMonitor/power_protect.h b/UPP/Core/PowerMonitor/power_protect.h index a378e78..c19502b 100644 --- a/UPP/Core/PowerMonitor/power_protect.h +++ b/UPP/Core/PowerMonitor/power_protect.h @@ -6,6 +6,13 @@ *****************************************************************************/ #ifndef _POWER_PROTECT_H_ #define _POWER_PROTECT_H_ -#include "main.h" +#include "power_monitor.h" + +/* Проверяет защиты по напряжению. */ +int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal); +/* Проверяет защиты по току. */ +int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal); +/* Проверяет всякие другие защиты (частота, температура). */ +void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal); #endif /* _POWER_PROTECT_H_ */ diff --git a/UPP/Core/Src/stm32f4xx_it.c b/UPP/Core/Src/stm32f4xx_it.c index cf5eee0..2d83618 100644 --- a/UPP/Core/Src/stm32f4xx_it.c +++ b/UPP/Core/Src/stm32f4xx_it.c @@ -23,8 +23,6 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "upp_main.h" -#include "pwm_thyristors.h" -#include "angle_control.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ diff --git a/UPP/Core/UPP/angle_control.c b/UPP/Core/UPP/angle_control.c index 781a050..c76cee4 100644 --- a/UPP/Core/UPP/angle_control.c +++ b/UPP/Core/UPP/angle_control.c @@ -21,19 +21,90 @@ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle) hangle->htim = &angletim; + // Инициализация ПИД + float kp = to_float(MB_INTERNAL.param.angle.PID_Kp, 10000); + float ki = to_float(MB_INTERNAL.param.angle.PID_Ki, 10000); + float kd = to_float(MB_INTERNAL.param.angle.PID_Kd, 10000); + Angle_PID_Init(hangle, kp, ki, kd); + // Инициализация каналов HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_1); HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_2); HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_3); + // Сброс всех каналов Angle_Reset(hangle, UPP_PHASE_A); Angle_Reset(hangle, UPP_PHASE_B); Angle_Reset(hangle, UPP_PHASE_C); + + // Инициализация углов + float angle_max = to_float(MB_INTERNAL.param.angle.Angle_Max, 65535); + float angle_min = to_float(MB_INTERNAL.param.angle.Angle_Min, 65535); + + hangle->f.Initialized = 1; return HAL_OK; } + +/** + * @brief Управление углом через ПИД регулятор. + * @param hangle Указатель на таймер + * @param setpoint Уставка куда регулировать + * @param measurement Измеренные регулируемые величины + */ +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); // делта подаём как ошибку + + /* Ограничиваем диапазон и сохраняем в alpha */ + if(angle > hangle->Config.AngleMax) angle = hangle->Config.AngleMax; + if(angle < hangle->Config.AngleMin) angle = hangle->Config.AngleMin; + + Angle_SetAngle(hangle, angle); +} + +/** + * @brief Сброс ПИД регулятора. + * @param hangle Указатель на таймер + */ +void Angle_PID_Reset(Angle_Handle_t *hangle) +{ + if(assert_upp(hangle)) + return; + + /* Вычисляем выход PID */ + arm_pid_reset_f32(&hangle->pid); + + Angle_SetAngle(hangle, hangle->Config.AngleLimit); + Angle_Reset(hangle, UPP_PHASE_A); + Angle_Reset(hangle, UPP_PHASE_B); + Angle_Reset(hangle, UPP_PHASE_C); +} + +/** + * @brief Инициализация ПИД регулятора. + * @param hangle Указатель на таймер + * @param kp, ki kd Коэффициенты регулятора + */ +void Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd) +{ + if(assert_upp(hangle)) + return; + + hangle->pid.Kp = kp; + hangle->pid.Ki = ki; + hangle->pid.Kd = kd; + arm_pid_init_f32(&hangle->pid, 1); +} + /** * @brief Инициализация углов открытия. * @param hangle Указатель на таймер @@ -67,6 +138,28 @@ HAL_StatusTypeDef Angle_SetRange(Angle_Handle_t *hangle, float AngleMin, float A return HAL_OK; } + +/** + * @brief Выставление текущего угла открытия тиристоров. + * @param hangle Указатель на таймер + * @param AngleLimit Лимит AngleMax, рассчитывается от параметров ШИМ + * @param AngleMin Минимально возможный угол открытия + * @param AngleMax Максимально возможный угол открытия + * @return HAL Status. + */ +HAL_StatusTypeDef Angle_SetAngle(Angle_Handle_t *hangle, float Angle) +{ + if(assert_upp(hangle)) + return HAL_ERROR; + + if(Angle > hangle->Config.AngleLimit) + Angle = hangle->Config.AngleLimit; + + hangle->alpha = Angle; + + return HAL_OK; +} + /** * @brief Инициализация предельного угла открытия. * @param hangle Указатель на таймер @@ -129,7 +222,7 @@ UPP_Phase_t Angle_Handle(Angle_Handle_t *hangle) * @param Phase Для какой фазы надо установить угол открытия * @return HAL Status. */ -HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float Angle, float PeriodMs) +HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float PeriodMs) { if(assert_upp(hangle)) return HAL_ERROR; @@ -139,16 +232,16 @@ HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float A { return HAL_ERROR; } - if(Angle > hangle->Config.AngleMax) + if(hangle->alpha > hangle->Config.AngleMax) { - Angle = hangle->Config.AngleMax; + hangle->alpha = hangle->Config.AngleMax; } - if(Angle < hangle->Config.AngleMin) + if(hangle->alpha < hangle->Config.AngleMin) { - Angle = hangle->Config.AngleMin; + hangle->alpha = hangle->Config.AngleMin; } - uint32_t timer_ticks = TIM_MillisToTick(PeriodMs*Angle, ANGLE_TIM2_FREQ_MHZ); + uint32_t timer_ticks = TIM_MillisToTick(PeriodMs*hangle->alpha, ANGLE_TIM2_FREQ_MHZ); uint32_t ccr_ticks = __HAL_TIM_GET_COUNTER(hangle->htim) + timer_ticks; switch(Phase) diff --git a/UPP/Core/UPP/angle_control.h b/UPP/Core/UPP/angle_control.h index 2b62a01..527394a 100644 --- a/UPP/Core/UPP/angle_control.h +++ b/UPP/Core/UPP/angle_control.h @@ -8,6 +8,9 @@ #define _ANGLE_CONTROL_H_ #include "main.h" +/** + * @brief Конфигурация алгоритма управления углом открытия + */ typedef struct { float AngleLimit; ///< Лимит AngleMax, рассчитывается от параметров ШИМ @@ -15,25 +18,39 @@ typedef struct float AngleMax; ///< Максимально возможный угол открытия }Angle_Config_t; +/** + * @brief Структура для управления углом открытия + */ typedef struct { - TIM_HandleTypeDef *htim; - Angle_Config_t Config; + TIM_HandleTypeDef *htim; ///< Указатель на таймер для расчета угла + Angle_Config_t Config; ///< Конфигурации алгоритма расчета угла открытия тиристоров + + float alpha; ///< текущий угол открытия + arm_pid_instance_f32 pid; ///< ПИД регулятор для управления углом struct { - unsigned Initialized : 1; + unsigned Initialized : 1; ///< Структура инициализирована unsigned Running : 3; ///< Сколько каналов запущено сейчас - } f; + } f; ///< Флаги }Angle_Handle_t; /* Инициализация Таймера для рассчета угла открытия. */ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle); +/* Управление углом через ПИД регулятор */ +void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement); +/* Сброс ПИД регулятора. */ +void Angle_PID_Reset(Angle_Handle_t *hangle); +/* Инициализация ПИД регулятора. */ +void Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd); +/* Выставление текущего угла открытия тиристоров. */ +HAL_StatusTypeDef Angle_SetAngle(Angle_Handle_t *hangle, float Angle); /* Инициализация углов открытия. */ HAL_StatusTypeDef Angle_SetRange(Angle_Handle_t *hangle, float AngleMin, float AngleMax); /* Инициализация предельного угла открытия. */ HAL_StatusTypeDef Angle_SetLimit(Angle_Handle_t *hangle, float AngleLimit); /* Установка угла открытия в таймер. */ -HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float Angle, float PeriodMs); +HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float PeriodMs); /* Сброс угла открытия у таймера. */ HAL_StatusTypeDef Angle_Reset(Angle_Handle_t *hangle, UPP_Phase_t Phase); diff --git a/UPP/Core/UPP/pwm_thyristors.c b/UPP/Core/UPP/pwm_thyristors.c index 25a7abc..b978b5e 100644 --- a/UPP/Core/UPP/pwm_thyristors.c +++ b/UPP/Core/UPP/pwm_thyristors.c @@ -6,7 +6,6 @@ * @details ******************************************************************************/ #include "pwm_thyristors.h" -#include "angle_control.h" #include "tim.h" static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state); diff --git a/UPP/Core/UPP/upp_control.c b/UPP/Core/UPP/upp_control.c index e949a30..6f675cc 100644 --- a/UPP/Core/UPP/upp_control.c +++ b/UPP/Core/UPP/upp_control.c @@ -24,10 +24,17 @@ void UPP_Control_InternalParams(void) return; // флаги обновились ли конфиги + static int alpha_update = 0; static int adc_channel_update[ADC_NUMB_OF_REGULAR_CHANNELS] = {0}; static int zc_update = 0; static int pwm_update = 0; + // временная переменная для параметров Мониторинга сети + 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_kd = upp.hangle.pid.Kd; // временная переменная для параметров каналов АЦП float adc_channel_max[ADC_NUMB_OF_REGULAR_CHANNELS] = {0}; uint16_t adc_channel_zero[ADC_NUMB_OF_REGULAR_CHANNELS] = {0}; @@ -42,6 +49,32 @@ void UPP_Control_InternalParams(void) float pm_alpha = upp.pm.exp[0].alpha; + + // Параметры регулятора Угла открытия + if(__CheckSimpleParamF(&angle_max, MB_INTERNAL.param.angle.Angle_Max, 65535)) + { + alpha_update = 1; + } + if(__CheckSimpleParamF(&angle_min, MB_INTERNAL.param.angle.Angle_Min, 65535)) + { + alpha_update = 1; + } + if(__CheckSimpleParamF(&angle_pid_kp, MB_INTERNAL.param.angle.PID_Kp, 10000)) + { + alpha_update = 1; + } + if(__CheckSimpleParamF(&angle_pid_ki, MB_INTERNAL.param.angle.PID_Ki, 10000)) + { + alpha_update = 1; + } + if(__CheckSimpleParamF(&angle_pid_kd, MB_INTERNAL.param.angle.PID_Kd, 10000)) + { + alpha_update = 1; + } + + + + // Параметры АЦП for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++) { adc_channel_max[i] = upp.pm.adc.Coefs[i].vMax; @@ -85,7 +118,7 @@ void UPP_Control_InternalParams(void) // Параметры мониторинга if(__CheckSimpleParamF(&pm_alpha, MB_INTERNAL.param.pm.mean_alpha, 65535)) { - for(int i = 0; i < 3; i++) + for(int i = 0; i < EXP_ALL; i++) { Filter_ReInit(&upp.pm.exp[i], pm_alpha); } @@ -93,6 +126,12 @@ void UPP_Control_InternalParams(void) + // Обновление регулятора угла открытия + if(alpha_update) + { + Angle_SetRange(&upp.hangle, angle_max, angle_max); + Angle_PID_Init(&upp.hangle, angle_pid_kp, angle_pid_ki, angle_pid_kd); + } // Обновление АЦП конфигов for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++) { @@ -152,7 +191,10 @@ void UPP_SetDefault(int pui_default, int internal_default) } if(internal_default) - { + { + MB_INTERNAL.param.setpoints.TemperatureWarn = SETPOINT_TEMP_WARN*10; + MB_INTERNAL.param.setpoints.TemperatureErr = SETPOINT_TEMP_ERR*10; + MB_INTERNAL.param.nominal.PhaseNumber = NOM_PHASE_NUMB; MB_INTERNAL.param.nominal.U = NOM_U_V_DEFAULT*10; MB_INTERNAL.param.nominal.U_deviation_plus = NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT*100; diff --git a/UPP/Core/UPP/upp_control.h b/UPP/Core/UPP/upp_control.h index 1cbcc53..5836033 100644 --- a/UPP/Core/UPP/upp_control.h +++ b/UPP/Core/UPP/upp_control.h @@ -10,6 +10,8 @@ #define _UPP_CONTROL_H #include "upp_defs.h" +#define to_float(_u16_, _coef_) ((float)_u16_/_coef_) + typedef struct { unsigned set_default_pui:1; ///< Выставить настройки ПУИ в дефолтные @@ -23,53 +25,66 @@ typedef struct }UPP_FuncCalls_t; +typedef struct +{ + uint16_t PhaseSequence; ///< Последовательность фаз todo + uint16_t PhaseNumber; ///< [Количество] + uint16_t U; ///< [В x 10] + uint16_t U_deviation_plus; ///< [Проценты x 100] + uint16_t U_deviation_minus; ///< [Проценты x 100] + uint16_t F; ///< [Гц x 100] + uint16_t F_deviation_plus; ///< [Проценты x 100] + uint16_t F_deviation_minus; ///< [Проценты x 100] + uint16_t I; ///< [Амперы x 10] +}UPP_ParamsNominal_t; + +typedef struct +{ + uint16_t TemperatureWarn; ///< Предупредительный порог температуры [Градусы x 100] + uint16_t TemperatureErr; ///< Аварийный порог температуры [Градусы x 100] +}UPP_ParamsSetpoints_t; + typedef struct { struct { - uint16_t mean_alpha; ///< Коэф альфа x10000 для эксп. фильтра Umean, Imean, Fmean + uint16_t mean_alpha; ///< Коэф альфа для усредняющего эксп. фильтра [0..1 x 65535] }pm; - struct - { - uint16_t PhaseNumber; ///< Количество - uint16_t U; ///< В x 10 - uint16_t U_deviation_plus; ///< Проценты x 100 - uint16_t U_deviation_minus; ///< Проценты x 100 - uint16_t F; ///< Гц x 100 - uint16_t F_deviation_plus; ///< Проценты x 100 - uint16_t F_deviation_minus; ///< Проценты x 100 - uint16_t I; ///< Амперы x 10 - }nominal; + UPP_ParamsNominal_t nominal; + UPP_ParamsSetpoints_t setpoints; /* Параметры АЦП */ struct { - uint16_t ADC_Max[4]; ///< В x 10 - uint16_t ADC_Zero[4]; ///< Кванты АЦП + uint16_t ADC_Max[4]; ///< Величина в единицах измерения при АЦП = 4095 [В или А x 10] + uint16_t ADC_Zero[4]; ///< Кванты АЦП когда на входе ноль }adc; /* Параметры ШИМ */ struct { uint16_t PhaseMask; ///< Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c - uint16_t Frequency; ///< Частота ШИМ для пачки импульсов на тиристоры - uint16_t PulseNumber; ///< Количесво импульсов в пачке + uint16_t Frequency; ///< Частота ШИМ для пачки импульсов на тиристоры [Герцы] + uint16_t PulseNumber; ///< Количесво импульсов в пачке [Количество] }pwm; /* Параметры Угла */ struct { - uint16_t Hysteresis; ///< Гистерезис для определения перехода через ноль - uint16_t DebouneCouner; ///< Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль + uint16_t Hysteresis; ///< Гистерезис для определения перехода через ноль [Проценты x 100] + uint16_t DebouneCouner; ///< Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль [Количество] }zc; /* Параметры Угла */ struct { - uint16_t Angle_Max; ///< Максимальный угол открытия тиристора - uint16_t Angle_Min; ///< Минимальный угол открытия тиристора + uint16_t Angle_Max; ///< Максимальный угол открытия тиристора [0..1 x 65535] + uint16_t Angle_Min; ///< Минимальный угол открытия тиристора [0..1 x 65535] + uint16_t PID_Kp; ///< Пропорциональный коэфициент ПИ регулятора угла [x 1000] + uint16_t PID_Ki; ///< Интегральный коэфициент ПИ регулятора угла [x 1000] + uint16_t PID_Kd; ///< Интегральный коэфициент ПИ регулятора угла [x 1000] }angle; diff --git a/UPP/Core/UPP/upp_errors.c b/UPP/Core/UPP/upp_errors.c index 02ebc29..ad9b482 100644 --- a/UPP/Core/UPP/upp_errors.c +++ b/UPP/Core/UPP/upp_errors.c @@ -1,13 +1,173 @@ /** ****************************************************************************** * @file upp_errors.c -* @brief Ошибки УПП и их обработка +* @brief Формирование ошибок в ПУИ ****************************************************************************** * @details ******************************************************************************/ +#include "upp_main.h" // УПП #include "upp_errors.h" // всё остальное по работе с УПП UPP_Errors_t errors; +static UPP_ErrorType_t UPP_SelectCommonError(void); +static int setError(int condition, int flag, int *timer, int delay); +void UPP_Errors_Program(void); +void UPP_Errors_Power(void); +void UPP_Errors_Ranges(void); +void UPP_Errors_LossPhase(void); +void UPP_Errors_Other(void); + + + +void UPP_Errors_Handle(void) +{ + /*====== Программные ошибки ======*/ + UPP_Errors_Program(); + /*====== Ошибки питания плат ======*/ + UPP_Errors_Power(); + /*====== Ошибки выхода за допустимые пределы ======*/ + UPP_Errors_Ranges(); + /*====== Потери фазы ======*/ + UPP_Errors_LossPhase(); + /*====== Остальные ======*/ + UPP_Errors_Other(); + + + + + + errors.common = UPP_SelectCommonError(); +} + +void UPP_Errors_Program(void) +{ + +} + +void UPP_Errors_Power(void) +{ + //read discrete inputs +} + +void UPP_Errors_Ranges(void) +{ + /* Преобразуем уставки в нормальные тики */ + float ticksTiMax = to_float(MB_DATA.HoldRegs.pui_params.TiMax, 1)/PM_SLOW_PERIOD_US; + /* Счетчики для отсчитывания задержки выставления ошибки */ + static int IMaxCnt = 0; + static int UMaxCnt = 0; + static int UMinCnt = 0; + static int FMaxCnt = 0; + static int FMinCnt = 0; + static int TMaxCnt = 0; + + /* Напряжения */ + errors.pui.err.OverVoltage = setError(errors.prvt.f.err.uamp_max, + errors.pui.err.OverVoltage, + &UMaxCnt, + ticksTiMax); + errors.pui.err.UnderVoltage = setError(errors.prvt.f.err.uamp_min, + errors.pui.err.UnderVoltage, + &UMinCnt, + ticksTiMax); + + + /* Токи */ + int i_max = ( errors.prvt.f.err.iamp_max || + errors.prvt.f.err.ia_max || + errors.prvt.f.err.ib_max || + errors.prvt.f.err.ic_max); + errors.pui.err.OverCurrent = setError(i_max, + errors.pui.err.OverCurrent, + &IMaxCnt, + ticksTiMax); + + + /* Частота */ + int f_max = ( errors.prvt.f.err.fac_max || + errors.prvt.f.err.fba_max || + errors.prvt.f.err.fbc_max); + int f_min = ( errors.prvt.f.err.fac_max || + errors.prvt.f.err.fba_max || + errors.prvt.f.err.fbc_max); + errors.pui.err.OverFrequency = setError(f_max, + errors.pui.err.OverFrequency, + &FMaxCnt, + ERRORS_DELAY_TICKS_DEFAULT); + + errors.pui.err.UnderFrequency = setError( f_min, + errors.pui.err.UnderFrequency, + &FMinCnt, + ERRORS_DELAY_TICKS_DEFAULT); + + + /* Температуры */ + errors.pui.err.OverTemperature = setError(errors.prvt.f.err.temp_err, + errors.pui.err.OverTemperature, + &TMaxCnt, + ERRORS_DELAY_TICKS_DEFAULT); +} + +void UPP_Errors_LossPhase(void) +{ + /* Счетчики для отсчитывания задержки выставления ошибки */ + static int LossPhaseAllCnt = 0; + static int LossPhaseACnt = 0; + static int LossPhaseBCnt = 0; + static int LossPhaseCCnt = 0; + + int loss_phases_all = ( errors.prvt.f.err.ia_min && + errors.prvt.f.err.ib_min && + errors.prvt.f.err.ic_min ); + + errors.pui.err.LossPhaseAll = setError( loss_phases_all, + errors.pui.err.LossPhaseAll, + &LossPhaseAllCnt, + ERRORS_DELAY_TICKS_DEFAULT); + + /* Если хотя бы одна фаза есть проверяем фазы отдельно */ + if(!errors.pui.err.LossPhaseAll) + { + errors.pui.err.LossPhaseA = setError( errors.prvt.f.err.ia_min, + errors.pui.err.LossPhaseA, + &LossPhaseACnt, + ERRORS_DELAY_TICKS_DEFAULT); + + errors.pui.err.LossPhaseB = setError( errors.prvt.f.err.ib_min, + errors.pui.err.LossPhaseB, + &LossPhaseBCnt, + ERRORS_DELAY_TICKS_DEFAULT); + + errors.pui.err.LossPhaseC = setError( errors.prvt.f.err.ic_min, + errors.pui.err.LossPhaseC, + &LossPhaseCCnt, + ERRORS_DELAY_TICKS_DEFAULT); + } + /* Если всех фаз нет, то отдельные не смотрим */ + else + { + errors.pui.err.LossPhaseA = 0; + errors.pui.err.LossPhaseB = 0; + errors.pui.err.LossPhaseC = 0; + } +} + +void UPP_Errors_Other(void) +{ + static int InterlaceCnt = 0; + + if(errors.prvt.f.err.longstart) + errors.pui.err.LongStart = 1; + else + errors.pui.err.LongStart = 0; + + errors.pui.err.Interlace = setError(errors.prvt.f.err.interlance, + errors.pui.err.Interlace, + &InterlaceCnt, + ERRORS_DELAY_TICKS_DEFAULT); + //Interlance +} + static UPP_ErrorType_t UPP_SelectCommonError(void) { // Пока нет ошибки @@ -38,7 +198,20 @@ static UPP_ErrorType_t UPP_SelectCommonError(void) return best; } -void UPP_ErrorsHandle(void) + +static int setError(int condition, int flag, int *timer, int delay) { - errors.common = UPP_SelectCommonError(); + if (condition) { + if (*timer < delay) + (*timer)++; + else + flag = 1; + } else { + if (*timer > 0) + (*timer)--; + else + flag = 0; + } + + return flag; } \ No newline at end of file diff --git a/UPP/Core/UPP/upp_errors.h b/UPP/Core/UPP/upp_errors.h index ac04ca6..dfafbab 100644 --- a/UPP/Core/UPP/upp_errors.h +++ b/UPP/Core/UPP/upp_errors.h @@ -64,36 +64,37 @@ typedef struct struct { /* Програмные ошибки */ - unsigned Internal_1:1; ///< Внутренняя неисправность УПП 1 - unsigned Internal_2:1; ///< Внутренняя неисправность УПП 2 - unsigned Internal_3:1; ///< Внутренняя неисправность УПП 3 - unsigned Internal_4:1; ///< Внутренняя неисправность УПП 4 - unsigned Internal_5:1; ///< Внутренняя неисправность УПП 5 - unsigned Internal_6:1; ///< Внутренняя неисправность УПП 6 + unsigned Internal_1:1; ///< Ошибка 1: Внутренняя неисправность УПП 1 + unsigned Internal_2:1; ///< Ошибка 2: Внутренняя неисправность УПП 2 + unsigned Internal_3:1; ///< Ошибка 3: Внутренняя неисправность УПП 3 + unsigned Internal_4:1; ///< Ошибка 4: Внутренняя неисправность УПП 4 + unsigned Internal_5:1; ///< Ошибка 5: Внутренняя неисправность УПП 5 + unsigned Internal_6:1; ///< Ошибка 6: Внутренняя неисправность УПП 6 /* Ошибки по питанию */ - unsigned Power_Digit_5V:1; ///< Неисправность цифрового источника питания (5 В) - unsigned Power_24V:1; ///< Неисправность источника питания 24 В - unsigned Power_Analog_5V:1; ///< Неисправность аналогового источника питания микроконтроллера (± 5 В) - unsigned Power_SCI_5V:1; ///< Неисправность источника питания последовательных интерфейсов микроконтроллера (5 В) - unsigned Power_DIO_24V:1; ///< Неисправность источника питания дискретных входов/выходов (24 В) + unsigned Power_Digit_5V:1; ///< Ошибка 7: Неисправность цифрового источника питания (5 В) + unsigned Power_24V:1; ///< Ошибка 8: Неисправность источника питания 24 В + unsigned Power_Analog_5V:1; ///< Ошибка 9: Неисправность аналогового источника питания микроконтроллера (± 5 В) + unsigned Power_SCI_5V:1; ///< Ошибка 10: Неисправность источника питания последовательных интерфейсов микроконтроллера (5 В) + unsigned Power_DIO_24V:1; ///< Ошибка 11: Неисправность источника питания дискретных входов/выходов (24 В) /* Ошибки по допустимым пределам Наряжений/Токов/Температуры */ - unsigned OverCurrent:1; ///< Ток выше допустимого (см. Imax и TiMax в @ref UPP_PUI_Params_t) - unsigned OverVoltage:1; ///< Напряжение сети выше допустимого (см. Umах в @ref UPP_PUI_Params_t) - unsigned OverTemperature:1; ///< Температура выше допустимой (плюс 85 °C) - unsigned UnderVoltage:1; ///< Напряжение сети ниже допустимого (см. Umin в @ref UPP_PUI_Params_t) + unsigned OverCurrent:1; ///< Ошибка 12: Ток выше допустимого (см. Imax и TiMax в @ref UPP_PUI_Params_t) + unsigned OverVoltage:1; ///< Ошибка 13: Напряжение сети выше допустимого (см. Umах в @ref UPP_PUI_Params_t) + unsigned OverTemperature:1; ///< Ошибка 14: Температура выше допустимой (плюс 85 °C) + unsigned UnderVoltage:1; ///< Ошибка 15: Напряжение сети ниже допустимого (см. Umin в @ref UPP_PUI_Params_t) /* Ошибки по обрывам фаз */ - unsigned LossPhaseA:1; ///< Обрыв фазы A (см. Imin в @ref UPP_PUI_Params_t) - unsigned LossPhaseB:1; ///< Обрыв фазы B (см. Imin в @ref UPP_PUI_Params_t) - unsigned LossPhaseC:1; ///< Обрыв фазы C (см. Imin в @ref UPP_PUI_Params_t) + unsigned LossPhaseAll:1; ///< Ошибка 16: Обрыв трёх фаз (см. Imin в @ref UPP_PUI_Params_t) + unsigned LossPhaseA:1; ///< Ошибка 17: Обрыв фазы A (см. Imin в @ref UPP_PUI_Params_t) + unsigned LossPhaseB:1; ///< Ошибка 18: Обрыв фазы B (см. Imin в @ref UPP_PUI_Params_t) + unsigned LossPhaseC:1; ///< Ошибка 19: Обрыв фазы C (см. Imin в @ref UPP_PUI_Params_t) /* Другие ошибки */ - unsigned LongStart:1; ///< Затянутый пуск (ток не спадает за установленное время) (см. Tdelay в @ref UPP_PUI_Params_t) - unsigned Interlace:1; ///< Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t) - unsigned OverFrequency:1; ///< Частота сети выше допустимой - unsigned UnderFrequency:1; ///< Частота сети ниже допустимой + unsigned LongStart:1; ///< Ошибка 20: Затянутый пуск (ток не спадает за установленное время) (см. Tdelay в @ref UPP_PUI_Params_t) + unsigned Interlace:1; ///< Ошибка 21: Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t) + unsigned OverFrequency:1; ///< Ошибка 22: Частота сети выше допустимой + unsigned UnderFrequency:1; ///< Ошибка 23: Частота сети ниже допустимой }err; }pui; @@ -104,6 +105,39 @@ typedef struct uint64_t all; struct { + unsigned uamp_max:1; + unsigned uamp_min:1; + unsigned iamp_max:1; + unsigned iamp_min:1; + + unsigned ic_max:1; + unsigned ic_min:1; + unsigned ib_max:1; + unsigned ib_min:1; + unsigned ia_max:1; + unsigned ia_min:1; + + unsigned uba_max:1; + unsigned uba_min:1; + unsigned uac_max:1; + unsigned uac_min:1; + unsigned ubc_max:1; + unsigned ubc_min:1; + + unsigned fba_max:1; + unsigned fba_min:1; + unsigned fac_max:1; + unsigned fac_min:1; + unsigned fbc_max:1; + unsigned fbc_min:1; + + + unsigned temp_warn:1; + unsigned temp_err:1; + + unsigned longstart:1; + unsigned interlance:3; + unsigned slow_calc_overrun:1; }err; }f; @@ -120,6 +154,6 @@ typedef struct }UPP_Errors_t; extern UPP_Errors_t errors; -void UPP_ErrorsHandle(void); +void UPP_Errors_Handle(void); #endif //_UPP_ERRORS_H \ No newline at end of file diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index 6ca39aa..c039738 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -9,7 +9,7 @@ #include "tim.h" UPP_t upp; -float alpha_dbg = 0.5; +float iref_dbg = 0; // ОСНОВНОЙ ЦИКЛ main.c /** @@ -52,73 +52,84 @@ int UPP_PreWhile(void) */ int UPP_While(void) { - // если ошибка вызываем СТОП - if(errors.pui.all) + if(upp.pm.f.runSlow) { - upp.call->stop = 1; - } - // иначе снимаем СТОП + // если ошибка вызываем СТОП + if(errors.pui.all) + { + upp.call->stop = 0; + } + // иначе снимаем СТОП + else + { + upp.call->stop = 0; + } + if (upp.call->stop) + upp.workmode = WM_Error; + + // Сброс на дефолтные по запросу + if(upp.call->set_default_pui) + { + UPP_SetDefault(1, 0); + } + if(upp.call->set_default_internal) + { + UPP_SetDefault(0, 1); + } + + PowerMonitor_SlowCalc(&upp.pm); + + + // Если СТОП - переходим в ошибку + // Автомат состояний УПП + switch(upp.workmode) + { + case WM_Ready: + // если пришла команда на запуск + if (upp.call->go) + { + upp.workmode = WM_Running; + Angle_PID_Reset(&upp.hangle); + upp.StartTick = local_time(); + } + break; + + case WM_Running: + // если пришла команда на остановку + if (!upp.call->go) + upp.workmode = WM_Ready; + + // Регулирование тиристоров + Angle_PID(&upp.hangle, iref_dbg, upp.pm.measured.final.Iamp); + + // если слишком долгий запуск + if((local_time() - upp.StartTick) > (upp.PUI.params->Tdelay*1000)) + { + errors.pui.err.LongStart = 1; + } + break; + + case WM_Error: + if(errors.common == Err_None) + upp.workmode = WM_Ready; + + PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ + break; + + case WM_Done: + PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ + break; + + default: + break; + } + + upp.pm.f.runSlow = 0; + }//if(upp.pm.f.runSlow) else { - upp.call->stop = 0; - } - // Сброс на дефолтные по запросу - if(upp.call->set_default_pui) - { - UPP_SetDefault(1, 0); - } - if(upp.call->set_default_internal) - { - UPP_SetDefault(0, 1); - } - - - - - PowerMonitor_SlowHandle(&upp.pm); - // Если СТОП - переходим в ошибку - if (upp.call->stop) - upp.workmode = WM_Error; - // Автомат состояний УПП - switch(upp.workmode) - { - case WM_Ready: - // если пришла команда на запуск - if (upp.call->go) - { - upp.workmode = WM_Running; - upp.StartTick = local_time(); - } - break; - case WM_Running: - // если пришла команда на остановку - if (!upp.call->go) - upp.workmode = WM_Ready; - - // если слишком долгий запуск - if((local_time() - upp.StartTick) > (upp.PUI.params->Tdelay*1000)) - { - errors.pui.err.LongStart = 1; - } - break; - - case WM_Error: - if(errors.common == Err_None) - upp.workmode = WM_Ready; - - PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ - break; - - case WM_Done: - PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ - break; - - default: - break; } - - return 0; } @@ -131,7 +142,7 @@ void UPP_Tick(void) { if(upp.workmode == WM_Not_Init) return; - UPP_ErrorsHandle(); + UPP_Errors_Handle(); UPP_Control_InternalParams(); } @@ -143,7 +154,7 @@ void UPP_ADC_Handle(void) { BenchTime_Start(BT_ADC, angletim.Instance->CNT, HAL_MAX_DELAY); - PowerMonitor_Handle(&upp.pm); + PowerMonitor_FastCalc(&upp.pm); for(int phase = 0; phase < 3; phase++) { @@ -157,7 +168,7 @@ void UPP_ADC_Handle(void) UPP_HalfWave_t curr_halfwave = ZC_GetHalfWave(&upp.pm.zc, phase); PWM_SetHalfWave(&upp.hpwm, phase, curr_halfwave); // Начинаем отсчитывать угол - Angle_Start(&upp.hangle, phase, alpha_dbg, 10); + Angle_Start(&upp.hangle, phase, 10); } } } diff --git a/UPP/Core/UPP/upp_main.h b/UPP/Core/UPP/upp_main.h index 976e2f3..c5c45c8 100644 --- a/UPP/Core/UPP/upp_main.h +++ b/UPP/Core/UPP/upp_main.h @@ -17,8 +17,6 @@ #include "upp_status.h" // статус упп #include "upp_control.h" // управление упп -extern float alpha_dbg; - typedef struct {