diff --git a/MATLAB/MCU_STM32_Matlab/Drivers/CMSIS/Device/STM32F4xx/stm32f4xx.h b/MATLAB/MCU_STM32_Matlab/Drivers/CMSIS/Device/STM32F4xx/stm32f4xx.h index f7a23fe..278d1f9 100644 --- a/MATLAB/MCU_STM32_Matlab/Drivers/CMSIS/Device/STM32F4xx/stm32f4xx.h +++ b/MATLAB/MCU_STM32_Matlab/Drivers/CMSIS/Device/STM32F4xx/stm32f4xx.h @@ -224,61 +224,50 @@ typedef enum #define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))) -/* Use of CMSIS compiler intrinsics for register exclusive access */ -/* Atomic 32-bit register access macro to set one or several bits */ + /* Atomic operations for MinGW/GCC */ + /* Atomic 32-bit register access macro to set one or several bits */ #define ATOMIC_SET_BIT(REG, BIT) \ do { \ - uint32_t val; \ - do { \ - val = __LDREXW((__IO uint32_t *)&(REG)) | (BIT); \ - } while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \ + __sync_fetch_and_or(&(REG), (BIT)); \ } while(0) /* Atomic 32-bit register access macro to clear one or several bits */ #define ATOMIC_CLEAR_BIT(REG, BIT) \ do { \ - uint32_t val; \ - do { \ - val = __LDREXW((__IO uint32_t *)&(REG)) & ~(BIT); \ - } while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \ + __sync_fetch_and_and(&(REG), ~(BIT)); \ } while(0) /* Atomic 32-bit register access macro to clear and set one or several bits */ -#define ATOMIC_MODIFY_REG(REG, CLEARMSK, SETMASK) \ - do { \ - uint32_t val; \ - do { \ - val = (__LDREXW((__IO uint32_t *)&(REG)) & ~(CLEARMSK)) | (SETMASK); \ - } while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \ +#define ATOMIC_MODIFY_REG(REG, CLEARMSK, SETMASK) \ + do { \ + uint32_t old_val, new_val; \ + do { \ + old_val = (REG); \ + new_val = (old_val & ~(CLEARMSK)) | (SETMASK); \ + } while (!__sync_bool_compare_and_swap(&(REG), old_val, new_val)); \ } while(0) /* Atomic 16-bit register access macro to set one or several bits */ #define ATOMIC_SETH_BIT(REG, BIT) \ do { \ - uint16_t val; \ - do { \ - val = __LDREXH((__IO uint16_t *)&(REG)) | (BIT); \ - } while ((__STREXH(val,(__IO uint16_t *)&(REG))) != 0U); \ + __sync_fetch_and_or((uint16_t *)&(REG), (BIT)); \ } while(0) /* Atomic 16-bit register access macro to clear one or several bits */ #define ATOMIC_CLEARH_BIT(REG, BIT) \ do { \ - uint16_t val; \ - do { \ - val = __LDREXH((__IO uint16_t *)&(REG)) & ~(BIT); \ - } while ((__STREXH(val,(__IO uint16_t *)&(REG))) != 0U); \ + __sync_fetch_and_and((uint16_t *)&(REG), ~(BIT)); \ } while(0) /* Atomic 16-bit register access macro to clear and set one or several bits */ -#define ATOMIC_MODIFYH_REG(REG, CLEARMSK, SETMASK) \ +#define ATOMIC_MODIFYH_REG(REG, CLEARMSK, SETMASK) \ do { \ - uint16_t val; \ + uint16_t old_val, new_val; \ do { \ - val = (__LDREXH((__IO uint16_t *)&(REG)) & ~(CLEARMSK)) | (SETMASK); \ - } while ((__STREXH(val,(__IO uint16_t *)&(REG))) != 0U); \ + old_val = (REG); \ + new_val = (old_val & ~(CLEARMSK)) | (SETMASK); \ + } while (!__sync_bool_compare_and_swap((uint16_t *)&(REG), old_val, new_val)); \ } while(0) - /** * @} */ diff --git a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h index c3163e1..80bdbe3 100644 --- a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h +++ b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h @@ -167,7 +167,7 @@ typedef struct { unsigned fInitDone : 1; ///< флаг для выхода из потока программы МК double SimTime; ///< Текущее время симуляции - long SystemClock; ///< Счетчик тактов для симуляции системных тиков (в целочисленном формате) + long long SystemClock; ///< Счетчик тактов для симуляции системных тиков (в целочисленном формате) double SystemClockDouble; ///< Счетчик в формате double для точной симуляции системных тиков С промежуточными значений double sSystemClock_step; ///< Шаг тиков для их симуляции, в формате double diff --git a/MATLAB/MCU_Wrapper/run_mex.bat b/MATLAB/MCU_Wrapper/run_mex.bat index 8f7f456..849620d 100644 --- a/MATLAB/MCU_Wrapper/run_mex.bat +++ b/MATLAB/MCU_Wrapper/run_mex.bat @@ -95,6 +95,8 @@ set code_PERIPH=.\MCU_STM32_Matlab\stm32_matlab_conf.c^ .\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c^ .\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c^ .\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c^ + .\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c^ + .\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c^ .\MCU_STM32_Matlab\Drivers\STM32_SIMULINK\stm32_matlab_tim.c^ .\MCU_STM32_Matlab\Drivers\STM32_SIMULINK\stm32_matlab_adc.c diff --git a/MATLAB/app_wrapper/app_init.c b/MATLAB/app_wrapper/app_init.c index 5850d67..e1f0f65 100644 --- a/MATLAB/app_wrapper/app_init.c +++ b/MATLAB/app_wrapper/app_init.c @@ -19,6 +19,7 @@ void app_init(void) { HAL_Init(); MX_DMA_Init(); MX_IWDG_Init(); + MX_USART3_UART_Init(); MX_TIM1_Init(); MX_TIM2_Init(); MX_TIM3_Init(); diff --git a/MATLAB/upp_init.m b/MATLAB/upp_init.m index a704a3c..a3796d6 100644 --- a/MATLAB/upp_init.m +++ b/MATLAB/upp_init.m @@ -1,14 +1,16 @@ clear all -IadcMax = 200;%50; +IadcMax = 53;%200;%53; VadcMax = 1216; Ts = 5e-6; -Vnom = 400; -Inom = 30;%4.2; +Vnom = 690; +Inom = 2;%4.2; Fnom = 50; -Temperature1 = 2.22; % 20 градусов -Temperature2 = 2.99; % 34 градусов +Temperatures1 = [2.22 4.22]; % 20->68 градусов +TempTimeline1 = [0 100]; % 0 и 10 секунда +Temperatures2 = [2.99 4.45]; % 34->80 градусов +TempTimeline2 = [0 50]; % 0 и 5 секунда diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index 827ce7c..b12adc6 100644 Binary files a/MATLAB/upp_r2023.slx and b/MATLAB/upp_r2023.slx differ diff --git a/UPP/Core/Configs/modbus_config.h b/UPP/Core/Configs/modbus_config.h index 35f4859..365f71e 100644 --- a/UPP/Core/Configs/modbus_config.h +++ b/UPP/Core/Configs/modbus_config.h @@ -20,6 +20,7 @@ #ifndef _MODBUS_CONFIG_H_ #define _MODBUS_CONFIG_H_ #include "upp_defs.h" +#include "upp_params.h" #include "upp_io.h" // Общие параметры @@ -35,8 +36,6 @@ #define MODBUS_MODEL_NAME "" #define MODBUS_USER_APPLICATION_NAME "" -#define MODBUS_NUMB_OF_USEROBJECTS 0 ///< Количество пользовательских объектов -#define MODBUS_USEROBJECT_0_NAME "" ///< Строка пользовательского идентификатора 0. По аналогии можно определить строки до <=128 USEROBJECT // Периферия (опционально) //#define mb_huart huart1 ///< Удобный дефайн для модбасовского uart diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index 7ef6765..0b19a66 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -22,10 +22,10 @@ * @{ */ -#define UPP_DISABLE_ERROR_BLOCK ///< Отключить блокировку УПП при ошибках +//#define UPP_DISABLE_ERROR_BLOCK ///< Отключить блокировку УПП при ошибках //#define UPP_SIMULATE_I ///< Симулировт токи (Iref/2) а не брать с АЦП #define UPP_DISABLE_PROTECT_BOARDPOWER ///< Отключить проверки питания плат (+24, +5 В) -#define UPP_DISABLE_PROTECT_LOSS_PHASE ///< Отключить проверки на потерянные фазы +//#define UPP_DISABLE_PROTECT_LOSS_PHASE ///< Отключить проверки на потерянные фазы //#define ZC_DISABLE_HYSTERESIS_DEBOUNCE ///< Отключить гиситерезис и дребезг на определении перехода через ноль diff --git a/UPP/Core/Inc/stm32f4xx_it.h b/UPP/Core/Inc/stm32f4xx_it.h index 7148ff7..fc9910e 100644 --- a/UPP/Core/Inc/stm32f4xx_it.h +++ b/UPP/Core/Inc/stm32f4xx_it.h @@ -57,6 +57,8 @@ void PendSV_Handler(void); void SysTick_Handler(void); void TIM1_UP_TIM10_IRQHandler(void); void TIM2_IRQHandler(void); +void USART3_IRQHandler(void); +void TIM8_BRK_TIM12_IRQHandler(void); void TIM8_UP_TIM13_IRQHandler(void); void TIM8_TRG_COM_TIM14_IRQHandler(void); void DMA2_Stream0_IRQHandler(void); diff --git a/UPP/Core/PowerMonitor/power_protect.c b/UPP/Core/PowerMonitor/power_protect.c index 74e254b..e5c2f17 100644 --- a/UPP/Core/PowerMonitor/power_protect.c +++ b/UPP/Core/PowerMonitor/power_protect.c @@ -133,12 +133,12 @@ int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal) { /* Переводим внутренние уставки в удобный вид */ - float lFnom = u2f(PARAM_INTERNAL->nominal.F, 100); - float lFmin = lFnom - lFnom*u2f(PARAM_INTERNAL->nominal.F_deviation_minus, 10000); - float lFmax = lFnom + lFnom*u2f(PARAM_INTERNAL->nominal.F_deviation_plus, 10000); + float lFnom = u2f(nominal->F, 100); + float lFmin = lFnom - lFnom*u2f(nominal->F_deviation_minus, 10000); + float lFmax = lFnom + lFnom*u2f(nominal->F_deviation_plus, 10000); - float lTwarn = u2f(PARAM_INTERNAL->setpoints.TemperatureWarn, 100); - float lTerr = u2f(PARAM_INTERNAL->setpoints.TemperatureWarn, 100); + float lTwarn = PARAM_INTERNAL->temp.TemperatureWarn; + float lTerr = PARAM_INTERNAL->temp.TemperatureWarn; /*=============== ЗАЩИТЫ ПО ЧАСТОТЕ ==================*/ diff --git a/UPP/Core/Src/main.c b/UPP/Core/Src/main.c index 1b613b2..e231ae7 100644 --- a/UPP/Core/Src/main.c +++ b/UPP/Core/Src/main.c @@ -87,7 +87,7 @@ int main(void) /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); - + /* USER CODE BEGIN Init */ #ifndef MATLAB diff --git a/UPP/Core/Src/stm32f4xx_it.c b/UPP/Core/Src/stm32f4xx_it.c index 5f49f7b..f2780ba 100644 --- a/UPP/Core/Src/stm32f4xx_it.c +++ b/UPP/Core/Src/stm32f4xx_it.c @@ -60,6 +60,8 @@ extern DMA_HandleTypeDef hdma_adc3; extern TIM_HandleTypeDef htim1; extern TIM_HandleTypeDef htim2; extern TIM_HandleTypeDef htim8; +extern TIM_HandleTypeDef htim12; +extern UART_HandleTypeDef huart3; extern TIM_HandleTypeDef htim14; /* USER CODE BEGIN EV */ @@ -232,6 +234,46 @@ void TIM2_IRQHandler(void) /* USER CODE END TIM2_IRQn 1 */ } +/** + * @brief This function handles USART3 global interrupt. + */ +void USART3_IRQHandler(void) +{ + /* USER CODE BEGIN USART3_IRQn 0 */ + + RS_UART_Handler(&hmodbus1); + return; + /* USER CODE END USART3_IRQn 0 */ + HAL_UART_IRQHandler(&huart3); + /* USER CODE BEGIN USART3_IRQn 1 */ + + /* USER CODE END USART3_IRQn 1 */ +} + +/** + * @brief This function handles TIM8 break interrupt and TIM12 global interrupt. + */ +void TIM8_BRK_TIM12_IRQHandler(void) +{ + /* USER CODE BEGIN TIM8_BRK_TIM12_IRQn 0 */ + uint32_t itsource = mb_htim.Instance->DIER; + uint32_t itflag = mb_htim.Instance->SR; + if ((itflag & (TIM_FLAG_UPDATE)) == (TIM_FLAG_UPDATE)) + { + if ((itsource & (TIM_IT_UPDATE)) == (TIM_IT_UPDATE)) + { + RS_TIM_Handler(&hmodbus1); + return; + } + } + /* USER CODE END TIM8_BRK_TIM12_IRQn 0 */ + HAL_TIM_IRQHandler(&htim8); + HAL_TIM_IRQHandler(&htim12); + /* USER CODE BEGIN TIM8_BRK_TIM12_IRQn 1 */ + + /* USER CODE END TIM8_BRK_TIM12_IRQn 1 */ +} + /** * @brief This function handles TIM8 update interrupt and TIM13 global interrupt. */ diff --git a/UPP/Core/Src/tim.c b/UPP/Core/Src/tim.c index ce6afdf..099bbef 100644 --- a/UPP/Core/Src/tim.c +++ b/UPP/Core/Src/tim.c @@ -468,6 +468,8 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) __HAL_RCC_TIM8_CLK_ENABLE(); /* TIM8 interrupt Init */ + HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn); HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn); HAL_NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn, 15, 0); @@ -494,6 +496,10 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM12_MspInit 0 */ /* TIM12 clock enable */ __HAL_RCC_TIM12_CLK_ENABLE(); + + /* TIM12 interrupt Init */ + HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn); /* USER CODE BEGIN TIM12_MspInit 1 */ /* USER CODE END TIM12_MspInit 1 */ @@ -613,6 +619,14 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) __HAL_RCC_TIM8_CLK_DISABLE(); /* TIM8 interrupt Deinit */ + /* USER CODE BEGIN TIM8:TIM8_BRK_TIM12_IRQn disable */ + /** + * Uncomment the line below to disable the "TIM8_BRK_TIM12_IRQn" interrupt + * Be aware, disabling shared interrupt may affect other IPs + */ + /* HAL_NVIC_DisableIRQ(TIM8_BRK_TIM12_IRQn); */ + /* USER CODE END TIM8:TIM8_BRK_TIM12_IRQn disable */ + HAL_NVIC_DisableIRQ(TIM8_UP_TIM13_IRQn); HAL_NVIC_DisableIRQ(TIM8_TRG_COM_TIM14_IRQn); /* USER CODE BEGIN TIM8_MspDeInit 1 */ @@ -637,6 +651,16 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM12_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM12_CLK_DISABLE(); + + /* TIM12 interrupt Deinit */ + /* USER CODE BEGIN TIM12:TIM8_BRK_TIM12_IRQn disable */ + /** + * Uncomment the line below to disable the "TIM8_BRK_TIM12_IRQn" interrupt + * Be aware, disabling shared interrupt may affect other IPs + */ + /* HAL_NVIC_DisableIRQ(TIM8_BRK_TIM12_IRQn); */ + /* USER CODE END TIM12:TIM8_BRK_TIM12_IRQn disable */ + /* USER CODE BEGIN TIM12_MspDeInit 1 */ /* USER CODE END TIM12_MspDeInit 1 */ diff --git a/UPP/Core/Src/usart.c b/UPP/Core/Src/usart.c index bcd8368..f739e55 100644 --- a/UPP/Core/Src/usart.c +++ b/UPP/Core/Src/usart.c @@ -110,6 +110,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) GPIO_InitStruct.Alternate = GPIO_AF7_USART3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + /* USART3 interrupt Init */ + HAL_NVIC_SetPriority(USART3_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART3_IRQn); /* USER CODE BEGIN USART3_MspInit 1 */ /* USER CODE END USART3_MspInit 1 */ @@ -157,6 +160,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) */ HAL_GPIO_DeInit(GPIOB, SCIT1_Pin|SCIR1_Pin); + /* USART3 interrupt Deinit */ + HAL_NVIC_DisableIRQ(USART3_IRQn); /* USER CODE BEGIN USART3_MspDeInit 1 */ /* USER CODE END USART3_MspDeInit 1 */ diff --git a/UPP/Core/UPP/upp_errors.c b/UPP/Core/UPP/upp_errors.c index 1ea4619..936a308 100644 --- a/UPP/Core/UPP/upp_errors.c +++ b/UPP/Core/UPP/upp_errors.c @@ -151,7 +151,7 @@ void UPP_Errors_LossPhase(void) MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); /* Если хотя бы одна фаза есть проверяем фазы отдельно */ - if(!ERR_PUI->LossPhaseAll) + if(!loss_phases_all) { ERR_PUI->LossPhaseA = setError( ERR_PRIVATE->ia_min, ERR_PUI->LossPhaseA, diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index 6a94ed9..ecf5ae7 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -10,6 +10,7 @@ - @ref ANGLE_CONTROL - Формирование и регулирование угла открытия тиристора ******************************************************************************/ #include "upp_main.h" // всё остальное по работе с УПП +#include "usart.h" #include "tim.h" #include "iwdg.h" @@ -34,6 +35,8 @@ int UPP_App_Init(void) upp.PUI.values = &MB_DATA.InRegs.pui; upp.call = &MB_INTERNAL.FuncCalls; + MODBUS_FirstInit(&hmodbus1, &mb_huart, &mb_htim); + if(HAL_TIM_Base_Start(&ustim) != HAL_OK) { return 1; @@ -49,8 +52,7 @@ int UPP_App_Init(void) if(Angle_Init(&upp.hangle) != HAL_OK) { return 1; - } - + } if(UPP_Params_Init() != HAL_OK) { return 1; @@ -74,6 +76,7 @@ int UPP_PreWhile(void) #endif UPP_DO.CEN(ENABLE); + MODBUS_SlaveStart(&hmodbus1, NULL); return 0; } @@ -141,8 +144,8 @@ int UPP_While(void) UPP_DO.Error(DISABLE); if(slow_cnt == 0) { // начало инициализации - сбрасываем флаги - memset(&ERR_PRIVATE, 0, sizeof(ERR_PRIVATE)); - memset(&ERR_PUI, 0, sizeof(ERR_PUI)); + memset(ERR_PRIVATE, 0, sizeof(*ERR_PRIVATE)); + memset(ERR_PUI, 0, sizeof(*ERR_PUI)); } if(slow_cnt > MS_TO_SLOW_TICKS(UPP_INIT_BEFORE_READY_MS)) diff --git a/UPP/Core/UPP/upp_params.c b/UPP/Core/UPP/upp_params.c index fe85ad3..d50f6f5 100644 --- a/UPP/Core/UPP/upp_params.c +++ b/UPP/Core/UPP/upp_params.c @@ -372,8 +372,8 @@ void UPP_Params_Saturate(void) SATURATE_U16(PARAM_PUI->Tdelay, 5, 60); SATURATE_U16(PARAM_PUI->Interlace, 0, 1); - SATURATE_U16(PARAM_INTERNAL->setpoints.TemperatureWarn, 0, 90); - SATURATE_U16(PARAM_INTERNAL->setpoints.TemperatureErr, 0, 90); + SATURATE_U16(PARAM_INTERNAL->temp.TemperatureWarn, 0, 90); + SATURATE_U16(PARAM_INTERNAL->temp.TemperatureErr, 0, 90); SATURATE_U16(PARAM_INTERNAL->nominal.PhaseNumber, 0, 3); SATURATE_U16(PARAM_INTERNAL->nominal.U, 0, ADC_U_MAX_V_DEFAULT*10); @@ -426,8 +426,8 @@ void UPP_Params_SetDefault(int pui_default, int internal_default) if(internal_default) { - PARAM_INTERNAL->setpoints.TemperatureWarn = SETPOINT_TEMP_WARN*10; - PARAM_INTERNAL->setpoints.TemperatureErr = SETPOINT_TEMP_ERR*10; + PARAM_INTERNAL->temp.TemperatureWarn = SETPOINT_TEMP_WARN*10; + PARAM_INTERNAL->temp.TemperatureErr = SETPOINT_TEMP_ERR*10; PARAM_INTERNAL->nominal.PhaseNumber = NOM_PHASE_NUMB; PARAM_INTERNAL->nominal.U = NOM_U_V_DEFAULT*10; diff --git a/UPP/Core/UPP/upp_params.h b/UPP/Core/UPP/upp_params.h index 05e4762..06caf58 100644 --- a/UPP/Core/UPP/upp_params.h +++ b/UPP/Core/UPP/upp_params.h @@ -10,15 +10,17 @@ #define _UPP_PARAMS_H #include "upp_defs.h" + + #define u2f(_u16_, _coef_) ((float)_u16_/_coef_) typedef struct { - unsigned set_default_pui:1; ///< Выставить настройки ПУИ в дефолтные - unsigned set_default_internal:1;///< Выставить внутренние настройки в дефолтные unsigned go:1; ///< Запустить УПП unsigned stop:1; ///< Остановка УПП (авария) + unsigned set_default_pui:1; ///< Выставить настройки ПУИ в дефолтные + unsigned set_default_internal:1;///< Выставить внутренние настройки в дефолтные unsigned reserved:11; unsigned reset_mcu:1; @@ -27,71 +29,74 @@ typedef struct typedef struct { - uint16_t PhaseSequence; ///< Последовательность фаз todo - uint16_t PhaseNumber; ///< [Количество] - uint16_t U; ///< [В x 10] - uint16_t U_deviation_plus; ///< [Проценты x 100] - uint16_t U_deviation_minus; ///< [Проценты x 100] - uint16_t F; ///< [Гц x 100] - uint16_t F_deviation_plus; ///< [Проценты x 100] - uint16_t F_deviation_minus; ///< [Проценты x 100] - uint16_t I; ///< [Амперы x 10] + uint16_t PhaseSequence; ///< Адрес 1000: Последовательность фаз todo + uint16_t PhaseNumber; ///< Адрес 1001: [Количество] + uint16_t U; ///< Адрес 1002: [В x 10] + uint16_t U_deviation_plus; ///< Адрес 1003: [Проценты x 100] + uint16_t U_deviation_minus; ///< Адрес 1004: [Проценты x 100] + uint16_t F; ///< Адрес 1005: [Гц x 100] + uint16_t F_deviation_plus; ///< Адрес 1006: [Проценты x 100] + uint16_t F_deviation_minus; ///< Адрес 1007: [Проценты x 100] + uint16_t I; ///< Адрес 1008: [Амперы x 10] }UPP_ParamsNominal_t; typedef struct { - uint16_t TemperatureWarn; ///< Предупредительный порог температуры [Градусы x 100] - uint16_t TemperatureErr; ///< Аварийный порог температуры [Градусы x 100] }UPP_ParamsSetpoints_t; typedef struct { + UPP_ParamsNominal_t nominal; + /* Параметры Температур */ struct { - uint16_t rms_window_size; ///< Размер окна для RMS - uint16_t rms_exp_alpha; ///< Постоянная времени для сглаживания RMS - }pm; - - UPP_ParamsNominal_t nominal; - UPP_ParamsSetpoints_t setpoints; + uint16_t TemperatureWarn; ///< Адрес 1010: Предупредительный порог температуры [Градусы x 100] + uint16_t TemperatureErr; ///< Адрес 1011: Аварийный порог температуры [Градусы x 100] + }temp; /* Параметры АЦП */ struct { - uint16_t ADC_Max[4]; ///< Величина в единицах измерения при АЦП = 4095 [В или А x 10] - uint16_t ADC_Zero[4]; ///< Кванты АЦП когда на входе ноль + uint16_t ADC_Max[4]; ///< Адрес 1020: Величина в единицах измерения при АЦП = 4095 [В или А x 10] + uint16_t ADC_Zero[4]; ///< Адрес 1021: Кванты АЦП когда на входе ноль }adc; + + /* Параметры Мониторинга напряжения */ + struct + { + uint16_t rms_window_size; ///< Адрес 1030: Размер окна для RMS + uint16_t rms_exp_alpha; ///< Адрес 1031: Постоянная времени для сглаживания RMS + }pm; + /* Параметры ШИМ */ struct { - uint16_t PhaseMask; ///< Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c - uint16_t Frequency; ///< Частота ШИМ для пачки импульсов на тиристоры [Герцы] - uint16_t Duty; ///< Скважность ШИМ для пачки импульсов на тиристоры [Проценты] - uint16_t PulseLength; ///< Количесво импульсов в пачке [Количество] + uint16_t PhaseMask; ///< Адрес 1040: Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c + uint16_t Frequency; ///< Адрес 1041: Частота ШИМ для пачки импульсов на тиристоры [Герцы] + uint16_t Duty; ///< Адрес 1042: Скважность ШИМ для пачки импульсов на тиристоры [Проценты] + uint16_t PulseLength; ///< Адрес 1043: Количесво импульсов в пачке [Количество] }pwm; - /* Параметры Угла */ + /* Параметры Перехода через ноль */ struct { - uint16_t Hysteresis; ///< Гистерезис для определения перехода через ноль [Проценты x 100] - uint16_t DebouneCouner; ///< Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль [Количество] + uint16_t Hysteresis; ///< Адрес 1050: Гистерезис для определения перехода через ноль [Проценты x 100] + uint16_t DebouneCouner; ///< Адрес 1051: Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль [Количество] }zc; /* Параметры Угла */ struct { - uint16_t PulseLengthReserve;/*!< @brief Сколько запаса закладывать на длительность пачки импульсов [Проценты] @ref __AngleSetLimit + uint16_t PulseLengthReserve;/*!< @brief Адрес 1060: Сколько запаса закладывать на длительность пачки импульсов [Проценты] @ref __AngleSetLimit @details Пример: 100% - будет запас в одну пачку импульсов */ - uint16_t Angle_Max; ///< Максимальный угол открытия тиристора [0..1 x 65535] - uint16_t Angle_Min; ///< Минимальный угол открытия тиристора [0..1 x 65535] - uint16_t PID_Kp; ///< Пропорциональный коэфициент ПИ регулятора угла [x 10000] - uint16_t PID_Ki; ///< Интегральный коэфициент ПИ регулятора угла [x 10000] - uint16_t PID_Kd; ///< Интегральный коэфициент ПИ регулятора угла [x 10000] - }angle; - - + uint16_t Angle_Max; ///< Адрес 1061: Максимальный угол открытия тиристора [0..1 x 65535] + uint16_t Angle_Min; ///< Адрес 1062: Минимальный угол открытия тиристора [0..1 x 65535] + uint16_t PID_Kp; ///< Адрес 1063: Пропорциональный коэфициент ПИ регулятора угла [x 10000] + uint16_t PID_Ki; ///< Адрес 1064: Интегральный коэфициент ПИ регулятора угла [x 10000] + uint16_t PID_Kd; ///< Адрес 1065: Интегральный коэфициент ПИ регулятора угла [x 10000] + }angle; }UPP_PrvtParams_t; @@ -108,4 +113,55 @@ void UPP_Params_Saturate(void); /* Установка параметров на дефолтные значения */ void UPP_Params_SetDefault(int pui_default, int internal_default); +#define MODBUS_NUMB_OF_USEROBJECTS 128 ///< Количество пользовательских объектов +/* Номинальные параметры (H1000-H1008) */ +#define MODBUS_USEROBJECT_0_NAME "Nom PhSeq;H1000;[]" +#define MODBUS_USEROBJECT_1_NAME "Nom PhNum;H1001;[cnt]" +#define MODBUS_USEROBJECT_2_NAME "Nom U;H1002;[Vx10]" +#define MODBUS_USEROBJECT_3_NAME "Nom Udev+;H1003;[%x100]" +#define MODBUS_USEROBJECT_4_NAME "Nom Udev-;H1004;[%x100]" +#define MODBUS_USEROBJECT_5_NAME "Nom F;H1005;[Hzx100]" +#define MODBUS_USEROBJECT_6_NAME "Nom Fdev+;H1006;[%x100]" +#define MODBUS_USEROBJECT_7_NAME "Nom Fdev-;H1007;[%x100]" +#define MODBUS_USEROBJECT_8_NAME "Nom I;H1008;[Ax10]" + +/* Температурные параметры (H1010-H1011) */ +#define MODBUS_USEROBJECT_10_NAME "TempWarn;H1010;[Cx100]" +#define MODBUS_USEROBJECT_11_NAME "TempErr;H1011;[Cx100]" + +/* Параметры АЦП (H1020-H1027) */ +#define MODBUS_USEROBJECT_20_NAME "ADC Max Uba;H1020;[V/Ax10]" +#define MODBUS_USEROBJECT_21_NAME "ADC Max Uac;H1021;[V/Ax10]" +#define MODBUS_USEROBJECT_22_NAME "ADC Max Ic;H1022;[V/Ax10]" +#define MODBUS_USEROBJECT_23_NAME "ADC Max Ia;H1023;[V/Ax10]" +#define MODBUS_USEROBJECT_24_NAME "ADC Zero Uba;H1024;[Quants]" +#define MODBUS_USEROBJECT_25_NAME "ADC Zero Uac;H1025;[Quants]" +#define MODBUS_USEROBJECT_26_NAME "ADC Zero Ic;H1026;[Quants]" +#define MODBUS_USEROBJECT_27_NAME "ADC Zero Ia;H1027;[Quants]" + +/* Мониторинг питания (H1030-H1031) */ +#define MODBUS_USEROBJECT_30_NAME "RMS WindowSize;H1030;[]" +#define MODBUS_USEROBJECT_31_NAME "RMS Alpha;H1031;[x10000]" + +/* ШИМ параметры (H1040-H1043) */ +#define MODBUS_USEROBJECT_40_NAME "PWM Mask;H1040;[bit]" +#define MODBUS_USEROBJECT_41_NAME "PWM Freq;H1041;[Hz]" +#define MODBUS_USEROBJECT_42_NAME "PWM Duty;H1042;[%]" +#define MODBUS_USEROBJECT_43_NAME "PWM Pulses;H1043;[cnt]" + +/* Ноль-кросс (H1050-H1051) */ +#define MODBUS_USEROBJECT_50_NAME "ZC Hyst;H1050;[%x100]" +#define MODBUS_USEROBJECT_51_NAME "ZC Debounce;H1051;[cnt]" + +/* Угловые параметры (H1060-H1065) */ +#define MODBUS_USEROBJECT_60_NAME "Angle PulseRes;H1060;[%]" +#define MODBUS_USEROBJECT_61_NAME "Angle Max;H1061;[x65535]" +#define MODBUS_USEROBJECT_62_NAME "Angle Min;H1062;[x65535]" +#define MODBUS_USEROBJECT_63_NAME "Angle PID_Kp;H1063;[x10000]" +#define MODBUS_USEROBJECT_64_NAME "Angle PID_Ki;H1064;[x10000]" +#define MODBUS_USEROBJECT_65_NAME "Angle PID_Kd;H1065;[x10000]" + +/* Функциональные вызовы - если нужно (битовые поля в одном регистре) */ +#define MODBUS_USEROBJECT2000_NAME "FuncCalls;H2000;[bitmask]" + #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 671ac78..283c5c4 100644 --- a/UPP/MDK-ARM/UPP.uvoptx +++ b/UPP/MDK-ARM/UPP.uvoptx @@ -12,7 +12,7 @@ *.lib *.txt; *.h; *.inc; *.md *.plm - *.cpp + *.cpp; *.cc; *.cxx 0 @@ -93,7 +93,7 @@ 1 1 1 - 1 + 0 1 1 1 @@ -103,7 +103,7 @@ 1 0 0 - 6 + 4 @@ -114,44 +114,54 @@ - STLink\ST-LINKIII-KEIL_SWO.dll + Segger\JL2CM3.dll + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + JL2CM3 + -U -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(4BA00477) -L00(4) -N01("Unknown JTAG device") -D01(06413041) -L01(5) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F427ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) + + + 0 + DLGUARM + + 0 UL2CM3 UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F427ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - - 0 - ST-LINKIII-KEIL_SWO - -U-O142 -O2190 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F427ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - - 0 - 0 - 156 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\Core\PowerMonitor\power_monitor.c - - -
-
+ + + + 0 + 1 + uwTick,0x0A + + 0 0 - 1 + 0 1 0 0 @@ -170,7 +180,7 @@ 0 0 0 - 1 + 0 0 0 0 @@ -270,7 +280,7 @@ 1 1 1 - 1 + 0 1 1 1 @@ -294,11 +304,6 @@ Segger\JL2CM3.dll - - 0 - JL2CM3 - -U60145553 -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(4BA00477) -L00(4) -N01("Unknown JTAG device") -D01(06413041) -L01(5) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - 0 ARMRTXEVENTFLAGS @@ -307,13 +312,18 @@ 0 DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=620,209,878,797,0)(1012=-1,-1,-1,-1,0) + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) 0 ARMDBGFLAGS + + 0 + JL2CM3 + -U-O14 -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(4BA00477) -L00(4) -N01("Unknown JTAG device") -D01(06413041) -L01(5) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) + 0 DLGUARM @@ -322,199 +332,59 @@ 0 UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U005600373433510237363934 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131123 -TC168000000 -TT10000000 -TP21 -TDS800D -TDT1 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - + + + 0 + 0 + 50 + 1 +
134253566
+ 0 + 0 + 0 + 0 + 0 + 1 + ../Core/Src/usart.c + + \\Debug_F417\../Core/Src/usart.c\50 +
+
0 1 - upp.call,0x0A - - - 1 - 1 - upp,0x0A - - - 2 - 1 uwTick,0x0A - - 3 - 1 - errors.prvt.f.err - - - 4 - 1 - errors.prvt.cnt - - - 5 - 1 - upp.pm.measured - - - 6 - 1 - hbt,0x0A - - - 7 - 1 - \\Debug_F417\../Core/UPP/upp_main.c\upp.pm.avg[5].dataProcessing - - - 8 - 1 - dbg_polarity,0x0A - - - 9 - 1 - dbg_iref - - - 10 - 1 - upp.pm.zc.Channel[0].HalfWave - - - 11 - 1 - \\Debug_F417\../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c\uwTick,0x0A - - - 12 - 1 - htim1 - - - 13 - 1 - htim2 - - - 14 - 1 - UPP_DIN,0x0A - - - 15 - 1 - \\Debug_F417\../Core/UPP/upp_io.c\UPP_DIN.Pusk.Sw_FilterDelay - - - 16 - 1 - hadc3 - - - 17 - 1 - upp.hangle.Iref - - - 18 - 1 - upp.pm.measured.final.U[0] - - - - - 0 - 2 - MB_INTERNAL,0x0A - 1 - 2 - MB_DATA,0x0A - - - 2 - 2 - errors.prvt.f.err,0x0A - - - 3 - 2 - errors.prvt.cnt,0x0A - - - 4 - 2 - errors.pui,0x0A - - - 5 - 2 - errors.common - - - 6 - 2 - upp.pm.measured.slow.U[0] - - - 7 - 2 - zc->Channel[channel1].PeriodStartTime,0x0A - - - 8 - 2 - zc->Channel[channel2].PeriodStartTime,0x0A - - - 9 - 2 - zc->Channel[channel1].PeriodStartTime - zc->Channel[channel2].PeriodStartTime,0x10 - - - 10 - 2 - htim5.Instance,0x0A - - - 11 - 2 - iref_dbg - - - 12 - 2 - upp.pm.measured.slow.U[0] - - - 13 - 2 + 1 upp,0x0A - 14 - 2 - htim5,0x0A + 2 + 1 + MB_DEVID - 15 - 2 - htim3,0x0A + 3 + 1 + hmodbus1,0x0A - 16 - 2 - htim5.Instance->CNT-2605346416,0x0A + 4 + 1 + RS_Buffer - + + 5 + 1 + pclk,0x0A + + 0 @@ -539,7 +409,7 @@ 0 0 0 - 1 + 0 0 0 0 @@ -559,17 +429,17 @@ - System Viewer\ADC3 + System Viewer\GPIOB 35905 - System Viewer\DMA2 + System Viewer\USART3 35904 1 - 0 + 1 0 2 10000000 @@ -1187,7 +1057,7 @@ MyLibs - 1 + 0 0 0 0 @@ -1859,7 +1729,7 @@ Application/MDK-ARM - 1 + 0 0 0 0 @@ -1899,7 +1769,7 @@ ::Compiler - 1 + 0 0 0 1 diff --git a/UPP/MDK-ARM/UPP.uvprojx b/UPP/MDK-ARM/UPP.uvprojx index b764892..1757519 100644 --- a/UPP/MDK-ARM/UPP.uvprojx +++ b/UPP/MDK-ARM/UPP.uvprojx @@ -138,7 +138,7 @@ 4101 1 - BIN\UL2V8M.DLL + BIN\UL2CM3.DLL diff --git a/UPP/UPP.ioc b/UPP/UPP.ioc index f2944be..f4e67db 100644 --- a/UPP/UPP.ioc +++ b/UPP/UPP.ioc @@ -164,10 +164,12 @@ NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false NVIC.TIM1_UP_TIM10_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.TIM2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.TIM8_BRK_TIM12_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.TIM8_TRG_COM_TIM14_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:true NVIC.TIM8_UP_TIM13_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.TimeBase=TIM8_TRG_COM_TIM14_IRQn NVIC.TimeBaseIP=TIM14 +NVIC.USART3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false PA10.GPIOParameters=GPIO_Label PA10.GPIO_Label=PWM3