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