diff --git a/mcu_project/upp/Core/upp/adc_filter.c b/mcu_project/upp/Core/upp/adc_filter.c
index f328aa6..362eeec 100644
--- a/mcu_project/upp/Core/upp/adc_filter.c
+++ b/mcu_project/upp/Core/upp/adc_filter.c
@@ -1,35 +1,63 @@
#include "adc_filter.h"
+/**
+ * @brief Привязка структуры фильтра к конкретному АЦП
+ * @param hfilter Указатель на структуру ADCFilter_t
+ * @param hadc Указатель на структуру HAL АЦП
+ */
void adc_Attach(ADCFilter_t *hfilter, ADC_HandleTypeDef *hadc)
{
+ // Связываем фильтр с конкретным аппаратным АЦП для чтения данных
hfilter->hadc = hadc;
}
-// фильтрация
+
+/**
+ * @brief Обновление и фильтрация новых данных АЦП методом усреднения
+ * @param hfilter Указатель на структуру ADCFilter_t
+ * @return int Возвращает 1, если произведено обновление отфильтрованных данных, иначе 0
+ */
int adc_filterring(ADCFilter_t *hfilter)
{
+ // Добавляем текущее значение из регистра данных АЦП в сумму
hfilter->sum += hfilter->hadc->Instance->DR;
+ // Увеличиваем счётчик накопленных выборок
hfilter->count++;
+ // Если набрано достаточное количество выборок для усреднения
if (hfilter->count >= hfilter->bufferSize)
{
+ // Вычисляем среднее значение и сохраняем как отфильтрованный результат
hfilter->AdcResult = hfilter->sum / hfilter->bufferSize;
+ // Сбрасываем сумму и счётчик для следующего цикла
hfilter->sum = 0;
hfilter->count = 0;
- hfilter->f.DataUpdated = 1;
+ // Отмечаем, что новые данные отфильтрованы и готовы к чтению
+ hfilter->f.DataUpdated = 1;
return 1;
}
+ // Если ещё недостаточно данных, возвращаем 0 — фильтрация не завершена
return 0;
}
+/**
+ * @brief Чтение последнего отфильтрованного значения АЦП
+ * @param hfilter Указатель на структуру ADCFilter_t
+ * @return uint16_t Последнее отфильтрованное значение
+ */
uint16_t adc_read_data(ADCFilter_t *hfilter)
{
- hfilter->f.DataUpdated = 0;
- return hfilter->AdcResult;
+ // После чтения сбрасываем флаг обновления данных
+ hfilter->f.DataUpdated = 0;
+ return hfilter->AdcResult;
}
-
+/**
+ * @brief Проверка, обновились ли данные АЦП после фильтрации
+ * @param hfilter Указатель на структуру ADCFilter_t
+ * @return int Возвращает 1, если данные были обновлены, иначе 0
+ */
int adc_is_data_updated(ADCFilter_t *hfilter)
{
- return hfilter->f.DataUpdated;
-}
\ No newline at end of file
+ return hfilter->f.DataUpdated;
+}
diff --git a/mcu_project/upp/Core/upp/adc_filter.h b/mcu_project/upp/Core/upp/adc_filter.h
index 4e60887..30eb891 100644
--- a/mcu_project/upp/Core/upp/adc_filter.h
+++ b/mcu_project/upp/Core/upp/adc_filter.h
@@ -3,25 +3,37 @@
#include "main.h"
+/**
+ * @brief Флаги состояния фильтра АЦП
+ */
typedef struct
{
- unsigned DataUpdated:1;
-}AdcFilterFlags;
+ unsigned DataUpdated : 1; /**< Флаг обновления данных */
+} AdcFilterFlags;
-// структура для ацп
+/**
+ * @brief Структура фильтрации данных АЦП
+ */
typedef struct
{
- AdcFilterFlags f;
- uint16_t AdcResult;
- ADC_HandleTypeDef *hadc;
- uint32_t sum;
- uint16_t count;
- uint16_t bufferSize;
+ AdcFilterFlags f; /**< Флаги состояния */
+ uint16_t AdcResult; /**< Отфильтрованное значение АЦП */
+ ADC_HandleTypeDef *hadc; /**< Указатель на структуру HAL АЦП */
+ uint32_t sum; /**< Сумма накопленных значений для усреднения */
+ uint16_t count; /**< Текущий счётчик накопленных значений */
+ uint16_t bufferSize; /**< Размер буфера для усреднения (число выборок) */
} ADCFilter_t;
+/** Привязка структуры фильтра к конкретному АЦП */
void adc_Attach(ADCFilter_t *hfilter, ADC_HandleTypeDef *hadc);
+
+/** Обновление и фильтрация нового значения АЦП */
int adc_filterring(ADCFilter_t *hfilter);
+
+/** Чтение последнего отфильтрованного значения АЦП */
uint16_t adc_read_data(ADCFilter_t *hfilter);
+
+/** Проверка, обновились ли данные АЦП после фильтрации */
int adc_is_data_updated(ADCFilter_t *hfilter);
-#endif //__ADC_FILTER_H
\ No newline at end of file
+#endif //__ADC_FILTER_H
diff --git a/mcu_project/upp/Core/upp/tiristor.c b/mcu_project/upp/Core/upp/tiristor.c
index 44ab8c7..a780194 100644
--- a/mcu_project/upp/Core/upp/tiristor.c
+++ b/mcu_project/upp/Core/upp/tiristor.c
@@ -1,104 +1,142 @@
#include "tiristor.h"
-// управление тиристором
+
+/**
+ * @brief Управление состоянием тиристора (включение/выключение) по флагам и времени открытия
+ * @param ctrl Указатель на структуру управления тиристором
+ */
void tiristor_control(TiristorControl_t *ctrl)
{
- if(ctrl->f.EnableTiristor)
- {
- if(ctrl->f.TiristorIsEnable == 0)
- {
- tiristor_enable(ctrl);
- ctrl->enable_start_tick = HAL_GetTick();
- }
- else
- {
- if(HAL_GetTick() - ctrl->enable_start_tick > ctrl->open_time)
- {
- tiristor_disable(ctrl);
- ctrl->f.EnableTiristor = 0;
- }
- }
- }
- else
- {
- if(ctrl->f.TiristorIsEnable)
- tiristor_disable(ctrl);
- }
+ if(ctrl->f.EnableTiristor) // Если разрешено включить тиристор
+ {
+ if(ctrl->f.TiristorIsEnable == 0) // Если тиристор еще выключен
+ {
+ tiristor_enable(ctrl); // Включить тиристор
+ ctrl->enable_start_tick = HAL_GetTick(); // Запомнить время включения для отсчёта длительности открытия
+ }
+ else
+ {
+ // Если время с момента включения превысило заданное время открытия
+ if(HAL_GetTick() - ctrl->enable_start_tick > ctrl->open_time)
+ {
+ tiristor_disable(ctrl); // Выключить тиристор
+ ctrl->f.EnableTiristor = 0; // Снять разрешение на включение, чтобы не включался снова без команды
+ }
+ }
+ }
+ else // Если тиристор не должен быть включен
+ {
+ if(ctrl->f.TiristorIsEnable) // Если тиристор включен
+ tiristor_disable(ctrl); // Выключить тиристор
+ }
}
+/**
+ * @brief Обновление значения задержки угла открытия тиристора в соответствии с направлением и шагом
+ * @param angle Указатель на структуру управления углом тиристора
+ */
void tiristor_angle_update(TiristorAngleControl_t *angle)
-{
- uint32_t current_time_ms = HAL_GetTick();
-
- if ((current_time_ms - angle->last_update_ms) >= angle->Init->sample_time_ms)
- {
- angle->last_update_ms = current_time_ms;
+{
+ uint32_t current_time_ms = HAL_GetTick(); // Текущее время в миллисекундах
- if(angle->Init->direction)
- angle->delay_us += angle->Init->delay_step_us;
- else
- angle->delay_us -= angle->Init->delay_step_us;
-
-
- if (angle->delay_us < angle->Init->delay_min_us)
- {
- angle->delay_us = angle->Init->delay_min_us;
- }
- else if (angle->delay_us > angle->Init->delay_max_us)
- {
- angle->delay_us = angle->Init->delay_max_us;
- }
- }
+ // Проверяем, прошло ли нужное время с последнего обновления
+ if ((current_time_ms - angle->last_update_ms) >= angle->Init->sample_time_ms)
+ {
+ angle->last_update_ms = current_time_ms; // Обновляем время последнего изменения задержки
+
+ // Изменяем задержку в зависимости от направления (разгон или торможение)
+ if(angle->Init->direction)
+ angle->delay_us += angle->Init->delay_step_us; // Увеличиваем задержку (увеличиваем угол)
+ else
+ angle->delay_us -= angle->Init->delay_step_us; // Уменьшаем задержку (уменьшаем угол)
+
+ // Ограничиваем задержку в пределах минимального и максимального значения
+ if (angle->delay_us < angle->Init->delay_min_us)
+ {
+ angle->delay_us = angle->Init->delay_min_us;
+ }
+ else if (angle->delay_us > angle->Init->delay_max_us)
+ {
+ angle->delay_us = angle->Init->delay_max_us;
+ }
+ }
}
-
+/**
+ * @brief Контроль угла открытия тиристора с проверкой таймера и флага готовности
+ * @param ctrl Указатель на структуру управления тиристором
+ */
void tiristor_angle_control(TiristorControl_t *ctrl)
{
- tiristor_angle_update(&ctrl->angle);
-
- if(ctrl->angle.delay_us != 0)
- {
- if ((uint16_t)((uint16_t)TIMER->CNT - ctrl->angle.start_delay_tick) > ctrl->angle.delay_us)
- {
- if(ctrl->f.TiristorReady)
- {
- ctrl->f.EnableTiristor = 1;
- ctrl->f.TiristorReady = 0;
- }
- }
- }
+ tiristor_angle_update(&ctrl->angle); // Обновляем задержку угла открытия
+
+ if(ctrl->angle.delay_us != 0) // Если задержка не нулевая
+ {
+ // Проверяем, прошла ли задержка с момента старта отсчёта таймера
+ if ((uint16_t)((uint16_t)TIMER->CNT - ctrl->angle.start_delay_tick) > ctrl->angle.delay_us)
+ {
+ if(ctrl->f.TiristorReady) // Если тиристор готов к включению
+ {
+ ctrl->f.EnableTiristor = 1; // Разрешаем включение тиристора
+ ctrl->f.TiristorReady = 0; // Снимаем флаг готовности, чтобы не включать повторно сразу
+ }
+ }
+ }
}
+/**
+ * @brief Запуск отсчёта задержки для открытия тиристора
+ * @param ctrl Указатель на структуру управления тиристором
+ */
void tiristor_start_angle_delay(TiristorControl_t *ctrl)
{
- ctrl->f.TiristorReady = 1;
- ctrl->angle.start_delay_tick = TIMER->CNT;
+ ctrl->f.TiristorReady = 1; // Устанавливаем флаг готовности тиристора к включению
+ ctrl->angle.start_delay_tick = TIMER->CNT; // Запоминаем текущее значение счётчика таймера
}
+/**
+ * @brief Включение тиристора путём установки GPIO в состояние открытия
+ * @param ctrl Указатель на структуру управления тиристором
+ */
void tiristor_enable(TiristorControl_t *ctrl)
{
- //HAL_GPIO_WritePin(ctrl->gpiox, ctrl->gpio_pin, GPIO_TIRISTOR_OPEN);
- ctrl->gpiox->ODR |= ctrl->gpio_pin;
- ctrl->f.TiristorIsEnable = 1;
+ // Открываем тиристор, установив соответствующий пин в высокое состояние
+ ctrl->gpiox->ODR |= ctrl->gpio_pin;
+ ctrl->f.TiristorIsEnable = 1; // Устанавливаем флаг, что тиристор включен
}
+/**
+ * @brief Выключение тиристора путём установки GPIO в состояние закрытия
+ * @param ctrl Указатель на структуру управления тиристором
+ */
void tiristor_disable(TiristorControl_t *ctrl)
{
- ctrl->gpiox->ODR &= ~ctrl->gpio_pin;
- //HAL_GPIO_WritePin(ctrl->gpiox, ctrl->gpio_pin, GPIO_TIRISTOR_CLOSE);
- ctrl->f.TiristorIsEnable = 0;
+ // Закрываем тиристор, сбросив соответствующий пин в низкое состояние
+ ctrl->gpiox->ODR &= ~ctrl->gpio_pin;
+ ctrl->f.TiristorIsEnable = 0; // Снимаем флаг включения тиристора
}
+/**
+ * @brief Сброс значения задержки угла открытия тиристора к начальному в зависимости от направления
+ * @param ctrl Указатель на структуру управления тиристором
+ */
void tiristor_angle_reset(TiristorControl_t *ctrl)
{
- if(ctrl->angle.Init->direction)
- ctrl->angle.delay_us = ctrl->angle.Init->delay_min_us;
- else
- ctrl->angle.delay_us = ctrl->angle.Init->delay_max_us;
+ // В зависимости от направления устанавливаем задержку на минимальное или максимальное значение
+ if(ctrl->angle.Init->direction)
+ ctrl->angle.delay_us = ctrl->angle.Init->delay_min_us;
+ else
+ ctrl->angle.delay_us = ctrl->angle.Init->delay_max_us;
}
+/**
+ * @brief Инициализация структуры управления тиристором, установка GPIO и сброс угла открытия
+ * @param ctrl Указатель на структуру управления тиристором
+ * @param gpiox Указатель на порт GPIO
+ * @param gpio_pin Номер пина GPIO
+ */
void tiristor_init(TiristorControl_t *ctrl, GPIO_TypeDef *gpiox, uint32_t gpio_pin)
{
- ctrl->gpiox = gpiox;
- ctrl->gpio_pin = gpio_pin;
- tiristor_angle_reset(ctrl);
-}
\ No newline at end of file
+ ctrl->gpiox = gpiox; // Сохраняем порт GPIO
+ ctrl->gpio_pin = gpio_pin; // Сохраняем номер пина GPIO
+ tiristor_angle_reset(ctrl); // Сбрасываем угол открытия тиристора на начальное значение
+}
diff --git a/mcu_project/upp/Core/upp/tiristor.h b/mcu_project/upp/Core/upp/tiristor.h
index e75f8a9..b1caf26 100644
--- a/mcu_project/upp/Core/upp/tiristor.h
+++ b/mcu_project/upp/Core/upp/tiristor.h
@@ -5,55 +5,108 @@
#include "tim.h"
-#define GPIO_TIRISTOR_OPEN GPIO_PIN_SET
-#define GPIO_TIRISTOR_CLOSE GPIO_PIN_RESET
+#define GPIO_TIRISTOR_OPEN GPIO_PIN_SET /**< Состояние GPIO для открытия тиристора */
+#define GPIO_TIRISTOR_CLOSE GPIO_PIN_RESET /**< Состояние GPIO для закрытия тиристора */
+#define TIMER TIM2 /**< Таймер, используемый для управления тиристором */
-#define TIMER TIM2
-
+/**
+ * @brief Флаги состояния управления тиристором
+ */
typedef struct
{
- unsigned EnableTiristor:1;
- unsigned TiristorIsEnable:1;
- unsigned TiristorReady:1;
-}TiristorControlFlags;
-typedef struct
-{
-uint32_t delay_min_us; // Минимальная задержка (максимальное открытие тиристора)
-uint32_t delay_max_us; // Начальная задержка (практически закрыт)
-uint32_t delay_step_us; // Шаг уменьшения задержки
-uint32_t sample_time_ms; // Интервал между шагами (например, 200 мс)
-unsigned direction; // Направление разгон/торможение
-}AngleInit_t;
+ unsigned EnableTiristor:1; /**< Флаг разрешения управления тиристором */
+ unsigned TiristorIsEnable:1; /**< Флаг, указывающий, что тиристор включен */
+ unsigned TiristorReady:1; /**< Флаг готовности тиристора к работе */
+} TiristorControlFlags;
+/**
+ * @brief Параметры инициализации угла открытия тиристора
+ */
typedef struct
{
- AngleInit_t *Init;
-
- uint32_t last_update_ms; // Время последнего обновления
- uint32_t delay_us; // Текущая задержка (в микросекундах)
- uint16_t start_delay_tick;
-}TiristorAngleControl_t;
+ uint32_t delay_min_us; /**< Минимальная задержка (микросекунды), соответствует максимальному открытию тиристора */
+ uint32_t delay_max_us; /**< Начальная задержка (микросекунды), соответствует практически закрытому тиристору */
+ uint32_t delay_step_us; /**< Шаг уменьшения задержки (микросекунды) */
+ uint32_t sample_time_ms; /**< Интервал времени между шагами регулировки (миллисекунды) */
+ unsigned direction; /**< Направление регулировки: разгон (увеличение открытого угла) или торможение */
+} AngleInit_t;
+
+/**
+ * @brief Структура управления углом открытия тиристора
+ */
+typedef struct
+{
+ AngleInit_t *Init; /**< Указатель на структуру параметров инициализации угла */
+ uint32_t last_update_ms; /**< Время последнего обновления (миллисекунды) */
+ uint32_t delay_us; /**< Текущая задержка (микросекунды) */
+ uint16_t start_delay_tick; /**< Значение таймера при старте задержки */
+} TiristorAngleControl_t;
typedef struct TiristorControl_t TiristorControl_t;
+
+/**
+ * @brief Основная структура управления тиристором
+ */
struct TiristorControl_t
{
- TiristorControlFlags f;
- TiristorAngleControl_t angle;
- GPIO_TypeDef *gpiox;
- uint32_t gpio_pin;
- uint32_t open_time;
- uint32_t enable_start_tick;
-
- void (*start_delay)(TiristorControl_t *ctrl); // Указатель на функцию запуска задержки включения
+ TiristorControlFlags f; /**< Флаги состояния тиристора */
+ TiristorAngleControl_t angle; /**< Управление углом открытия */
+ GPIO_TypeDef *gpiox; /**< Порт GPIO для управления тиристором */
+ uint32_t gpio_pin; /**< Номер пина GPIO */
+ uint32_t open_time; /**< Время открытия тиристора */
+ uint32_t enable_start_tick; /**< Время включения тиристора по таймеру */
+
};
+/**
+ * @brief Управление состоянием тиристора (включение/выключение)
+ * @param ctrl Указатель на структуру управления тиристором
+ */
void tiristor_control(TiristorControl_t *ctrl);
+
+/**
+ * @brief Обновление угла открытия тиристора согласно параметрам
+ * @param angle Указатель на структуру управления углом тиристора
+ */
void tiristor_angle_update(TiristorAngleControl_t *angle);
+
+/**
+ * @brief Контроль угла открытия тиристора, включая обновление состояния
+ * @param ctrl Указатель на структуру управления тиристором
+ */
void tiristor_angle_control(TiristorControl_t *ctrl);
+
+/**
+ * @brief Запуск задержки открытия тиристора
+ * @param ctrl Указатель на структуру управления тиристором
+ */
void tiristor_start_angle_delay(TiristorControl_t* ctrl);
+
+/**
+ * @brief Сброс угла открытия тиристора к начальному состоянию
+ * @param ctrl Указатель на структуру управления тиристором
+ */
void tiristor_angle_reset(TiristorControl_t *ctrl);
+
+/**
+ * @brief Включение тиристора
+ * @param ctrl Указатель на структуру управления тиристором
+ */
void tiristor_enable(TiristorControl_t *ctrl);
+
+/**
+ * @brief Выключение тиристора
+ * @param ctrl Указатель на структуру управления тиристором
+ */
void tiristor_disable(TiristorControl_t *ctrl);
+
+/**
+ * @brief Инициализация структуры управления тиристором
+ * @param ctrl Указатель на структуру управления тиристором
+ * @param gpiox Указатель на GPIO порт
+ * @param gpio_pin Номер GPIO пина
+ */
void tiristor_init(TiristorControl_t *ctrl, GPIO_TypeDef *gpiox, uint32_t gpio_pin);
-#endif //__TIRISTORS_H
\ No newline at end of file
+
+#endif //__TIRISTORS_H
diff --git a/mcu_project/upp/Core/upp/upp.c b/mcu_project/upp/Core/upp/upp.c
index 57835ad..7485652 100644
--- a/mcu_project/upp/Core/upp/upp.c
+++ b/mcu_project/upp/Core/upp/upp.c
@@ -1,207 +1,299 @@
#include "upp.h"
-Phase_t phase_A;
-Phase_t phase_B;
-Phase_t phase_C;
-UPP_Control_t Upp;
-// главная функция
-void upp_main(void)
+Phase_t phase_A; /*< Фаза управления тиристорами A */
+Phase_t phase_B; /*< Фаза управления тиристорами B */
+Phase_t phase_C; /*< Фаза управления тиристорами C */
+UPP_Control_t Upp; /*< Структура управления УПП */
+
+/**
+ * @brief Главная функция управления УПП
+ *
+ * @details Выполняет основную логику управления пускателем:
+ * инициализация углов, безопасный запуск,
+ * проверка флагов остановки/отключения,
+ * управление фазами и тиристорами.
+ */void upp_main(void)
{
+ // Проверяем необходимость обновления параметров угла управления тиристорами
if(GetAngleInit(&Upp.angleInit))
{
+ // Если параметры изменились, сбрасываем углы для всех фаз
tiristor_angle_reset(&phase_A.ctrl);
tiristor_angle_reset(&phase_B.ctrl);
tiristor_angle_reset(&phase_C.ctrl);
}
- // безопасный запуск
+ // Выполняем безопасный запуск (обработка изменения направления и стартового состояния)
upp_safe_go();
- // останавливаем УПП (убираем питание с выхода упп) если выставлен флаг
+ // Если установлен флаг принудительной остановки, выключаем питание УПП и подключаем выход
if(Upp.ForceStop)
{
- Upp.Go = 0;
- connect_upp();
- return;
+ Upp.Go = 0; // Останавливаем работу
+ connect_upp(); // Подключаем УПП (прямое питание)
+ return; // Выход из функции, дальнейшая логика не выполняется
}
+
+ // Если установлен флаг принудительного отключения, выставляем готовность тиристоров и отключаем УПП
if(Upp.ForceDisconnect)
{
phase_A.ctrl.f.TiristorReady = 1;
phase_B.ctrl.f.TiristorReady = 1;
phase_C.ctrl.f.TiristorReady = 1;
- Upp.Go = 0;
- disconnect_upp();
+ Upp.Go = 0; // Останавливаем работу
+ disconnect_upp(); // Отключаем УПП (снимаем питание с выхода)
return;
}
- // отключаем упп если выставлен флаг
+ // Если установлен флаг плавного отключения УПП, готовим тиристоры и отключаем УПП
if(Upp.GoDisconnect)
{
phase_A.ctrl.f.TiristorReady = 1;
phase_B.ctrl.f.TiristorReady = 1;
phase_C.ctrl.f.TiristorReady = 1;
+ Upp.Go = 0;
disconnect_upp();
}
- // останавливаем упп если выставлен флаг
+
+ // Если установлен флаг остановки, останавливаем работу и подключаем УПП (прямое питание)
if(Upp.GoStop)
{
Upp.Go = 0;
connect_upp();
}
+ // Если в режиме подготовки (запуска)
if(Upp.Prepare)
{
+ // Если УПП в состоянии отключения, подключаем его (готовим к работе)
if(Upp.Disconnected)
{
connect_upp();
}
+
+ // Обрабатываем каждую фазу (детектирование нуля, управление углом тиристора)
upp_phase_routine(&phase_A);
upp_phase_routine(&phase_B);
upp_phase_routine(&phase_C);
}
+
+ // Если работа разрешена (флаг Go)
if(Upp.Go)
{
+ // Если всё ещё в подготовке, проверяем готовность тиристоров
if(Upp.Prepare)
{
+ // Если все тиристоры готовы — снимаем флаг подготовки и продолжаем работу
if(phase_A.ctrl.f.TiristorReady && phase_B.ctrl.f.TiristorReady && phase_C.ctrl.f.TiristorReady)
{
Upp.Prepare = 0;
}
else
{
+ // Если хоть один тиристор не готов — выходим, не продолжая управление
return;
}
}
+
+ // Если во время работы произошло отключение УПП — ставим флаг принудительной остановки
if(Upp.Disconnected)
{
Upp.ForceStop = 1;
return;
}
- // если все фазы дошли до минимума в режиме разгона, то выставляем флаг на отключение упп (прямая подача питания на двигатель)
+ // Проверяем условие достижения минимального угла (минимальная задержка) во время запуска (direction == 0)
+ // Это значит, что тиристоры открыты максимально рано — можно перейти на прямое питание двигателя
if( (phase_A.ctrl.angle.delay_us == phase_A.ctrl.angle.Init->delay_min_us) &&
(phase_B.ctrl.angle.delay_us == phase_B.ctrl.angle.Init->delay_min_us) &&
(phase_C.ctrl.angle.delay_us == phase_C.ctrl.angle.Init->delay_min_us) && (Upp.angleInit.direction == 0))
{
- Upp.GoDisconnect = 1;
+ Upp.GoDisconnect = 1; // Флаг для отключения УПП и подачи питания напрямую
}
else
{
Upp.GoDisconnect = 0;
}
- // если все фазы дошли до максимума в режиме торможения, то выставляем флаг на остановку упп (выключения питания на двигателе)
+ // Проверяем условие достижения максимального угла (максимальная задержка) во время торможения (direction == 1)
+ // Это значит, что тиристоры максимально закрыты — нужно остановить питание двигателя
if( (phase_A.ctrl.angle.delay_us == phase_A.ctrl.angle.Init->delay_max_us) &&
(phase_B.ctrl.angle.delay_us == phase_B.ctrl.angle.Init->delay_max_us) &&
(phase_C.ctrl.angle.delay_us == phase_C.ctrl.angle.Init->delay_max_us) && (Upp.angleInit.direction == 1))
{
- Upp.GoStop = 1;
+ Upp.GoStop = 1; // Флаг для остановки УПП и отключения питания
}
else
{
Upp.GoStop = 0;
}
+ // Продолжаем обработку фаз — обновляем состояние и проверяем условия управления тиристорами
upp_phase_routine(&phase_A);
upp_phase_routine(&phase_B);
upp_phase_routine(&phase_C);
+ // Управляем тиристорами каждой фазы с помощью функций контроля угла и самого тиристора
upp_phase_control(&phase_A);
upp_phase_control(&phase_B);
upp_phase_control(&phase_C);
}
else
{
+ // Если флаг Go не установлен, сбрасываем углы управления тиристорами для всех фаз
tiristor_angle_reset(&phase_A.ctrl);
tiristor_angle_reset(&phase_B.ctrl);
tiristor_angle_reset(&phase_C.ctrl);
}
}
+
+/**
+ * @brief Функция безопасного запуска УПП
+ *
+ * @details Следит за изменениями флага GoSafe и запускает или останавливает пускатель,
+ * сбрасывая угол задержки тиристоров в зависимости от направления.
+ */
void upp_safe_go(void)
{
- static int prev_gosafe;
-
+ static int prev_gosafe; // Статическая переменная для хранения предыдущего значения флага GoSafe
+ // Если текущее значение GoSafe больше предыдущего — это сигнал о старте в режиме запуска (направление 0)
if(Upp.GoSafe > prev_gosafe)
{
- Upp.angleInit.direction = 0;
- Upp.Prepare = 1;
- Upp.Go = 1;
+ Upp.angleInit.direction = 0; // Устанавливаем направление пуска (разгон)
+ Upp.Prepare = 1; // Включаем режим подготовки
+ Upp.Go = 1; // Включаем основной флаг запуска работы УПП
+
+ // Сбрасываем углы управления тиристорами для всех фаз — начинаем с начального состояния
tiristor_angle_reset(&phase_A.ctrl);
tiristor_angle_reset(&phase_B.ctrl);
tiristor_angle_reset(&phase_C.ctrl);
}
+ // Если текущее значение GoSafe меньше предыдущего — это сигнал о старте в режиме торможения (направление 1)
else if (Upp.GoSafe < prev_gosafe)
{
- Upp.angleInit.direction = 1;
- Upp.Prepare = 1;
- Upp.Go = 1;
+ Upp.angleInit.direction = 1; // Устанавливаем направление торможения
+ Upp.Prepare = 1; // Включаем режим подготовки
+ Upp.Go = 1; // Включаем основной флаг запуска работы УПП
+
+ // Сбрасываем углы управления тиристорами для всех фаз — начинаем с начального состояния
tiristor_angle_reset(&phase_A.ctrl);
tiristor_angle_reset(&phase_B.ctrl);
tiristor_angle_reset(&phase_C.ctrl);
}
+ // Обновляем сохранённое предыдущее значение GoSafe для отслеживания изменений в следующем вызове
prev_gosafe = Upp.GoSafe;
}
+
+
+/**
+ * @brief Отключение питания УПП (разрыв всех фаз)
+ *
+ * @details Если тиристор готов, вызывает макросы отключения фаз,
+ * после чего выставляет соответствующие флаги состояния.
+ */
void disconnect_upp(void)
{
- if(phase_A.ctrl.f.TiristorReady)
- {
- disconnect_phase(&phase_A);
- }
-
- if(phase_B.ctrl.f.TiristorReady)
- {
- disconnect_phase(&phase_B);
- }
-
- if(phase_C.ctrl.f.TiristorReady)
- {
- disconnect_phase(&phase_C);
- }
-
- if(phase_A.disconnect.Disconnected && phase_B.disconnect.Disconnected && phase_C.disconnect.Disconnected)
- {
- Upp.Disconnected = 1;
- Upp.GoDisconnect = 0;
- Upp.Go = 0;
- }
+ // Если тиристоры фазы A открыты, подключаем фазу напрямую
+ if(phase_A.ctrl.f.TiristorReady)
+ {
+ disconnect_phase(&phase_A);
+ }
+
+ // Аналогично для фазы B
+ if(phase_B.ctrl.f.TiristorReady)
+ {
+ disconnect_phase(&phase_B);
+ }
+
+ // Аналогично для фазы C
+ if(phase_C.ctrl.f.TiristorReady)
+ {
+ disconnect_phase(&phase_C);
+ }
+
+ // Если УПП на всех трех фазах отключены
+ if(phase_A.disconnect.Disconnected && phase_B.disconnect.Disconnected && phase_C.disconnect.Disconnected)
+ {
+ Upp.Disconnected = 1; // Устанавливаем флаг, что УПП полностью отключена
+ Upp.GoDisconnect = 0; // Сбрасываем флаг запроса на отключение
+ Upp.Go = 0; // Прекращаем работу УПП
+ }
+
}
+/**
+ * @brief Подключение питания УПП (соединение всех фаз)
+ *
+ * @details Вызывает отключение тиристоров и макросы подключения фаз,
+ * сбрасывает флаг отключения.
+ */
void connect_upp(void)
{
- tiristor_disable(&phase_A.ctrl);
- tiristor_disable(&phase_B.ctrl);
- tiristor_disable(&phase_C.ctrl);
+ // Отключаем управление тиристорами для всех фаз
+ tiristor_disable(&phase_A.ctrl);
+ tiristor_disable(&phase_B.ctrl);
+ tiristor_disable(&phase_C.ctrl);
- connect_phase(&phase_A);
- connect_phase(&phase_B);
- connect_phase(&phase_C);
-
- Upp.Disconnected = 0;
+ // Подключаем УПП к каждой фазе)
+ connect_phase(&phase_A);
+ connect_phase(&phase_B);
+ connect_phase(&phase_C);
+
+ // Сбрасываем флаг, указывающий на то, что УПП было отключено
+ Upp.Disconnected = 0;
}
+/**
+ * @brief Управление одной фазой УПП
+ * @param phase Указатель на структуру фазы Phase_t
+ *
+ * @details Контролирует угол и включает/отключает тиристор для данной фазы.
+ */
void upp_phase_control(Phase_t *phase)
{
tiristor_angle_control(&phase->ctrl);
tiristor_control(&phase->ctrl);
}
+/**
+ * @brief Обработка фазы при каждом нулевом переходе синусоиды
+ * @param phase Указатель на структуру фазы Phase_t
+ *
+ * @details Обновляет состояние детектора нулевого перехода,
+ * запускает задержку угла тиристора,
+ * отключает тиристор, если он был включен.
+ */
void upp_phase_routine(Phase_t *phase)
{
+ // Обновляем детектор нулевого перехода по текущему состоянию входного сигнала
zero_cross_update(&phase->zc_detector);
+
+ // Если обнаружен нулевой переход (синусоида пересекла 0)
if(is_zero_cross(&phase->zc_detector))
{
+ // Запускаем отсчёт задержки до открытия тиристора (по углу)
tiristor_start_angle_delay(&phase->ctrl);
+ // Если тиристор был включён в предыдущем полупериоде — отключаем его
if (phase->ctrl.f.TiristorIsEnable)
tiristor_disable(&phase->ctrl);
}
}
+/**
+ * @brief Расчёт параметров угла запуска тиристора
+ * @param angle Указатель на структуру AngleInit_t для записи параметров
+ * @return int 1, если произошли изменения параметров, иначе 0
+ *
+ * @details Проверяет изменения в параметрах управления и при необходимости
+ * пересчитывает максимальные и минимальные задержки, шаг изменения угла,
+ * а также изменяет прескалер таймера.
+ */
int GetAngleInit(AngleInit_t *angle)
{
static float sine_freq_old = 0;
@@ -209,7 +301,7 @@ int GetAngleInit(AngleInit_t *angle)
static float max_duty_old = 0, min_duty_old = 0; // Задаются в процентах
int update = 0;
-
+ // Проверка, изменились ли параметры: частота, скважности
if( (Upp.sine_freq != sine_freq_old) &&
(Upp.max_duty != max_duty_old) &&
(Upp.min_duty != min_duty_old) )
@@ -218,64 +310,73 @@ int GetAngleInit(AngleInit_t *angle)
min_duty_old = Upp.min_duty;
max_duty_old = Upp.max_duty;
sine_freq_old = Upp.sine_freq;
-
}
+ // Проверка, изменились ли длительность
if(Upp.Duration != Duration_old)
- {
+ {
update = 1;
Duration_old = Upp.Duration;
}
-
+
if(update)
{
- // max/min duty
- uint32_t half_period_us = (500000.0f / Upp.sine_freq) - 1000; // полупериод в мкс - время открытия тиристоры
+ // Расчёт длительности полупериода в микросекундах (с учётом вычета резерва на открытие тиристора)
+ uint32_t half_period_us = (500000.0f / Upp.sine_freq) - 1000;
+ // Расчёт максимальной и минимальной задержки (в мкс) по процентам скважности
angle->delay_max_us = (uint32_t)(Upp.max_duty * half_period_us);
angle->delay_min_us = (uint32_t)(Upp.min_duty * half_period_us);
+ // Проверка, помещаются ли значения задержек в 16-битный таймер
if((angle->delay_max_us > 0xFFFF) || (angle->delay_min_us > 0xFFFF))
{
- // увеличение прескалера в 10 раз (с 1мкс до 10мкс, с 7Гц до 0.7Гц)
+ // Если нет — увеличиваем прескалер в 10 раз (точность 10 мкс)
angle->delay_max_us /= 10;
angle->delay_min_us /= 10;
TIMER->PSC = 719;
-
+
if((angle->delay_max_us > 0xFFFF) || (angle->delay_min_us > 0xFFFF))
{
- // увеличение прескалера в 10 раз (с 10мкс до 0,1мс, с 0.7Гц до 0.07 Гц)
+ // Если всё ещё не помещается — ещё в 10 раз (точность 0.1 мс)
angle->delay_max_us /= 10;
angle->delay_min_us /= 10;
TIMER->PSC = 7299;
if ((angle->delay_max_us > 0xFFFF) || (angle->delay_min_us > 0xFFFF))
{
- // если все еще переполнение то выключаем всё
+ // Если даже при этом переполнение — аварийная остановка
Upp.ForceStop = 1;
}
}
}
else
{
+ // Задержки помещаются — устанавливаем стандартный прескалер (1 мкс)
TIMER->PSC = 71;
}
- // duration
+ // Перевод длительности разгона/торможения из секунд в миллисекунды
float duration_ms = Duration_old * 1000.0f;
uint32_t steps = duration_ms / angle->sample_time_ms;
if (steps == 0) steps = 1;
+ // Вычисление шага изменения задержки на каждом шаге
if (angle->delay_max_us > angle->delay_min_us)
angle->delay_step_us = (angle->delay_max_us - angle->delay_min_us) / steps;
else
angle->delay_step_us = 0;
-
}
return update;
}
+/**
+ * @brief Инициализация УПП и связанных структур
+ *
+ * @details Настраивает параметры управления, GPIO для фаз,
+ * инициализирует тиристоры, запускает таймер и настраивает детектор нулевого перехода.
+ */
void upp_init(void)
{
Upp.max_duty = 0.9;
diff --git a/mcu_project/upp/Core/upp/upp.h b/mcu_project/upp/Core/upp/upp.h
index f6765e9..4524f4c 100644
--- a/mcu_project/upp/Core/upp/upp.h
+++ b/mcu_project/upp/Core/upp/upp.h
@@ -9,46 +9,69 @@
#include "zero_cross.h"
#include "tiristor.h"
-#define hadc hadc1
-#define ADC_INITIAL_ZERO_LEVEL 2048
+/**
+ * @brief Определение используемого ADC
+ */
+#define hadc hadc1
-#define disconnect_phase(_ph_) { (_ph_)->disconnect.gpiox->ODR |= (_ph_)->disconnect.gpio_pin; (_ph_)->disconnect.Disconnected = 1;}
-#define connect_phase(_ph_) { (_ph_)->disconnect.gpiox->ODR &= ~(_ph_)->disconnect.gpio_pin; (_ph_)->disconnect.Disconnected = 0;}
+/**
+ * @brief Начальный уровень отсчёта для определения нуля в ADC (обычно середина диапазона)
+ */
+#define ADC_INITIAL_ZERO_LEVEL 2048
+/**
+ * @brief Макрос для разрыва (отключения) фазы — устанавливает GPIO в высокий уровень и флаг Disconnected
+ * @param _ph_ Указатель на структуру фазы Phase_t
+ */
+#define disconnect_phase(_ph_) { (_ph_)->disconnect.gpiox->ODR |= (_ph_)->disconnect.gpio_pin; (_ph_)->disconnect.Disconnected = 1;}
+
+/**
+ * @brief Макрос для подключения фазы — сбрасывает GPIO в низкий уровень и флаг Disconnected
+ * @param _ph_ Указатель на структуру фазы Phase_t
+ */
+#define connect_phase(_ph_) { (_ph_)->disconnect.gpiox->ODR &= ~(_ph_)->disconnect.gpio_pin; (_ph_)->disconnect.Disconnected = 0;}
+
+/**
+ * @struct Phase_t
+ * @brief Структура, описывающая одну фазу с состоянием тиристора и детектом нуля
+ */
typedef struct
{
- struct
- {
- unsigned Disconnected:1;
- GPIO_TypeDef *gpiox;
- uint32_t gpio_pin;
- }disconnect;
-
- ZeroCrossDetector_t zc_detector;
- TiristorControl_t ctrl;
-} Phase_t; // структура для фазы
+ struct
+ {
+ unsigned Disconnected:1; /**< Флаг разрыва фазы */
+ GPIO_TypeDef *gpiox; /**< Порт GPIO для разрыва */
+ uint32_t gpio_pin; /**< Пин GPIO для разрыва */
+ }disconnect;
+
+ ZeroCrossDetector_t zc_detector; /**< Детектор пересечения нуля */
+ TiristorControl_t ctrl; /**< Управление тиристором */
+} Phase_t;
+/**
+ * @struct UPP_Control_t
+ * @brief Основная структура управления устройством плавного пуска
+ */
typedef struct
{
- unsigned GoSafe:1;
- unsigned Go:1;
- unsigned GoStop:1;
- unsigned Prepare:1;
- unsigned Disconnected:1;
- unsigned GoDisconnect:1;
- unsigned ForceStop:1;
- unsigned ForceDisconnect:1;
- unsigned PreGoDone:1;
-
-
- float Duration;
- float sine_freq;
- float max_duty;
- float min_duty;
-
- AngleInit_t angleInit;
-}UPP_Control_t;
+ unsigned GoSafe:1; /**< Флаг безопасного запуска */
+ unsigned Go:1; /**< Флаг запуска */
+ unsigned GoStop:1; /**< Флаг остановки */
+ unsigned Prepare:1; /**< Флаг подготовки */
+ unsigned Disconnected:1; /**< Флаг разрыва */
+ unsigned GoDisconnect:1; /**< Флаг отключения */
+ unsigned ForceStop:1; /**< Флаг форсированной остановки */
+ unsigned ForceDisconnect:1; /**< Флаг форсированного отключения */
+ unsigned PreGoDone:1; /**< Флаг завершения подготовки */
+
+ float Duration; /**< Время нарастания и спада напряжение через УПП */
+ float sine_freq; /**< Частота сети */
+ float max_duty; /**< Максимальная скважность угла открытия */
+ float min_duty; /**< Минимальная скважность угла открытия */
+
+ AngleInit_t angleInit; /**< Настройки угла открытия тиристора */
+} UPP_Control_t;
extern Phase_t phase_A;
@@ -56,14 +79,28 @@ extern Phase_t phase_B;
extern Phase_t phase_C;
extern UPP_Control_t Upp;
+/** Основной цикл работы устройства плавного пуска */
void upp_main(void);
+
+/** Выполнение безопасного запуска устройства */
void upp_safe_go(void);
+
+/** Отключение устройства плавного пуска (разрыв фаз) */
void disconnect_upp(void);
+
+/** Подключение устройства плавного пуска (восстановление фаз) */
void connect_upp(void);
+
+/** Выполнение обработки одной фазы в цикле */
void upp_phase_routine(Phase_t *phase);
+
+/** Управление фазой с контролем тиристора и нуля */
void upp_phase_control(Phase_t *phase);
+
+/** Получение настроек угла открытия тиристора */
int GetAngleInit(AngleInit_t *angle);
+
+/** Инициализация устройства плавного пуска */
void upp_init(void);
-
-#endif //__UPP_H
\ No newline at end of file
+#endif //__UPP_H
diff --git a/mcu_project/upp/Core/upp/zero_cross.c b/mcu_project/upp/Core/upp/zero_cross.c
index 9e1c295..e4f2f21 100644
--- a/mcu_project/upp/Core/upp/zero_cross.c
+++ b/mcu_project/upp/Core/upp/zero_cross.c
@@ -2,55 +2,92 @@
ADCFilter_t AdcFilter;
+/**
+ * @brief Инициализация структуры детектора перехода через ноль
+ * @param zc Указатель на структуру ZeroCrossDetector_t
+ * @param zeroLevel Значение уровня АЦП, соответствующее нулю (mid-scale)
+ */
void zero_cross_Init(ZeroCrossDetector_t *zc, uint16_t zeroLevel)
{
- zc->lastSample = 0;
- zc->f.ZeroCrossDetected = 0;
- zc->zeroLevel = zeroLevel;
+ // Обнуляем последнее измеренное значение сдвига относительно нуля
+ zc->lastSample = 0;
+
+ // Сбрасываем флаг обнаружения перехода через ноль
+ zc->f.ZeroCrossDetected = 0;
+
+ // Запоминаем уровень, соответствующий нулю (обычно mid-scale АЦП)
+ zc->zeroLevel = zeroLevel;
}
-// апдейт флага зерокросс детектед
+
+/**
+ * @brief Обновление флага перехода через ноль
+ * @param zc Указатель на структуру ZeroCrossDetector_t
+ * @details Если аппаратный детектор включен, просто переносим флаг EXTI.
+ * Иначе — анализируем разницу между текущим и предыдущим значением АЦП,
+ * чтобы определить, произошёл ли переход через ноль.
+ */
void zero_cross_update(ZeroCrossDetector_t *zc)
{
#ifdef HARDWARE_ZERO_CROSS_DETECT
- zc->f.ZeroCrossDetected = zc->f.EXTIZeroCrossDetected;
+ // Используем флаг аппаратного прерывания EXTI для установки флага перехода через ноль
+ zc->f.ZeroCrossDetected = zc->f.EXTIZeroCrossDetected;
#else
- uint16_t adcValue;
- if(adc_is_data_updated(&zc->AdcFilter))
- {
- adcValue = adc_read_data(&zc->AdcFilter);
- }
- else
- {
- return;
- }
-
- zc->currSample = (int16_t)adcValue - (int16_t)zc->zeroLevel;
+ uint16_t adcValue;
- if ((zc->lastSample < 0 && zc->currSample >= 0) ||
- (zc->lastSample > 0 && zc->currSample <= 0))
- {
- zc->f.ZeroCrossDetected = 1;
- }
+ // Проверяем, обновились ли данные АЦП (фильтр)
+ if(adc_is_data_updated(&zc->AdcFilter))
+ {
+ adcValue = adc_read_data(&zc->AdcFilter);
+ }
+ else
+ {
+ // Нет новых данных — выход из функции
+ return;
+ }
- zc->lastSample = zc->currSample;
+ // Вычисляем смещение текущей выборки относительно нуля
+ zc->currSample = (int16_t)adcValue - (int16_t)zc->zeroLevel;
+
+ // Проверяем, произошёл ли переход через ноль между предыдущей и текущей выборками
+ if ((zc->lastSample < 0 && zc->currSample >= 0) ||
+ (zc->lastSample > 0 && zc->currSample <= 0))
+ {
+ // Устанавливаем флаг обнаружения перехода через ноль
+ zc->f.ZeroCrossDetected = 1;
+ }
+
+ // Сохраняем текущее значение для следующего сравнения
+ zc->lastSample = zc->currSample;
#endif
}
+/**
+ * @brief Проверка наличия перехода через ноль и сброс флагов
+ * @param zc Указатель на структуру ZeroCrossDetector_t
+ * @return int 1 — переход через ноль обнаружен, 0 — нет
+ * @details Если переход обнаружен, сбрасываем флаги и возвращаем 1,
+ * иначе возвращаем 0.
+ */
int is_zero_cross(ZeroCrossDetector_t *zc)
{
- if(zc->f.ZeroCrossDetected)
- {
- zc->f.ZeroCrossDetected = 0;
- zc->f.EXTIZeroCrossDetected = 0;
- return 1;
- }
- return 0;
+ if(zc->f.ZeroCrossDetected)
+ {
+ // Сброс флагов после обнаружения
+ zc->f.ZeroCrossDetected = 0;
+ zc->f.EXTIZeroCrossDetected = 0;
+ return 1;
+ }
+ return 0;
}
-
#ifdef HARDWARE_ZERO_CROSS_DETECT
+/**
+ * @brief Обработчик прерывания EXTI для аппаратного детектора перехода через ноль
+ * @param zc Указатель на структуру ZeroCrossDetector_t
+ * @details Устанавливает флаг аппаратного перехода через ноль.
+ */
void zero_cross_update_EXTI(ZeroCrossDetector_t *zc)
{
- zc->f.EXTIZeroCrossDetected = 1;
+ zc->f.EXTIZeroCrossDetected = 1;
}
-#endif
\ No newline at end of file
+#endif
diff --git a/mcu_project/upp/Core/upp/zero_cross.h b/mcu_project/upp/Core/upp/zero_cross.h
index 8ee4a65..b59ba46 100644
--- a/mcu_project/upp/Core/upp/zero_cross.h
+++ b/mcu_project/upp/Core/upp/zero_cross.h
@@ -4,38 +4,43 @@
#include "main.h"
#include "adc_filter.h"
-#define hadc hadc1
+#define hadc hadc1
+#define HARDWARE_ZERO_CROSS_DETECT // аппаратный детект zero cross (альтернатива — считывание через АЦП)
-
-#define HARDWARE_ZERO_CROSS_DETECT // аппаратный детект зеро кросс (альтернатива - считывая через ацп)
-
+/**
+ * @brief Флаги состояния детектора нуля
+ */
typedef struct
{
- unsigned WaitForZeroCrossDetected : 1;
+ unsigned WaitForZeroCrossDetected : 1; /**< Ожидание обнаружения перехода через ноль */
#ifdef HARDWARE_ZERO_CROSS_DETECT
- unsigned EXTIZeroCrossDetected:1;
+ unsigned EXTIZeroCrossDetected : 1; /**< Флаг обнаружения нуля аппаратным прерыванием EXTI */
#endif
- unsigned ZeroCrossDetected:1;
-}ZeroCrossFlags;
-
+ unsigned ZeroCrossDetected : 1; /**< Флаг обнаружения перехода через ноль */
+} ZeroCrossFlags;
+/**
+ * @brief Структура детектора перехода через ноль
+ */
typedef struct
{
- ZeroCrossFlags f;
- int currSample;
- int16_t lastSample; // предыдущее значение (относительно нуля)
- uint16_t zeroLevel; // уровень, соответствующий "нулю", обычно mid-scale
- ADCFilter_t AdcFilter;
+ ZeroCrossFlags f; /**< Флаги состояния детектора */
+ int currSample; /**< Текущее значение выборки */
+ int16_t lastSample; /**< Предыдущее значение выборки (относительно нуля) */
+ uint16_t zeroLevel; /**< Уровень, соответствующий "нулю", обычно mid-scale АЦП */
+ ADCFilter_t AdcFilter; /**< Фильтр АЦП для сглаживания входных данных */
} ZeroCrossDetector_t;
-
+/** Инициализация структуры детектора перехода через ноль */
void zero_cross_Init(ZeroCrossDetector_t *zc, uint16_t zeroLevel);
+/** Обновление состояния детектора перехода через ноль (через АЦП или аппаратный метод) */
void zero_cross_update(ZeroCrossDetector_t *zc);
+/** Проверка, был ли обнаружен переход через ноль */
int is_zero_cross(ZeroCrossDetector_t *zc);
-
#ifdef HARDWARE_ZERO_CROSS_DETECT
+/** Обновление состояния детектора перехода через ноль при аппаратном прерывании EXTI*/
void zero_cross_update_EXTI(ZeroCrossDetector_t *zc);
#endif
-#endif //__ZERO_CROSS_H
\ No newline at end of file
+#endif //__ZERO_CROSS_H
diff --git a/mcu_project/upp/MDK-ARM/upp.uvguix.wot89 b/mcu_project/upp/MDK-ARM/upp.uvguix.wot89
index 2ce7c3b..a991a90 100644
--- a/mcu_project/upp/MDK-ARM/upp.uvguix.wot89
+++ b/mcu_project/upp/MDK-ARM/upp.uvguix.wot89
@@ -101,17 +101,17 @@
-1
- 431
- 1912
- 2722
- 1220
+ 590
+ 494
+ 1304
+ 1379
0
- 1414
- 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000010000000000000000100000029453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C7570702E6300000000057570702E6300000000C5D4F200FFFFFFFF29453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C7570702E6800000000057570702E6800000000FFDC7800FFFFFFFF2A453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C496E635C6D61696E2E6800000000066D61696E2E6800000000BECEA100FFFFFFFF2A453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C5372635C6D61696E2E6300000000066D61696E2E6300000000F0A0A100FFFFFFFF29453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C496E635C6164632E6800000000056164632E6800000000BCA8E100FFFFFFFF30453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C6164635F66696C7465722E63000000000C6164635F66696C7465722E63000000009CC1B600FFFFFFFF30453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C6164635F66696C7465722E68000000000C6164635F66696C7465722E6800000000F7B88600FFFFFFFF30453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C7A65726F5F63726F73732E63000000000C7A65726F5F63726F73732E6300000000D9ADC200FFFFFFFF30453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C7A65726F5F63726F73732E68000000000C7A65726F5F63726F73732E6800000000A5C2D700FFFFFFFF29453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C5372635C74696D2E63000000000574696D2E6300000000B3A6BE00FFFFFFFF2E453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C7469726973746F722E68000000000A7469726973746F722E6800000000EAD6A300FFFFFFFF2E453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C7469726973746F722E63000000000A7469726973746F722E6300000000F6FA7D00FFFFFFFF37453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C5372635C73746D3332663178785F68616C5F6D73702E63000000001373746D3332663178785F68616C5F6D73702E6300000000B5E99D00FFFFFFFF29453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C5372635C6164632E6300000000056164632E63000000005FC3CF00FFFFFFFF4F453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C447269766572735C53544D3332463178785F48414C5F4472697665725C5372635C73746D3332663178785F68616C5F6164632E63000000001373746D3332663178785F68616C5F6164632E6300000000C1838300FFFFFFFF52453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C447269766572735C53544D3332463178785F48414C5F4472697665725C5372635C73746D3332663178785F68616C5F7263635F65782E63000000001673746D3332663178785F68616C5F7263635F65782E6300000000CACAD500FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD5000100000000000000020000007408000066000000B80B0000FC050000
+ 1595
+ 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000012000000000000000100000029453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C7570702E6300000000057570702E6300000000C5D4F200FFFFFFFF29453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C7570702E6800000000057570702E6800000000FFDC7800FFFFFFFF2A453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C496E635C6D61696E2E6800000000066D61696E2E6800000000BECEA100FFFFFFFF2A453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C5372635C6D61696E2E6300000000066D61696E2E6300000000F0A0A100FFFFFFFF29453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C496E635C6164632E6800000000056164632E6800000000BCA8E100FFFFFFFF30453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C6164635F66696C7465722E63000000000C6164635F66696C7465722E63000000009CC1B600FFFFFFFF30453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C6164635F66696C7465722E68000000000C6164635F66696C7465722E6800000000F7B88600FFFFFFFF30453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C7A65726F5F63726F73732E63000000000C7A65726F5F63726F73732E6300000000D9ADC200FFFFFFFF30453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C7A65726F5F63726F73732E68000000000C7A65726F5F63726F73732E6800000000A5C2D700FFFFFFFF29453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C5372635C74696D2E63000000000574696D2E6300000000B3A6BE00FFFFFFFF2E453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C7469726973746F722E68000000000A7469726973746F722E6800000000EAD6A300FFFFFFFF2E453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C7570705C7469726973746F722E63000000000A7469726973746F722E6300000000F6FA7D00FFFFFFFF37453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C5372635C73746D3332663178785F68616C5F6D73702E63000000001373746D3332663178785F68616C5F6D73702E6300000000B5E99D00FFFFFFFF29453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C5372635C6164632E6300000000056164632E63000000005FC3CF00FFFFFFFF4F453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C447269766572735C53544D3332463178785F48414C5F4472697665725C5372635C73746D3332663178785F68616C5F6164632E63000000001373746D3332663178785F68616C5F6164632E6300000000C1838300FFFFFFFF52453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C447269766572735C53544D3332463178785F48414C5F4472697665725C5372635C73746D3332663178785F68616C5F7263635F65782E63000000001673746D3332663178785F68616C5F7263635F65782E6300000000CACAD500FFFFFFFF2B453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C436F72655C5372635C75736172742E63000000000775736172742E6300000000C5D4F200FFFFFFFF52453A5C2E4449504C4F4D5C6D63755F70726F6A6563745C7570705C447269766572735C434D5349535C4465766963655C53545C53544D3332463178785C496E636C7564655C73746D33326631303378362E68000000000D73746D33326631303378362E6800000000FFDC7800FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000F40000006600000080070000B4020000
@@ -134,7 +134,7 @@
16
- 7408000066000000100D0000FC000000
+ F40000006600000090050000FC000000
@@ -150,7 +150,7 @@
0
16
- 0300000066000000ED000000CC050000
+ 0300000066000000ED00000084020000
16
@@ -170,7 +170,7 @@
0
16
- 0300000066000000ED000000CC050000
+ 0300000066000000ED00000084020000
16
@@ -450,7 +450,7 @@
0
16
- 0300000066000000ED000000CC050000
+ 0300000066000000ED00000084020000
16
@@ -470,7 +470,7 @@
0
16
- 0300000066000000ED000000CC050000
+ 0300000066000000ED00000084020000
16
@@ -490,7 +490,7 @@
0
16
- 0300000000060000350400003D070000
+ 03000000B80200007D070000F5030000
16
@@ -530,7 +530,7 @@
0
16
- 0300000000060000350400003D070000
+ 03000000B80200007D070000F5030000
16
@@ -1170,7 +1170,7 @@
0
16
- 0300000000060000350400003D070000
+ 03000000B802000035040000F5030000
16
@@ -1190,7 +1190,7 @@
0
16
- 0300000000060000350400003D070000
+ 03000000B802000035040000F5030000
16
@@ -1250,7 +1250,7 @@
0
16
- 0300000000060000350400003D070000
+ 03000000B802000035040000F5030000
16
@@ -1270,7 +1270,7 @@
0
16
- 0300000000060000350400003D070000
+ 03000000B802000035040000F5030000
16
@@ -1730,7 +1730,7 @@
0
16
- 00000000560700003804000069070000
+ 000000000E0400008007000021040000
16
@@ -1799,14 +1799,14 @@
3312
- 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000E500000090050000E9000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000007408000066000000100D0000FC000000F40000004F00000090050000E50000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000041020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000200C000066000000100D000058020000A00400004F000000900500004102000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFF00000004F000000F4000000E5050000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000800700006600000070080000FC050000000000004F000000F0000000E50500000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF000000002D020000900500003102000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000008007000048020000100D0000F2020000000000003102000090050000DB02000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFC802000031020000CC020000DB02000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000E505000038040000E90500000100000001000010040000000100000098F9FFFF94000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF01000077940000018000800000010000008007000000060000B80B00006D07000000000000E905000038040000560700000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657301000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000
+ 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000E500000090050000E9000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000F40000006600000090050000FC000000F40000004F00000090050000E50000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000041020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000A0040000660000009005000058020000A00400004F000000900500004102000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFF00000004F000000F40000009D020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000000000066000000F0000000FC050000000000004F000000F00000009D0200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF000000002D020000900500003102000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000000000004802000090050000F2020000000000003102000090050000DB02000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFC802000031020000CC020000DB02000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF000000009D02000080070000A10200000100000001000010040000000100000098F9FFFF94000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF01000077940000018000800000010000000000000000060000380400006D07000000000000A1020000800700000E0400000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657301000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000
59392
File
- 2918
- 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000001A48414C5F52434345785F476574506572697068434C4B4672657196000000000000001400095570702E616E676C650A416E676C65496E69742E0D5570702E466F72636553746F700B636F6E6E6563745F7570700D5469726973746F7252656164790C5469726973746F72446F6E650E6C6173745F7570646174655F6D73147469726973746F725F616E676C655F72657365740E73616D706C655F74696D655F6D730D64656C61795F737465705F75730C64656C61795F6D696E5F75730C64656C61795F6D61785F75730E73746172745F64656C61795F7573084475726174696F6E086475726174696F6E185469726973746F724857416E676C65436F6E74726F6C5F74165469726973746F72416E676C65436F6E74726F6C5F74057570702E680A656E61626C655F7570700B5570702E44697361626C650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000
+ 2927
+ 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000864656C61795F75739600000000000000140010646973636F6E6E6563745F70686173651A7469726973746F725F73746172745F616E676C655F64656C61790B73746172745F64656C61790864656C61795F75730C5469726973746F72446F6E65095570702E616E676C650A416E676C65496E69742E0D5570702E466F72636553746F700B636F6E6E6563745F7570700D5469726973746F7252656164790E6C6173745F7570646174655F6D73147469726973746F725F616E676C655F72657365740E73616D706C655F74696D655F6D730D64656C61795F737465705F75730C64656C61795F6D696E5F75730C64656C61795F6D61785F75730E73746172745F64656C61795F7573084475726174696F6E185469726973746F724857416E676C65436F6E74726F6C5F74165469726973746F72416E676C65436F6E74726F6C5F740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000
1423
@@ -1822,7 +1822,7 @@
Build
966
- 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000002001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000037570709600000000000000010003757070000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000
+ 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000037570709600000000000000010003757070000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000
583
@@ -1838,7 +1838,7 @@
Debug
2373
- 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000
+ 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000
898
@@ -1865,18 +1865,18 @@
0
..\Core\upp\upp.c
- 18
- 19
- 44
+ 40
+ 1
+ 22
1
0
..\Core\upp\upp.h
- 26
+ 40
1
- 39
+ 42
1
0
@@ -1892,7 +1892,7 @@
../Core/Src/main.c
- 5
+ 6
82
96
1
@@ -1910,7 +1910,7 @@
..\Core\upp\adc_filter.c
- 19
+ 22
1
15
1
@@ -1919,27 +1919,27 @@
..\Core\upp\adc_filter.h
- 22
+ 28
1
- 14
+ 24
1
0
..\Core\upp\zero_cross.c
- 22
- 1
- 43
+ 1
+ 54
+ 62
1
0
..\Core\upp\zero_cross.h
- 23
+ 66
1
- 41
+ 36
1
0
@@ -1947,7 +1947,7 @@
../Core/Src/tim.c
29
- 1
+ 20
44
1
@@ -1955,18 +1955,18 @@
..\Core\upp\tiristor.h
- 8
+ 4
1
- 26
+ 59
1
0
..\Core\upp\tiristor.c
- 2
- 19
- 95
+ 26
+ 58
+ 26
1
0
@@ -1983,7 +1983,7 @@
../Core/Src/adc.c
15
- 1
+ 21
52
1
@@ -2001,12 +2001,30 @@
../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c
0
- 304
+ 354
385
1
0
+
+ ../Core/Src/usart.c
+ 0
+ 1
+ 1
+ 1
+
+ 0
+
+
+ ..\Drivers\CMSIS\Device\ST\STM32F1xx\Include\stm32f103x6.h
+ 16
+ 451
+ 482
+ 1
+
+ 0
+
diff --git a/mcu_project/upp/MDK-ARM/upp.uvoptx b/mcu_project/upp/MDK-ARM/upp.uvoptx
index d335b90..6f56b6e 100644
--- a/mcu_project/upp/MDK-ARM/upp.uvoptx
+++ b/mcu_project/upp/MDK-ARM/upp.uvoptx
@@ -128,7 +128,24 @@
-U-O142 -O2254 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL08000 -FP0($$Device:STM32F103C6$Flash\STM32F10x_128.FLM)
-
+
+
+ 0
+ 0
+ 62
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ ..\Core\upp\tiristor.c
+
+
+
+
0