diff --git a/MATLAB/MCU_STM32_Matlab/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c b/MATLAB/MCU_STM32_Matlab/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c index b3ce9bb..efc8e55 100644 --- a/MATLAB/MCU_STM32_Matlab/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c +++ b/MATLAB/MCU_STM32_Matlab/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c @@ -421,6 +421,7 @@ void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState Pin { GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; } + __GPIO_BSRR_Sim(GPIOx); } /** @@ -442,6 +443,7 @@ void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) /* Set selected pins that were at low level, and reset ones that were high */ GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin); + __GPIO_BSRR_Sim(GPIOx); } /** diff --git a/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_gpio.c b/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_gpio.c index 58ce973..b7145ce 100644 --- a/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_gpio.c +++ b/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_gpio.c @@ -16,6 +16,18 @@ void Simulate_GPIO_BSRR(void) #ifdef GPIOD __GPIO_BSRR_Sim(GPIOD); #endif +#ifdef GPIOE + __GPIO_BSRR_Sim(GPIOE); +#endif +#ifdef GPIOF + __GPIO_BSRR_Sim(GPIOF); +#endif +#ifdef GPIOG + __GPIO_BSRR_Sim(GPIOG); +#endif +#ifdef GPIOH + __GPIO_BSRR_Sim(GPIOH); +#endif } diff --git a/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c b/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c index 546224f..4d04c32 100644 --- a/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c +++ b/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c @@ -26,6 +26,7 @@ void Simulate_Periph_Sim(void) { Simulate_TIMs(); Simulate_ADCs(); + Simulate_GPIO_BSRR(); } // MCU PERIPH DEINIT diff --git a/MATLAB/MCU_Wrapper/mcu_wrapper.c b/MATLAB/MCU_Wrapper/mcu_wrapper.c index 6948f4d..1c02dd0 100644 --- a/MATLAB/MCU_Wrapper/mcu_wrapper.c +++ b/MATLAB/MCU_Wrapper/mcu_wrapper.c @@ -37,9 +37,10 @@ const int inOffsets[IN_PORT_NUMB] = { */ const int outLengths[OUT_PORT_NUMB] = { THYR_PORT_1_WIDTH, - PM_PORT_2_WIDTH, - ANGLE_PORT_3_WIDTH, - OUT_PORT_4_WIDTH + DO_PORT_2_WIDTH, + PM_PORT_3_WIDTH, + ANGLE_PORT_4_WIDTH, + OUT_PORT_5_WIDTH }; /** * @brief Таблица смещений в выходном массиве OUT @@ -48,7 +49,8 @@ const int outOffsets[OUT_PORT_NUMB] = { OFFSET_OUT_ARRAY_1, OFFSET_OUT_ARRAY_2, OFFSET_OUT_ARRAY_3, - OFFSET_OUT_ARRAY_4 + OFFSET_OUT_ARRAY_4, + OFFSET_OUT_ARRAY_5 }; // INPUT/OUTPUTS AUTO-PARAMS END diff --git a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h index dcc6ce4..449038e 100644 --- a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h +++ b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h @@ -57,11 +57,12 @@ #define ADC_PORT_1_WIDTH 6 #define IN_PORT_2_WIDTH 16 -#define OUT_PORT_NUMB 4 +#define OUT_PORT_NUMB 5 #define THYR_PORT_1_WIDTH 6 -#define PM_PORT_2_WIDTH 32 -#define ANGLE_PORT_3_WIDTH 16 -#define OUT_PORT_4_WIDTH 16 +#define DO_PORT_2_WIDTH 3 +#define PM_PORT_3_WIDTH 32 +#define ANGLE_PORT_4_WIDTH 16 +#define OUT_PORT_5_WIDTH 16 // INPUT/OUTPUTS PARAMS END /** WRAPPER_CONF @@ -100,13 +101,14 @@ #define OFFSET_IN_ARRAY_2 (OFFSET_IN_ARRAY_1 + ADC_PORT_1_WIDTH) /// === Полный размер буфера === -#define TOTAL_OUT_SIZE (THYR_PORT_1_WIDTH + PM_PORT_2_WIDTH + ANGLE_PORT_3_WIDTH + OUT_PORT_4_WIDTH) +#define TOTAL_OUT_SIZE (THYR_PORT_1_WIDTH + DO_PORT_2_WIDTH + PM_PORT_3_WIDTH + ANGLE_PORT_4_WIDTH + OUT_PORT_5_WIDTH) /// === Смещения массивов (внутри общего буфера) === #define OFFSET_OUT_ARRAY_1 0 #define OFFSET_OUT_ARRAY_2 (OFFSET_OUT_ARRAY_1 + THYR_PORT_1_WIDTH) -#define OFFSET_OUT_ARRAY_3 (OFFSET_OUT_ARRAY_2 + PM_PORT_2_WIDTH) -#define OFFSET_OUT_ARRAY_4 (OFFSET_OUT_ARRAY_3 + ANGLE_PORT_3_WIDTH) +#define OFFSET_OUT_ARRAY_3 (OFFSET_OUT_ARRAY_2 + DO_PORT_2_WIDTH) +#define OFFSET_OUT_ARRAY_4 (OFFSET_OUT_ARRAY_3 + PM_PORT_3_WIDTH) +#define OFFSET_OUT_ARRAY_5 (OFFSET_OUT_ARRAY_4 + ANGLE_PORT_4_WIDTH) // INPUT/OUTPUTS AUTO-PARAMS END diff --git a/MATLAB/app_wrapper/app_init.c b/MATLAB/app_wrapper/app_init.c index c399266..f107614 100644 --- a/MATLAB/app_wrapper/app_init.c +++ b/MATLAB/app_wrapper/app_init.c @@ -27,6 +27,7 @@ void app_init(void) { UPP_SetDefault(1, 1); UPP_Init(); UPP_PreWhile(); + UPP_DO.CEN(DISABLE); // USER APP INIT END } diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index 1c8806f..3eca712 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -10,7 +10,7 @@ float dbg[16]; extern float iref_dbg; #define PIN_READ(_verbname_) (_verbname_##_GPIO_Port->ODR & (_verbname_##_Pin)) ? 1 : 0 -void Write_Thyristors(real_T* Buffer, int ind_port) +void Write_UPP_Outputs(real_T* Buffer, int ind_port) { int pwm1_pin = PIN_READ(PWM1); int pwm2_pin = PIN_READ(PWM2); @@ -18,14 +18,39 @@ void Write_Thyristors(real_T* Buffer, int ind_port) int pwm4_pin = PIN_READ(PWM4); int pwm5_pin = PIN_READ(PWM5); int pwm6_pin = PIN_READ(PWM6); + int err = PIN_READ(RDO1); + int work = PIN_READ(RDO2); + int ready = PIN_READ(RDO3); + + if (CEN_GPIO_Port->ODR & CEN_Pin) + { + WriteOutputArray(0, ind_port, 0); + WriteOutputArray(0, ind_port, 1); + WriteOutputArray(0, ind_port, 2); + WriteOutputArray(0, ind_port, 3); + WriteOutputArray(0, ind_port, 4); + WriteOutputArray(0, ind_port, 5); + + + WriteOutputArray(0, ind_port+1, 0); + WriteOutputArray(0, ind_port+1, 1); + WriteOutputArray(0, ind_port+1, 2); + } + else + { + WriteOutputArray(pwm1_pin, ind_port, 0); + WriteOutputArray(pwm2_pin, ind_port, 1); + WriteOutputArray(pwm3_pin, ind_port, 2); + WriteOutputArray(pwm4_pin, ind_port, 3); + WriteOutputArray(pwm5_pin, ind_port, 4); + WriteOutputArray(pwm6_pin, ind_port, 5); + + WriteOutputArray(ready, ind_port+1, 0); + WriteOutputArray(work, ind_port+1, 1); + WriteOutputArray(err, ind_port+1, 2); + } - WriteOutputArray(pwm1_pin, ind_port, 0); - WriteOutputArray(pwm2_pin, ind_port, 1); - WriteOutputArray(pwm3_pin, ind_port, 2); - WriteOutputArray(pwm4_pin, ind_port, 3); - WriteOutputArray(pwm5_pin, ind_port, 4); - WriteOutputArray(pwm6_pin, ind_port, 5); } void Write_PowerMonitor(real_T* Buffer, int ind_port) @@ -71,9 +96,9 @@ void Write_AngleControl(real_T* Buffer, int ind_port) WriteOutputArray(upp.hangle.alpha, ind_port, nn++); - WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR1) - upp.hangle.htim->Instance->CNT, 2, nn++); - WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR2) - upp.hangle.htim->Instance->CNT, 2, nn++); - WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR3) - upp.hangle.htim->Instance->CNT, 2, nn++); + WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR1) - upp.hangle.htim->Instance->CNT, ind_port, nn++); + WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR2) - upp.hangle.htim->Instance->CNT, ind_port, nn++); + WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR3) - upp.hangle.htim->Instance->CNT, ind_port, nn++); } @@ -108,11 +133,11 @@ void app_readInputs(const real_T* Buffer) { */ void app_writeOutputBuffer(real_T* Buffer) { // USER APP OUTPUT START - Write_Thyristors(Buffer, 0); + Write_UPP_Outputs(Buffer, 0); - Write_PowerMonitor(Buffer, 1); + Write_PowerMonitor(Buffer, 2); - Write_AngleControl(Buffer, 2); + Write_AngleControl(Buffer, 3); int nn = 0; //WriteOutputArray(upp.hangle.htim->Instance->CNT, 2, nn++); diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index 21d410d..f9989dc 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 0851d68..35f4859 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_io.h" // Общие параметры #define MODBUS_DEVICE_ID 1 ///< Адрес устройства в сети Modbus @@ -40,8 +41,8 @@ // Периферия (опционально) //#define mb_huart huart1 ///< Удобный дефайн для модбасовского uart //#define mb_htim htim3 ///< Удобный дефайн для модбасовского таймера -//#define RS_EnableReceive() ///< Функция изменения направления передачи на ПРИЕМ для RS-485 -//#define RS_EnableTransmit() ///< Функция изменения направления передачи на ПЕРЕДАЧУ для RS-485 +#define RS_EnableReceive() UPP_UART1_SetDirection(GPIO_PIN_RESET) ///< Функция изменения направления передачи на ПРИЕМ для RS-485 +#define RS_EnableTransmit() UPP_UART1_SetDirection(GPIO_PIN_RESET) ///< Функция изменения направления передачи на ПЕРЕДАЧУ для RS-485 // Модули modbus diff --git a/UPP/Core/Configs/mylibs_config.h b/UPP/Core/Configs/mylibs_config.h index 4838d99..11c8233 100644 --- a/UPP/Core/Configs/mylibs_config.h +++ b/UPP/Core/Configs/mylibs_config.h @@ -99,9 +99,10 @@ #define BENCH_TIME_ENABLE ///< Включить бенч времени #define BENCH_TIME_MAX_CHANNELS 5 ///< Максимальное количество каналов измерения -#define BT_ADC 0 -#define BT_PWM 1 -#define BT_SYSTICK 2 +#define BT_SLOWCALC 0 +#define BT_ADC 1 +#define BT_PWM 2 +#define BT_SYSTICK 3 /** GEN_CONFIG * @} */ diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index af6a373..5b47806 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -51,8 +51,8 @@ #define NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT 6 #define NOM_U_DEVIATION_MINUS_PERCENT_DEFAULT 10 #define NOM_F_HZ_DEFAULT 50 -#define NOM_F_DEVIATION_PLUS_PERCENT_DEFAULT 5 -#define NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT 5 +#define NOM_F_DEVIATION_PLUS_PERCENT_DEFAULT 10 +#define NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT 10 #define NOM_I_A_DEFAULT 5 /* Параметры ПУИ */ @@ -66,8 +66,10 @@ #define PUI_Tdelay_SECONDS_DEFAULT 30 #define PUI_Interlace_EN_DEFAULT 5000 -/* Дефолтное коливчество тиков для задержки выставления ошибки */ -#define ERRORS_DELAY_TICKS_DEFAULT 10 +/* Время задержки перед выставлением ошибки */ +#define ERRORS_DELAY_MS_UAMP_ERR 1500 // todo +#define ERRORS_DELAY_MS_F_ERR 5000 +#define ERRORS_DELAY_MS_DEFAULT 0.1f /* Параметри мониторинга сети */ #define PM_EXP_ALPHA_COEF_DEFAULT 0.01 diff --git a/UPP/Core/Configs/upp_defs.h b/UPP/Core/Configs/upp_defs.h index 8e8669b..bf1d138 100644 --- a/UPP/Core/Configs/upp_defs.h +++ b/UPP/Core/Configs/upp_defs.h @@ -152,8 +152,15 @@ typedef struct { #define PM_SLOW_PERIOD_US (PM_ADC_PERIOD_US*PM_SLOW_PERIOD_CNT) #define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000) +#define US_TO_SLOW_TICKS(_us_) ((_us_)/PM_SLOW_PERIOD_US) +#define MS_TO_SLOW_TICKS(_ms_) US_TO_SLOW_TICKS((_ms_)*1000) + + + #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 /** * @brief Состояния полуволны diff --git a/UPP/Core/Inc/main.h b/UPP/Core/Inc/main.h index 885ffc6..a3dc80d 100644 --- a/UPP/Core/Inc/main.h +++ b/UPP/Core/Inc/main.h @@ -31,8 +31,11 @@ extern "C" { /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +/* Общее по УПП */ #include "upp_defs.h" +#include "upp_io.h" #include "upp_errors.h" +/* Общие библиотеки */ #include "mylibs_include.h" #include "modbus.h" /* USER CODE END Includes */ diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c index 489d7a5..40a941b 100644 --- a/UPP/Core/PowerMonitor/power_monitor.c +++ b/UPP/Core/PowerMonitor/power_monitor.c @@ -225,7 +225,7 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm) } else // если уже запущена - ставим overrun slow calc { - errors.prvt.f.err.slow_calc_overrun = 1; + ERR_PRIVATE.slow_calc_overrun = 1; errors.prvt.cnt.slow_calc_overrun++; } } diff --git a/UPP/Core/PowerMonitor/power_protect.c b/UPP/Core/PowerMonitor/power_protect.c index 2bf7206..e5259c6 100644 --- a/UPP/Core/PowerMonitor/power_protect.c +++ b/UPP/Core/PowerMonitor/power_protect.c @@ -24,30 +24,30 @@ int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect /* Общее напряжение */ if(measure->final.Uamp > lUmax) { - errors.prvt.f.err.uamp_max = 1; + ERR_PRIVATE.uamp_max = 1; } else if (measure->final.Uamp < lUmin) { - errors.prvt.f.err.uamp_min = 1; + ERR_PRIVATE.uamp_min = 1; } else { - errors.prvt.f.err.uamp_max = 0; - errors.prvt.f.err.uamp_min = 0; + ERR_PRIVATE.uamp_max = 0; + ERR_PRIVATE.uamp_min = 0; } /* Последовательность фаз */ int realPhaseSequence = 0; if(realPhaseSequence != lPhaseSequence) { - errors.prvt.f.err.interlance = 1; + ERR_PRIVATE.interlance = 1; } else { - errors.prvt.f.err.interlance = 0; + ERR_PRIVATE.interlance = 0; } - return (errors.prvt.f.err.uamp_min == 0); + return (ERR_PRIVATE.uamp_min == 0); } /** @@ -65,62 +65,62 @@ int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect /* Общий ток */ if(measure->final.Iamp > lImax) { - errors.prvt.f.err.iamp_max = 1; + ERR_PRIVATE.iamp_max = 1; } else if (measure->final.Iamp < lImin) { - errors.prvt.f.err.iamp_min = 1; + ERR_PRIVATE.iamp_min = 1; } else { - errors.prvt.f.err.iamp_max = 0; - errors.prvt.f.err.iamp_min = 0; + ERR_PRIVATE.iamp_max = 0; + ERR_PRIVATE.iamp_min = 0; } /* Ток по фазам */ if(measure->final.I[I_A] > lImax) { - errors.prvt.f.err.ia_max = 1; + ERR_PRIVATE.ia_max = 1; } else if (measure->final.I[I_A] < lImin) { - errors.prvt.f.err.ia_min = 1; + ERR_PRIVATE.ia_min = 1; } else { - errors.prvt.f.err.ia_max = 0; - errors.prvt.f.err.ia_min = 0; + ERR_PRIVATE.ia_max = 0; + ERR_PRIVATE.ia_min = 0; } if(measure->final.I[I_B] > lImax) { - errors.prvt.f.err.ib_max = 1; + ERR_PRIVATE.ib_max = 1; } else if (measure->final.I[I_B] < lImin) { - errors.prvt.f.err.ib_min = 1; + ERR_PRIVATE.ib_min = 1; } else { - errors.prvt.f.err.ib_max = 0; - errors.prvt.f.err.ib_min = 0; + ERR_PRIVATE.ib_max = 0; + ERR_PRIVATE.ib_min = 0; } if(measure->final.I[I_C] > lImax) { - errors.prvt.f.err.ic_max = 1; + ERR_PRIVATE.ic_max = 1; } else if (measure->final.I[I_C] < lImin) { - errors.prvt.f.err.ic_min = 1; + ERR_PRIVATE.ic_min = 1; } else { - errors.prvt.f.err.ic_max = 0; - errors.prvt.f.err.ic_min = 0; + ERR_PRIVATE.ic_max = 0; + ERR_PRIVATE.ic_min = 0; } - return (errors.prvt.f.err.iamp_min == 0); + return (ERR_PRIVATE.iamp_min == 0); } @@ -144,44 +144,44 @@ void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, U /*=============== ЗАЩИТЫ ПО ЧАСТОТЕ ==================*/ if(measure->final.F[U_AC] > lFmax) { - errors.prvt.f.err.fac_max = 1; + ERR_PRIVATE.fac_max = 1; } else if (measure->final.F[U_AC] < lFmin) { - errors.prvt.f.err.fac_min = 1; + ERR_PRIVATE.fac_min = 1; } else { - errors.prvt.f.err.fac_max = 0; - errors.prvt.f.err.fac_min = 0; + ERR_PRIVATE.fac_max = 0; + ERR_PRIVATE.fac_min = 0; } if(measure->final.F[U_BA] > lFmax) { - errors.prvt.f.err.fba_max = 1; + ERR_PRIVATE.fba_max = 1; } else if (measure->final.F[U_BA] < lFmin) { - errors.prvt.f.err.fba_min = 1; + ERR_PRIVATE.fba_min = 1; } else { - errors.prvt.f.err.fba_max = 0; - errors.prvt.f.err.fba_min = 0; + ERR_PRIVATE.fba_max = 0; + ERR_PRIVATE.fba_min = 0; } if(measure->final.F[U_BC] > lFmax) { - errors.prvt.f.err.fbc_max = 1; + ERR_PRIVATE.fbc_max = 1; } else if (measure->final.F[U_BC] < lFmin) { - errors.prvt.f.err.fbc_min = 1; + ERR_PRIVATE.fbc_min = 1; } else { - errors.prvt.f.err.fbc_max = 0; - errors.prvt.f.err.fbc_min = 0; + ERR_PRIVATE.fbc_max = 0; + ERR_PRIVATE.fbc_min = 0; } @@ -189,15 +189,15 @@ void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, U /*=============== ЗАЩИТЫ ПО ТЕМПЕРАТУРЕ ==================*/ if(measure->final.T[TEMP_1] > lTerr) { - errors.prvt.f.err.temp_err = 1; + ERR_PRIVATE.temp_err = 1; } else if (measure->final.T[TEMP_1] > lTwarn) { - errors.prvt.f.err.temp_warn = 1; + ERR_PRIVATE.temp_warn = 1; } else { - errors.prvt.f.err.temp_err = 0; - errors.prvt.f.err.temp_warn = 0; + ERR_PRIVATE.temp_err = 0; + ERR_PRIVATE.temp_warn = 0; } } diff --git a/UPP/Core/Src/DBG_stm32f417_support.c b/UPP/Core/Src/DBG_stm32f417_support.c new file mode 100644 index 0000000..e69de29 diff --git a/UPP/Core/UPP/upp_errors.c b/UPP/Core/UPP/upp_errors.c index 1ad798e..1d00369 100644 --- a/UPP/Core/UPP/upp_errors.c +++ b/UPP/Core/UPP/upp_errors.c @@ -4,6 +4,12 @@ * @brief Формирование ошибок в ПУИ ****************************************************************************** * @details +Общая логика: +В программе выставляются всякие внутренние флаги ошибок: ERR_PRIVATE +В этом модуле смотрятся какие флаги выставились и переносят эти флаги +в структуру ошибок ПУИ ERR_PUI. + +Также реализована защита от дребезга и в целом задержка на выставление ошибок. ******************************************************************************/ #include "upp_main.h" // УПП #include "upp_errors.h" // всё остальное по работе с УПП @@ -62,50 +68,50 @@ void UPP_Errors_Ranges(void) static int TMaxCnt = 0; /* Напряжения */ - errors.pui.err.OverVoltage = setError(errors.prvt.f.err.uamp_max, - errors.pui.err.OverVoltage, - &UMaxCnt, - ticksTiMax); - errors.pui.err.UnderVoltage = setError(errors.prvt.f.err.uamp_min, - errors.pui.err.UnderVoltage, - &UMinCnt, - ticksTiMax); + ERR_PUI.OverVoltage = setError(ERR_PRIVATE.uamp_max, + ERR_PUI.OverVoltage, + &UMaxCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR)); + ERR_PUI.UnderVoltage = setError(ERR_PRIVATE.uamp_min, + ERR_PUI.UnderVoltage, + &UMinCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR)); /* Токи */ - int i_max = ( errors.prvt.f.err.iamp_max || - errors.prvt.f.err.ia_max || - errors.prvt.f.err.ib_max || - errors.prvt.f.err.ic_max); - errors.pui.err.OverCurrent = setError(i_max, - errors.pui.err.OverCurrent, - &IMaxCnt, - ticksTiMax); + int i_max = ( ERR_PRIVATE.iamp_max || + ERR_PRIVATE.ia_max || + ERR_PRIVATE.ib_max || + ERR_PRIVATE.ic_max); + ERR_PUI.OverCurrent = setError(i_max, + ERR_PUI.OverCurrent, + &IMaxCnt, + ticksTiMax); /* Частота */ - int f_max = ( errors.prvt.f.err.fac_max || - errors.prvt.f.err.fba_max || - errors.prvt.f.err.fbc_max); - int f_min = ( errors.prvt.f.err.fac_max || - errors.prvt.f.err.fba_max || - errors.prvt.f.err.fbc_max); - errors.pui.err.OverFrequency = setError(f_max, - errors.pui.err.OverFrequency, - &FMaxCnt, - ERRORS_DELAY_TICKS_DEFAULT); + int f_max = ( ERR_PRIVATE.fac_max || + ERR_PRIVATE.fba_max || + ERR_PRIVATE.fbc_max); + int f_min = ( ERR_PRIVATE.fac_max || + ERR_PRIVATE.fba_max || + ERR_PRIVATE.fbc_max); + ERR_PUI.OverFrequency = setError(f_max, + ERR_PUI.OverFrequency, + &FMaxCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR)); - errors.pui.err.UnderFrequency = setError( f_min, - errors.pui.err.UnderFrequency, - &FMinCnt, - ERRORS_DELAY_TICKS_DEFAULT); + ERR_PUI.UnderFrequency = setError( f_min, + ERR_PUI.UnderFrequency, + &FMinCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR)); /* Температуры */ - errors.pui.err.OverTemperature = setError(errors.prvt.f.err.temp_err, - errors.pui.err.OverTemperature, - &TMaxCnt, - ERRORS_DELAY_TICKS_DEFAULT); + ERR_PUI.OverTemperature = setError(ERR_PRIVATE.temp_err, + ERR_PUI.OverTemperature, + &TMaxCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); } void UPP_Errors_LossPhase(void) @@ -116,39 +122,39 @@ void UPP_Errors_LossPhase(void) static int LossPhaseBCnt = 0; static int LossPhaseCCnt = 0; - int loss_phases_all = ( errors.prvt.f.err.ia_min && - errors.prvt.f.err.ib_min && - errors.prvt.f.err.ic_min ); + int loss_phases_all = ( ERR_PRIVATE.ia_min && + ERR_PRIVATE.ib_min && + ERR_PRIVATE.ic_min ); - errors.pui.err.LossPhaseAll = setError( loss_phases_all, - errors.pui.err.LossPhaseAll, - &LossPhaseAllCnt, - ERRORS_DELAY_TICKS_DEFAULT); + ERR_PUI.LossPhaseAll = setError( loss_phases_all, + ERR_PUI.LossPhaseAll, + &LossPhaseAllCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); /* Если хотя бы одна фаза есть проверяем фазы отдельно */ - if(!errors.pui.err.LossPhaseAll) + if(!ERR_PUI.LossPhaseAll) { - errors.pui.err.LossPhaseA = setError( errors.prvt.f.err.ia_min, - errors.pui.err.LossPhaseA, - &LossPhaseACnt, - ERRORS_DELAY_TICKS_DEFAULT); + ERR_PUI.LossPhaseA = setError( ERR_PRIVATE.ia_min, + ERR_PUI.LossPhaseA, + &LossPhaseACnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); - errors.pui.err.LossPhaseB = setError( errors.prvt.f.err.ib_min, - errors.pui.err.LossPhaseB, - &LossPhaseBCnt, - ERRORS_DELAY_TICKS_DEFAULT); + ERR_PUI.LossPhaseB = setError( ERR_PRIVATE.ib_min, + ERR_PUI.LossPhaseB, + &LossPhaseBCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); - errors.pui.err.LossPhaseC = setError( errors.prvt.f.err.ic_min, - errors.pui.err.LossPhaseC, - &LossPhaseCCnt, - ERRORS_DELAY_TICKS_DEFAULT); + ERR_PUI.LossPhaseC = setError( ERR_PRIVATE.ic_min, + ERR_PUI.LossPhaseC, + &LossPhaseCCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); } /* Если всех фаз нет, то отдельные не смотрим */ else { - errors.pui.err.LossPhaseA = 0; - errors.pui.err.LossPhaseB = 0; - errors.pui.err.LossPhaseC = 0; + ERR_PUI.LossPhaseA = 0; + ERR_PUI.LossPhaseB = 0; + ERR_PUI.LossPhaseC = 0; } } @@ -156,15 +162,15 @@ void UPP_Errors_Other(void) { static int InterlaceCnt = 0; - if(errors.prvt.f.err.longstart) - errors.pui.err.LongStart = 1; + if(ERR_PRIVATE.longstart) + ERR_PUI.LongStart = 1; else - errors.pui.err.LongStart = 0; + ERR_PUI.LongStart = 0; - errors.pui.err.Interlace = setError(errors.prvt.f.err.interlance, - errors.pui.err.Interlace, - &InterlaceCnt, - ERRORS_DELAY_TICKS_DEFAULT); + ERR_PUI.Interlace = setError(ERR_PRIVATE.interlance, + ERR_PUI.Interlace, + &InterlaceCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); //Interlance } diff --git a/UPP/Core/UPP/upp_io.c b/UPP/Core/UPP/upp_io.c index a8e4607..193b5ea 100644 --- a/UPP/Core/UPP/upp_io.c +++ b/UPP/Core/UPP/upp_io.c @@ -7,62 +7,131 @@ ******************************************************************************/ #include "upp_io.h" #include "main.h" +UPP_LEDs_t UPP_LEDS; UPP_DiscreteInputs_t UPP_DIN; UPP_DiscreteOutputs_t UPP_DO; +static void UPP_CEN_Write(int state); +static void UPP_RDO1_Write(int state); +static void UPP_RDO2_Write(int state); +static void UPP_RDO3_Write(int state); +static void UPP_RDO4_Write(int state); +static void UPP_DO1_Write(int state); +static void UPP_DO2_Write(int state); +static void UPP_DO3_Write(int state); +static void UPP_DO4_Write(int state); +static void UPP_DO5_Write(int state); -void UPP_CEN_Write(int state) + + +/** + * @brief Инициализация дискретных входов/выходов УПП + */ +void UPP_IO_Init(void) { - HAL_GPIO_WritePin(CEN_GPIO_Port, CEN_Pin, state); + /* Дискретне выходы */ + UPP_DO.CEN = &UPP_CEN_Write; + UPP_DO.Ready = &UPP_RDO3_Write; + UPP_DO.Work = &UPP_RDO2_Write; + UPP_DO.Error = &UPP_RDO1_Write; + UPP_DO.RDO4 = &UPP_RDO4_Write; + UPP_DO.DO1 = &UPP_DO1_Write; + UPP_DO.DO2 = &UPP_DO2_Write; + UPP_DO.DO3 = &UPP_DO3_Write; + UPP_DO.DO4 = &UPP_DO4_Write; + UPP_DO.DO5 = &UPP_DO5_Write; + + + /* Дискретные входы */ + GPIO_Switch_Init(&UPP_DIN.Pusk, DIN1_GPIO_Port, DIN1_Pin, 0); + GPIO_Switch_Init(&UPP_DIN.MestDist, DIN2_GPIO_Port, DIN2_Pin, 0); + GPIO_Switch_Init(&UPP_DIN.DIN3, DIN3_GPIO_Port, DIN3_Pin, 0); + GPIO_Switch_Init(&UPP_DIN.err_24Vdio, ERR_24VDIO_GPIO_Port, ERR_24VDIO_Pin, 1); + GPIO_Switch_Init(&UPP_DIN.err_24V, ERR_24V_GPIO_Port, ERR_24V_Pin, 1); + GPIO_Switch_Init(&UPP_DIN.err_5Vsi, ERR_5VSI_GPIO_Port, ERR_5VSI_Pin, 0); + + /* Дискретные входы платы УМ */ + GPIO_Switch_Init(&UPP_DIN.err_5Vd, UM_ERR_5VD_GPIO_Port, UM_ERR_5VD_Pin, 0); + GPIO_Switch_Init(&UPP_DIN.err_Va, UM_ERR_VA_GPIO_Port, UM_ERR_VA_Pin, 1); + + /* Светодиоды платы УМ */ + GPIO_LED_Init(&UPP_LEDS.green1, UM_LED_GREEN1_GPIO_Port, UM_LED_GREEN1_Pin, 0); + GPIO_LED_Init(&UPP_LEDS.green2, UM_LED_GREEN2_GPIO_Port, UM_LED_GREEN2_Pin, 0); + GPIO_LED_Init(&UPP_LEDS.red, UM_LED_RED_GPIO_Port, UM_LED_RED_Pin, 0); + + + /* Очищаем выходы */ + UPP_DO.CEN(DISABLE); + UPP_DO.Error(DISABLE); + UPP_DO.Work(DISABLE); + UPP_DO.Ready(DISABLE); + UPP_DO.RDO4(DISABLE); + UPP_DO.DO1(DISABLE); + UPP_DO.DO2(DISABLE); + UPP_DO.DO3(DISABLE); + UPP_DO.DO4(DISABLE); + UPP_DO.DO5(DISABLE); + GPIO_LED_Off(&UPP_LEDS.green1); + GPIO_LED_Off(&UPP_LEDS.green2); + GPIO_LED_Off(&UPP_LEDS.red); + } -void UPP_RDO1_Write(int state) + + +/** + * @brief Выставить направление UART1 (STM USART2) + */ +void UPP_UART1_SetDirection(int state) +{ + HAL_GPIO_WritePin(SCIDE1_GPIO_Port, SCIDE1_Pin, state); +} +/** + * @brief Выставить направление UART2 (STM USART5) + */ +void UPP_UART2_SetDirection(int state) +{ + HAL_GPIO_WritePin(SCIDE2_GPIO_Port, SCIDE2_Pin, state); +} + + + +static void UPP_CEN_Write(int state) +{ + HAL_GPIO_WritePin(CEN_GPIO_Port, CEN_Pin, !state); +} +static void UPP_RDO1_Write(int state) { HAL_GPIO_WritePin(RDO1_GPIO_Port, RDO1_Pin, state); } -void UPP_RDO2_Write(int state) +static void UPP_RDO2_Write(int state) { HAL_GPIO_WritePin(RDO2_GPIO_Port, RDO2_Pin, state); } -void UPP_RDO3_Write(int state) +static void UPP_RDO3_Write(int state) { HAL_GPIO_WritePin(RDO3_GPIO_Port, RDO3_Pin, state); } -void UPP_RDO4_Write(int state) +static void UPP_RDO4_Write(int state) { HAL_GPIO_WritePin(RDO4_GPIO_Port, RDO4_Pin, state); } -void UPP_DO1_Write(int state) +static void UPP_DO1_Write(int state) { HAL_GPIO_WritePin(DO1_GPIO_Port, DO1_Pin, state); } -void UPP_DO2_Write(int state) +static void UPP_DO2_Write(int state) { HAL_GPIO_WritePin(DO2_GPIO_Port, DO2_Pin, state); } -void UPP_DO3_Write(int state) +static void UPP_DO3_Write(int state) { HAL_GPIO_WritePin(DO3_GPIO_Port, DO3_Pin, state); } -void UPP_DO4_Write(int state) +static void UPP_DO4_Write(int state) { HAL_GPIO_WritePin(DO4_GPIO_Port, DO4_Pin, state); } -void UPP_DO5_Write(int state) +static void UPP_DO5_Write(int state) { HAL_GPIO_WritePin(DO5_GPIO_Port, DO5_Pin, state); } - - -void UPP_Connect_Discrete(void) -{ - UPP_DO.CEN = &UPP_CEN_Write; - UPP_DO.RDO_Error = &UPP_RDO1_Write; - UPP_DO.RDO_Work = &UPP_RDO2_Write; - UPP_DO.RDO_Ready = &UPP_RDO3_Write; - UPP_DO.RDO4_Reserved = &UPP_RDO4_Write; - UPP_DO.DO1_Reserved = &UPP_DO1_Write; - UPP_DO.DO2_Reserved = &UPP_DO2_Write; - UPP_DO.DO3_Reserved = &UPP_DO3_Write; - UPP_DO.DO4_Reserved = &UPP_DO4_Write; - UPP_DO.DO5_Reserved = &UPP_DO5_Write; -} diff --git a/UPP/Core/UPP/upp_io.h b/UPP/Core/UPP/upp_io.h index cec4a15..7d369d6 100644 --- a/UPP/Core/UPP/upp_io.h +++ b/UPP/Core/UPP/upp_io.h @@ -6,10 +6,12 @@ * @details ******************************************************************************/ -#ifndef _UPP_ERRORS_H -#define _UPP_ERRORS_H +#ifndef _UPP_IO_H +#define _UPP_IO_H #include "mylibs_include.h" + + typedef struct { /* Отладочные светодиоды */ @@ -21,13 +23,15 @@ extern UPP_LEDs_t UPP_LEDS; typedef struct { - GPIO_SwitchTypeDef in1; - GPIO_SwitchTypeDef in2; - GPIO_SwitchTypeDef in3; + GPIO_SwitchTypeDef Pusk; ///< Команда «ПУСК» + GPIO_SwitchTypeDef MestDist; ///< Мест/дист управление + GPIO_SwitchTypeDef DIN3; ///< Резерв - GPIO_SwitchTypeDef err_24V; - GPIO_SwitchTypeDef err_5Vd; - GPIO_SwitchTypeDef err_5Vsi; + GPIO_SwitchTypeDef err_24Vdio;///< Сигнал ошибки источника питания цифровых входов/выходов + GPIO_SwitchTypeDef err_24V; ///< Сигнал ошибки основного источника питания 24В + GPIO_SwitchTypeDef err_5Vsi; ///< Сигнал ошибки источника питания цифровых интерфейсов + GPIO_SwitchTypeDef err_5Vd; ///< Вход сигнала неисправности цифрового источника питания 5В(+5Vd) микроконтроллера и микросхем ввода-вывода (5 В). + GPIO_SwitchTypeDef err_Va; ///< Вход обобщенного сигнала неисправности аналоговых источников питания +3,3В(+3Va), 5В(+5Vа), +15В(+15Va). }UPP_DiscreteInputs_t; extern UPP_DiscreteInputs_t UPP_DIN; @@ -35,17 +39,25 @@ typedef struct { void (*CEN)(int state); - void (*RDO_Error)(int state); - void (*RDO_Work)(int state); - void (*RDO_Ready)(int state); - void (*RDO4_Reserved)(int state); + void (*Error)(int state); + void (*Work)(int state); + void (*Ready)(int state); + void (*RDO4)(int state); - void (*DO1_Reserved)(int state); - void (*DO2_Reserved)(int state); - void (*DO3_Reserved)(int state); - void (*DO4_Reserved)(int state); - void (*DO5_Reserved)(int state); + void (*DO1)(int state); + void (*DO2)(int state); + void (*DO3)(int state); + void (*DO4)(int state); + void (*DO5)(int state); }UPP_DiscreteOutputs_t; extern UPP_DiscreteOutputs_t UPP_DO; -#endif //_UPP_ERRORS_H \ No newline at end of file + +/* Инициализация дискретных входов/выходов УПП */ +void UPP_IO_Init(void); + +/* Выставить направление UART1 (STM USART2) */ +void UPP_UART1_SetDirection(int state); +/* Выставить направление UART2 (STM USART5) */ +void UPP_UART2_SetDirection(int state); +#endif //_UPP_IO_H \ No newline at end of file diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index 54158dc..29f2788 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -18,6 +18,9 @@ float iref_dbg = 0; */ int UPP_Init(void) { + /* Очищаем входы */ + UPP_IO_Init(); + BenchTime_Init(); // Подключение указателей upp.errors = &errors; @@ -43,6 +46,8 @@ int UPP_PreWhile(void) UPP_Params_InternalControl(); Angle_SetRange(&upp.hangle, 0.0, 0.8); PowerMonitor_Start(&upp.pm); + + return 0; } @@ -52,8 +57,12 @@ int UPP_PreWhile(void) */ int UPP_While(void) { + int retval = 0; if(upp.pm.f.runSlow) { + BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY); + + UPP_DO.CEN(ENABLE); // если ошибка вызываем СТОП if(errors.pui.all) { @@ -84,7 +93,14 @@ int UPP_While(void) // Автомат состояний УПП switch(upp.workmode) { + /* Состояние готовности */ case WM_Ready: + PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ + // Индикация + UPP_DO.Ready(ENABLE); + UPP_DO.Work(DISABLE); + UPP_DO.Error(DISABLE); + // если пришла команда на запуск if (upp.call->go) { @@ -94,7 +110,12 @@ int UPP_While(void) } break; + /* Состояние В работе */ case WM_Running: + // Индикация + UPP_DO.Ready(DISABLE); + UPP_DO.Work(ENABLE); + UPP_DO.Error(DISABLE); // если пришла команда на остановку if (!upp.call->go) upp.workmode = WM_Ready; @@ -105,32 +126,43 @@ int UPP_While(void) // если слишком долгий запуск if((local_time() - upp.StartTick) > (upp.PUI.params->Tdelay*1000)) { - errors.pui.err.LongStart = 1; + ERR_PRIVATE.longstart = 1; } break; - + +// /* Состояние Работа завершена */ +// case WM_Done: +// // Индикация +// UPP_DO.Ready(DISABLE); +// UPP_DO.Work(DISABLE); +// UPP_DO.Error(DISABLE); +// PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ +// break; + + /* Состояние Ошибки */ case WM_Error: + default: + PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ + // Индикация + UPP_DO.Ready(ENABLE); + UPP_DO.Work(DISABLE); + UPP_DO.Error(ENABLE); + // Находимся до тех пор пока ошибки не будет устранена if(errors.common == Err_None) upp.workmode = WM_Ready; - PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ - break; - - case WM_Done: - PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ - break; - - default: + retval = 1; break; } upp.pm.f.runSlow = 0; + upp.Timings.slow_calc = BenchTime_End(BT_SLOWCALC, angletim.Instance->CNT); }//if(upp.pm.f.runSlow) else { } - return 0; + return retval; } diff --git a/UPP/Core/UPP/upp_main.h b/UPP/Core/UPP/upp_main.h index d134455..86af664 100644 --- a/UPP/Core/UPP/upp_main.h +++ b/UPP/Core/UPP/upp_main.h @@ -39,6 +39,7 @@ typedef struct struct { + uint32_t slow_calc; uint32_t isr_adc; uint32_t isr_pwm; uint32_t isr_systick; diff --git a/UPP/MDK-ARM/EventRecorderStub.scvd b/UPP/MDK-ARM/EventRecorderStub.scvd new file mode 100644 index 0000000..2956b29 --- /dev/null +++ b/UPP/MDK-ARM/EventRecorderStub.scvd @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx index e1d7eaf..b782c81 100644 --- a/UPP/MDK-ARM/UPP.uvoptx +++ b/UPP/MDK-ARM/UPP.uvoptx @@ -900,7 +900,7 @@ Modbus - 0 + 1 0 0 0 diff --git a/UPP/MDK-ARM/UPP.uvprojx b/UPP/MDK-ARM/UPP.uvprojx index 6f05408..3d8dd09 100644 --- a/UPP/MDK-ARM/UPP.uvprojx +++ b/UPP/MDK-ARM/UPP.uvprojx @@ -17,8 +17,8 @@ STM32F427ZGTx STMicroelectronics - Keil.STM32F4xx_DFP.2.17.1 - https://www.keil.com/pack/ + Keil.STM32F4xx_DFP.2.16.0 + http://www.keil.com/pack/ IRAM(0x20000000-0x2002FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ