From 95a022d6c12247545b6727fb1eacd86e01864f4e Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Sat, 17 May 2025 14:28:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcu_project/upp/Core/upp/adc_filter.c | 42 +++- mcu_project/upp/Core/upp/adc_filter.h | 32 ++- mcu_project/upp/Core/upp/tiristor.c | 184 +++++++++++------- mcu_project/upp/Core/upp/tiristor.h | 115 ++++++++--- mcu_project/upp/Core/upp/upp.c | 237 ++++++++++++++++------- mcu_project/upp/Core/upp/upp.h | 105 ++++++---- mcu_project/upp/Core/upp/zero_cross.c | 101 +++++++--- mcu_project/upp/Core/upp/zero_cross.h | 39 ++-- mcu_project/upp/MDK-ARM/upp.uvguix.wot89 | 108 ++++++----- mcu_project/upp/MDK-ARM/upp.uvoptx | 19 +- 10 files changed, 664 insertions(+), 318 deletions(-) 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