From d918ffb860975b67f0abcc55d720c02b6c89caa2 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Thu, 20 Nov 2025 19:13:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A8=D0=98=D0=9C=20=D0=B8=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8C=20=D1=83=D0=B3=D0=BB=D0=B0?= =?UTF-8?q?=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B6=D0=B5=D0=BD=D0=B5=20=D0=BD?= =?UTF-8?q?=D0=B0=20417=20=D0=B1=D0=BE=D0=BB=D0=B5=D0=B5=20=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Оптимизированы конфиг дефайны - в мкс и мс, а не тиках --- UPP/Core/Configs/upp_config.h | 40 ++++--- UPP/Core/Configs/upp_defs.h | 18 ++-- UPP/Core/Inc/main.h | 12 +-- UPP/Core/PowerMonitor/adc_tools.c | 2 +- UPP/Core/PowerMonitor/power_monitor.c | 4 +- UPP/Core/Src/adc.c | 2 +- UPP/Core/Src/gpio.c | 6 +- UPP/Core/Src/main.c | 6 +- UPP/Core/Src/tim.c | 98 +++++++++-------- UPP/Core/UPP/angle_control.c | 9 +- UPP/Core/UPP/pwm_thyristors.c | 101 +++++++++++++----- UPP/Core/UPP/pwm_thyristors.h | 4 +- UPP/Core/UPP/upp_main.c | 31 +++--- UPP/Core/UPP/upp_main.h | 2 +- UPP/Core/UPP/upp_params.c | 15 ++- UPP/Core/UPP/upp_params.h | 4 +- UPP/MDK-ARM/UPP.uvoptx | 51 ++++++--- UPP/UPP.ioc | 83 +++++++------- ...атой управления УПП.docx | Bin 54624 -> 54781 bytes 19 files changed, 296 insertions(+), 192 deletions(-) diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index 866bb04..65fc927 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -33,7 +33,7 @@ #define UPP_SIMULATE_I ///< Симулировт токи а не брать с АЦП /** - * @addtogroup UPP_DEFAULT_PARAMS Default params for external flash + * @addtogroup UPP_PARAMS_DEFAULT Default params for external flash * @ingroup UPP_CONFIG * @brief Дефолтные параметры для внешней памяти. Они применятся по команде или по ошибке * @details Префиксы @@ -41,11 +41,10 @@ */ -/* Номинальные параметры */ +/* Уставки по температурам */ #define SETPOINT_TEMP_WARN 70 #define SETPOINT_TEMP_ERR 85 - /* Номинальные параметры */ #define NOM_PHASE_NUMB 3 #define NOM_U_V_DEFAULT 690 @@ -78,7 +77,7 @@ #define ANGLE_MAX_PERCENT_DEFAULT 0.8 #define ANGLE_MIN_PERCENT_DEFAULT 0.1 #define ANGLE_PID_KP_COEF_DEFAULT 1.0 -#define ANGLE_PID_KI_COEF_DEFAULT 0.1 +#define ANGLE_PID_KI_COEF_DEFAULT 0.01 #define ANGLE_PID_KD_COEF_DEFAULT 0 #define ANGLE_REF_ALPHA_COEF_DEFAULT 0.0001 @@ -99,7 +98,7 @@ #define PWM_THYR_FREQUENCY_HZ_DEFAULT 20000 #define PWM_THYR_PULSE_NUMBER_DEFAULT 20 -/** //UPP_DEFAULT_PARAMS +/** //UPP_PARAMS_DEFAULT * @} */ @@ -111,19 +110,18 @@ * @{ */ -/* Периоды вызова всякого */ -#define PM_ADC_PERIOD_US 30 ///< Период опроса АЦП в мкс -#define PM_SLOW_PERIOD_CNT 20 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US -#define PM_TEMP_SLOW_PERIOD_CNT 200 ///< Период обновления датчиков температуры в тиках @ref PM_SLOW_PERIOD_CNT -#define PM_F_SLOW_PERIOD_CNT 2000 ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT - -#define UPP_SLOW_TICKS_FOR_INIT 20000 ///< Сколько тиков ждать медленных измерений ждать перед переходом в готовность +/* Периоды обновления всякого */ +#define PM_ADC_PERIOD_US 30 ///< Период опроса АЦП в мкс +#define PM_SLOW_PERIOD_US 500 ///< Период обновления медленных расчетов в мкс (чтобы делилось на @ref PM_ADC_PERIOD_US) +#define PM_TEMP_SLOW_PERIOD_MS 1000 ///< Период опроса АЦП в мс +#define PM_F_SLOW_PERIOD_MS 40 ///< Период обновления частоты в мс +#define UPP_INIT_BEFORE_READY_MS 2000 ///< Сколько сканировать сеть, перед выставлением состояния готовности /* Частоты таймеров в МГц*/ -#define US_TIM5_FREQ_MHZ 90 ///< Частота тиков таймера ШИМ (1-4 каналы) -#define ADC_TIM8_FREQ_MZH 180 ///< Частота тиков таймера АЦП #define PWM_TIM1_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (1-4 каналы) -#define PWM_TIM3_FREQ_MHZ 90 ///< Частота тиков таймера ШИМ (5-6 каналы) +#define PWM_TIM8_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (5-6 каналы) +#define US_TIM5_FREQ_MHZ 90 ///< Частота тиков микросекундного таймера +#define ADC_TIM3_FREQ_MZH 90 ///< Частота тиков таймера АЦП #define ANGLE_TIM2_FREQ_MHZ 90 ///< Частота тиков таймера отсчета угла открытия тиристоров @@ -132,17 +130,17 @@ // ===== ОТЛАДОЧНЫЕ ШТУКИ ДЛЯ 417 ====== #if defined(STM32F417xx) -#undef US_TIM5_FREQ_MHZ -#undef ADC_TIM8_FREQ_MZH #undef PWM_TIM1_FREQ_MHZ -#undef PWM_TIM3_FREQ_MHZ +#undef PWM_TIM8_FREQ_MHZ +#undef US_TIM5_FREQ_MHZ +#undef ADC_TIM3_FREQ_MZH #undef ANGLE_TIM2_FREQ_MHZ // У 417 меньше частота поэтому меняем прескалер -#define US_TIM5_FREQ_MHZ 84 ///< Частота тиков таймера ШИМ (1-4 каналы) -#define ADC_TIM8_FREQ_MZH 168 ///< Частота тиков таймера АЦП #define PWM_TIM1_FREQ_MHZ 168 ///< Частота тиков таймера ШИМ (1-4 каналы) -#define PWM_TIM3_FREQ_MHZ 84 ///< Частота тиков таймера ШИМ (5-6 каналы) +#define PWM_TIM8_FREQ_MHZ 168 ///< Частота тиков таймера ШИМ (5-6 каналы) +#define US_TIM5_FREQ_MHZ 84 ///< Частота тиков микросекундного таймера +#define ADC_TIM3_FREQ_MZH 84 ///< Частота тиков таймера АЦП #define ANGLE_TIM2_FREQ_MHZ 84 ///< Частота тиков таймера отсчета угла открытия тиристоров #define HAL_PWREx_EnableOverDrive() HAL_ERROR diff --git a/UPP/Core/Configs/upp_defs.h b/UPP/Core/Configs/upp_defs.h index db8fcda..6520ea4 100644 --- a/UPP/Core/Configs/upp_defs.h +++ b/UPP/Core/Configs/upp_defs.h @@ -27,7 +27,7 @@ * @brief Список аварий УПП */ typedef enum { - UPP_Not_Init = 0, ///< УПП не инициализирован + UPP_Init = 0, ///< УПП не инициализирован UPP_Ready = 1, ///< УПП в готовности UPP_Work = 2, ///< УПП в работе, управляет тиристорами UPP_Error = 3, ///< УПП в аварии @@ -96,7 +96,7 @@ typedef struct { /** * @brief Структура параметров УПП от ПУИ - * @details Параметры по умолчанию приведены в @ref UPP_DEFAULT_PARAMS + * @details Параметры по умолчанию приведены в @ref UPP_PARAMS_DEFAULT * @note Защиты №X приведены в @ref UPP_ErrorType_t */ typedef struct { @@ -149,20 +149,26 @@ typedef struct { * @brief Дефайны УПП которые используютяс исключительно внутри программы * @{ */ -#define PM_SLOW_PERIOD_US (PM_ADC_PERIOD_US*PM_SLOW_PERIOD_CNT) -#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000) - +/* Перерасчеты в тики */ +#define PM_SLOW_PERIOD_CNT (PM_SLOW_PERIOD_US/PM_ADC_PERIOD_US) ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US #define US_TO_SLOW_TICKS(_us_) ((_us_)/PM_SLOW_PERIOD_US) #define MS_TO_SLOW_TICKS(_ms_) US_TO_SLOW_TICKS((_ms_)*1000) +#define PM_F_SLOW_PERIOD_CNT (MS_TO_SLOW_TICKS(PM_F_SLOW_PERIOD_MS)) ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT + + +/* Перерасчеты в тики */ +#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000) ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT + - +/* Дефайны для "удобного" доступа к структурам */ #define PARAM_INTERNAL MB_INTERNAL.param #define PARAM_PUI MB_DATA.HoldRegs.pui_params #define ERR_PUI errors.pui.err #define ERR_PRIVATE errors.prvt.f.err #define ERR_PRIVATE_CNT errors.prvt.cnt +/* Enum'ы УПП */ /** * @brief Состояния полуволны */ diff --git a/UPP/Core/Inc/main.h b/UPP/Core/Inc/main.h index 2fa1fad..dc1f029 100644 --- a/UPP/Core/Inc/main.h +++ b/UPP/Core/Inc/main.h @@ -62,6 +62,7 @@ void Error_Handler(void); /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ +#define angletim htim2 #define mb_huart huart3 #define mbdbg_htim htim11 #define PWM_CHANNEL_1 TIM_CHANNEL_1 @@ -69,19 +70,18 @@ void Error_Handler(void); #define PWM_CHANNEL_3 TIM_CHANNEL_3 #define PWM_CHANNEL_4 TIM_CHANNEL_4 #define mem_hspi hspi3 +#define ANGLE_CHANNEL_2 TIM_CHANNEL_2 +#define ANGLE_CHANNEL_3 TIM_CHANNEL_3 +#define ANGLE_CHANNEL_1 TIM_CHANNEL_1 #define PWM_CHANNEL_5 TIM_CHANNEL_3 #define PWM_CHANNEL_6 TIM_CHANNEL_4 #define mb_htim htim12 -#define adc_tim htim8 +#define adc_tim htim3 #define usTick ustim.Instance->CNT -#define hpwm2 htim3 +#define hpwm2 htim8 #define mb_dbg_huart huart6 #define ustim htim5 #define hpwm1 htim1 -#define ANGLE_CHANNEL_1 TIM_CHANNEL_1 -#define ANGLE_CHANNEL_2 TIM_CHANNEL_2 -#define ANGLE_CHANNEL_3 TIM_CHANNEL_3 -#define angletim htim2 #define UM_LED_GREEN2_Pin GPIO_PIN_2 #define UM_LED_GREEN2_GPIO_Port GPIOE #define CEN_Pin GPIO_PIN_3 diff --git a/UPP/Core/PowerMonitor/adc_tools.c b/UPP/Core/PowerMonitor/adc_tools.c index 7e3841d..f959c46 100644 --- a/UPP/Core/PowerMonitor/adc_tools.c +++ b/UPP/Core/PowerMonitor/adc_tools.c @@ -104,7 +104,7 @@ HAL_StatusTypeDef ADC_Start(ADC_Periodic_t *adc, float PeriodUs) HAL_TIM_Base_Stop(adc->htim); // Запускаем таймер который будет запускать опрос АЦП с заданным периодом - __HAL_TIM_SET_AUTORELOAD_FORCE(adc->htim, TIM_MicrosToTick(PeriodUs, ADC_TIM4_FREQ_MZH-1)); + __HAL_TIM_SET_AUTORELOAD_FORCE(adc->htim, TIM_MicrosToTick(PeriodUs, ADC_TIM3_FREQ_MZH-1)); res = HAL_TIM_Base_Start(adc->htim); if(res != HAL_OK) diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c index e0184f0..78cd965 100644 --- a/UPP/Core/PowerMonitor/power_monitor.c +++ b/UPP/Core/PowerMonitor/power_monitor.c @@ -88,7 +88,7 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm) /* Инициализация среднего фильтра для температур */ for(int i = 0; i < ADC_NUMB_OF_T_CHANNELS; i++) { - if(FilterAverage_Init(&hpm->avg[AVG_TEMP1+i], PM_TEMP_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT)) + if(FilterAverage_Init(&hpm->avg[AVG_TEMP1+i], MS_TO_SLOW_TICKS(PM_TEMP_SLOW_PERIOD_MS), FILTER_MODE_DEFAULT)) return HAL_ERROR; Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]); @@ -96,7 +96,7 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm) /* Инициализация среднего фильтра для частот */ for(int i = 0; i < 3; i++) { - if(FilterAverage_Init(&hpm->avg[AVG_FBA+i], PM_F_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT)) + if(FilterAverage_Init(&hpm->avg[AVG_FBA+i], MS_TO_SLOW_TICKS(PM_F_SLOW_PERIOD_MS), FILTER_MODE_DEFAULT)) return HAL_ERROR; Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]); diff --git a/UPP/Core/Src/adc.c b/UPP/Core/Src/adc.c index 1e47c8a..0da022a 100644 --- a/UPP/Core/Src/adc.c +++ b/UPP/Core/Src/adc.c @@ -50,7 +50,7 @@ void MX_ADC3_Init(void) hadc3.Init.ContinuousConvMode = DISABLE; hadc3.Init.DiscontinuousConvMode = DISABLE; hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; - hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T8_TRGO; + hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO; hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc3.Init.NbrOfConversion = 6; hadc3.Init.DMAContinuousRequests = ENABLE; diff --git a/UPP/Core/Src/gpio.c b/UPP/Core/Src/gpio.c index 6746ace..8d3dd37 100644 --- a/UPP/Core/Src/gpio.c +++ b/UPP/Core/Src/gpio.c @@ -62,13 +62,13 @@ void MX_GPIO_Init(void) HAL_GPIO_WritePin(DO2_GPIO_Port, DO2_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(DO3_GPIO_Port, DO3_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(DO3_GPIO_Port, DO3_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(DO5_GPIO_Port, DO5_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, DO5_Pin|DO4_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOA, DO4_Pin|RDO4_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(RDO4_GPIO_Port, RDO4_Pin, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, DO1_Pin|RDO1_Pin|SCIDE2_Pin|SCIDE1_Pin diff --git a/UPP/Core/Src/main.c b/UPP/Core/Src/main.c index 3b44545..89df5ce 100644 --- a/UPP/Core/Src/main.c +++ b/UPP/Core/Src/main.c @@ -22,7 +22,6 @@ #include "can.h" #include "dma.h" #include "iwdg.h" -#include "rtc.h" #include "spi.h" #include "tim.h" #include "usart.h" @@ -108,7 +107,6 @@ int main(void) MX_USART3_UART_Init(); MX_CAN1_Init(); MX_IWDG_Init(); - //MX_RTC_Init(); MX_TIM1_Init(); MX_TIM3_Init(); MX_USART6_UART_Init(); @@ -123,11 +121,11 @@ int main(void) __HAL_TIM_SET_PRESCALER_FORCE(&ustim, US_TIM5_FREQ_MHZ-1); #if defined(STM32F417xx) // т.к. нет епромки выставляем дефолтные - UPP_SetDefault(1, 1); + UPP_Params_SetDefault(1, 1); #endif #else //MATLAB #endif //MATLAB - UPP_Init(); + UPP_App_Init(); /* USER CODE END 2 */ /* Infinite loop */ diff --git a/UPP/Core/Src/tim.c b/UPP/Core/Src/tim.c index 9d46689..97a009e 100644 --- a/UPP/Core/Src/tim.c +++ b/UPP/Core/Src/tim.c @@ -53,7 +53,7 @@ void MX_TIM1_Init(void) htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 65535; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim1.Init.RepetitionCounter = 0; + htim1.Init.RepetitionCounter = 20; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { @@ -68,6 +68,10 @@ void MX_TIM1_Init(void) { Error_Handler(); } + if (HAL_TIM_OnePulse_Init(&htim1, TIM_OPMODE_SINGLE) != HAL_OK) + { + Error_Handler(); + } sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) @@ -184,9 +188,7 @@ void MX_TIM3_Init(void) /* USER CODE END TIM3_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; - TIM_SlaveConfigTypeDef sSlaveConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; - TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM3_Init 1 */ @@ -206,42 +208,15 @@ void MX_TIM3_Init(void) { Error_Handler(); } - if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) - { - Error_Handler(); - } - if (HAL_TIM_OnePulse_Init(&htim3, TIM_OPMODE_SINGLE) != HAL_OK) - { - Error_Handler(); - } - sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER; - sSlaveConfig.InputTrigger = TIM_TS_ITR0; - if (HAL_TIM_SlaveConfigSynchro(&htim3, &sSlaveConfig) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 0; - sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; - sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; - if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) - { - Error_Handler(); - } - if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) - { - Error_Handler(); - } /* USER CODE BEGIN TIM3_Init 2 */ /* USER CODE END TIM3_Init 2 */ - HAL_TIM_MspPostInit(&htim3); } /* TIM5 init function */ @@ -294,6 +269,8 @@ void MX_TIM8_Init(void) TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; /* USER CODE BEGIN TIM8_Init 1 */ @@ -301,9 +278,9 @@ void MX_TIM8_Init(void) htim8.Instance = TIM8; htim8.Init.Prescaler = 0; htim8.Init.CounterMode = TIM_COUNTERMODE_UP; - htim8.Init.Period = 1800-1; + htim8.Init.Period = 65535; htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim8.Init.RepetitionCounter = 0; + htim8.Init.RepetitionCounter = 20; htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim8) != HAL_OK) { @@ -314,15 +291,50 @@ void MX_TIM8_Init(void) { Error_Handler(); } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; + if (HAL_TIM_PWM_Init(&htim8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_OnePulse_Init(&htim8, TIM_OPMODE_SINGLE) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK) { Error_Handler(); } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) + { + Error_Handler(); + } + sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; + sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; + sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; + sBreakDeadTimeConfig.DeadTime = 0; + sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; + sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; + sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig) != HAL_OK) + { + Error_Handler(); + } /* USER CODE BEGIN TIM8_Init 2 */ /* USER CODE END TIM8_Init 2 */ + HAL_TIM_MspPostInit(&htim8); } /* TIM11 init function */ @@ -505,27 +517,27 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) /* USER CODE END TIM1_MspPostInit 1 */ } - else if(timHandle->Instance==TIM3) + else if(timHandle->Instance==TIM8) { - /* USER CODE BEGIN TIM3_MspPostInit 0 */ + /* USER CODE BEGIN TIM8_MspPostInit 0 */ - /* USER CODE END TIM3_MspPostInit 0 */ + /* USER CODE END TIM8_MspPostInit 0 */ __HAL_RCC_GPIOC_CLK_ENABLE(); - /**TIM3 GPIO Configuration - PC8 ------> TIM3_CH3 - PC9 ------> TIM3_CH4 + /**TIM8 GPIO Configuration + PC8 ------> TIM8_CH3 + PC9 ------> TIM8_CH4 */ GPIO_InitStruct.Pin = PWM5_Pin|PWM6_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF2_TIM3; + GPIO_InitStruct.Alternate = GPIO_AF3_TIM8; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - /* USER CODE BEGIN TIM3_MspPostInit 1 */ + /* USER CODE BEGIN TIM8_MspPostInit 1 */ - /* USER CODE END TIM3_MspPostInit 1 */ + /* USER CODE END TIM8_MspPostInit 1 */ } } diff --git a/UPP/Core/UPP/angle_control.c b/UPP/Core/UPP/angle_control.c index 76357a1..d97c748 100644 --- a/UPP/Core/UPP/angle_control.c +++ b/UPP/Core/UPP/angle_control.c @@ -38,12 +38,10 @@ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle) Angle_Reset(hangle, UPP_PHASE_B); Angle_Reset(hangle, UPP_PHASE_C); - // Инициализация углов float angle_max = to_float(PARAM_INTERNAL.angle.Angle_Max, 65535); float angle_min = to_float(PARAM_INTERNAL.angle.Angle_Min, 65535); - hangle->f.Initialized = 1; return HAL_OK; } @@ -121,8 +119,8 @@ void Angle_PID_Reset(Angle_Handle_t *hangle) * @brief Выставление степени открытия тиристоров. * @param hangle Указатель на таймер * @param OpenLevel Насколько открыть тиристор: - - 0 - полностбю закрыт, - - 1 - полностью открыт + - 0 - максимально закрыт, + - 1 - максимально открыт * @return HAL Status. */ HAL_StatusTypeDef Angle_SetAngle(Angle_Handle_t *hangle, float OpenLevel) @@ -190,6 +188,7 @@ HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float P switch(Phase) { case UPP_PHASE_A: + __HAL_TIM_CLEAR_IT(hangle->htim, TIM_IT_CC1); // очищаем флаг навсякий __HAL_TIM_SET_COMPARE(hangle->htim, ANGLE_CHANNEL_1, ccr_ticks); // Если слишком маленький timer_tick и счетчик уже перевалил за ccr, но не сгенерил прервыание: if (__HAL_TIM_GET_COMPARE(hangle->htim, ANGLE_CHANNEL_1) <= __HAL_TIM_GET_COUNTER(hangle->htim)) @@ -203,6 +202,7 @@ HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float P break; case UPP_PHASE_B: + __HAL_TIM_CLEAR_IT(hangle->htim, TIM_IT_CC2); // очищаем флаг навсякий __HAL_TIM_SET_COMPARE(hangle->htim, ANGLE_CHANNEL_2, ccr_ticks); // Если слишком маленький timer_tick и счетчик уже перевалил за ccr, но не сгенерил прервыание: if (__HAL_TIM_GET_COMPARE(hangle->htim, ANGLE_CHANNEL_2) <= __HAL_TIM_GET_COUNTER(hangle->htim)) @@ -215,6 +215,7 @@ HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float P break; case UPP_PHASE_C: + __HAL_TIM_CLEAR_IT(hangle->htim, TIM_IT_CC3); // очищаем флаг навсякий __HAL_TIM_SET_COMPARE(hangle->htim, ANGLE_CHANNEL_3, ccr_ticks); // Если слишком маленький timer_tick и счетчик уже перевалил за ccr, но не сгенерил прервыание: if (__HAL_TIM_GET_COMPARE(hangle->htim, ANGLE_CHANNEL_3) <= __HAL_TIM_GET_COUNTER(hangle->htim)) diff --git a/UPP/Core/UPP/pwm_thyristors.c b/UPP/Core/UPP/pwm_thyristors.c index 0aafba6..02ee9eb 100644 --- a/UPP/Core/UPP/pwm_thyristors.c +++ b/UPP/Core/UPP/pwm_thyristors.c @@ -60,14 +60,17 @@ HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm) PWM_SetConfig(hpwm, PARAM_INTERNAL.pwm.PhaseMask, PARAM_INTERNAL.pwm.Frequency, PARAM_INTERNAL.pwm.PulseNumber); - PWM_Stop(hpwm, 0, 1); HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_1); HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_2); HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_3); HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_4); HAL_TIM_PWM_Start(&hpwm2, PWM_CHANNEL_5); HAL_TIM_PWM_Start(&hpwm2, PWM_CHANNEL_6); + PWM_Stop(hpwm, 0, 1); + +#ifndef PWM_HARDWARE_IMPULSES_CONTROL HAL_TIM_Base_Start_IT(&hpwm1); +#endif return HAL_OK; } @@ -103,13 +106,26 @@ HAL_StatusTypeDef PWM_Start(PWM_Handle_t *hpwm, UPP_Phase_t Phase) // Запуск только если таймер в режиме ожидания case PWM_THYR_TIM_WAIT: +#ifndef PWM_HARDWARE_IMPULSES_CONTROL hpwm->Phase[Phase]->State = PWM_THYR_TIM_START; - return HAL_OK; + return HAL_OK; +#else + hpwm->Phase[Phase]->State = PWM_THYR_TIM_ACTIVE; + + if(hpwm->Config.PulseNumber) + hpwm->Phase[Phase]->htim->Instance->RCR = hpwm->Config.PulseNumber-1; + else + return HAL_ERROR; + + __PWM_SetOutputState(hpwm->Phase[Phase], PWM_ENABLE); + + hpwm->f.Running++; + return HAL_TIM_Base_Start_IT(hpwm->Phase[Phase]->htim); +#endif default: return HAL_ERROR; } - return HAL_ERROR; } @@ -127,30 +143,44 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_ { if(assert_upp(hpwm)) return HAL_ERROR; - // Если канал дурацкий - возвращаем ошибку - if(Phase >= 3) - { - return HAL_ERROR; - } - if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) - return HAL_ERROR; - hpwm->Phase[Phase]->State = PWM_THYR_DISABLED; - - // Если не force_stop_all - сбрасываем только текущий канал - if (!force_stop_all) - { - __PWM_SetOutputState(hpwm->Phase[Phase], PWM_DISABLE); - } // Если force_stop_all - сбрасываем ВСЕ КАНАЛЫ - else { + if(force_stop_all) + { + // в первую очередь выключаем канал, потом выставим режим каналов + __HAL_TIM_MOE_DISABLE(&hpwm1); + // в первую очередь выключаем канал, потом выставим режим каналов + __HAL_TIM_MOE_DISABLE(&hpwm2); + + for(int ch = 0; ch < 6; ch++) { __PWM_SetOutputState(&hpwm->AllPhases[ch], PWM_DISABLE); } + return HAL_OK; + } + // Если НЕ force_stop_all - сбрасываем ТОЛЬКО заданный канал + else + { + // Если канал дурацкий - возвращаем ошибку + if(Phase >= 3) + { + return HAL_ERROR; + } + if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) + return HAL_ERROR; + + hpwm->Phase[Phase]->State = PWM_THYR_DISABLED; + // Если не force_stop_all - сбрасываем только текущий канал + __PWM_SetOutputState(hpwm->Phase[Phase], PWM_DISABLE); +#ifdef PWM_HARDWARE_IMPULSES_CONTROL + if(hpwm->f.Running) + hpwm->f.Running--; + + HAL_TIM_Base_Stop(hpwm->Phase[Phase]->htim); +#endif + return HAL_OK; } - - return HAL_OK; } /** * @brief Хендл ШИМ тиристоров. @@ -172,6 +202,7 @@ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm) if (hPhase->htim == NULL) continue; +#ifndef PWM_HARDWARE_IMPULSES_CONTROL switch (hPhase->State) { case PWM_THYR_DISABLED: // канал отключен @@ -208,6 +239,14 @@ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm) __PWM_SetOutputState(hPhase, PWM_DISABLE); break; } +#else //PWM_HARDWARE_IMPULSES_CONTROL + // после того как пачка импульсов прошла отключаем активный канал + if (hPhase->State == PWM_THYR_TIM_ACTIVE) + { + __PWM_SetOutputState(hPhase, PWM_DISABLE); + HAL_TIM_Base_Stop(hPhase->htim); + } +#endif } return HAL_OK; } @@ -233,7 +272,7 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t hpwm->Config.Frequency = Frequency; // Высставление периодов __HAL_TIM_SET_AUTORELOAD(&hpwm1, TIM_FreqToTick(Frequency, PWM_TIM1_FREQ_MHZ-1)); - __HAL_TIM_SET_AUTORELOAD(&hpwm2, TIM_FreqToTick(Frequency, PWM_TIM3_FREQ_MHZ-1)); + __HAL_TIM_SET_AUTORELOAD(&hpwm2, TIM_FreqToTick(Frequency, PWM_TIM8_FREQ_MHZ-1)); // Скважности 50/50 __HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_1, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); __HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_2, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); @@ -248,8 +287,12 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t __HAL_TIM_SET_COUNTER(&hpwm2, 0); PWM_Stop(hpwm, 0, 1); - + +#ifndef PWM_HARDWARE_IMPULSES_CONTROL return HAL_TIM_Base_Start_IT(&hpwm1); +#else + return HAL_OK; +#endif } @@ -317,7 +360,8 @@ HAL_StatusTypeDef PWM_SetPolarity(PWM_Handle_t *hpwm, int polarity) } return HAL_OK; } -/** + +/** * @brief Установка режима для канала ШИМ. * @param hpwm Указатель на хендл ШИМ тиристоров * @param Phase Для какой фазы надо установить состояние @@ -331,9 +375,9 @@ static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state if (hCh->htim == NULL) return HAL_ERROR; - uint32_t ch_mode = state; + // выставляем режим каналов switch(hCh->ChMask) { case TIM_CHANNEL_1: @@ -355,5 +399,12 @@ static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state default: break; } + + // в последнюю очередь включаем выход. Перед этим настраиваем каналы на ШИМ + if(state == PWM_ENABLE) + { + __HAL_TIM_MOE_ENABLE(hCh->htim); + } + return HAL_OK; -} +} \ No newline at end of file diff --git a/UPP/Core/UPP/pwm_thyristors.h b/UPP/Core/UPP/pwm_thyristors.h index 85fc1d3..6516a6e 100644 --- a/UPP/Core/UPP/pwm_thyristors.h +++ b/UPP/Core/UPP/pwm_thyristors.h @@ -10,11 +10,11 @@ - +#define PWM_HARDWARE_IMPULSES_CONTROL #define PWM_ENABLE TIM_OCMODE_PWM2 -#define PWM_DISABLE TIM_OCMODE_FORCED_ACTIVE +#define PWM_DISABLE TIM_OCMODE_FORCED_INACTIVE diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index c2a2396..b32b125 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -11,15 +11,15 @@ UPP_t upp; float dbg_iref = 1; -int dbg_polarity = 1; -// ОСНОВНОЙ ЦИКЛ main.c +int dbg_polarity = 0; /** * @brief Инициализация УПП. * @return 0 - если ОК, >1 если ошибка. */ -int UPP_Init(void) +int UPP_App_Init(void) { + upp.workmode = UPP_Init; /* Очищаем входы */ UPP_IO_Init(); @@ -45,9 +45,7 @@ int UPP_Init(void) if(Angle_Init(&upp.hangle) != HAL_OK) { return 1; - } - - upp.workmode = UPP_Ready; + } return 0; } @@ -57,7 +55,7 @@ int UPP_Init(void) */ int UPP_PreWhile(void) { - UPP_Params_InternalControl(); + UPP_Params_ControlInternal(); if(Angle_SetRange(&upp.hangle, 0.0, 0.8) != HAL_OK) return 1; @@ -102,7 +100,7 @@ int UPP_While(void) // Сброс на дефолтные по запросу if(upp.call->set_default_pui || upp.call->set_default_internal) { - UPP_SetDefault(upp.call->set_default_pui, upp.call->set_default_internal); + UPP_Params_SetDefault(upp.call->set_default_pui, upp.call->set_default_internal); } // Медленные расчеты @@ -115,11 +113,16 @@ int UPP_While(void) switch(upp.workmode) { /* Состояние инициализации */ - case UPP_Not_Init: - if(slow_cnt > UPP_SLOW_TICKS_FOR_INIT) + case UPP_Init: + if(slow_cnt > MS_TO_SLOW_TICKS(UPP_INIT_BEFORE_READY_MS)) { + slow_cnt = 0; // сбрасываем чтобы потом еще раз инициализироватся upp.workmode = UPP_Ready; } + else + { + slow_cnt++; + } break; /* Состояние готовности */ @@ -147,7 +150,7 @@ int UPP_While(void) UPP_DO.Error(DISABLE); // если пришла команда на остановку if (!upp.call->go) - upp.workmode = UPP_Ready; + upp.workmode = UPP_Init; // Регулирование тиристоров #ifndef UPP_SIMULATE_I // берем с АЦП @@ -181,7 +184,7 @@ int UPP_While(void) UPP_DO.Error(ENABLE); // Находимся до тех пор пока ошибки не будет устранена if(errors.common == Err_None) - upp.workmode = UPP_Not_Init; + upp.workmode = UPP_Init; retval = 1; break; @@ -189,7 +192,7 @@ int UPP_While(void) UPP_Errors_Handle(); - UPP_Params_InternalControl(); + UPP_Params_ControlInternal(); upp.pm.f.runSlow = 0; @@ -209,7 +212,7 @@ int UPP_While(void) */ void UPP_Tick(void) { - if(upp.workmode == UPP_Not_Init) + if(upp.workmode == UPP_Init) return; } diff --git a/UPP/Core/UPP/upp_main.h b/UPP/Core/UPP/upp_main.h index 9d45809..4d07896 100644 --- a/UPP/Core/UPP/upp_main.h +++ b/UPP/Core/UPP/upp_main.h @@ -49,7 +49,7 @@ extern UPP_t upp; /* Инициализация УПП */ -int UPP_Init(void); +int UPP_App_Init(void); /* Инициализация основного цикла УПП. */ int UPP_PreWhile(void); /* Основной цикл УПП. */ diff --git a/UPP/Core/UPP/upp_params.c b/UPP/Core/UPP/upp_params.c index 5474851..66314c7 100644 --- a/UPP/Core/UPP/upp_params.c +++ b/UPP/Core/UPP/upp_params.c @@ -18,7 +18,7 @@ static void __AngleSetLimit(void); * @brief Контроль внутренних параметров УПП. * @return HAL Status. */ -void UPP_Params_InternalControl(void) +void UPP_Params_ControlInternal(void) { __AngleSetLimit(); if(upp.call->go) // при запущеном УПП ничего не меняем @@ -171,13 +171,22 @@ void UPP_Params_InternalControl(void) } + /** - * @brief Установка параметров на дефолтные значения @ref UPP_DEFAULT_PARAMS. + * @brief Контроль внутренних параметров УПП. + * @return HAL Status. + */ +void UPP_Params_Saturate(void) +{ +} + +/** + * @brief Установка параметров на дефолтные значения @ref UPP_PARAMS_DEFAULT. * @param pui_default Сбросить параметры ПУИ * @param internal_default Сбросить внутренние параметры * @return HAL Status. */ -void UPP_SetDefault(int pui_default, int internal_default) +void UPP_Params_SetDefault(int pui_default, int internal_default) { if(pui_default) { diff --git a/UPP/Core/UPP/upp_params.h b/UPP/Core/UPP/upp_params.h index 9f80af0..22a3db6 100644 --- a/UPP/Core/UPP/upp_params.h +++ b/UPP/Core/UPP/upp_params.h @@ -96,8 +96,8 @@ typedef struct /* Контроль внутренних параметров УПП. */ -void UPP_Params_InternalControl(void); +void UPP_Params_ControlInternal(void); /* Установка параметров на дефолтные значения */ -void UPP_SetDefault(int pui_default, int internal_default); +void UPP_Params_SetDefault(int pui_default, int internal_default); #endif //_UPP_PARAMS_H \ No newline at end of file diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx index 511f869..5c7eb76 100644 --- a/UPP/MDK-ARM/UPP.uvoptx +++ b/UPP/MDK-ARM/UPP.uvoptx @@ -331,7 +331,7 @@ 0 407 1 -
134233366
+
134233418
0 0 0 @@ -368,12 +368,12 @@ 1 1 - upp + upp,0x0A 2 1 - uwTick + uwTick,0x0A 3 @@ -388,7 +388,7 @@ 5 1 - hbt + hbt,0x0A 6 @@ -410,6 +410,31 @@ 1 dbg_iref + + 10 + 1 + upp.call->reset_mcu + + + 11 + 1 + upp.pm.zc.Channel[0].HalfWave + + + 12 + 1 + upp.call->reserved + + + 13 + 1 + \\Debug_F417\../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c\uwTick + + + 14 + 1 + htim1 + @@ -518,18 +543,8 @@ 0 - `upp.pm.measured.real.U[0] - 0000000000000000007097C00000000000709740000000000000000000000000000000007570702E706D2E6D656173757265642E7265616C2E555B305D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000001000000731CC7711CC7D13F1400000000000000000000000000000000000000A49F0008 - - - 1 - `upp.pm.measured.real.U[1] - 0080000000000000007097C00000000000709740000000000000000000000000000000007570702E706D2E6D656173757265642E7265616C2E555B315D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000002000000398EE3388EE3D83F1400000000000000000000000000000000000000A49F0008 - - - 2 - `upp.pm.measured.final.F[0] - 0000800000000000000000000000000000805140000000000000000000000000000000007570702E706D2E6D656173757265642E66696E616C2E465B305D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000003000000555555555555D53F140000000000000000000000000000000000000028020008 + `upp.pm.zc.Channel[0].HalfWave + 0000000000000000000000000000000000000040000000000000000000000000000000007570702E706D2E7A632E4368616E6E656C5B305D2E48616C66576176650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000001000000000000000000F03F1400000000000000000000000000000000000000FC9E0008 @@ -545,6 +560,10 @@ System Viewer\TIM14 35903 + + System Viewer\TIM2 + 35900 + System Viewer\TIM5 35905 diff --git a/UPP/UPP.ioc b/UPP/UPP.ioc index 458edce..9245df5 100644 --- a/UPP/UPP.ioc +++ b/UPP/UPP.ioc @@ -94,25 +94,25 @@ Mcu.Pin23=PB11 Mcu.Pin24=PB13 Mcu.Pin25=PG6 Mcu.Pin26=PC6 -Mcu.Pin27=PC8 -Mcu.Pin28=PC9 -Mcu.Pin29=PA8 +Mcu.Pin27=PC7 +Mcu.Pin28=PC8 +Mcu.Pin29=PC9 Mcu.Pin3=PE5 -Mcu.Pin30=PA9 -Mcu.Pin31=PA10 -Mcu.Pin32=PA11 -Mcu.Pin33=PA12 -Mcu.Pin34=PA13 -Mcu.Pin35=PA14 -Mcu.Pin36=PA15 -Mcu.Pin37=PC10 -Mcu.Pin38=PC11 -Mcu.Pin39=PC12 +Mcu.Pin30=PA8 +Mcu.Pin31=PA9 +Mcu.Pin32=PA10 +Mcu.Pin33=PA11 +Mcu.Pin34=PA12 +Mcu.Pin35=PA13 +Mcu.Pin36=PA14 +Mcu.Pin37=PA15 +Mcu.Pin38=PC10 +Mcu.Pin39=PC11 Mcu.Pin4=PE6 -Mcu.Pin40=PD2 -Mcu.Pin41=PD3 -Mcu.Pin42=PD6 -Mcu.Pin43=PG9 +Mcu.Pin40=PC12 +Mcu.Pin41=PD2 +Mcu.Pin42=PD3 +Mcu.Pin43=PD6 Mcu.Pin44=PG12 Mcu.Pin45=PG15 Mcu.Pin46=PB3 @@ -128,16 +128,16 @@ Mcu.Pin54=VP_RTC_VS_RTC_Activate Mcu.Pin55=VP_RTC_VS_RTC_Calendar Mcu.Pin56=VP_SYS_VS_tim14 Mcu.Pin57=VP_TIM1_VS_ClockSourceINT -Mcu.Pin58=VP_TIM2_VS_ClockSourceINT -Mcu.Pin59=VP_TIM2_VS_no_output1 +Mcu.Pin58=VP_TIM1_VS_OPM +Mcu.Pin59=VP_TIM2_VS_ClockSourceINT Mcu.Pin6=PC14/OSC32_IN -Mcu.Pin60=VP_TIM2_VS_no_output2 -Mcu.Pin61=VP_TIM2_VS_no_output3 -Mcu.Pin62=VP_TIM3_VS_ClockSourceINT -Mcu.Pin63=VP_TIM5_VS_ClockSourceINT -Mcu.Pin64=VP_TIM8_VS_ControllerModeTrigger +Mcu.Pin60=VP_TIM2_VS_no_output1 +Mcu.Pin61=VP_TIM2_VS_no_output2 +Mcu.Pin62=VP_TIM2_VS_no_output3 +Mcu.Pin63=VP_TIM3_VS_ClockSourceINT +Mcu.Pin64=VP_TIM5_VS_ClockSourceINT Mcu.Pin65=VP_TIM8_VS_ClockSourceINT -Mcu.Pin66=VP_TIM8_VS_ClockSourceITR +Mcu.Pin66=VP_TIM8_VS_OPM Mcu.Pin67=VP_TIM11_VS_ClockSourceINT Mcu.Pin68=VP_TIM12_VS_ClockSourceINT Mcu.Pin7=PC15/OSC32_OUT @@ -145,7 +145,7 @@ Mcu.Pin8=PF6 Mcu.Pin9=PF7 Mcu.PinsNb=69 Mcu.ThirdPartyNb=0 -Mcu.UserConstants=mb_huart,huart3;mbdbg_htim,htim11;PWM_CHANNEL_1,TIM_CHANNEL_1;PWM_CHANNEL_2,TIM_CHANNEL_2;PWM_CHANNEL_3,TIM_CHANNEL_3;PWM_CHANNEL_4,TIM_CHANNEL_4;mem_hspi,hspi3;PWM_CHANNEL_5,TIM_CHANNEL_3;PWM_CHANNEL_6,TIM_CHANNEL_4;mb_htim,htim12;adc_tim,htim8;usTick,ustim.Instance->CNT;hpwm2,htim3;mb_dbg_huart,huart6;ustim,htim5;hpwm1,htim1;ANGLE_CHANNEL_1,TIM_CHANNEL_1;ANGLE_CHANNEL_2,TIM_CHANNEL_2;ANGLE_CHANNEL_3,TIM_CHANNEL_3;angletim,htim2 +Mcu.UserConstants=angletim,htim2;mb_huart,huart3;mbdbg_htim,htim11;PWM_CHANNEL_1,TIM_CHANNEL_1;PWM_CHANNEL_2,TIM_CHANNEL_2;PWM_CHANNEL_3,TIM_CHANNEL_3;PWM_CHANNEL_4,TIM_CHANNEL_4;mem_hspi,hspi3;ANGLE_CHANNEL_2,TIM_CHANNEL_2;ANGLE_CHANNEL_3,TIM_CHANNEL_3;ANGLE_CHANNEL_1,TIM_CHANNEL_1;PWM_CHANNEL_5,TIM_CHANNEL_3;PWM_CHANNEL_6,TIM_CHANNEL_4;mb_htim,htim12;adc_tim,htim3;usTick,ustim.Instance->CNT;hpwm2,htim8;mb_dbg_huart,huart6;ustim,htim5;hpwm1,htim1 Mcu.UserName=STM32F427ZGTx MxCube.Version=6.12.1 MxDb.Version=DB.6.0.121 @@ -191,7 +191,7 @@ PA4.Signal=GPIO_Output PA5.GPIOParameters=PinState,GPIO_Label PA5.GPIO_Label=DO4 PA5.Locked=true -PA5.PinState=GPIO_PIN_SET +PA5.PinState=GPIO_PIN_RESET PA5.Signal=GPIO_Output PA6.GPIOParameters=PinState,GPIO_Label PA6.GPIO_Label=RDO4 @@ -261,6 +261,8 @@ PC12.GPIOParameters=GPIO_Label PC12.GPIO_Label=UM_SPI_MOSI PC12.Mode=Full_Duplex_Master PC12.Signal=SPI3_MOSI +PC13.GPIOParameters=GPIO_Label +PC13.GPIO_Label=DO3 PC13.Locked=true PC13.Signal=GPIO_Output PC14/OSC32_IN.Mode=LSE-External-Oscillator @@ -271,6 +273,11 @@ PC6.GPIOParameters=GPIO_Label PC6.GPIO_Label=SCIT1 PC6.Mode=Asynchronous PC6.Signal=USART6_TX +PC7.GPIOParameters=GPIO_Label +PC7.GPIO_Label=SCIR2 +PC7.Locked=true +PC7.Mode=Asynchronous +PC7.Signal=USART6_RX PC8.GPIOParameters=GPIO_Label PC8.GPIO_Label=PWM5 PC8.Signal=S_TIM8_CH3 @@ -347,6 +354,8 @@ PF9.GPIOParameters=GPIO_Label PF9.GPIO_Label=AI_Ia PF9.Mode=IN7 PF9.Signal=ADC3_IN7 +PG12.GPIOParameters=GPIO_Label +PG12.GPIO_Label=ERR_24V PG12.Locked=true PG12.Signal=GPIO_Input PG15.GPIOParameters=GPIO_Label @@ -358,10 +367,6 @@ PG6.GPIO_Label=UM_SPI_CS PG6.GPIO_PuPd=GPIO_PULLDOWN PG6.Locked=true PG6.Signal=GPIO_Output -PG9.GPIOParameters=GPIO_Label -PG9.GPIO_Label=SCIR2 -PG9.Mode=Asynchronous -PG9.Signal=USART6_RX PH0/OSC_IN.Mode=HSE-External-Oscillator PH0/OSC_IN.Signal=RCC_OSC_IN PH1/OSC_OUT.Mode=HSE-External-Oscillator @@ -397,7 +402,7 @@ ProjectManager.ToolChainLocation= ProjectManager.UAScriptAfterPath= ProjectManager.UAScriptBeforePath= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-true-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC3_Init-ADC3-false-HAL-true,5-MX_USART3_UART_Init-USART3-false-HAL-true,6-MX_CAN1_Init-CAN1-false-HAL-true,7-MX_IWDG_Init-IWDG-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_TIM1_Init-TIM1-false-HAL-true,10-MX_TIM3_Init-TIM3-false-HAL-true,11-MX_USART6_UART_Init-USART6-false-HAL-true,12-MX_SPI3_Init-SPI3-false-HAL-true,13-MX_TIM11_Init-TIM11-false-HAL-true,14-MX_TIM12_Init-TIM12-false-HAL-true,15-MX_TIM8_Init-TIM8-false-HAL-true,16-MX_TIM5_Init-TIM5-false-HAL-true,17-MX_TIM2_Init-TIM2-false-HAL-true +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-true-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC3_Init-ADC3-false-HAL-true,5-MX_USART3_UART_Init-USART3-false-HAL-true,6-MX_CAN1_Init-CAN1-false-HAL-true,7-MX_IWDG_Init-IWDG-false-HAL-true,8-MX_RTC_Init-RTC-true-HAL-true,9-MX_TIM1_Init-TIM1-false-HAL-true,10-MX_TIM3_Init-TIM3-false-HAL-true,11-MX_USART6_UART_Init-USART6-false-HAL-true,12-MX_SPI3_Init-SPI3-false-HAL-true,13-MX_TIM11_Init-TIM11-false-HAL-true,14-MX_TIM12_Init-TIM12-false-HAL-true,15-MX_TIM8_Init-TIM8-false-HAL-true,16-MX_TIM5_Init-TIM5-false-HAL-true,17-MX_TIM2_Init-TIM2-false-HAL-true RCC.48MHZClocksFreq_Value=90000000 RCC.AHBFreq_Value=180000000 RCC.APB1CLKDivider=RCC_HCLK_DIV4 @@ -465,8 +470,9 @@ TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 TIM1.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 -TIM1.IPParameters=Prescaler,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation4 CH4,Channel-PWM Generation3 CH3,TIM_MasterOutputTrigger +TIM1.IPParameters=Prescaler,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation4 CH4,Channel-PWM Generation3 CH3,TIM_MasterOutputTrigger,RepetitionCounter TIM1.Prescaler=0 +TIM1.RepetitionCounter=20 TIM1.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE TIM11.IPParameters=Prescaler TIM11.Prescaler=180-1 @@ -486,10 +492,11 @@ TIM5.IPParameters=Prescaler TIM5.Prescaler=90-1 TIM8.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 TIM8.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 -TIM8.IPParameters=Prescaler,Period,TIM_MasterSlaveMode,TIM_MasterOutputTrigger,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,OC4Preload_PWM +TIM8.IPParameters=Prescaler,Period,TIM_MasterSlaveMode,TIM_MasterOutputTrigger,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,OC4Preload_PWM,RepetitionCounter TIM8.OC4Preload_PWM=ENABLE TIM8.Period=65535 TIM8.Prescaler=0 +TIM8.RepetitionCounter=20 TIM8.TIM_MasterOutputTrigger=TIM_TRGO_RESET TIM8.TIM_MasterSlaveMode=TIM_MASTERSLAVEMODE_DISABLE USART3.IPParameters=VirtualMode @@ -510,6 +517,8 @@ VP_TIM12_VS_ClockSourceINT.Mode=Internal VP_TIM12_VS_ClockSourceINT.Signal=TIM12_VS_ClockSourceINT VP_TIM1_VS_ClockSourceINT.Mode=Internal VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT +VP_TIM1_VS_OPM.Mode=OPM_bit +VP_TIM1_VS_OPM.Signal=TIM1_VS_OPM VP_TIM2_VS_ClockSourceINT.Mode=Internal VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT VP_TIM2_VS_no_output1.Mode=Output Compare1 No Output @@ -524,8 +533,6 @@ VP_TIM5_VS_ClockSourceINT.Mode=Internal VP_TIM5_VS_ClockSourceINT.Signal=TIM5_VS_ClockSourceINT VP_TIM8_VS_ClockSourceINT.Mode=Internal VP_TIM8_VS_ClockSourceINT.Signal=TIM8_VS_ClockSourceINT -VP_TIM8_VS_ClockSourceITR.Mode=TriggerSource_ITR0 -VP_TIM8_VS_ClockSourceITR.Signal=TIM8_VS_ClockSourceITR -VP_TIM8_VS_ControllerModeTrigger.Mode=Trigger Mode -VP_TIM8_VS_ControllerModeTrigger.Signal=TIM8_VS_ControllerModeTrigger +VP_TIM8_VS_OPM.Mode=OPM_bit +VP_TIM8_VS_OPM.Signal=TIM8_VS_OPM board=custom diff --git a/Информация для программиста (УПП СП СЭД)/Описание работы с платой управления УПП.docx b/Информация для программиста (УПП СП СЭД)/Описание работы с платой управления УПП.docx index 897126a7af1cc6a006273ff3eee6810b44a27489..e8a97e21615cdd7277afad6ea05b8a5f37fdc28d 100644 GIT binary patch delta 23642 zcmV)gK%~FmsssJ21F$m*3Bo8qI_gjW0M(N`2^)WJ8%MV1{|oGQ;QFr&?nta>Ka8<1 z`k4svLy+Xe7mEvlmMB{ri4-W>vawhocII(+JXiikZfI`yl6zISw3xm$0Y95fr3F2GfA zp;CWu>^Aof8n-T8xW4VL7#Auh?OJ26cGzsxFI~7_Ke_PFYyb7X{Oa`LUUT=(QN7Ww zuqqlS7f+9OFI~9ZZXaK)R!??s*N#H{zrDKKJgPSL_YZdK)zfBcuZjQ! z;@fenxm!OuVefNljk~pz3sH4P!?iV!>kWT)alhF*sajkuD z^WgBHeV^40v~D%cOBe368W*D~R(cKMk6a8J6n%7`Xvw@ce8i0?Al_JQ)el)4nvIj& z2gm(xsMf|V-tJa%cT^|t9vyb?J3WSEJRZ2M+9~_!S18l`z3`!&HMer*Ti)wbUFpjQ_k*#+u~ zm^|3Elkpm}b-Q-VM&Qxz#r0c_W~+AdkhO@htiq^X;bMJZjcJ^l&At2l^OzNri^sKA zZGG?31%RMI2w|Fwm$vKo+PqYc{;_}3i%h%iZL%8y^?;`Ji#A%kP=;{ zY!BbQF>teJ#YT&NoE+D7Sr6Dvwf%OT*T^3@Jm54%qE+I@<{jRp+MRauLUrv|)!yT+ z)W+~D?X}=f!HeMU!ShP+Q|H6rdGKB5LFZxcGtiPA3MJe&e(tD*TK`y zZ-W<|$G@zwOV5L|;M>k`*x&EiJ^b3^3j6wseXx6<2H%Un-?Aqk1}}pbmEg zXj{Bx$#!w3i*B{kF5A_!5M!i6uXc0=qc~fpH_me*?<3c1<@7F1S=G*1YZPC$V%|l zTfyhSe*~Wf|GuhG4PrL&VepGs3ptC1g-zFe&o?YC6y*zBR5TS~OJ{2EC8PKY8P-Ky z8kVi+Sr5y$LHg}kT?oF&tRhX&K4jASlF8FEK6oNg==n;L?)SzKmDiw80hwa~=GBfas^G!30NnndGA4dRp@`L>QNUT>M&HBzKsauq35 z6Jw-cEY}dvI*U)Jzv;KO0LhZ_@h<;~SyDCiOzX)E6MsivHF;bncxIX5?GiOBDHt>Kc7%|W?_SZRyw{R`^ z9GVCQp9G%+7<`R#`j%3IOw!Uia<#%3_?$`51J-87lFlEP#{7ttyk;EabA7(7<}sJ| zt|uWcLP=(GV(_veOoU&D!W+KsS!gA69<9o#GQ%OJ3mpk<5Fg$-1Ai*2OgA0dM^I+& z_Fc`eNkWw+3I~6C6uVMJkGkTUImd;<|1{n7Vk6?q;7cwyXIxY}4=Zu;OU!RvWr>NL zD?27ZOvQ1LQ7h zdP}N)udx@^KB}qA?vxmH3@~900V6KBltSqH28{`>VNuiO!*lSRmJdCvUpN!NT?@Vt zQ{=Z@)hU!ISGdE1I7*cgljwRlGi42ie7IpDWO`jDM6gIG$iIu}^9TNeOF7rEY_xPW zeIMZPnO=Vkk-xKo|0Cx6$D)uu|6Fv1JtCt}5weJZkT0Q=vMs6jl_}bW4r{rG=6yEk zi{RG+mvE)_Tc#>uCHPp(l-w};TW>~W^7w-N6c;*=QhC_Ec^G{}YT+i+C-)EQUCmL$ z;n-*8@3XQ~Mk)%i7-yl1*t=Kj-Lc--3-4Khx}bl<@GX~X_nUXxy-WKC_v(>$;TN0D z54tY~#1h2VKWLq_H=F#$f;P42SO22ZJiK$nUB2Dx-2!n-qxp_qYw!s_{PkY=3r1ue z?D*TQgFXKB7W-s%MBT-Jh7F7rBT7+9u|YvJfI-E6wqtfwB3K1VtBLsU}DA(xuu;Pd+t#|4Nw{CNW39dkDc3aWCV>kTU{neEc zPPSnQxO=7Ey44ddrs(=}*U4=zJfeK}uwHBNr+1r&%~muF1iKH}RoC+@KNPRq^`p8k z3TwN&^+sEWK(BQBpuxr^781-`9JMiF2U36CwII7Gf8_V*J2)eG5E+02;vsbqzr9>_ z@E4}5f8w^WFpsL-a7h{Nf(Rp+CWLwsn1+4Rb&W)h=;|uXqXXE(oB8*We&V+#@mf6j~u z|1q=7zEq(4DBLt#Tx)yO^JLZm=3mi_gd;OmIv#Osoy@y+E=T2&hW9L~%uu_p=|m=E zXl|&?KSJ`hMzpUN(qtMDgzbMxmP;+@fE+_%*gh?0by|l9w|b7ao6UB+c{G|6ngcxx zD?^@y=W{CTIqj~sxBOJvT{D7e@8nVg^ z0zKPF#C@ARd19)>SWk(g-q%A812fpz9|p<~}C2H{iBL?`Zn32%}pAS3+eKSXfa z^WX;&w(~r6X#Ldru=AM5zJ*JPH9geOj<-f^>4xc_K>d zd#OkJfp_79mvTn#fH8lzW@za_!x@tH$#`OJ`KW(gXsR1KlcLnJ90CpHz+=PF0h}^L<%l>y_e7H+&=3`^kY&b(uT{6# zuXvm0j`I$vdN-~(J6G4QZMs$OJ@4xFwd>o}p>UAAm)<_Ob^CBIhT>MMUT=i`%a;z< zK|AYLNzs?)R$M%~1X#KW`VocME`43IOxv)ynwuk+J|cfU^nER-RcSpPkoEW#A?s1m z#AJOcuDSl0DYVINif+T5>$Tm4(91yeDK|9TlBmj<5<2pLWBUs7m}g2XjF6^i@Yx7k z+|rSoev5gCG4Vai*JTWvRBl6q5-Sxyl*jD^TPEo?p6u4*f~q2YJR;NdJR(f0g&B|O z183<WXSMn75It^E{PM}Uas!XVC zSMn4L|HX7AhsCSd%z9CZk9jr@X3S5&RS;8SOmmd?b>MiadBc z%Q#N~$rGo>^Y?|68!`|*Uq=Syqd&Lr9@Jd!aUSk_?8+S2DBEemo8|K3NnC%tw1Vi* zPlG>?mmo9!z1>&*lL`1MB)Ebs$MA`%;Jtt8YV@q^I^~P0+z2h?eAF%KxYSmFxC1@6 zsqTeI`AQ$4kt|6tnra4c42`oYuV?Z0M~u$Sel^AJX3KTH6cljYA!-s6OXaMY3n@U* zka2V|{`rUy8R4E^5tvHMB%#1ER2*GzkWXubw+d%fk?XC>5M0XSi->%;OUI*NQnr5w zDo%U3!BNZu#dv|SAr(=c%8e+-?)-3rA%`kbQA)-9R0R1HYCw4uydi!n2UM?b+3#%a zT)(`rzO%Kx5xT0j+^g?gMvJYvwe7S#_xmgSQCCD+RpV!k6{0Ze^?zLe;!XGSm09i5peUqveWbBcL|bWihq z%TcCiwpVBhXn2azOE3yqTEBm~y;*gg^&J<&8HX;#r`bt#vqWDICJc38arWRG`GPdt zv=B&UY@xpH>PYP4ovm@zW6jd-BQ)YpW>P&~m1AKKg+AwLH|>1y*oDaTO(+i4nMVjR zt5GteL6EjWm*g0t9wn}=;5vBIeB7}~E_1#q<{{M#4?93AE9N{v_Dp{d=@~!%o1aAg zedkfm@$WIjB;^BQ^ufOGDG(`qWA?`IxijUHvsT&Lj?)=>3G2V4!N+6yMU{Ip#sgG22)XUsx?=!BT;;W>?CslA?CUfZBB<|rzKLa`no|k2T!=`iFU5LZ#fHq1 z12BN?lQ)AM!%GgM>8CIh3a&%A7V)vJtTYyg_|`hEB9+9a1*3mc9q9UoD|4VhDn;Lv zbqFKcMU7&4I^W-%@mfTD_L)RiOI(XUz_L6C=0vbfdo6-c8`~~T`0S_;k*E26M@LFe zmunGIZCj`n=XNb3dDP4tu0=@2R6tuNSR=|a!kZMQJ)<$867W&Xl}-sI*i`}25jt~- z5BPCtvoo~BHu!(D;N|EUa?pg8$)eP&yz8JZrFv;2QDQt}&(&=tqMXjV&AfE@m*?=0 zMs#@ZoICt=>=}egozj-By_OFDK?MSAALvBpaLYxfX6X)pWE(p2rBW2k0&FA*BHQ!X zIsA18o3^_!Oa4+0f8s$OP^rY=bI~VBhdU-@?x%h>{uAF(WFZJ>~s`!W>rX=59_3gRE~}=crF*Cn{TKr zC(nVyU)g0oz>`FGR2BowXfXiy7XzGGpV$>2v6JX${z?G~Z(rj~yxN=+&qzanI8(r3Tj%pJ;ucW?>?Uo+VKZSX31(fKV;v-lv36=Fz0-~)S* z5ku9TC7;i}Im4$Ee9sTX>HID{4yW^&Z=kLO;ja7Vod^6v=OJ(E!{P1tokx}68Nc}~ zc*$K{?0->5CHOe_OYmidAGO1t`i@n@stBI3e)E5~JmpUbr`Qj?WR&-V_d!Db>i2f* zhw`LYTTPMIp;^au2*jGyvAUE(Bh`f&zaoS%DjHV^yYiOac%&f{*oM?0m2=m4;9HJG z#gg6PHC}TG)*T`}|;-lC>BET*)^M}vDvon{)Yi8d5+-)F?$|G(hh zgC~EPA@|7_u5}&+FM_{`^T%E#Rsy=Lh~`K35vi%0hg>xk(-xaY&JjWz8H|uR@*;lowPTb z{KbMlwdhy>qSHLQbJQ5P-YpQfG@9?&wFZA5;Nh?L!e6j!gbsB4?bg8_|9XpkvO2om zWjaALFjg#j?kRC3Dl$t5UIzXc8uo>OA$AcFPQ=>FeO1(*f8n)?KQhO#{40Pm$ z^3a`$66xNNCK|_E(Y>QsM8lPO>sC)-n6UP}{wKG&K#20)!+Nd7pB4*?(eM&1JY;`Y zUC*=pP-Je`kLtcCtnKdB8|~2B)-ByWXt42)g;equr+X+EY6iL|lN+H&-$DB>`_Pd1 z?Ly61Iz*E{Et#pAzc9Pyr_LWL!8gH|!IxF`@g!vk3nGkQTI#y$JTgslAa+cflcyll zX2hQ_m<{@ZsaRou2G6B3j(W(|G)I4CZ$heIW@k5MnqLSm=vOgZw+8xd`GweFzLJ zmDpuIl-0mw@w+D)8`7ZC#GH$K9VWh?z5C;Vo>P$Qs=kKQqjoikdemrOc9YqTnt^A zR2}nAYL>_61&D0Xd2pPU{K16w>(J@n5_B}(RSZX0+UZ|Wm z4G&K3sd?!Q$6=FE&iEakn~Tl3Mfd+;o7v);J+BkwX?KC^P1xG7@%|Mkg`SY_IF_s6 z%L=74iY!_(vMffvy|I1`sss@g+ol3E-^HHbq>>!WbU+shP0m=b`bK}O#`jm@Uj)zj zqW%k3_(Cku^J5-4VvDgNE)==Ud~XY`sstt#ih9HjVJ5V&iIiBGz3nW8l>?E5Q)i_t z)o*O29&XWITTO)9o)$=>T&xXa94oJDj_V3nx)L|DLo3VUrYfH{GJ@Zee3Bb9skk6> z)M%RFLc>!q)}u(P(9C~Ip>zDo%oU(4H^Pah3V~AUgfz5}Nqgckt>fv+e!_*IeQJ}7 zFl56rs?NJR*RF4aAyt%D`B-t0B1BUhdSCRlxm8!!k%M-&oXgegTh`__d&#@}@G^gE zXX~0@-E!Bj?YIM3s-10TXX{_CI@uD*Kf=0ujms39G-Ra%s6l^2WLTdgWQCySV@CwD zOcYrSgitOGa>>!akQI_zLB|>;5G${s7n-=|6ItbI!Ql|z$scUS)X97H_4xJ}xk;=T zf`XnwpsBLZIy-(RhSJQjk;-Wig|HEET#XqUQsJj#VPYfC+3&H02n|1w;?Cnm6OjpI)*h2$Z(- z6#}8a^_Y>ZD=UOI1%#S20-rd)s%~wpLk2_NWkp*s1fc?sZr_MNC<>2E z0t0&!L!8RTNb!K1gs^1eQDnP@gRR8*K1r#Rj>4f7cL#q#_l|OrE3|CW1BT4{QlSAf z(AOn$l^jY8xnddQs_C9awPYSg8J^`C$xB8~gpo}1th)*mV!hHV3xts-Su-19eT+$#*}q#cZ%NB3e#M<dn^1(`Kp#AI&Qx#ohr^VKyrUkaTKc!xYNUQ%MOB zNRXe6T*6Y>*gYu>Y4sA<{3wsp45Kqaxa5bXfMRu%0N)Tvqvr_45@c#P^gJ$6?2LbP zI76|TRO%JOK@OG5{k%l6vtXo{j8zUPD;Q^qk?-iP@=Uy3=ELPL^HCc@2T@MUB|hb( z9+6aK{x|4Vr=o(DNP1Jyof6UbNUq$tk63s`y5W;XBH( z9YNv**d@Ljf$z*Hr%K*}Uuih6gcX0kv3sI~^GfJQxIxdg__jQT_SUcVQo;zlhvo4e z|42Jvk2r>5+eBtwhZt#YsxpdS5hG&KXX#0eh_K_yE@EP622Ms3YL@QmrYn?rmL?cI z=pBL#E4Hb6OO&r}8Gr(=*2I(8y!RCf1u_?|ANO zqLbN*y(V)(MY-W`1y6#{g3p7mgTKZ%77tWDX(_IVlPJIMqq5GUOvV>{w}hVGoV<(` z-Yu?7x!}cOQ>w6gR-ID(1k``mp(9}8{pdX8XU0Savj(p_k2=2-r>?#ZUaVHwXgXtW z{f@tzpM%wt@!-!0at^Z3Dbj(r<27$lwHmb}R_D&!O}n=HK`1-jdp&WqVR&aaRSwd2VA7WEM(t+wTl{}b+pnPO)JJ*g z$g>r1w%HNCy%ftz-h`L{@AIsM{8vaQiR&Bjy$M6ItTe!O5_KN8n$3N$#h(fh>B%v} zKSEL?`c9-Xck3;w7c;R>i2FEwg{wpJ`UJQ?sfi-@Me{kEPr8@ToRi5{y<=+##HK~% zSqwz87?hq}s;R16M?QaXk;ffPd8)inrqQTKyl^b7{XcfQ1m)+2)LSuK-e_)c-227} z$a;9pXk2UT-fp%+pzdLS#ey@xP~STc#0Lb}x@HhgyyJ_EBdmYlmEC)cN+yPo2TJYU z=X(Y*FkvXl?5_R&`fl3`?>!VRodqu|FuHU1>fN_nwd30dyMBw^#|coocx#~Ka&z~C6FyoSCl?vHZnxXV7pv8i z-P`q}+R1A3xZZzY*Y=yOqgtE&Y~89x)H^z?A^^1NQSG3?+R$`vGs@R3rrCGfy(5rE zzkl4f4pimV+O^7^)`3D*#|OLZJ1wT1e#O3BJnl7%eH**B#@&qr;p^o;7%3vAfiBZF z!n;Fmb?*tEsPP7b%o!$bzo^w}p5Ct4_PDP`&^%s?_!)m|#m&QmV}4Q(e*^zsX!{r!X8dY8D2v=Bs+ zCKO4iltq7ox}Tzn)v!;zttYMBO-8M%_}*^S+q<{6PYQSDW$Y@9npa_$O;%<(}Z={ir!1dBRan3`|W!3sKUSS zqaSxeTG#HfeuTGnZ{fv_CU2K`$zdZ_Pz_5&`+0whqp$3Lacy9D4E_$sW~lpwX6&iN zQ8Nvu#5P@5#`EgCnqjBzs*7I<*CGHRBsvH^@kZbi=tHS^#ITZ-H^#3FzOgrvWZC{- zvx)p$X8OPA{Fb4BJgb%w_b6#ix7To`vLf?j-y9B~3;rlhfPTsC3T7Al*m=az2S19m z^BaGDv}NZ}s%;Rt%m>V;%!{JLw*d&k7XbQz^Gx zuHA3m;XpUMw104~9(99XWB|AOVn8fmA?zP8x!!E@7Yl=-7X9j9bee~Ejv52ky9FVR zZoXsJ8a-6qd@uYJO*pZRcTc^)#XeabVOM_)BQhRirGy_xHe3ujX;O+2(Nl_bj74$S zjPBdxQEN;~63ClAxbR0E&xO9+HY=iAPP7!CzUat1ILxXU9rcC)H62ZaZR8E$9%W({ zdgiE(-!4YAXA&2VZ?Ptf%>Dt#NiZS)gm+FN@S*=can5zh@D^kq!FnOZ^TT@|VFP~? znJB4L-e(_3KTY0$!LS|I!%xFts8pq!hzQ|+RhNC^!%HzGwbaZOjt z$*r0#QV=3!r|vYFrbvCo50CEro`e4Bs+8)`%A}+a@cC|Tgh0cl3oI<-@R;TJ8k#;T zocdB>#uk%t*ObX3Gans%mVMs3oPd7`%V}-|3=sn(q|1bPr)rt#X!jX2<&$itoF*Ni zvBT)!N>?Ea0zDH*gh&7WhG3X^V8lX$xFlr;+r_*7~RN{F1~w6(VBUQ^kdoN9mDW>TH_ zhDlw^0e&V)a z%WTq3x5np>OsNeFY4_jZzven!Qdd8@;tXB}ucRJMxNOobvR~$`cg5SCu6uL#fXAx% z*VHO9ti_dFr&cDF*z{76P8olKX?PT~nP7p3YKHgl6E;krcm8d)!r)_nB>()M!N+2K zkMF2?{PU|-sV(-l?nBL#alMX@rKhUoKIu9%Ibr@3eD-r(q~s=tRFs-IIRI*6!!%^} zl4MI9rOarJ`>_{c_PwzMSFtXGLVy8$=nHz}Q7KM~NaPZQ=YVt@n2~=@MLN^qbEb3> z9czx3XRBrpb;E{^pMEM~?8?H>o$tWOO!3b*h9CTu{Nq~*f~ML2xyiO3l+=fd_S}K&b6!IFR`g7 z{3_BP@C(bh=dk`6*ze{#1q*Emd zhmJV&uhQfm4Ifj(+G(o51LrSRR94Lk6ZAOMj7p?`nMm3QNcvvc*b$bj(P*1ueJ)RW#xgGFq44zYxim^N5M9xz-WlI<+P z;viU5QS`;YBErZczRNrL27*O`Y{P_7M`bL*;u0*zs5B|Ch+W%uZK(wJiwG7!6+n^i zPyCU6d%*W7%C2Ct3CV|2sihYNG=iyMM$fT`u(97v%$R>j^OY`Lx^5s0HRXK<*@40H zi5Zp7`znSR4a?PurJ%?nqtwuRGgTPN!;Fd)3VOPZ{9=t-3%(JlllV4G4o^j19+_rjW}#AOL{|2=XO*<0o02jF zd}O;0P|)IU__8Vj7B;ajL%4GZk&!6_k+G-wnDKvIRlKt8v$=%GNF`x=!AM=pCQR=u z57-5R$Ro1=E5+cdM9&q&$hytbPdLhlE!H&Jj6U6sIa6vZ&H!R=USO+^- z*0-+lT=H<|it}!G9ftRcAYA8)E5P-}`VHsuyD0&=T8RO zXn#HzsuSl9r%R}&d6omkv0xLH(D_`bRyh{C;6k;|@UkX#C~HB##$2NCxLadDY4GML zp>UP+Qj4K*Vi5{lM>+m{8MVA&=h$__s9zd|JMX~QPFU362`erz9FBIbT-#dbIGleU z?iSk{3uAj@QSZ37VJL1?*Ec=CL_Cgsrtu)n5wmi#JUNc7V^cj^#?uX$y2D~>=BljN zrYPKw`m_aiUXfff6V>mzX?rN2$L&YGu#?Pqo zRe~m$kUV74h8GX>OUjbWl(6k9XQzKXulTwA zEyLKcJm9M21wIG(S$8Oe$eFnFV2PiX_*oV|6PGZXMrF-%A@DP$rUy-5A)C(O`L#p2$jWQaP`Jsy;a}asNJgDt$OVP!K7J&Xb7lAJSr1)a?U{XD1Hcdjbz|8 zwSWnIUwQR!(crbpnny8sjckADY93MsZ%D@oq=L6H^LeG61FcAB4!SeZ7jLu*=$=CM zE(~=O~S*9ol`_!{%&p^J36qe#aU3BBqGPu2d-~T{BVE2B_dxUa_JRq z;s8S<3aW1*5IHnF$0N?fJ$`QtBBvNa(|{BA8ZH;FV`SDSpae)|pgNz6*Ffs9SiWh* zGnKbIWMjb;(jikbnJF_t2`xkvj;@vDt`NG`DKo@f^}|li1-i~eQoPYhOWG>?GmF7% zVCjbA8H;(~(&XXw#5aF}m$lvv`+L9Pj<>zuk3R=d{5ja!a^4*bJ7>R!1I%gFwFEGS zWkPZbA(FdfSk9(z)M${E(q;ihkuEQ>`qeLIHj=VjE(Ci)VkE>UWXN)y`*4K>X) zsX}U#si4%}FfA9xJrk$gKM%g+sRPB4^c9huT4b;0gl6ThgV%qZM=6RTNl|1#Vw3=k zm$)wO;?uBZVe5@O1qsP*6gDwL*jLV6R0!A2LAtK;Hwr_S8Ba)MCr2JdfdzG85td*+ zO&Hf@9;nJ2t%U1T6h^`A!%%}3br$o`qXocqnYqu^ahUzU?(B)$Qiy$-$P^bBtsZ*$&5CZF(1!c2- zS~^4)nw)T#F-1DwRRxVwFzDH~T@y*2(t6@TjJDxB*_?~_6l-Yc> zm7BYr2kh%_29{j8MVCUuBo%aIYlbT_P)^j|EsF|oCG>xk9OjahyN&m++>?5N8hVul zh@0*;rDm-CGE0l6NO7n-42-ZBdh@ezu3{(L;ETK`lPRFX2PepZN_@V^Xu?Q{tpN>D zOXWy|LE{iXB6jGPIY8o!jb0g&bjUT5((Lfg9B)ai)*)|6R;`&16p{1)d!feuEzJAR z@O)u;%j|zls0|B>Q)X@PldvT9D>jgieP_JL{uJ?<&@4V_@yUc1rHIeKEcn0AhxqW4 z$$42Aw(%%+W&8&wp|+74su#Z^gfA)@SNKlLG$DnTMUy&fT7#bJ`^wgLwojlu(y0=K zds$R+eHDyNHw|Q30^X}FQpJ2JIbN2D;h8iqOR0Y%x}AhM3H71kiYY&xIz$@soH8~Z zqBh2ocW z*lm9=Qa$)CcoiN#mOv(~Ffm|r@oaW8)`FiztS(=)eA@Y4@S?(B%opN*l(9KS9a@y% z+o47Eut}R+E5sPNqssFEn|?=D{Z{Z&bb~voQbTZtY*f!Q3}&WE2$f-Ij>yn6*xf|o zV5D8_ijcIZs5D6%jhe#Zu@Lqs(r3Wwq@;hz@Wh1_`7}qj3!cQG=>m{{EQC6W{Qvmy z)68fUq4LyTJah*9?`^c-CogBL=K6Eo?iju;*5>h{Es;DWgP?B9TRCh^C}ja+2;e$sy? z`{bAJhuJh{X7HTzxpapZMa4n{U}F)My^b6neSJAxxCcAiH{x1SqJJ`?4OzvL?}xy| zTkcga%A!W60FIFlsf|DmQYr-;Bg;b2Lh2*!T!P~%Pw{o2;oJ%yV>A4etYO^?E`<5B{&{s{M)*QfK*U!oG0^7{!+nl1_P#uZYi@_ zEh4pD;#{IzDur&LVdiH()xdAS#96w zo@}+*|Je;rXPB5j>u*|Dyy{zF4e#046*7T&1R5sa2{qX9Ug4k`(Fmn3&2f^I6QS-= zhaZt3F%D9@lZ`6lw=YbD`pQatkF1>XDY)&}adfCb8FM8;^r_G{LAgYPdgmiy+C2@P ziT#%$M(jM`8#Ox*MS%K?C`^C-b+l#kH7nr>#LmQnXPw`&J0Gwo&e$)$LGcG}t-oS+ z`orLP3hjrfXK5NR7l(R(6xh1k$Ihcl@J;Zff>yy>!IR*#;Pc??;IF^9DA9ABy4avl zVX%(wc~msPp2wBMOaWq6y}Z`JAo(>0WyYvCHyl+mNM32DeO8~cwl9C=?7kn#uN=2b z_|P;LV`q@n-Loiwd0yao7>6TBIjok__#iuNUf;Mfn&kt1Yp?Anu~4=xck3<1@srk6 zxH_bo!YeWw8`+3@nkEx)G1^*O6g6Jjz|X38+G;%N=iIC5sGX%vt20r={DH}N4K)K$ z+jC`NVp0cZw)bX=)}?yZhy=Q zpU0)e)QCeuofOqGW;}k54#YNscDTML%js?m106bpS#LBs{daJzZThJqI}kEY4K-bXUEr-c|2et*BZf z(5z^B$Mg)f1qBlz>4tHa`s ziObD%4Sb7Nf7J1p6I=ci$6c^bG4-j5D4h@JO)T!>rVervqb`jzUU^YSES!U=%^1mu zxh?}D#(>l_2y*?1bKk_1HV>j`}4Q&BpfJU&mNGN05kD4~9& z(@|YYm`7;~L5aM-&mh+q~L;~VFu47@*p2?s@&1PX8 zlz{wL1o^T3xI}(Bk~E1+5HIiol$hXhk>e62ke^JhwJ=0ee{B_d825t2BoA;Ih*)%W zyY5kEClG-U=W${ql`MSuvnx=i77xIhgo~T_gj1>ZP20sy-6%}VLN7}fcQwqLxwsKW z9>?+of9lf3-PpyA(v*gNv^W8RiMhC)!1Gd?ny3`>>f+wnIyhY4-o3uPzkPje>&AAt zzrFPv$Jr3rwwUNMPd8-6-ddF^NO65-%9r9Lw%cDamj7q5(uA0($F|TaF?v8SrAk_u3cK#wYSgU}y_n%BH`=RQ2U@vQv2h$X z`@PU921s=EdF9}v?3LVMdiMr`BE5U!e<@IbGY^D3%wF_9@7>Ri#ACtYhaY_i_dm_P z%bxTe=zjVT#yWD~0W@P2fA2$lruR7nWyCj#(7?lA!Fzgt?0wq%Y^;5*8<@lT;!u^j z5l|J2{u*kMc6xu2(WDn*RRDtQ89=x9$zbi+SF(}gcgHZ!o`^313RPAX8Z*lue?A}X zOF18lEwAk%U<+btpoIxk_db)IHJ_TeEfJ2wAYmp3kXF#;i)hZeO&~cwiz02O7xi=r zP2iK4K<&sSZuU*~4a3>D9j)$eI_o%Yfd8R7n`+po-gJ<}*h40cwMK%L`jqpDZ%b|9 z{Nj*rVHEeASNwB~@dod?GP!624_M@K zqi(j^eXTm$Ff|2!Ixz*xQYQ#~6G<>Pmd*@f3er$m@!O9okSHZ24y+Zjf7}SN#YaOB z7T+CF?4<<*Y`mDk8#Nu0EDSysC0M<@k*Ch1ku`mC)WRS2`{M~z!e8siz}O=`uW|mg z4KkZe#Ogt{W#&x|kH$e@guv_;Yn<7*cLT92y5kIl;cmWd8y)NEL6FkitG@lZ;2~ z?yW%prUEkJ+xFJMVQ_G3>*qh&zjJ>5N;R;`U_lh6#EVR__+p1rdIFXK2o$d@7zCUs z#*7;^b;T);=>>nD9rb>ne?6>Cgwy9%(@v*o zO;!A|oZy`ORlN3|^qj*<1qcT|?PQOY55JVj&8YfARe=2m}+`he?%E7H`u-i(M z9FK0?+C7A`U?Vq19&r>Ubw|ajxw=}|X}G$zW*h&=o@PJxJ}q&v`o}=?sFW|&c|u=j zUuzgV-(o9qFUfdra8H=PUznQIsn_COOohs3S~JD{-?AU29EMh$M@9#}I1nw0O%&@! zo7RMvXhu?6e@kp;B!xMP!z3{Au4+jNA&f(9+T=7z>Kp0r{}Y75rz=uchB6Qhi9lr= z&j}GQ?D8n6>uff2{u`Sf0q@B!@>mWpP7CkgKsi_XfV$O zK7HQlebjp(KK>x?KdQ_7F1)vSGej-)b&ha{r6gfajVdyhid{)f#7`pTOX{4k3QQBq z$nkDA(=!~VKLG^CtCwxUSz6_`8tNe>sb|zAsal5S&};?3CyvakdxtmmEIjN1`2N@f z(9ywg6qxq>gd(Hneqn?>s#T4OSEdhz!IJ_*B@ik^z62R8m;I#F2z@}p4lI*5Lmvs6 z8~B-usb4u`lV3w20mYMnLlqfZ43mZl!9r0mKoaLPkXe^Q_$XeH_{fLGldnS>0WFit zLmLx@;9k74FgolTYpZXg%JLMjiUE`OLmd_kp)z0bJfN~T<&-#XOb1ahW_lPJ%9ATZ zAOYl)OhhF)blAu?qM)ITjAO(Cqvk8Ku#roktFwo7@EQ_+)N_dIo6y-T?BU@RPt^8x zSr{FL5| zqvJH@7}l(L=19L_fM*AJ3FDE8|5%IX(%{_S*>Edtb^xd$vR^2%QT3DwU=v0r=p~3E zKSi!dn&9b^B1J9%5R*|wB7bse|F6Y0$HQ#Q|L)o<-n{g7cXeeIcd@Ykl|uk+uD_di zUHN6Ox{YI;Vs;|`!677~Y97^bJ!9Z)RPVI~=xxdR+wO;D(Xcq-fh zI(Q8!3VxKhk#BTJ@$|U^c#6G%c_wNSiLo1%OM_MC=N4~oJDKun_J2$k(0OdZAq@{2 zGMBKxsMhxBRKJOd`pr_0x+%AiBZ{u7lXT}({kDOW`@%2&m0~Cpr z-gq(ei42VV0A&*4K-PVAAPe%%AS%VQG&23AhWUVp;ZqQ6+7qYO|KAsQ;b zcr8G&6UX}FM1?Ce-&Y&8u_~;Px&$|?bfYbnZ1`h6b=1512c{`Zf|s&Y+lx|atRCAg zauZMNz0I+$M99LBz~m7RhzL_^5*A(USoK4&uGEjl3pBa^ceT~0|Dr6&6NDYFwt z2^wiZQWFajM}Hwpusrl)rLa^VnVC-uvS{xZQe-0wl6j#^yu{ijFPb2yC4f_z#y7C! zCJz;MCbvLkGdt5oA@*JSWA)XjJUe#gP}S?=`z!-EXtNvr0^&DlQ~b^2H^&K`(ObVz z_9mNxxk;iVVX0G7kg6SX(?LlRAz4J$ia?#zaYL>2o`0k0O>xR?8j{noB2&*vm^WVR zXKI^kITBJZ7+*o}6d4SGfB!doWne>Mnth>xaT!W9NpVUE#60Stl%{Sx5HT6dx++|e zP|AlU3?)<1wWtPQP6<^;fF6a+_njz+O;pPg3KggOh|?6<#00Mcz+2jTE!ul#60w;L zhjAn<5PxFg&Oep0KH{5LY6v9^$JEGuqCFT^$xd@=sS)3X?iyKYSgaFMWNoQc+rIM| z>l@lF23Kg8MAyCzMq>vdCtBKI;~b)EA=sB6qFe9VT$ht+oSZ|UfQ^R$?o&6mP#UI5 zVpHcNUr)k4nb$i+iR~F%dT}u!i>c;lW^0z(JAdW(PW~0$)fugADkdlvwB-k~$H1bS zpcXO9qwJ-)4#|8UWlyv3g$?^ko6uH<8V@*&6Jo^wN|)9^t$1bjri)cWrDk>@a^oN}{!XctbBCAz= zRZyH;)AbBK!6mpm2^!oTLU0Lg!6mrsLy+J)IKkcBH6cK7cPF?EOz>deIq$`(|L?2b zwRf$X-L-0U*QyrPKWmtyGfd?tU$KnV(HCX2T3l+%pb8nl^3=%s`~XfDAZJpqKhs$) z7W{z|u7#Zcb|pB=bwHSRy$IcjG|5SML+eH{)<0zfM@+{O;XrTqx7dr6a;_6hjep{v zAgZNuwzAugX#!wyrs^Kc8R@Til9Dvd4T(Q0+xqZs+>6*tIXkKbzDy+D{9E4i+2cui zWU{9AVm5-WmQ1u~Ev8a8E07-Vtwd@!Nb9}G6ZJE&+{qy>9-gThG>0XC6@QM4_DK9U z#2rb)68GhF`yR@Nz5~l`P`MeHs+zOlaJPU1E@b2}gh2e?E;`5o+OJp4JDpu)bBPt( z95vTs=h!1z=o25>O8cMpq_!>J>hmMhpy9_U2dBwG_&t^vL#+b$9y`{)SF2vUEU@0w zM@h@!L%S~Uya_Vc@W#{_#!3zhLcb=^K$%P?Gbd&^kAlp6tTqYN=Gl{P(A=cPm!i@2 z)EI0A1_6_mvC;jXJOw}N#X`i$@P@zect)?%Tn(_$+R`it<)E^YD6=gw{4=x7;$Jv< zgT18F?O=%A$Jur~{C8b(`e&)$Z{_-QD^9rJjt0x4!q~ewJCP(e@F;1bE!WVDOQV8P zLjZp~J~y+FVAhO5{%E;V@{RA{y2zX|qGO@KL?f{BtP(3ATwIeCP1L0N?(?`N!;(DOuK- zNhP{f(dC#^=a*)CUu4AWdN*&xrp_-?xP#xx7N84$>%N36Usg(kt^eMG$7AZWJea40)zCfds^CjMuFG zr}R}(w+6gwXDcP6ub_9NbEJg=_=qm>;CI96mn=FN=i3|Zta9Mb^q`*#3n6T4(Du8* zc|~h6>6beaC#TBGi{}e`^}-qubmi80RByzkiaKGm1DidjQS5nJ{i3)L85P#vdov(< zfJ^16F=DW>^4Ihn%e!~3_}1~sQ+SdxJlfB%_o$bc^yUZMMrSjJL?bE(klKeV@x2uq zJ-soJz1oSm_<;B)b-kOvzk2;-=zqOLTR5r96Lin{_wcd*O zQx4H9E|ME!xa$5i5Wt1MpRSFX9%RP!z5LUI&nD!(@=UbQ7bB^K@5&M-KL?t#&#D93 z_Et6~{vq8(yhq_3yKex!a|cF_v)jXs=Nr`4nlGcq1-stvzZYOMyWO{GRoA+1c&;!t zs9_>r$N_um$k!q{L-C9Rl^g8u?*DcZb%rlgh$P;vpO(ZQG|(aeJ7U9NA0!w9$s{IB zZzMP!xlU1UyQgDxg~#QEpCq)mH27lWX4gYEamUQDPAWJ;2Ix^=W@Xc^@Jm+4f4hn1 zFLLq(!Fr{f_Ex9Csj-$Y2aP-mO`%-D_gA{_q6LF9YMzr8FG{2l)0ML8&4KxsA*MB< zWu4_TLL|oK_;wmjN}AoBIp58Llz@klNP=Ix6%r%suAtFtTv9X zZVt+OsfD~GJ-}pgYjcCiXXLjubJC6a`Io!95Rq+tsG+X66I|Egi}O}|<{%ugBEME) zd_TY6=XfsN&fK;|%5A zMhG$pa+oIgrKU77zhJ{r>dc&uB{?vpLfX-;=a`RYzN^u$pn|PsHC2y%sK(2~tHK`B zkIq2QEV;>UW-KF(4s{bt)Glfium~-7CA2FfF6H=wYi+tOhy|~jZ_^wi>C#mgj``YL z;lqFl1#lAk>bqv^j*eZO8HU;>i>N)Tl+!#d zh`K+6lM6G)8z_YPt`W!T{6|UZ5LZ5uXDx#x0JT$wF@5IoW{QMX1+jW03nN;z!7qA& z?snB+$_CC7f5~qaB@(F%eQN4D9^*0xE(OVT^v#}ptkvMc(p0rMlz`6iG^8bdgrlSo+k*}kB(4^m z0VjPpk&`hV)ySB}H)-Mh?{cI2U_mbIg)qUoo|#yk&5fA$ZoMEW)VTMArRCLYcye*_ z&`iTV&oP8k*%+5a8NvCQQhh5of=f)^Kl@nx!lo%QHux^3)2b z%;AeYT!lN6PAy6CjdRQ-H!bQn46b|u7&@IJFEZKW+>`J$<_G5NTw22@BU&ym{~w7;aeD zW2~R2BfNcpb~wOt8Q~i##A+86**qmYTqUT|pund+FHd{vuq!XVI7%m9vXP9e;=+i( zFp69%*xchDJ&(P=It0)!PM6P2ud^H;s)W+=r!>2j)D+_Hpa{GZdhoGwzrro63H9Zs zFd{zYDM@VB%Cx5lu#3B~wK;agQB%^)yJ*ZW_hYQUaB-0!*VFu5UcQ>(`1-=2)SBsP zhFOlWe6UnqbCYvsuAWTp%Yi=UlkNPR?Ss6T%Z}#$a@uIkO$w09uDmWjJ$IQ*q&BG_ zc8qa&;F9;pl-;Xy1o}J*!yvd3;_rz4QKRKvqIHFmaeg7cNFRL1;zDbs&f##S7wvBo zH0I9mK~YJsSTBIBJDVev?^>Z(ZGAH8FVr|Q5se9{p7c_R-El0vyyy8Cmc4rXr#c%5 zdz1Oc%-BfV&;SsvF&c0)-4(A({#ZC+vcGe0vGcl4?(ZMx*AaqtXI*7S{w|I8QU=QT z1=45B*4?PxlYd1q+`R*5mv267AY>cl z#>;+AyQwkhcH<;v7Ce@(auf00Y}1hZo_*T;?xVdHYqKetw1Q29<=)xnhiSHiOAeIU zM`iyPOoem+0Of^l-96PbcJ;xTMM^-J-B+=2zu5hy4Uf|#UbNdW-wg$k4n#lt2Mv!d>T1Nuw%)8#LUW9mAa-y6tuqA zzcFN|iQf^l(qmEUC1IwAj>Avh>Yg@JahpeX+hhG_Q{I`IGtcf8i;eKvuPCNUCrs&- zAtdEFw407koZIN$3S*394I zN#P3EIR=4)-XL@&=0VWmc_tI>xKWF5mndGOZEQDlDhcy?)b!ih;J)jZq=*OLZdH_dJP|&o5 zN1!f41Qg#?5e8(;uDWr)^`*)g-3tZnYr-QgxlulpTU{RRnSf%2(;TN5P?~tClY#S} z9VQ+{-blWW;GQ+aLy<4&67urP+@QF;0rXfR)|0SXoo^*^ceP!+r<)!fw0HSe|JVzx z)5ytdO*&2;t2|s;;O`riMR3h44B}R>U1f4d*`No(8{hY?wOmW-U(E3>gUF4`t5NQB z{;=7!-6Qpim*&#AM!pSt!t764j|T*m2@ka=S`3Y}D+#NxDqpLrxua@l?r0Csab9SS zn95P>S$I*=#Uj14EM(@5EcNLbU2=x5yx}eO?p)KTi`ScG5!4o`?kxy8vk$iqJ6kZV zFoM$&D@&^&?0E;i$lZETyk2${rM(@_N|@ggemB-+6A4#A(QH{lFBLFaJzi!~I%m*z;5A4TP^bHr6&euoMsC{P+C){P6JZ7sgCLaYQ2ncEyH{dO;|yX~iNnNb&4s{8HvX|z|Y>5*yf;l~@-*t@83sBr5*F#B^a z=%09bK?JEOA|k!|_s}@3m!ShOIevV6L(vs9L}>z-Z}N5*J~HmB)f0H z)=+B4s9!!ouiKN*poV4&dM;5te&IS6!n1u2IDJ8BmuF)W-NL^2tECl&YqqO|B|Z8{ zL=&$0Cu6&^0d4w$T?#rIuG5|s6CZ8u0-C!P&;GRPh`(I@>9X}${NCaTraku5wA2|j zU*yfY20F&$IyBDEXAepHy6aPpw`M69QW{!Itx_^7)Q#%jjudp7XbvTgD#Wzw=X~zY zkg2MmZ7kt^sIgv7f9m;lb>*~QH!0|45vlB1;l7T^R8!3^iK^K;RA6guJO7e`vgJbP zddo%!t8m@$Vw~U}6D7+6w!PzgMWxM^OI8UH0Iih9VA%k{bb#S-beUu8boi$vK^?xe zuIQZMBR}{mGN{Erj)Cr~W=YR-NF-ydtYJJ$+M#MCB_YLh0)a=rC%EbHvr@Bw6R87t z1m-S}SLz8RC_eqEMKc?v&B0v{OCcvk|4ZNHzUfEgBSB4+9K-YZ@>9n-$JGoJzIB!< zVAZ1wcOq`2qH5N2wG5+3wggtiauCpd-|voF)DiYxiClWeM0>S9BB)UNweFuX&Kl(! zzj2io@191#uiNeyLm_mzlool14v8mO8zHN(o;eogUN*6lyot@6l^Rf_w2yx{%BF_I z;?wXs%|8EatV;8-%2o-L`w~uM6Km!P@I&8xb53w~5L>uv>AX1%@zt+p`}es&GB39d z7WMb0?0YZQuKRg{C$d{FcS5+lOriMgWuj7TF)jp&z)xtISI|Il8FuI-a}Fx43%#-U%%|W2A8O=J7}rIUHdUPy5I}uw8NzWLPSii9X=vlk7;U;F2qN9~N?5LuA0$z?Vtch+7$x z1et#T!pQu}P1zqKIcfgYBHRMx~vODW%}m@dE~dlrdS%3dM)vz#bzrXYxc zK;8^@>(+Da7Dp?DScp#^u&1$lszi{bUct?bbmoczb&unzh)`9}{-h(1x7~3O|51D| zGI-uj{|PL~rmPXZ)uRGYy@2I*d@C)J*TmlVXv0>NKZ?*4IDr2DVmIC)i zt(8aHfX8zjTFN z)boDKDu8Xgo>y{G?K~U%*gtg-5}Ln%5Ei~W+R3>r2^o6e6zSIN$KgC}E}ajLFKld_ zaeP4S>Csl^o`7@$i0%5R1KUf9&$gT2b!tw}F6xD+Accr>@}KY2^qfdea|nq@vu&|& z>N5t}dBkS#!WgYG+opDvprU7J_?clY_k?n(KFhPWC9LCm2elk`Iz`ivGj(1e%2M0+ z9Nc&%@D8IjhbyM^c@JavQQ1`jpJFk|m~Zf;bkDTojc*-*yq{my=9)-qLZ!-h{|wze z%|PzqjOx7}_^7SB)-!GUDNP;TVDqWZ-gM$TCcEAQHReLuv4LMrp^o%0SiNlA`4m$I zqZiwqKVi2O=N8+SszUn!pRX}0@tT7Xe-k^~hT$opx=pblWm2JQ2cl&ygD9@h-CIhV z4fy(9V}qcdS_vRmuXJ6)z#vc_G_aKd7Ss1?UYnE6)>M0})K;)&}nlW^OVMgN+FEHsX21Q?On z!^HMm=+q1-Ef`ZUM%!}frCSEuq?vUIH2N?G3_~Ewz^Mc-ZftGQHJN?@TD4r7K{!HJ zX+V>mPo`qyz}3V{P!j=`C}F=KD$tQ)lwLUSylZjZ_qhNdi3ys0@<1 z`5)>u^j@(-p%g(qfws2OY=-{tfUIW1r=D-T!^k?xmhcY@=&(FAGT!Bi$%d-uM3d>~ z*QLY=$0kCU@5a~Pyy~Qs&c!N>e$k(=Mi@n|GXL^w*hLI`iFR(oV#vcvoKdJ|@ysbu z$-c{=1C!s{9AkyL`7zkuT{FBHb+HGUZPEgy(J-`kIx}SD-p{8yhfbOm!{X3F37>tu-I?+Kj z2I_Bji*>={#KL*JNcl22O^79)^huZ+!??D!hVzKYMQW0mjNT*G-(XE(!!xR`DeGtT z1)(Z75$1J9`Rmxl!a9dlJ>m0WUGY+@WZ}j_^Xj%m{QZ@eCI87 zKMo~DQ!yegK&msy0atyDJRr((Qg|c>hB_axZ(HH)&+m7bVu0Aq>7yU5*(kkKertr& zm$idta<|dW7A>fPjnt3#DD}6Q z0Nn-M@)&#BzNz^+t&}8Zhh1}Yp((wb-l7Wvi8M9iB^PQE#u}_`AUsu0F7UZWK>yp2 z9=O^;2K3Bc^O><2!d7UW`kFDKM2+oY&owfP%fdiCWax3us0Ta#LOWYxD$R@!2tcGM9Ifz);i+_qD)3sHtmbgt*g+(3WlA%KdkFuus z;}DTKTG*xjh9{Je?||mJrb|VBF6NQj>9kJt_;T3eWkN!sD5|7Wq}v^lgtgTL)MNV! zMNCE#zTw$&dMjdehk9;1(s{sHr*c>{rsDU=mM2PCKGY1j@M_^)oPOK8E27Fs z>8fdD{Z#OlNieXx zP({#v;I8gY^*_B0Mu5JWnfibBbpM`FLlD!4^3F;kXjDQkDu|%*vp8h`DRF!d2=`xs z{$I>MJ7($0{^Mmt5QyNvyML1>=>4oDxCtseM@#lUn)rvkvHyAX|D*Ikz30ThMbOqc eac~awc8=kH^$De(Cq!_YgbK{lq7=^ji}ruI3dEuS delta 23650 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ξ6)gRV@Nrw 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�<6`z-xcJ=z}^$ypMl?w~%2@FW`ls2Ey9AQf-L zv}e)U15-zICo2dHuZ%-EdIodtJ{;L83-@14GEiO9ZDh`vKUphkL~gq&p($PX=O_+q z@Hv;G)RLtx+c9kdL@?|SXIMN-?by0-TffKnc9AdBA=b9r&-;KuYkmu2Q^bp9c;)ss z7|m^Gk5eEoF$)`)fx_I&oNvgAV$v<8o0v5^bWoiNHq9d=Yg1I!=CRn8=-XhD^yP6X z4)0P@qBP08o4eTR?(?}j9|zT`sN8D%;Scx15q0>3Ll>TkjUxT+}*YRoYS$_W+^A zhesfA@DG0ObxC;XHMFBkbATW)!$GYQ=lzJOO)+TmZpI;~I@3C^_#AuRUXLi!LhfIr z7m7)HL+ilEnfQk|Y!b@)9Vx5lY12Etw$UTD0Ir!Ft23ElYtqiqzifNNKQgQe(eN6|y51oESGeMW*)7>qDEepfFXvLzz~?CY5B} zV*=3rC@IDZU#Hgn!GcKUy2bPUL4Aawm%Xz#6*CSYXjkc%g$)waEx-iEQGLx>v}ZLd z8L%jxzDWwS=)op2%i6GX*{1KaP4Y-r)bA0zn8s2B5z6X#kpY zMtebU06+=?06_Sk^5A1-uK7PIL@Ib)b$|==+j+8YB+I?QdLMR$cT$NRDjE&q9^4$C z5nYOaVnZ72kK1~VsbQ6_Tkzwn`2@`OuG+HhH)shBN`UV}hwnN?P2ev=lUHeFBMpC8 zK3#@5^}%w4@`uX#`LLD7)lGOnVj72djCZs-frhV33YTZqc1#BcNe%apaP5V?#TqFY z*z&L^36m5=K7ufq_^!}a9GfHn1L?|;s~gawZuq$NUY{cwb?se$8(no*gihF09MW*k z0LU-Z(KiM?sDCg~mzp6138npfmn$;Co^WliEFo1G;U5eDArP=+8sjjc&a=f#{*ekO*YfUr_>KU zObJjmFm*(x)uSsWNjm8NPAQI#&Y+bKDH@|MFsMc`Xt&|?{Lzz|cEyS?qsTud5%hb3 z+A-65P8rC&ln31lzn9yr9ae0G;ETr?#!RxBNG8u$M}P19dqev5d>}l$rLGqg

`$ z@`R1!OLh4a*WY@)T~8?_-wO4jXQ3*vL4VR6*a#vTRqygY5$c;7A@p8`ag927Ms-BUu7TXd{-Q#y}t zhf*wQ&^0lfuu}I?Lk%wvXI6#{P()c!Nn5xI=pRWoW9F#up)p)Z77YYvYeR+DX)k<&igOn~ zwZy3!>#Q<)7VB@v1}21#S(4X>_nPns!QYt%QTo=862~QERNwbwkh(<$wtpdtW5m82 z7p(pnC1CQRqu>(mWDfEMCQbiCjw@ltcwzKupF>27@5<@(rr z=%?n!v#NuRPYSBN_jgL&PVzg0-Ap_u))t(&Bq#K`Dqtyz90I}r z2eokU;LLkG z3IN!Ezb{C@5rJ10X#X!Kz^@DM;Hbgx7DeGvM!~(KgkZZx7C1O?>LLThe;>+!Z?Hdq YgFWv5pW`iBng%Z}(jp_z{de}i068hIxc~qF