diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index 7899bcf..827ce7c 100644 Binary files a/MATLAB/upp_r2023.slx and b/MATLAB/upp_r2023.slx differ diff --git a/UPP/Core/Configs/upp_defs.h b/UPP/Core/Configs/upp_defs.h index f37f589..37be046 100644 --- a/UPP/Core/Configs/upp_defs.h +++ b/UPP/Core/Configs/upp_defs.h @@ -74,6 +74,51 @@ typedef enum { Err_Interlace = 21, ///< Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t) } UPP_ErrorType_t; +/** + * @brief Структура аварий УПП для ПУИ + */ +typedef struct +{ + /* Програмные ошибки */ + 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; ///< Ошибка 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; ///< Ошибка 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 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; ///< Ошибка 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: Частота сети ниже допустимой +}UPP_PUI_Error_t; + +/** + * @brief Структура предупреждений УПП для ПУИ + */ +typedef struct +{ +}UPP_PUI_Warnings_t; /** * @brief Структура данных от УПП передаваемых в ПУИ @@ -85,13 +130,32 @@ typedef struct { uint16_t WorkMode; /** @brief Адрес 1: Режим работы @details «Готовность» или «Работа» */ - uint16_t Voltage; /** @brief Адрес 2: Напряжение на входе УПП, Вольты */ + uint16_t Uall; /** @brief Адрес 2: Среднее напряжение по трем фазам на входе УПП (RMS), Вольты */ + uint16_t Uab; /** @brief Адрес 3: Напряжение фазы AB (RMS), Вольты */ + uint16_t Ubc; /** @brief Адрес 4: Напряжение фазы BC (RMS), Вольты */ + uint16_t Uca; /** @brief Адрес 5: Напряжение фазы CA (RMS), Вольты */ - uint16_t Current; /** @brief Адрес 3: Ток на входе УПП, Амперы */ + uint16_t Iall; /** @brief Адрес 6: Средний ток по трем фазам на входе УПП (RMS), Амперы */ + uint16_t Ia; /** @brief Адрес 7: Ток фазы A (RMS), Амперы */ + uint16_t Ib; /** @brief Адрес 8: Ток фазы B (RMS), Амперы */ + uint16_t Ic; /** @brief Адрес 9: Ток фазы C (RMS), Амперы */ - uint16_t Frequency; /** @brief Адрес 4: Частота напряжения на входе УПП */ + uint16_t Fall; /** @brief Адрес 10: Средняя частота напряжений по трем фазам на входе УПП, Герцы */ + uint16_t Fab; /** @brief Адрес 11: Частота напряжения фазы AB, Герцы */ + uint16_t Fbc; /** @brief Адрес 12: Частота напряжения фазы BC, Герцы */ + uint16_t Fca; /** @brief Адрес 13: Частота напряжения фазы CA, Герцы */ - uint16_t Temperature; /** @brief Адрес 5: Температура радиатора тиристоров, Градусы Цельсия */ + uint16_t Temperature1; /** @brief Адрес 14: Температура радиатора тиристоров, Градусы Цельсия */ + uint16_t Temperature2; /** @brief Адрес 15: Температура радиатора тиристоров, Градусы Цельсия */ + + uint16_t reserved[10]; /** @brief Адрес 16-49: Зарезервированны*/ + + + union + { + uint16_t all; + UPP_PUI_Warnings_t warn; + }Warnings; /** @brief Адрес 4: Частота напряжения на входе УПП */ } UPP_PUI_Values_t; /** @@ -180,11 +244,12 @@ typedef struct { #define SQRT2 1.4142135 /* Дефайны для "удобного" доступа к структурам */ -#define PARAM_INTERNAL MB_INTERNAL.param -#define PARAM_PUI MB_DATA.HoldRegs.pui_params -#define ERR_PUI errors.pui.err -#define ERR_PRIVATE errors.prvt.f.err -#define ERR_PRIVATE_CNT errors.prvt.cnt +//#define PARAM_INTERNAL MB_INTERNAL.param +//#define PARAM_PUI MB_DATA.HoldRegs.pui_params +//#define ERR_PUI errors.pui.err +//#define ERR_PRIVATE errors.prvt.f.err +//#define ERR_PRIVATE_CNT errors.prvt.cnt + /* Enum'ы УПП */ /** diff --git a/UPP/Core/Inc/main.h b/UPP/Core/Inc/main.h index 9c14f2b..ef1b27f 100644 --- a/UPP/Core/Inc/main.h +++ b/UPP/Core/Inc/main.h @@ -52,6 +52,12 @@ extern "C" { /* Exported macro ------------------------------------------------------------*/ /* USER CODE BEGIN EM */ +/* Дефайны для "удобного" доступа к структурам */ +static UPP_PrvtParams_t *PARAM_INTERNAL = &MB_INTERNAL.param; +static UPP_PUI_Params_t *PARAM_PUI = &MB_DATA.HoldRegs.pui_params; +static UPP_PUI_Error_t *ERR_PUI = &errors.pui.err; +static UPP_PrvtErrors_t *ERR_PRIVATE = &errors.prvt.f.err; +static UPP_ErrorsCnt_t *ERR_PRIVATE_CNT = &errors.prvt.cnt; /* USER CODE END EM */ /* Exported functions prototypes ---------------------------------------------*/ diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c index 219aa08..3f269c3 100644 --- a/UPP/Core/PowerMonitor/power_monitor.c +++ b/UPP/Core/PowerMonitor/power_monitor.c @@ -130,8 +130,8 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm) float iphase_mean = 0; // средний ток каждой фазы float uphase_mean = 0; // среднее напряжение каждой фазы // Дополнительно посчитаем значения в реальных Вольтах/Амперах - float u_base = u2f(PARAM_INTERNAL.nominal.U, 10); - float i_base = u2f(PARAM_INTERNAL.nominal.I, 10); + float u_base = u2f(PARAM_INTERNAL->nominal.U, 10); + float i_base = u2f(PARAM_INTERNAL->nominal.I, 10); for(int i = 0; i < 3; i++) { /* Получение частоты фазы */ @@ -189,8 +189,8 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm) { if(hpm == NULL) return; - float u_base = u2f(PARAM_INTERNAL.nominal.U, 10); - float i_base = u2f(PARAM_INTERNAL.nominal.I, 10); + float u_base = u2f(PARAM_INTERNAL->nominal.U, 10); + float i_base = u2f(PARAM_INTERNAL->nominal.I, 10); PowerMonitor_Measured_t *meas = &hpm->measured; /* Считываем АЦП с пересчетами и медианой фильтрацией от выбросов */ @@ -233,8 +233,8 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm) } else // если уже запущена - ставим overrun slow calc { - ERR_PRIVATE.overrun_slow_calc = 1; - ERR_PRIVATE_CNT.overrun_slow_calc++; + ERR_PRIVATE->overrun_slow_calc = 1; + ERR_PRIVATE_CNT->overrun_slow_calc++; } } else @@ -258,21 +258,21 @@ int PowerMonitor_Protect(PowerMonitor_t *hpm, uint8_t Running) return 1; PowerMonitor_Measured_t *measure = &hpm->measured; - UPP_PUI_Params_t *protect = &PARAM_PUI; - UPP_ParamsNominal_t *nominal = &PARAM_INTERNAL.nominal; + UPP_PUI_Params_t *params = PARAM_PUI; + UPP_ParamsNominal_t *nominal = &PARAM_INTERNAL->nominal; /*=============== ЗАЩИТЫ ПО НАПРЯЖЕНИЮ ==================*/ - hpm->f.isU = Protect_Voltages(measure, protect, nominal); + hpm->f.isU = Protect_Voltages(measure, params, nominal); /* Если УПП в работе */ if(Running) { /*=============== ЗАЩИТЫ ПО ТОКУ ==================*/ - hpm->f.isI = Protect_Currents(measure, protect, nominal); + hpm->f.isI = Protect_Currents(measure, params, nominal); } /*=============== ЗАЩИТЫ ВСЯКИЕ ДРУГИЕ ==================*/ - Protect_Misc(measure, protect, nominal); + Protect_Misc(measure, params, nominal); if(errors.prvt.f.all) diff --git a/UPP/Core/PowerMonitor/power_protect.c b/UPP/Core/PowerMonitor/power_protect.c index 11ac38b..74e254b 100644 --- a/UPP/Core/PowerMonitor/power_protect.c +++ b/UPP/Core/PowerMonitor/power_protect.c @@ -14,40 +14,40 @@ * Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ * @return 1 - напряжение есть, 0 - напряжения нет */ -int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal) +int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal) { /* Переводим уставки ПУИ в удобный вид */ - float lUmin = u2f(protect->Umin, 100)/**u2f(nominal->U, 10)*/; - float lUmax = u2f(protect->Umax, 100)/**u2f(nominal->U, 10)*/; + float lUmin = u2f(params->Umin, 100)/**u2f(nominal->U, 10)*/; + float lUmax = u2f(params->Umax, 100)/**u2f(nominal->U, 10)*/; float lPhaseSequence = u2f(nominal->PhaseSequence, 100); /* Общее напряжение */ if(measure->final.Uamp > lUmax) { - ERR_PRIVATE.uamp_max = 1; + ERR_PRIVATE->uamp_max = 1; } else if (measure->final.Uamp < lUmin) { - ERR_PRIVATE.uamp_min = 1; + ERR_PRIVATE->uamp_min = 1; } else { - ERR_PRIVATE.uamp_max = 0; - ERR_PRIVATE.uamp_min = 0; + ERR_PRIVATE->uamp_max = 0; + ERR_PRIVATE->uamp_min = 0; } /* Последовательность фаз */ int realPhaseSequence = 0; if(realPhaseSequence != lPhaseSequence) { - ERR_PRIVATE.interlance = 1; + ERR_PRIVATE->interlance = 1; } else { - ERR_PRIVATE.interlance = 0; + ERR_PRIVATE->interlance = 0; } - return (ERR_PRIVATE.uamp_min == 0); + return (ERR_PRIVATE->uamp_min == 0); } /** @@ -55,72 +55,72 @@ int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect * @note Заполняет флаги prvt ошибок (приватные). * Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ */ -int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal) +int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal) { /* Переводим уставки ПУИ в удобный вид */ - float lIref = u2f(protect->Iref, 100)/**u2f(nominal->I, 10)*/; - float lImin = u2f(protect->Imin, 100)/**u2f(nominal->I, 10)*/; - float lImax = u2f(protect->Imax, 100) * 50 / u2f(nominal->I, 10); // Imax процентов от 50 А, в о.е. от номинального + float lIref = u2f(params->Iref, 100)/**u2f(nominal->I, 10)*/; + float lImin = u2f(params->Imin, 100)/**u2f(nominal->I, 10)*/; + float lImax = u2f(params->Imax, 100) * 50 / u2f(nominal->I, 10); // Imax процентов от 50 А, в о.е. от номинального /* Общий ток */ if(measure->final.Iamp > lImax) { - ERR_PRIVATE.iamp_max = 1; + ERR_PRIVATE->iamp_max = 1; } else if (measure->final.Iamp < lImin) { - ERR_PRIVATE.iamp_min = 1; + ERR_PRIVATE->iamp_min = 1; } else { - ERR_PRIVATE.iamp_max = 0; - ERR_PRIVATE.iamp_min = 0; + ERR_PRIVATE->iamp_max = 0; + ERR_PRIVATE->iamp_min = 0; } /* Ток по фазам */ if(measure->final.I[I_A] > lImax) { - ERR_PRIVATE.ia_max = 1; + ERR_PRIVATE->ia_max = 1; } else if (measure->final.I[I_A] < lImin) { - ERR_PRIVATE.ia_min = 1; + ERR_PRIVATE->ia_min = 1; } else { - ERR_PRIVATE.ia_max = 0; - ERR_PRIVATE.ia_min = 0; + ERR_PRIVATE->ia_max = 0; + ERR_PRIVATE->ia_min = 0; } if(measure->final.I[I_B] > lImax) { - ERR_PRIVATE.ib_max = 1; + ERR_PRIVATE->ib_max = 1; } else if (measure->final.I[I_B] < lImin) { - ERR_PRIVATE.ib_min = 1; + ERR_PRIVATE->ib_min = 1; } else { - ERR_PRIVATE.ib_max = 0; - ERR_PRIVATE.ib_min = 0; + ERR_PRIVATE->ib_max = 0; + ERR_PRIVATE->ib_min = 0; } if(measure->final.I[I_C] > lImax) { - ERR_PRIVATE.ic_max = 1; + ERR_PRIVATE->ic_max = 1; } else if (measure->final.I[I_C] < lImin) { - ERR_PRIVATE.ic_min = 1; + ERR_PRIVATE->ic_min = 1; } else { - ERR_PRIVATE.ic_max = 0; - ERR_PRIVATE.ic_min = 0; + ERR_PRIVATE->ic_max = 0; + ERR_PRIVATE->ic_min = 0; } - return (ERR_PRIVATE.iamp_min == 0); + return (ERR_PRIVATE->iamp_min == 0); } @@ -130,58 +130,58 @@ int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect * @note Заполняет флаги prvt ошибок (приватные). * Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ */ -void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal) +void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal) { /* Переводим внутренние уставки в удобный вид */ - float lFnom = u2f(PARAM_INTERNAL.nominal.F, 100); - float lFmin = lFnom - lFnom*u2f(PARAM_INTERNAL.nominal.F_deviation_minus, 10000); - float lFmax = lFnom + lFnom*u2f(PARAM_INTERNAL.nominal.F_deviation_plus, 10000); + float lFnom = u2f(PARAM_INTERNAL->nominal.F, 100); + float lFmin = lFnom - lFnom*u2f(PARAM_INTERNAL->nominal.F_deviation_minus, 10000); + float lFmax = lFnom + lFnom*u2f(PARAM_INTERNAL->nominal.F_deviation_plus, 10000); - float lTwarn = u2f(PARAM_INTERNAL.setpoints.TemperatureWarn, 100); - float lTerr = u2f(PARAM_INTERNAL.setpoints.TemperatureWarn, 100); + float lTwarn = u2f(PARAM_INTERNAL->setpoints.TemperatureWarn, 100); + float lTerr = u2f(PARAM_INTERNAL->setpoints.TemperatureWarn, 100); /*=============== ЗАЩИТЫ ПО ЧАСТОТЕ ==================*/ if(measure->final.F[U_CA] > lFmax) { - ERR_PRIVATE.fac_max = 1; + ERR_PRIVATE->fac_max = 1; } else if (measure->final.F[U_CA] < lFmin) { - ERR_PRIVATE.fac_min = 1; + ERR_PRIVATE->fac_min = 1; } else { - ERR_PRIVATE.fac_max = 0; - ERR_PRIVATE.fac_min = 0; + ERR_PRIVATE->fac_max = 0; + ERR_PRIVATE->fac_min = 0; } if(measure->final.F[U_AB] > lFmax) { - ERR_PRIVATE.fba_max = 1; + ERR_PRIVATE->fba_max = 1; } else if (measure->final.F[U_AB] < lFmin) { - ERR_PRIVATE.fba_min = 1; + ERR_PRIVATE->fba_min = 1; } else { - ERR_PRIVATE.fba_max = 0; - ERR_PRIVATE.fba_min = 0; + ERR_PRIVATE->fba_max = 0; + ERR_PRIVATE->fba_min = 0; } if(measure->final.F[U_BC] > lFmax) { - ERR_PRIVATE.fbc_max = 1; + ERR_PRIVATE->fbc_max = 1; } else if (measure->final.F[U_BC] < lFmin) { - ERR_PRIVATE.fbc_min = 1; + ERR_PRIVATE->fbc_min = 1; } else { - ERR_PRIVATE.fbc_max = 0; - ERR_PRIVATE.fbc_min = 0; + ERR_PRIVATE->fbc_max = 0; + ERR_PRIVATE->fbc_min = 0; } @@ -189,15 +189,15 @@ void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, U /*=============== ЗАЩИТЫ ПО ТЕМПЕРАТУРЕ ==================*/ if(measure->final.T[TEMP_1] > lTerr) { - ERR_PRIVATE.temp_err = 1; + ERR_PRIVATE->temp_err = 1; } else if (measure->final.T[TEMP_1] > lTwarn) { - ERR_PRIVATE.temp_warn = 1; + ERR_PRIVATE->temp_warn = 1; } else { - ERR_PRIVATE.temp_err = 0; - ERR_PRIVATE.temp_warn = 0; + ERR_PRIVATE->temp_err = 0; + ERR_PRIVATE->temp_warn = 0; } } diff --git a/UPP/Core/PowerMonitor/power_protect.h b/UPP/Core/PowerMonitor/power_protect.h index c19502b..06114d9 100644 --- a/UPP/Core/PowerMonitor/power_protect.h +++ b/UPP/Core/PowerMonitor/power_protect.h @@ -10,9 +10,9 @@ /* Проверяет защиты по напряжению. */ -int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal); +int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal); /* Проверяет защиты по току. */ -int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal); +int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal); /* Проверяет всякие другие защиты (частота, температура). */ -void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal); +void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal); #endif /* _POWER_PROTECT_H_ */ diff --git a/UPP/Core/UPP/upp_errors.c b/UPP/Core/UPP/upp_errors.c index 090a843..1ea4619 100644 --- a/UPP/Core/UPP/upp_errors.c +++ b/UPP/Core/UPP/upp_errors.c @@ -7,10 +7,10 @@ Общая логика: В программе выставляются всякие внутренние флаги ошибок: ERR_PRIVATE В этом модуле смотрятся какие флаги выставились и переносят эти флаги -в структуру ошибок ПУИ ERR_PUI. +в структуру ошибок ПУИ ERR_PUI-> Исключение: Программные ошибки и ошибки питания плат, -они пишутся напрямую в ERR_PUI. +они пишутся напрямую в ERR_PUI-> Также реализована защита от дребезга и в целом задержка на выставление ошибок. ******************************************************************************/ @@ -67,17 +67,17 @@ void UPP_Errors_Power(void) int err_5Vsi = GPIO_Read_Switch(&UPP_DIN.err_5Vsi); int err_Va = GPIO_Read_Switch(&UPP_DIN.err_Va); - ERR_PUI.Power_DIO_24V = err_24Vdio; - ERR_PUI.Power_24V = err_24V; - ERR_PUI.Power_Digit_5V = err_5Vd; - ERR_PUI.Power_SCI_5V = err_5Vsi; - ERR_PUI.Power_Analog_5V = err_Va; + ERR_PUI->Power_DIO_24V = err_24Vdio; + ERR_PUI->Power_24V = err_24V; + ERR_PUI->Power_Digit_5V = err_5Vd; + ERR_PUI->Power_SCI_5V = err_5Vsi; + ERR_PUI->Power_Analog_5V = err_Va; } void UPP_Errors_Ranges(void) { /* Преобразуем уставки в нормальные тики */ - float ticksTiMax = u2f(PARAM_PUI.TiMax, 1)/PM_SLOW_PERIOD_US; + float ticksTiMax = u2f(PARAM_PUI->TiMax, 1)/PM_SLOW_PERIOD_US; /* Счетчики для отсчитывания задержки выставления ошибки */ static int IMaxCnt = 0; static int UMaxCnt = 0; @@ -87,48 +87,48 @@ void UPP_Errors_Ranges(void) static int TMaxCnt = 0; /* Напряжения */ - ERR_PUI.OverVoltage = setError(ERR_PRIVATE.uamp_max, - ERR_PUI.OverVoltage, + ERR_PUI->OverVoltage = setError(ERR_PRIVATE->uamp_max, + ERR_PUI->OverVoltage, &UMaxCnt, MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR)); - ERR_PUI.UnderVoltage = setError(ERR_PRIVATE.uamp_min, - ERR_PUI.UnderVoltage, + ERR_PUI->UnderVoltage = setError(ERR_PRIVATE->uamp_min, + ERR_PUI->UnderVoltage, &UMinCnt, MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR)); /* Токи */ - int i_max = ( ERR_PRIVATE.iamp_max || - ERR_PRIVATE.ia_max || - ERR_PRIVATE.ib_max || - ERR_PRIVATE.ic_max); - ERR_PUI.OverCurrent = setError(i_max, - ERR_PUI.OverCurrent, + int i_max = ( ERR_PRIVATE->iamp_max || + ERR_PRIVATE->ia_max || + ERR_PRIVATE->ib_max || + ERR_PRIVATE->ic_max); + ERR_PUI->OverCurrent = setError(i_max, + ERR_PUI->OverCurrent, &IMaxCnt, ticksTiMax); /* Частота */ - int f_max = ( ERR_PRIVATE.fac_max || - ERR_PRIVATE.fba_max || - ERR_PRIVATE.fbc_max); - int f_min = ( ERR_PRIVATE.fac_min || - ERR_PRIVATE.fba_min || - ERR_PRIVATE.fbc_min); - ERR_PUI.OverFrequency = setError(f_max, - ERR_PUI.OverFrequency, + int f_max = ( ERR_PRIVATE->fac_max || + ERR_PRIVATE->fba_max || + ERR_PRIVATE->fbc_max); + int f_min = ( ERR_PRIVATE->fac_min || + ERR_PRIVATE->fba_min || + ERR_PRIVATE->fbc_min); + ERR_PUI->OverFrequency = setError(f_max, + ERR_PUI->OverFrequency, &FMaxCnt, MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR)); - ERR_PUI.UnderFrequency = setError( f_min, - ERR_PUI.UnderFrequency, + ERR_PUI->UnderFrequency = setError( f_min, + ERR_PUI->UnderFrequency, &FMinCnt, MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR)); /* Температуры */ - ERR_PUI.OverTemperature = setError(ERR_PRIVATE.temp_err, - ERR_PUI.OverTemperature, + ERR_PUI->OverTemperature = setError(ERR_PRIVATE->temp_err, + ERR_PUI->OverTemperature, &TMaxCnt, MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); } @@ -141,39 +141,39 @@ void UPP_Errors_LossPhase(void) static int LossPhaseBCnt = 0; static int LossPhaseCCnt = 0; - int loss_phases_all = ( ERR_PRIVATE.ia_min && - ERR_PRIVATE.ib_min && - ERR_PRIVATE.ic_min ); + int loss_phases_all = ( ERR_PRIVATE->ia_min && + ERR_PRIVATE->ib_min && + ERR_PRIVATE->ic_min ); - ERR_PUI.LossPhaseAll = setError( loss_phases_all, - ERR_PUI.LossPhaseAll, + ERR_PUI->LossPhaseAll = setError( loss_phases_all, + ERR_PUI->LossPhaseAll, &LossPhaseAllCnt, MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); /* Если хотя бы одна фаза есть проверяем фазы отдельно */ - if(!ERR_PUI.LossPhaseAll) + if(!ERR_PUI->LossPhaseAll) { - ERR_PUI.LossPhaseA = setError( ERR_PRIVATE.ia_min, - ERR_PUI.LossPhaseA, + ERR_PUI->LossPhaseA = setError( ERR_PRIVATE->ia_min, + ERR_PUI->LossPhaseA, &LossPhaseACnt, MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); - ERR_PUI.LossPhaseB = setError( ERR_PRIVATE.ib_min, - ERR_PUI.LossPhaseB, + ERR_PUI->LossPhaseB = setError( ERR_PRIVATE->ib_min, + ERR_PUI->LossPhaseB, &LossPhaseBCnt, MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); - ERR_PUI.LossPhaseC = setError( ERR_PRIVATE.ic_min, - ERR_PUI.LossPhaseC, + ERR_PUI->LossPhaseC = setError( ERR_PRIVATE->ic_min, + ERR_PUI->LossPhaseC, &LossPhaseCCnt, MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); } /* Если всех фаз нет, то отдельные не смотрим */ else { - ERR_PUI.LossPhaseA = 0; - ERR_PUI.LossPhaseB = 0; - ERR_PUI.LossPhaseC = 0; + ERR_PUI->LossPhaseA = 0; + ERR_PUI->LossPhaseB = 0; + ERR_PUI->LossPhaseC = 0; } } @@ -182,13 +182,13 @@ void UPP_Errors_Other(void) static int InterlaceCnt = 0; - if(ERR_PRIVATE.longstart) - ERR_PUI.LongStart = 1; + if(ERR_PRIVATE->longstart) + ERR_PUI->LongStart = 1; else - ERR_PUI.LongStart = 0; + ERR_PUI->LongStart = 0; - ERR_PUI.Interlace = setError(ERR_PRIVATE.interlance, - ERR_PUI.Interlace, + ERR_PUI->Interlace = setError(ERR_PRIVATE->interlance, + ERR_PUI->Interlace, &InterlaceCnt, MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); //Interlance diff --git a/UPP/Core/UPP/upp_errors.h b/UPP/Core/UPP/upp_errors.h index c314ffc..fdebec0 100644 --- a/UPP/Core/UPP/upp_errors.h +++ b/UPP/Core/UPP/upp_errors.h @@ -50,7 +50,62 @@ static const uint8_t UPP_ErrorPriority[] = }; +/** + * @brief Приватные ошибки + * @details Ииспользуются внутри программы и для определение ошибки для ПУИ + */ +typedef 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 overrun_slow_calc:1; + unsigned overrun_fast_calc:1; +}UPP_PrvtErrors_t; +/** + * @brief Счетчики ошибок + */ +typedef struct +{ + uint16_t angle_reinit_err; + uint16_t adc_reinit_err; + uint16_t zc_reinit_err; + uint16_t pwm_reinit_err; + uint16_t overrun_slow_calc; + uint16_t overrun_fast_calc; +}UPP_ErrorsCnt_t; + /** * @brief Структура с всеми ошибками УПП */ @@ -61,97 +116,18 @@ typedef struct union { uint32_t all; - struct - { - /* Програмные ошибки */ - 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; ///< Ошибка 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; ///< Ошибка 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 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; ///< Ошибка 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; + UPP_PUI_Error_t err; + }pui; ///< Ошибки ПУИ struct { union { 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 overrun_slow_calc:1; - unsigned overrun_fast_calc:1; - }err; + UPP_PrvtErrors_t err; }f; - struct - { - uint16_t angle_reinit_err; - uint16_t adc_reinit_err; - uint16_t zc_reinit_err; - uint16_t pwm_reinit_err; - uint16_t overrun_slow_calc; - uint16_t overrun_fast_calc; - }cnt; + UPP_ErrorsCnt_t cnt; }prvt; ///< Приватные ошибки, не идущие напрямую в ПУИ }UPP_Errors_t; diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index 092f558..6a94ed9 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -30,7 +30,7 @@ int UPP_App_Init(void) BenchTime_Init(); // Подключение указателей upp.errors = &errors; - upp.PUI.params = &PARAM_PUI; + upp.PUI.params = &MB_DATA.HoldRegs.pui_params; upp.PUI.values = &MB_DATA.InRegs.pui; upp.call = &MB_INTERNAL.FuncCalls; @@ -45,7 +45,7 @@ int UPP_App_Init(void) if(PWM_Init(&upp.hpwm) != HAL_OK) { return 1; - } + } if(Angle_Init(&upp.hangle) != HAL_OK) { return 1; @@ -89,13 +89,14 @@ int UPP_While(void) { static uint32_t slow_cnt = 0; upp.Timings.slow_calc_prd_us = BenchTime_Period(BT_SLOWCALC_PRD, angletim.Instance->CNT, HAL_MAX_DELAY)/ANGLE_TIM2_FREQ_MHZ; - BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY); + BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY); res = HAL_IWDG_Refresh(&hiwdg); // если не вызываются медленные расчеты - что-то не то сбрасываемся по watchdog + + int razgon_done = (fabsf(upp.hangle.Iref - u2f(PARAM_PUI->Iref, 100)) < 0.1); + // Медленные расчеты - PowerMonitor_SlowCalc(&upp.pm); - - int razgon_done = (fabsf(upp.hangle.Iref - u2f(PARAM_PUI.Iref, 100)) < 0.1); - + PowerMonitor_SlowCalc(&upp.pm); + #ifdef UPP_SIMULATE_I // симулируем токи upp.pm.measured.final.Iamp = upp.hangle.Iref/2; // При симуляции тока не включаем его проверку @@ -110,8 +111,6 @@ int UPP_While(void) UPP_Params_Control(); - - #ifndef UPP_DISABLE_ERROR_BLOCK // если ошибка вызываем СТОП upp.call->stop = (errors.common != Err_None); @@ -129,6 +128,7 @@ int UPP_While(void) // Если СТОП - переходим в ошибку if (upp.call->stop) upp.workmode = UPP_Error; + // Автомат состояний УПП switch(upp.workmode) { @@ -146,8 +146,8 @@ int UPP_While(void) } if(slow_cnt > MS_TO_SLOW_TICKS(UPP_INIT_BEFORE_READY_MS)) - { // конец инициализации - сбрасываем чтобы потом еще раз инициализироватся - slow_cnt = 0; + { // конец инициализации + slow_cnt = 0; // сбрасываем счетчик для следующей инициализации upp.workmode = UPP_Ready; } else @@ -188,16 +188,16 @@ int UPP_While(void) // Коррекция для отсчета угла открытия // 30 градусов - сдвиг между линейными и фазными напряжениями - // 30 градусов - фазовое смщеение эксп. фильтра АЦП для сглаживания напряжений + // 0 градусов - фазовое смщеение эксп. фильтра АЦП для сглаживания напряжений float Correction = 30 + 0; // Регулирование тиристоров - Angle_PID(&upp.hangle, u2f(PARAM_PUI.Iref,100), upp.pm.measured.final.Iamp, Correction); + Angle_PID(&upp.hangle, u2f(PARAM_PUI->Iref,100), upp.pm.measured.final.Iamp, Correction); // если слишком долгий запуск if((local_time() - upp.StartTick) > (upp.PUI.params->Tdelay*1000)) { - ERR_PRIVATE.longstart = 1; + ERR_PRIVATE->longstart = 1; } break; @@ -272,8 +272,8 @@ void UPP_ADC_Handle(void) if(upp.pm.f.inIsr) { - ERR_PRIVATE.overrun_fast_calc = 1; - ERR_PRIVATE_CNT.overrun_fast_calc++; + ERR_PRIVATE->overrun_fast_calc = 1; + ERR_PRIVATE_CNT->overrun_fast_calc++; return; } upp.pm.f.inIsr = 1; diff --git a/UPP/Core/UPP/upp_params.c b/UPP/Core/UPP/upp_params.c index 35ce7ca..fe85ad3 100644 --- a/UPP/Core/UPP/upp_params.c +++ b/UPP/Core/UPP/upp_params.c @@ -23,7 +23,7 @@ * * // В UPP_Params_ControlInternal(): * float new_param = module.param; -* if(__CheckParamF(&new_param, PARAM_INTERNAL.new_param, 1000)) +* if(__CheckParamF(&new_param, PARAM_INTERNAL->new_param, 1000)) * { * module_update = 1; * } @@ -36,7 +36,7 @@ * } * * // В UPP_Params_SetDefault(): -* PARAM_INTERNAL.new_param = NEW_PARAM_DEFAULT * 1000; +* PARAM_INTERNAL->new_param = NEW_PARAM_DEFAULT * 1000; * ****************************************************************************** */ @@ -75,7 +75,7 @@ void UPP_Params_ControlPUI(void) return; /* Tnt - Уставка на скорость нарастания пускового тока */ - float angle_ref_alphaPUI = PUI_Tnt_CalcAlpha(u2f(PARAM_PUI.Tnt, 1000), PM_SLOW_PERIOD_US); + float angle_ref_alphaPUI = PUI_Tnt_CalcAlpha(u2f(PARAM_PUI->Tnt, 1000), PM_SLOW_PERIOD_US); float angle_ref_alpha = upp.hangle.refFilter.alpha; if(angle_ref_alpha != angle_ref_alphaPUI) { @@ -85,7 +85,7 @@ void UPP_Params_ControlPUI(void) upp.hangle.pid.Ki, upp.hangle.pid.Kd, angle_ref_alpha) != HAL_OK) - ERR_PRIVATE_CNT.angle_reinit_err++; + ERR_PRIVATE_CNT->angle_reinit_err++; } @@ -133,23 +133,23 @@ void UPP_Params_ControlInternal(void) // Параметры регулятора Угла открытия - if(__CheckParamF(&angle_max, PARAM_INTERNAL.angle.Angle_Max, 65535)) + if(__CheckParamF(&angle_max, PARAM_INTERNAL->angle.Angle_Max, 65535)) { alpha_update = 1; } - if(__CheckParamF(&angle_min, PARAM_INTERNAL.angle.Angle_Min, 65535)) + if(__CheckParamF(&angle_min, PARAM_INTERNAL->angle.Angle_Min, 65535)) { alpha_update = 1; } - if(__CheckParamF(&angle_pid_kp, PARAM_INTERNAL.angle.PID_Kp, 10000)) + if(__CheckParamF(&angle_pid_kp, PARAM_INTERNAL->angle.PID_Kp, 10000)) { alpha_update = 1; } - if(__CheckParamF(&angle_pid_ki, PARAM_INTERNAL.angle.PID_Ki, 10000)) + if(__CheckParamF(&angle_pid_ki, PARAM_INTERNAL->angle.PID_Ki, 10000)) { alpha_update = 1; } - if(__CheckParamF(&angle_pid_kd, PARAM_INTERNAL.angle.PID_Kd, 10000)) + if(__CheckParamF(&angle_pid_kd, PARAM_INTERNAL->angle.PID_Kd, 10000)) { alpha_update = 1; } @@ -162,47 +162,47 @@ void UPP_Params_ControlInternal(void) adc_channel_zero[i] = upp.pm.adc.Coefs[i].lZero; // Максимальное измеряемое напряжение - if(__CheckParamF(&adc_channel_max[i], PARAM_INTERNAL.adc.ADC_Max[i], 10)) + if(__CheckParamF(&adc_channel_max[i], PARAM_INTERNAL->adc.ADC_Max[i], 10)) { adc_channel_update[i] = 1; } // Значение АЦП при нулевом входе - if(__CheckParamU16(&adc_channel_zero[i], PARAM_INTERNAL.adc.ADC_Zero[i])) + if(__CheckParamU16(&adc_channel_zero[i], PARAM_INTERNAL->adc.ADC_Zero[i])) { adc_channel_update[i] = 1; } } // Параметры алгоритма перехода через ноль - if(__CheckParamF(&zc_hysteresis, PARAM_INTERNAL.zc.Hysteresis, 10000)) + if(__CheckParamF(&zc_hysteresis, PARAM_INTERNAL->zc.Hysteresis, 10000)) { zc_update = 1; } - if(__CheckParamU16(&zc_debounce, PARAM_INTERNAL.zc.DebouneCouner)) + if(__CheckParamU16(&zc_debounce, PARAM_INTERNAL->zc.DebouneCouner)) { zc_update = 1; } // Параметры ШИМ - if(__CheckParamU8(&pwm_phase_mask, PARAM_INTERNAL.pwm.PhaseMask, 1)) + if(__CheckParamU8(&pwm_phase_mask, PARAM_INTERNAL->pwm.PhaseMask, 1)) { pwm_update = 1; } - if(__CheckParamU16(&pwm_freq, PARAM_INTERNAL.pwm.Frequency)) + if(__CheckParamU16(&pwm_freq, PARAM_INTERNAL->pwm.Frequency)) { pwm_update = 1; } - if(__CheckParamF(&pwm_duty, PARAM_INTERNAL.pwm.Duty, 100)) + if(__CheckParamF(&pwm_duty, PARAM_INTERNAL->pwm.Duty, 100)) { pwm_update = 1; } - if(__CheckParamF(&pwm_pulse_len, PARAM_INTERNAL.pwm.PulseLength, 65535)) + if(__CheckParamF(&pwm_pulse_len, PARAM_INTERNAL->pwm.PulseLength, 65535)) { pwm_update = 1; } // Параметры мониторинга - if(__CheckParamU16(&pm_rms_widnow_size, PARAM_INTERNAL.pm.rms_window_size)) + if(__CheckParamU16(&pm_rms_widnow_size, PARAM_INTERNAL->pm.rms_window_size)) { for(int i = 0; i < RMS_ALL; i++) { @@ -210,7 +210,7 @@ void UPP_Params_ControlInternal(void) Filter_Start(&upp.pm.rms[i]); } } - if(__CheckParamF(&pm_rms_exp_alpha, PARAM_INTERNAL.pm.rms_exp_alpha, 65535)) + if(__CheckParamF(&pm_rms_exp_alpha, PARAM_INTERNAL->pm.rms_exp_alpha, 65535)) { for(int i = 0; i < RMS_EXP_ALL; i++) { @@ -234,10 +234,10 @@ void UPP_Params_ControlInternal(void) alpha_update = 0; } else - ERR_PRIVATE_CNT.angle_reinit_err++; + ERR_PRIVATE_CNT->angle_reinit_err++; } else - ERR_PRIVATE_CNT.angle_reinit_err++; + ERR_PRIVATE_CNT->angle_reinit_err++; } // Обновление АЦП конфигов for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++) @@ -247,7 +247,7 @@ void UPP_Params_ControlInternal(void) if(ADC_ConfigChannel(&upp.pm.adc, i, adc_channel_zero[i], adc_channel_max[i], 4095) == HAL_OK) adc_channel_update[i] = 0; else - ERR_PRIVATE_CNT.adc_reinit_err++; + ERR_PRIVATE_CNT->adc_reinit_err++; } } // Обновление Zero-Cross конфигов @@ -256,7 +256,7 @@ void UPP_Params_ControlInternal(void) if(ZC_Init(&upp.pm.zc, upp.pm.zc.Config.NumChannels, zc_hysteresis, zc_debounce) == HAL_OK) zc_update = 0; else - ERR_PRIVATE_CNT.zc_reinit_err++; + ERR_PRIVATE_CNT->zc_reinit_err++; } // Обновление ШИМ конфигов if(pwm_update) @@ -266,7 +266,7 @@ void UPP_Params_ControlInternal(void) pwm_update = 0; } else - ERR_PRIVATE_CNT.pwm_reinit_err++; + ERR_PRIVATE_CNT->pwm_reinit_err++; } } @@ -282,16 +282,16 @@ HAL_StatusTypeDef UPP_Params_Init(void) /*====== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ angle_control ======*/ // Инициализация ПИД if(Angle_PID_Init(&upp.hangle, - 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) + 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; // Инициализация углов if(Angle_SetRange(&upp.hangle, - u2f(PARAM_INTERNAL.angle.Angle_Min, 65535), - u2f(PARAM_INTERNAL.angle.Angle_Max, 65535)) != HAL_OK) + u2f(PARAM_INTERNAL->angle.Angle_Min, 65535), + u2f(PARAM_INTERNAL->angle.Angle_Max, 65535)) != HAL_OK) return HAL_ERROR; @@ -299,46 +299,46 @@ HAL_StatusTypeDef UPP_Params_Init(void) /*===== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ power_monitor ======*/ /* Инициализация каналов АЦП */ if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_UBA, - PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UBA], - u2f(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UBA], 10), + PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UBA], + u2f(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UBA], 10), 4095) != HAL_OK) return HAL_ERROR; if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_UAC, - PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UAC], - u2f(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UAC], 10), + PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UAC], + u2f(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UAC], 10), 4095) != HAL_OK) return HAL_ERROR; if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_IC, - PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IC], - u2f(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IC], 10), + PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IC], + u2f(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IC], 10), 4095) != HAL_OK) return HAL_ERROR; if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_IA, - PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IA], - u2f(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IA], 10), + PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IA], + u2f(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IA], 10), 4095) != HAL_OK) return HAL_ERROR; /* Инициализация алгоритма перехода через ноль */ - if(ZC_Init(&upp.pm.zc, 3, u2f(PARAM_INTERNAL.zc.Hysteresis, 100), PARAM_INTERNAL.zc.DebouneCouner) != HAL_OK) + if(ZC_Init(&upp.pm.zc, 3, u2f(PARAM_INTERNAL->zc.Hysteresis, 100), PARAM_INTERNAL->zc.DebouneCouner) != HAL_OK) return HAL_ERROR; /* Инициализация RMS фильтра медленного алга */ for(int i = 0; i < RMS_ALL; i++) { - if(FilterRMS_Init(&upp.pm.rms[i], PARAM_INTERNAL.pm.rms_window_size)) + if(FilterRMS_Init(&upp.pm.rms[i], PARAM_INTERNAL->pm.rms_window_size)) return HAL_ERROR; Filter_Start(&upp.pm.rms[i]); } /* Инициализация экпоненциального фильтра медленного алга */ for(int i = 0; i < RMS_EXP_ALL; i++) { - if(FilterExp_Init(&upp.pm.rms_exp[i], u2f(PARAM_INTERNAL.pm.rms_exp_alpha, 65535))) + if(FilterExp_Init(&upp.pm.rms_exp[i], u2f(PARAM_INTERNAL->pm.rms_exp_alpha, 65535))) return HAL_ERROR; Filter_Start(&upp.pm.rms_exp[i]); } @@ -346,10 +346,10 @@ HAL_StatusTypeDef UPP_Params_Init(void) /*====== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ pwm_thyristors ======*/ - if(PWM_SetConfig(&upp.hpwm, PARAM_INTERNAL.pwm.PhaseMask, - PARAM_INTERNAL.pwm.Frequency, - u2f(PARAM_INTERNAL.pwm.Duty, 100), - PARAM_INTERNAL.pwm.PulseLength) != HAL_OK) + if(PWM_SetConfig(&upp.hpwm, PARAM_INTERNAL->pwm.PhaseMask, + PARAM_INTERNAL->pwm.Frequency, + u2f(PARAM_INTERNAL->pwm.Duty, 100), + PARAM_INTERNAL->pwm.PulseLength) != HAL_OK) return HAL_ERROR; return HAL_OK; @@ -362,45 +362,45 @@ HAL_StatusTypeDef UPP_Params_Init(void) */ void UPP_Params_Saturate(void) { - SATURATE_U16(PARAM_PUI.Iref, 100, 500); -// SATURATE_U16(PARAM_PUI.Tnt, 50, 5000); - SATURATE_U16(PARAM_PUI.Umin, 5, 99); - SATURATE_U16(PARAM_PUI.Umax, 100, 120); - SATURATE_U16(PARAM_PUI.Imax, 5, 99); - SATURATE_U16(PARAM_PUI.Imin, 0, 40); - SATURATE_U16(PARAM_PUI.TiMax, 500, 10000); - SATURATE_U16(PARAM_PUI.Tdelay, 5, 60); - SATURATE_U16(PARAM_PUI.Interlace, 0, 1); + SATURATE_U16(PARAM_PUI->Iref, 100, 500); +// SATURATE_U16(PARAM_PUI->Tnt, 50, 5000); + SATURATE_U16(PARAM_PUI->Umin, 5, 99); + SATURATE_U16(PARAM_PUI->Umax, 100, 120); + SATURATE_U16(PARAM_PUI->Imax, 5, 99); + SATURATE_U16(PARAM_PUI->Imin, 0, 40); + SATURATE_U16(PARAM_PUI->TiMax, 500, 10000); + SATURATE_U16(PARAM_PUI->Tdelay, 5, 60); + SATURATE_U16(PARAM_PUI->Interlace, 0, 1); - SATURATE_U16(PARAM_INTERNAL.setpoints.TemperatureWarn, 0, 90); - SATURATE_U16(PARAM_INTERNAL.setpoints.TemperatureErr, 0, 90); + SATURATE_U16(PARAM_INTERNAL->setpoints.TemperatureWarn, 0, 90); + SATURATE_U16(PARAM_INTERNAL->setpoints.TemperatureErr, 0, 90); - SATURATE_U16(PARAM_INTERNAL.nominal.PhaseNumber, 0, 3); - SATURATE_U16(PARAM_INTERNAL.nominal.U, 0, ADC_U_MAX_V_DEFAULT*10); - SATURATE_U16(PARAM_INTERNAL.nominal.U_deviation_plus, 0, 100*100); - SATURATE_U16(PARAM_INTERNAL.nominal.U_deviation_minus, 0, 100*100); - SATURATE_U16(PARAM_INTERNAL.nominal.F, 40*100, 60*100); - SATURATE_U16(PARAM_INTERNAL.nominal.F_deviation_plus, 0, 100*100); - SATURATE_U16(PARAM_INTERNAL.nominal.F_deviation_minus, 0, 100*100); - SATURATE_U16(PARAM_INTERNAL.nominal.I, 0, ADC_I_MAX_A_DEFAULT*10); + SATURATE_U16(PARAM_INTERNAL->nominal.PhaseNumber, 0, 3); + SATURATE_U16(PARAM_INTERNAL->nominal.U, 0, ADC_U_MAX_V_DEFAULT*10); + SATURATE_U16(PARAM_INTERNAL->nominal.U_deviation_plus, 0, 100*100); + SATURATE_U16(PARAM_INTERNAL->nominal.U_deviation_minus, 0, 100*100); + SATURATE_U16(PARAM_INTERNAL->nominal.F, 40*100, 60*100); + SATURATE_U16(PARAM_INTERNAL->nominal.F_deviation_plus, 0, 100*100); + SATURATE_U16(PARAM_INTERNAL->nominal.F_deviation_minus, 0, 100*100); + SATURATE_U16(PARAM_INTERNAL->nominal.I, 0, ADC_I_MAX_A_DEFAULT*10); - SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UBA], 0, 5000*10); - SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UAC], 0, 5000*10); - SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IC], 0, 1000*10); - SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IA], 0, 1000*10); - SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UBA], 1848, 2248); - SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UAC], 1848, 2248); - SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IC], 1848, 2248); - SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IA], 1848, 2248); + SATURATE_U16(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UBA], 0, 5000*10); + SATURATE_U16(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UAC], 0, 5000*10); + SATURATE_U16(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IC], 0, 1000*10); + SATURATE_U16(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IA], 0, 1000*10); + SATURATE_U16(PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UBA], 1848, 2248); + SATURATE_U16(PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UAC], 1848, 2248); + SATURATE_U16(PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IC], 1848, 2248); + SATURATE_U16(PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IA], 1848, 2248); - SATURATE_U16(PARAM_INTERNAL.pwm.PhaseMask, 0, 7); - SATURATE_U16(PARAM_INTERNAL.pwm.Frequency, 1000, 40000); + SATURATE_U16(PARAM_INTERNAL->pwm.PhaseMask, 0, 7); + SATURATE_U16(PARAM_INTERNAL->pwm.Frequency, 1000, 40000); - SATURATE_U16(PARAM_INTERNAL.zc.Hysteresis, 0, 0.1*100); - SATURATE_U16(PARAM_INTERNAL.zc.DebouneCouner, 0, 1000); + SATURATE_U16(PARAM_INTERNAL->zc.Hysteresis, 0, 0.1*100); + SATURATE_U16(PARAM_INTERNAL->zc.DebouneCouner, 0, 1000); - SATURATE_U16(PARAM_INTERNAL.angle.PulseLengthReserve, 50, 1000); + SATURATE_U16(PARAM_INTERNAL->angle.PulseLengthReserve, 50, 1000); } /** @@ -413,58 +413,58 @@ void UPP_Params_SetDefault(int pui_default, int internal_default) { if(pui_default) { - PARAM_PUI.Iref = PUI_Iref_PERCENT_DEFAULT*100; - PARAM_PUI.Tnt = PUI_Tnt_MS_DEFAULT; - PARAM_PUI.Umin = PUI_Umin_PERCENT_DEFAULT*100; - PARAM_PUI.Umax = PUI_Umax_PERCENT_DEFAULT*100; - PARAM_PUI.Imax = PUI_Imax_PERCENT_DEFAULT*100; - PARAM_PUI.Imin = PUI_Imin_PERCENT_DEFAULT*100; - PARAM_PUI.TiMax = PUI_TiMax_US_DEFAULT; - PARAM_PUI.Tdelay = PUI_Tdelay_SECONDS_DEFAULT; - PARAM_PUI.Interlace = PUI_Interlace_EN_DEFAULT; + PARAM_PUI->Iref = PUI_Iref_PERCENT_DEFAULT*100; + PARAM_PUI->Tnt = PUI_Tnt_MS_DEFAULT; + PARAM_PUI->Umin = PUI_Umin_PERCENT_DEFAULT*100; + PARAM_PUI->Umax = PUI_Umax_PERCENT_DEFAULT*100; + PARAM_PUI->Imax = PUI_Imax_PERCENT_DEFAULT*100; + PARAM_PUI->Imin = PUI_Imin_PERCENT_DEFAULT*100; + PARAM_PUI->TiMax = PUI_TiMax_US_DEFAULT; + PARAM_PUI->Tdelay = PUI_Tdelay_SECONDS_DEFAULT; + PARAM_PUI->Interlace = PUI_Interlace_EN_DEFAULT; } if(internal_default) { - PARAM_INTERNAL.setpoints.TemperatureWarn = SETPOINT_TEMP_WARN*10; - PARAM_INTERNAL.setpoints.TemperatureErr = SETPOINT_TEMP_ERR*10; + PARAM_INTERNAL->setpoints.TemperatureWarn = SETPOINT_TEMP_WARN*10; + PARAM_INTERNAL->setpoints.TemperatureErr = SETPOINT_TEMP_ERR*10; - PARAM_INTERNAL.nominal.PhaseNumber = NOM_PHASE_NUMB; - PARAM_INTERNAL.nominal.U = NOM_U_V_DEFAULT*10; - PARAM_INTERNAL.nominal.U_deviation_plus = NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT*100; - PARAM_INTERNAL.nominal.U_deviation_minus = NOM_U_DEVIATION_MINUS_PERCENT_DEFAULT*100; - PARAM_INTERNAL.nominal.F = NOM_F_HZ_DEFAULT*100; - PARAM_INTERNAL.nominal.F_deviation_plus = NOM_F_DEVIATION_PLUS_PERCENT_DEFAULT*100; - PARAM_INTERNAL.nominal.F_deviation_minus = NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT*100; - PARAM_INTERNAL.nominal.I = NOM_I_A_DEFAULT*10; + PARAM_INTERNAL->nominal.PhaseNumber = NOM_PHASE_NUMB; + PARAM_INTERNAL->nominal.U = NOM_U_V_DEFAULT*10; + PARAM_INTERNAL->nominal.U_deviation_plus = NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT*100; + PARAM_INTERNAL->nominal.U_deviation_minus = NOM_U_DEVIATION_MINUS_PERCENT_DEFAULT*100; + PARAM_INTERNAL->nominal.F = NOM_F_HZ_DEFAULT*100; + PARAM_INTERNAL->nominal.F_deviation_plus = NOM_F_DEVIATION_PLUS_PERCENT_DEFAULT*100; + PARAM_INTERNAL->nominal.F_deviation_minus = NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT*100; + PARAM_INTERNAL->nominal.I = NOM_I_A_DEFAULT*10; - PARAM_INTERNAL.pm.rms_window_size = PM_RMS_WINDOW_PERIOD_US_DEFAULT/PM_SLOW_PERIOD_US; - PARAM_INTERNAL.pm.rms_exp_alpha = FilterExp_CalcAlpha98(PM_RMS_EXT_TAU_US_DEFAULT, PM_SLOW_PERIOD_US)*65535; + PARAM_INTERNAL->pm.rms_window_size = PM_RMS_WINDOW_PERIOD_US_DEFAULT/PM_SLOW_PERIOD_US; + PARAM_INTERNAL->pm.rms_exp_alpha = FilterExp_CalcAlpha98(PM_RMS_EXT_TAU_US_DEFAULT, PM_SLOW_PERIOD_US)*65535; - PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UBA] = ADC_U_MAX_V_DEFAULT*10; - PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UAC] = ADC_U_MAX_V_DEFAULT*10; - PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IC] = ADC_I_MAX_A_DEFAULT*10; - PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IA] = ADC_I_MAX_A_DEFAULT*10; - PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UBA] = ADC_U_ZERO_DEFAULT; - PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UAC] = ADC_U_ZERO_DEFAULT; - PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IC] = ADC_I_ZERO_DEFAULT; - PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IA] = ADC_I_ZERO_DEFAULT; + PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UBA] = ADC_U_MAX_V_DEFAULT*10; + PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UAC] = ADC_U_MAX_V_DEFAULT*10; + PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IC] = ADC_I_MAX_A_DEFAULT*10; + PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IA] = ADC_I_MAX_A_DEFAULT*10; + PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UBA] = ADC_U_ZERO_DEFAULT; + PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UAC] = ADC_U_ZERO_DEFAULT; + PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IC] = ADC_I_ZERO_DEFAULT; + PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IA] = ADC_I_ZERO_DEFAULT; - PARAM_INTERNAL.pwm.PhaseMask = 7; // (все три фазы) - PARAM_INTERNAL.pwm.Frequency = PWM_THYR_FREQUENCY_HZ_DEFAULT; - PARAM_INTERNAL.pwm.Duty = PWM_THYR_DUTY_PERCENT_DEFAULT*100; - PARAM_INTERNAL.pwm.PulseLength = PWM_THYR_PULSE_LENGTH_DEFAULT*65535; + PARAM_INTERNAL->pwm.PhaseMask = 7; // (все три фазы) + PARAM_INTERNAL->pwm.Frequency = PWM_THYR_FREQUENCY_HZ_DEFAULT; + PARAM_INTERNAL->pwm.Duty = PWM_THYR_DUTY_PERCENT_DEFAULT*100; + PARAM_INTERNAL->pwm.PulseLength = PWM_THYR_PULSE_LENGTH_DEFAULT*65535; - PARAM_INTERNAL.zc.Hysteresis = ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT*100; - PARAM_INTERNAL.zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_CNT_DEFAULT; + PARAM_INTERNAL->zc.Hysteresis = ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT*100; + PARAM_INTERNAL->zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_CNT_DEFAULT; - 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; + 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; //__AngleSetLimit(); } } @@ -475,10 +475,10 @@ void UPP_Params_SetDefault(int pui_default, int internal_default) // Перерасчет максимально допустимого угла static void __AngleSetLimit(void) { // Сколько пачка ипульсов занимает процентов от всего периода - float pulses_percent_of_period = (((float)PARAM_INTERNAL.pwm.PulseLength / PARAM_INTERNAL.pwm.Frequency) * 1000) / ANGLE_PERIOD_MS(upp.pm.measured.final.Fmean); + float pulses_percent_of_period = (((float)PARAM_INTERNAL->pwm.PulseLength / PARAM_INTERNAL->pwm.Frequency) * 1000) / ANGLE_PERIOD_MS(upp.pm.measured.final.Fmean); // Вычитаем этот процент из 1 - получаем максимально безопасный угол float angle_limit = 1; - angle_limit -= pulses_percent_of_period*u2f(PARAM_INTERNAL.angle.PulseLengthReserve, 100); // добавляем запас в PulseLengthReserve процентов от пачки импульсов + angle_limit -= pulses_percent_of_period*u2f(PARAM_INTERNAL->angle.PulseLengthReserve, 100); // добавляем запас в PulseLengthReserve процентов от пачки импульсов Angle_SetLimit(&upp.hangle, angle_limit); } diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx index 2b61035..671ac78 100644 --- a/UPP/MDK-ARM/UPP.uvoptx +++ b/UPP/MDK-ARM/UPP.uvoptx @@ -742,30 +742,6 @@ 0 0 0 - ..\Core\UPP\pwm_thyristors.c - pwm_thyristors.c - 0 - 0 - - - 2 - 14 - 5 - 0 - 0 - 0 - ..\Core\UPP\pwm_thyristors.h - pwm_thyristors.h - 0 - 0 - - - 2 - 15 - 1 - 0 - 0 - 0 ..\Core\UPP\angle_control.c angle_control.c 0 @@ -773,7 +749,7 @@ 2 - 16 + 14 5 0 0 @@ -785,7 +761,7 @@ 2 - 17 + 15 1 0 0 @@ -797,7 +773,7 @@ 2 - 18 + 16 5 0 0 @@ -809,7 +785,7 @@ 2 - 19 + 17 1 0 0 @@ -821,7 +797,7 @@ 2 - 20 + 18 5 0 0 @@ -833,7 +809,7 @@ 2 - 21 + 19 1 0 0 @@ -845,7 +821,7 @@ 2 - 22 + 20 5 0 0 @@ -857,7 +833,7 @@ 2 - 23 + 21 1 0 0 @@ -869,7 +845,7 @@ 2 - 24 + 22 5 0 0 @@ -879,6 +855,30 @@ 0 0 + + 2 + 23 + 1 + 0 + 0 + 0 + ..\Core\UPP\pwm_thyristors.c + pwm_thyristors.c + 0 + 0 + + + 2 + 24 + 5 + 0 + 0 + 0 + ..\Core\UPP\pwm_thyristors.h + pwm_thyristors.h + 0 + 0 + diff --git a/UPP/MDK-ARM/UPP.uvprojx b/UPP/MDK-ARM/UPP.uvprojx index 3def99e..b764892 100644 --- a/UPP/MDK-ARM/UPP.uvprojx +++ b/UPP/MDK-ARM/UPP.uvprojx @@ -450,16 +450,6 @@ 5 ..\Core\UPP\upp_main.h - - pwm_thyristors.c - 1 - ..\Core\UPP\pwm_thyristors.c - - - pwm_thyristors.h - 5 - ..\Core\UPP\pwm_thyristors.h - angle_control.c 1 @@ -510,6 +500,16 @@ 5 ..\Core\UPP\upp_io.h + + pwm_thyristors.c + 1 + ..\Core\UPP\pwm_thyristors.c + + + pwm_thyristors.h + 5 + ..\Core\UPP\pwm_thyristors.h + @@ -1437,16 +1437,6 @@ 5 ..\Core\UPP\upp_main.h - - pwm_thyristors.c - 1 - ..\Core\UPP\pwm_thyristors.c - - - pwm_thyristors.h - 5 - ..\Core\UPP\pwm_thyristors.h - angle_control.c 1 @@ -1497,6 +1487,16 @@ 5 ..\Core\UPP\upp_io.h + + pwm_thyristors.c + 1 + ..\Core\UPP\pwm_thyristors.c + + + pwm_thyristors.h + 5 + ..\Core\UPP\pwm_thyristors.h + diff --git a/Информация для программиста (УПП СП СЭД)/Modbus Карта.docx b/Информация для программиста (УПП СП СЭД)/Modbus Карта.docx new file mode 100644 index 0000000..f2e7e6f Binary files /dev/null and b/Информация для программиста (УПП СП СЭД)/Modbus Карта.docx differ