From 21379c6188a09d87b1f66353c175330adfba5830 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Fri, 21 Nov 2025 16:01:43 +0300 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D1=81=D0=B1=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D0=B0=20=D1=83=D0=B3=D0=BB=D0=B0=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D0=B9=D0=B8=D0=B8=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D0=BC=D0=B5=D0=BB=D0=BE=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UPP/Core/Configs/upp_config.h | 2 + UPP/Core/PowerMonitor/power_monitor.c | 12 +- UPP/Core/PowerMonitor/power_monitor.h | 2 + UPP/Core/UPP/angle_control.c | 9 +- UPP/Core/UPP/pwm_thyristors.c | 166 ++++++++++++++------------ UPP/Core/UPP/upp_errors.c | 25 +++- UPP/Core/UPP/upp_main.c | 105 ++++++++-------- UPP/Core/UPP/upp_main.h | 2 +- UPP/MDK-ARM/UPP.uvoptx | 39 +++--- UPP/MDK-ARM/UPP.uvprojx | 8 +- 10 files changed, 209 insertions(+), 161 deletions(-) diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index 2dc4f4d..a5a39f2 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -30,6 +30,8 @@ #define TEMP_1 0 #define TEMP_2 1 + +#define UPP_DISABLE_ERROR_BLOCK ///< Отключить блокировку УПП при ошибках #define UPP_SIMULATE_I ///< Симулировт токи (Iref/2) а не брать с АЦП /** diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c index 78cd965..9c82526 100644 --- a/UPP/Core/PowerMonitor/power_monitor.c +++ b/UPP/Core/PowerMonitor/power_monitor.c @@ -150,9 +150,9 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm) float fmean = 0; // средняя частота по трем фазам float iphase_mean = 0; // средний ток каждой фазы float uphase_mean = 0; // среднее напряжение каждой фазы - - float u_base = to_float(PARAM_INTERNAL.nominal.U, 10); // Дополнительно посчитаем значения в реалдьных Вольтах - float i_base = to_float(PARAM_INTERNAL.nominal.I, 10); // Дополнительно посчитаем значения в реалдьных Амперах + // Дополнительно посчитаем значения в реальных Вольтах/Амперах + float u_base = to_float(PARAM_INTERNAL.nominal.U, 10); + float i_base = to_float(PARAM_INTERNAL.nominal.I, 10); for(int i = 0; i < 3; i++) { /* Получение частоты фазы */ @@ -260,9 +260,9 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm) /** * @brief Проверяет защиты питания и температур. * @param measure Указатель на структуру с измеренными значениями - * @param Running Флаг: - * - 1 - УПП в работе, - * - 0 - УПП ожидает команды + * @param Running Флаг для защит по току: + * - 1 - УПП в работе, проверяем токи + * - 0 - УПП ожидает команды, не смотрим токи * @return 1 - была обнаружена ощибка, 0 - все ок */ int PowerMonitor_Protect(PowerMonitor_t *hpm, uint8_t Running) diff --git a/UPP/Core/PowerMonitor/power_monitor.h b/UPP/Core/PowerMonitor/power_monitor.h index 14518cb..ee343ff 100644 --- a/UPP/Core/PowerMonitor/power_monitor.h +++ b/UPP/Core/PowerMonitor/power_monitor.h @@ -3,6 +3,8 @@ * @file power_monitor.h * @brief Модуль мониторящий сеть: Напряжение, Токи, Температуры ****************************************************************************** +* @addtogroup POWER_MONITOR Power Monitoring +* @brief Модуль для слежения за сетью и температурами (крч все что от АЦП) *****************************************************************************/ #ifndef _POWER_MONITOR_H_ #define _POWER_MONITOR_H_ diff --git a/UPP/Core/UPP/angle_control.c b/UPP/Core/UPP/angle_control.c index e25d7d3..1d4e3ff 100644 --- a/UPP/Core/UPP/angle_control.c +++ b/UPP/Core/UPP/angle_control.c @@ -104,9 +104,16 @@ void Angle_PID_Reset(Angle_Handle_t *hangle) { if(assert_upp(hangle)) return; - + + hangle->Iref = 0; + hangle->Imeas = 0; + /* Вычисляем выход PID */ arm_pid_reset_f32(&hangle->pid); + + Filter_ReInit(&hangle->refFilter, hangle->refFilter.alpha); + Filter_Start(&hangle->refFilter); + Filter_Process(&hangle->refFilter, 0); Angle_SetAngle(hangle, 0); Angle_Reset(hangle, UPP_PHASE_A); diff --git a/UPP/Core/UPP/pwm_thyristors.c b/UPP/Core/UPP/pwm_thyristors.c index 53786b6..8c9db9c 100644 --- a/UPP/Core/UPP/pwm_thyristors.c +++ b/UPP/Core/UPP/pwm_thyristors.c @@ -82,12 +82,14 @@ HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm) * @param hpwm Указатель на хендл ШИМ тиристоров * @param Phase На какой фазе надо запустить ШИМ * @return HAL Status. - * @details Переводит автомат состояний канала ШИМ в состояние запуска ШИМ. */ HAL_StatusTypeDef PWM_Start(PWM_Handle_t *hpwm, UPP_Phase_t Phase) { if(assert_upp(hpwm)) return HAL_ERROR; + // Если уже какой-то канал запущен - не запускаем + if(hpwm->f.Running) + return HAL_BUSY; // Если канал дурацкий - возвращаем ошибку if(Phase >= 3) { @@ -96,7 +98,6 @@ HAL_StatusTypeDef PWM_Start(PWM_Handle_t *hpwm, UPP_Phase_t Phase) if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) return HAL_ERROR; - switch(hpwm->Phase[Phase]->State) { // Если мы НЕ в режиме ожидание - ошибка @@ -137,9 +138,8 @@ HAL_StatusTypeDef PWM_Start(PWM_Handle_t *hpwm, UPP_Phase_t Phase) * @param Phase На какой фазе надо остановить ШИМ * @param force_stop_all Принудительно остановить ВЕСЬ ШИМ * @return HAL Status. - * @details Переводит автомат канала ШИМ в состояние отключенного ШИМ и - * включает канал в режим форсированного неактивного выхода. - * При передаче 1 в force_stop_all, отключаются все каналы ШИМ и выдается дискрет на запрет ШИМ + * @details Включает канал в режим форсированного неактивного выхода. + * При передаче 1 в force_stop_all, отключаются MOE (Main Output Enable) и все каналы ШИМ */ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_stop_all) { @@ -155,6 +155,7 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_ __HAL_TIM_MOE_DISABLE(&hpwm2); + // выставляем все каналы в FORCE MODE for(int ch = 0; ch < 6; ch++) { __PWM_SetOutputState(&hpwm->AllPhases[ch], PWM_DISABLE); @@ -171,87 +172,21 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_ } if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) return HAL_ERROR; - - hpwm->Phase[Phase]->State = PWM_THYR_DISABLED; + // Если не force_stop_all - сбрасываем только текущий канал __PWM_SetOutputState(hpwm->Phase[Phase], PWM_DISABLE); + if(hpwm->Phase[Phase]->State != PWM_THYR_DISABLED) + { + hpwm->Phase[Phase]->State = PWM_THYR_DISABLED; #ifdef PWM_HARDWARE_IMPULSES_CONTROL - if(hpwm->f.Running) - hpwm->f.Running--; - - HAL_TIM_Base_Stop(hpwm->Phase[Phase]->htim); + if(hpwm->f.Running) + hpwm->f.Running--; + HAL_TIM_Base_Stop(hpwm->Phase[Phase]->htim); #endif + } return HAL_OK; } } -/** - * @brief Хендл ШИМ тиристоров. - * @param hpwm Указатель на хендл ШИМ тиристоров - * @return HAL Status. - * @details Автомат состояний, который определяет поведение каналов ШИМ - */ -HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm) -{ - if(assert_upp(hpwm)) - return HAL_ERROR; - - uint8_t phase = 0; - PWM_Channel_t *hPhase = NULL; - - for(int ch = 0; ch < 6; ch++) - { - hPhase = &hpwm->AllPhases[ch]; - if (hPhase->htim == NULL) - continue; - -#ifndef PWM_HARDWARE_IMPULSES_CONTROL - switch (hPhase->State) - { - case PWM_THYR_DISABLED: // канал отключен - __PWM_SetOutputState(hPhase, PWM_DISABLE); - break; - - case PWM_THYR_TIM_WAIT: // канал ожидает команды - __PWM_SetOutputState(hPhase, PWM_DISABLE); - break; - - case PWM_THYR_TIM_START: // начать ШИМ (пачка импульсов) - __PWM_SetOutputState(hPhase, PWM_ENABLE); - hPhase->PulseCnt = hpwm->Config.PulseNumber - 1; // 1 импульс уже прошел - hPhase->State = PWM_THYR_TIM_ACTIVE; - hpwm->f.Running++; - break; - - case PWM_THYR_TIM_ACTIVE: // управление пачкой импульсов ШИМ - hPhase->PulseCnt--; - if (hPhase->PulseCnt <= 1) // если остался один импльс в след раз идем в PWM_THYR_TIM_DONE - { - hPhase->PulseCnt = 0; - hPhase->State = PWM_THYR_TIM_DONE; - } - break; - - case PWM_THYR_TIM_DONE: // пачка импульсов отправлена - отключение - hPhase->State = PWM_THYR_TIM_WAIT; - if(hpwm->f.Running) - hpwm->f.Running--; - break; - - default: // чзх - __PWM_SetOutputState(hPhase, PWM_DISABLE); - break; - } -#else //PWM_HARDWARE_IMPULSES_CONTROL - // после того как пачка импульсов прошла отключаем активный канал - if (hPhase->State == PWM_THYR_TIM_ACTIVE) - { - __PWM_SetOutputState(hPhase, PWM_DISABLE); - HAL_TIM_Base_Stop(hPhase->htim); - } -#endif - } - return HAL_OK; -} /** * @brief Установка параметров ШИМ. @@ -363,6 +298,79 @@ HAL_StatusTypeDef PWM_SetPolarity(PWM_Handle_t *hpwm, int polarity) return HAL_OK; } +/** + * @brief Хендл ШИМ тиристоров. + * @param hpwm Указатель на хендл ШИМ тиристоров + * @return HAL Status. + * @details Автомат состояний, который определяет поведение каналов ШИМ + */ +HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm) +{ + if(assert_upp(hpwm)) + return HAL_ERROR; + + uint8_t phase = 0; + PWM_Channel_t *hPhase = NULL; + + for(int ch = 0; ch < 6; ch++) + { + hPhase = &hpwm->AllPhases[ch]; + if (hPhase->htim == NULL) + continue; + +#ifndef PWM_HARDWARE_IMPULSES_CONTROL + switch (hPhase->State) + { + case PWM_THYR_DISABLED: // канал отключен + __PWM_SetOutputState(hPhase, PWM_DISABLE); + break; + + case PWM_THYR_TIM_WAIT: // канал ожидает команды + __PWM_SetOutputState(hPhase, PWM_DISABLE); + break; + + case PWM_THYR_TIM_START: // начать ШИМ (пачка импульсов) + __PWM_SetOutputState(hPhase, PWM_ENABLE); + hPhase->PulseCnt = hpwm->Config.PulseNumber - 1; // 1 импульс уже прошел + hPhase->State = PWM_THYR_TIM_ACTIVE; + hpwm->f.Running++; + break; + + case PWM_THYR_TIM_ACTIVE: // управление пачкой импульсов ШИМ + hPhase->PulseCnt--; + if (hPhase->PulseCnt <= 1) // если остался один импльс в след раз идем в PWM_THYR_TIM_DONE + { + hPhase->PulseCnt = 0; + hPhase->State = PWM_THYR_TIM_DONE; + } + break; + + case PWM_THYR_TIM_DONE: // пачка импульсов отправлена - отключение + hPhase->State = PWM_THYR_TIM_WAIT; + if(hpwm->f.Running) + hpwm->f.Running--; + break; + + default: // чзх + __PWM_SetOutputState(hPhase, PWM_DISABLE); + break; + } +#else //PWM_HARDWARE_IMPULSES_CONTROL + // после того как пачка импульсов прошла отключаем активный канал + if (hPhase->State == PWM_THYR_TIM_ACTIVE) + { + if(hpwm->f.Running) + hpwm->f.Running--; + __PWM_SetOutputState(hPhase, PWM_DISABLE); + HAL_TIM_Base_Stop(hPhase->htim); + } +#endif + } + return HAL_OK; +} + + +//================ ВНУТРЕННИЕ ФУНКЦИИ =================== /** * @brief Установка режима для канала ШИМ. * @param hpwm Указатель на хендл ШИМ тиристоров diff --git a/UPP/Core/UPP/upp_errors.c b/UPP/Core/UPP/upp_errors.c index 72ccdaa..7762958 100644 --- a/UPP/Core/UPP/upp_errors.c +++ b/UPP/Core/UPP/upp_errors.c @@ -7,7 +7,10 @@ Общая логика: В программе выставляются всякие внутренние флаги ошибок: ERR_PRIVATE В этом модуле смотрятся какие флаги выставились и переносят эти флаги -в структуру ошибок ПУИ ERR_PUI. +в структуру ошибок ПУИ ERR_PUI. + +Исключение: Программные ошибки и ошибки питания плат, +они пишутся напрямую в ERR_PUI. Также реализована защита от дребезга и в целом задержка на выставление ошибок. ******************************************************************************/ @@ -27,7 +30,6 @@ void UPP_Errors_Other(void); void UPP_Errors_Handle(void) { - /*====== Программные ошибки ======*/ UPP_Errors_Program(); /*====== Ошибки питания плат ======*/ @@ -41,8 +43,6 @@ void UPP_Errors_Handle(void) - - errors.common = UPP_SelectCommonError(); } @@ -53,7 +53,21 @@ void UPP_Errors_Program(void) void UPP_Errors_Power(void) { - //read discrete inputs + static int error_latch_ticks = 0; + int error_latch_timeout = 5000; + + /* Считывание неисправностей источников питания */ + int err_24Vdio = GPIO_Read_Switch(&UPP_DIN.err_24Vdio); + int err_24V = GPIO_Read_Switch(&UPP_DIN.err_24V); + int err_5Vd = GPIO_Read_Switch(&UPP_DIN.err_5Vd); + 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; } void UPP_Errors_Ranges(void) @@ -163,6 +177,7 @@ void UPP_Errors_Other(void) { static int InterlaceCnt = 0; + if(ERR_PRIVATE.longstart) ERR_PUI.LongStart = 1; else diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index 8f5c4d2..030cf3b 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -1,15 +1,20 @@ /** ****************************************************************************** * @file upp_main.c -* @brief Инициализация и самые базовые вещи по работе УПП +* @brief Главный файл по работе УПП ****************************************************************************** * @details +Работа УПП состоит из нескольких модулей: +- @ref POWER_MONITOR - Считывание и фильтрация данных от АЦП и выставление защит по этим данным +- @ref PWM_THYRISTORS - Формирование пачки импульсов +- @ref ANGLE_CONTROL - Формирование и регулирование угла открытия тиристора ******************************************************************************/ #include "upp_main.h" // всё остальное по работе с УПП #include "tim.h" #include "iwdg.h" UPP_t upp; +HAL_StatusTypeDef res; // сюда сохраняется результат от выполения всяких функций float dbg_iref = 1; int dbg_polarity = 0; @@ -30,8 +35,6 @@ int UPP_App_Init(void) upp.PUI.values = &MB_DATA.InRegs.pui; upp.call = &MB_INTERNAL.FuncCalls; - UPP_DO.CEN(ENABLE); - if(HAL_TIM_Base_Start(&ustim) != HAL_OK) { return 1; @@ -67,6 +70,8 @@ int UPP_PreWhile(void) return 1; + + UPP_DO.CEN(ENABLE); return 0; } @@ -81,55 +86,55 @@ int UPP_While(void) if(upp.pm.f.runSlow) { static uint32_t slow_cnt = 0; - - HAL_IWDG_Refresh(&hiwdg); BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY); + res = HAL_IWDG_Refresh(&hiwdg); + // Медленные расчеты + PowerMonitor_SlowCalc(&upp.pm); + // Защиты // Определенные защиты включаем только в режиме работы + PowerMonitor_Protect(&upp.pm, upp.workmode == UPP_Work); // если ошибка вызываем СТОП - if(errors.pui.all) - { - upp.call->stop = 0; - } - // иначе снимаем СТОП - else - { - upp.call->stop = 0; - } - // Если СТОП - переходим в ошибку - if (upp.call->stop) - upp.workmode = UPP_Error; +#ifndef UPP_DISABLE_ERROR_BLOCK + upp.call->stop = (errors.common != Err_None); +#endif // Сброс на дефолтные по запросу if(upp.call->set_default_pui || upp.call->set_default_internal) { UPP_Params_SetDefault(upp.call->set_default_pui, upp.call->set_default_internal); + upp.call->set_default_pui = 0; + upp.call->set_default_internal = 0; } - // Медленные расчеты - PowerMonitor_SlowCalc(&upp.pm); - - // Защиты // Определенные защиты включаем только в режиме работы - PowerMonitor_Protect(&upp.pm, upp.workmode == UPP_Work); + // Если СТОП - переходим в ошибку + if (upp.call->stop) + upp.workmode = UPP_Error; // Автомат состояний УПП switch(upp.workmode) { - /* Состояние инициализации */ + /*======= Состояние Инициализация =========*/ case UPP_Init: + if(slow_cnt == 0) + { // начало инициализации - сбрасываем флаги + memset(&ERR_PRIVATE, 0, sizeof(ERR_PRIVATE)); + memset(&ERR_PUI, 0, sizeof(ERR_PUI)); + } + if(slow_cnt > MS_TO_SLOW_TICKS(UPP_INIT_BEFORE_READY_MS)) - { - slow_cnt = 0; // сбрасываем чтобы потом еще раз инициализироватся + { // конец инициализации - сбрасываем чтобы потом еще раз инициализироватся + slow_cnt = 0; upp.workmode = UPP_Ready; } else - { + { // инициализация в процессе slow_cnt++; } break; - /* Состояние готовности */ + /*======= Состояние Готовность =========*/ case UPP_Ready: - PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ + res = PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ // Индикация UPP_DO.Ready(ENABLE); UPP_DO.Work(DISABLE); @@ -144,7 +149,7 @@ int UPP_While(void) } break; - /* Состояние В работе */ + /*======= Состояние В работе =========*/ case UPP_Work: // Индикация UPP_DO.Ready(DISABLE); @@ -155,11 +160,11 @@ int UPP_While(void) upp.workmode = UPP_Init; // Регулирование тиристоров - #ifndef UPP_SIMULATE_I // берем с АЦП +#ifndef UPP_SIMULATE_I // берем с АЦП Angle_PID(&upp.hangle, dbg_iref, upp.pm.measured.final.Iamp); - #else // симулируем +#else // симулируем Angle_PID(&upp.hangle, dbg_iref, upp.hangle.Iref/2); - #endif +#endif // если слишком долгий запуск if((local_time() - upp.StartTick) > (upp.PUI.params->Tdelay*1000)) { @@ -167,7 +172,7 @@ int UPP_While(void) } break; -// /* Состояние Работа завершена */ + /*======= Состояние Работа завершена =========*/ // case WM_Done: // // Индикация // UPP_DO.Ready(DISABLE); @@ -176,7 +181,7 @@ int UPP_While(void) // PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ // break; - /* Состояние Ошибки */ + /*======= Состояние Ошибка/Неизвестно =========*/ case UPP_Error: default: PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ @@ -192,11 +197,6 @@ int UPP_While(void) break; } - - UPP_Errors_Handle(); - UPP_Params_ControlInternal(); - - upp.pm.f.runSlow = 0; upp.Timings.slow_calc_us = BenchTime_End(BT_SLOWCALC, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ; }//if(upp.pm.f.runSlow) @@ -216,12 +216,16 @@ void UPP_Tick(void) { if(upp.workmode == UPP_Init) return; + + // Обрабока ошибок и выставление итоговой Ошибки + UPP_Errors_Handle(); + // + UPP_Params_ControlInternal(); } // ПРЕРЫВАНИЯ stm32f4xx_it.c - void UPP_ADC_Handle(void) { BenchTime_Start(BT_ADC, angletim.Instance->CNT, HAL_MAX_DELAY); @@ -245,9 +249,11 @@ void UPP_ADC_Handle(void) { // Меняем полуволну тиристора UPP_HalfWave_t curr_halfwave = ZC_GetHalfWave(&upp.pm.zc, phase); - PWM_SetHalfWave(&upp.hpwm, phase, curr_halfwave); + res = PWM_SetHalfWave(&upp.hpwm, phase, curr_halfwave); // Начинаем отсчитывать угол - Angle_Start(&upp.hangle, phase, 10); + res = Angle_Start(&upp.hangle, phase, 10); + if(res != HAL_OK) + __NOP(); } } } @@ -260,34 +266,37 @@ void UPP_ADC_Handle(void) void UPP_PWM_Handle(void) { BenchTime_Start(BT_PWM, angletim.Instance->CNT, HAL_MAX_DELAY); - PWM_Handle(&upp.hpwm); + res = PWM_Handle(&upp.hpwm); upp.Timings.isr_pwm_us = BenchTime_End(BT_PWM, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ; } void UPP_Angle_Handle(void) -{ +{ UPP_Phase_t phase = Angle_Handle(&upp.hangle); - Angle_Reset(&upp.hangle, phase); + res = Angle_Reset(&upp.hangle, phase); // Если УПП в работе if(upp.workmode == UPP_Work) { switch(phase) { case UPP_PHASE_A: - PWM_Start(&upp.hpwm, UPP_PHASE_A); + res = PWM_Start(&upp.hpwm, UPP_PHASE_A); break; case UPP_PHASE_B: - PWM_Start(&upp.hpwm, UPP_PHASE_B); + res = PWM_Start(&upp.hpwm, UPP_PHASE_B); break; case UPP_PHASE_C: - PWM_Start(&upp.hpwm, UPP_PHASE_C); + res = PWM_Start(&upp.hpwm, UPP_PHASE_C); break; default: break; } + if(res != HAL_OK) + __NOP(); } } +// Callback по совпадению CCRx void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim) { if (htim == upp.hangle.htim) diff --git a/UPP/Core/UPP/upp_main.h b/UPP/Core/UPP/upp_main.h index 4d07896..22a261c 100644 --- a/UPP/Core/UPP/upp_main.h +++ b/UPP/Core/UPP/upp_main.h @@ -1,7 +1,7 @@ /** ****************************************************************************** * @file upp_main.h -* @brief Определения структур данных Modbus устройства +* @brief Определения структур для работы УПП ****************************************************************************** * @details ******************************************************************************/ diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx index aa75c66..3581068 100644 --- a/UPP/MDK-ARM/UPP.uvoptx +++ b/UPP/MDK-ARM/UPP.uvoptx @@ -331,7 +331,7 @@ 0 407 1 -
134233418
+
134233790
0 0 0 @@ -345,6 +345,22 @@ 1 0 + 136 + 1 +
134256008
+ 0 + 0 + 0 + 0 + 0 + 1 + ../Core/Src/stm32f4xx_it.c + + \\Debug_F417\../Core/Src/stm32f4xx_it.c\136 +
+ + 2 + 0 27 1
0
@@ -358,22 +374,6 @@
- - 2 - 0 - 136 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ../Core/Src/stm32f4xx_it.c - - -
@@ -451,6 +451,11 @@ 1 htim1 + + 15 + 1 + htim2 + diff --git a/UPP/MDK-ARM/UPP.uvprojx b/UPP/MDK-ARM/UPP.uvprojx index 20b686b..45f9920 100644 --- a/UPP/MDK-ARM/UPP.uvprojx +++ b/UPP/MDK-ARM/UPP.uvprojx @@ -17,8 +17,8 @@ STM32F427ZGTx STMicroelectronics - Keil.STM32F4xx_DFP.2.16.0 - http://www.keil.com/pack/ + Keil.STM32F4xx_DFP.2.17.1 + https://www.keil.com/pack/ IRAM(0x20000000-0x2002FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ @@ -1004,8 +1004,8 @@ STM32F417ZGTx STMicroelectronics - Keil.STM32F4xx_DFP.2.16.0 - http://www.keil.com/pack/ + Keil.STM32F4xx_DFP.2.17.1 + https://www.keil.com/pack/ IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE