From ae2887acfeaa496ed624a6196e52d6a9ccbc9bd5 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Mon, 23 Dec 2024 12:52:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D1=85,?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=B5=D0=B4=D1=82=D0=B0=D0=B9=D0=BC=D0=B0=20(=D0=B2=20=D0=BC?= =?UTF-8?q?=D1=81=20=D0=B8=D0=BB=D0=B8=20=D1=82=D0=B8=D0=BA=D0=B0=D1=85=20?= =?UTF-8?q?for())?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - положительное/отрицательное питание -> прямое/обратное включение - ключи для питание -> ключи для фаз - positive/negative -> Forward/Reverse - power switch ->phase switch --- diode_tester/Core/Interfaces/modbus_data.h | 10 +- diode_tester/Core/MyLibs/mylibs_defs.h | 2 +- diode_tester/Core/Tester_main/tester_config.h | 40 ++--- diode_tester/Core/Tester_main/tester_func.c | 156 ++++++++++-------- diode_tester/Core/Tester_main/tester_func.h | 41 ++--- .../Core/Tester_main/tester_interface_func.c | 12 +- .../Core/Tester_main/tester_interface_func.h | 6 +- diode_tester/Core/Tester_main/tester_main.c | 63 +++---- diode_tester/Core/Tester_main/tester_main.h | 12 +- 9 files changed, 181 insertions(+), 161 deletions(-) diff --git a/diode_tester/Core/Interfaces/modbus_data.h b/diode_tester/Core/Interfaces/modbus_data.h index b03deed..a882f51 100644 --- a/diode_tester/Core/Interfaces/modbus_data.h +++ b/diode_tester/Core/Interfaces/modbus_data.h @@ -47,8 +47,9 @@ typedef struct //MB_DataInRegsTypeDef */ typedef struct //MB_DataInRegsTypeDef { - uint16_t TimeForPositiveDC; + uint16_t TimeForForward; uint16_t TimeBeforeTest; + uint16_t TimeDeadtime; uint16_t TimeBeforePeak; uint16_t TimeBeforeDisconnect; @@ -66,7 +67,7 @@ typedef struct //MB_DataInRegsTypeDef // DEFINES FOR HOLDING REGISTERS ARRAYS #define R_SETTINGS_ADDR 0 -#define R_SETTINGS_QNT 4 +#define R_SETTINGS_QNT 10 // DEFINES FOR REGISTERS LOCAL ADDRESSES @@ -100,13 +101,14 @@ typedef struct //MB_DataInRegsTypeDef typedef struct //MB_DataCoilsTypeDef { /* reg 1 */ - unsigned PositiveTest:1; - unsigned NegativeTest:1; + unsigned ForwardTest:1; + unsigned ReverseTest:1; unsigned StartTest:1; unsigned reserved:13; /* reg 2 */ unsigned msTimeBeforeTest_enable:1; + unsigned msTimeDeadtime_enable:1; unsigned msTimeBeforePeak_enable:1; unsigned msTimeBeforeDisconnect_enable:1; }MB_DataCoilsTypeDef; diff --git a/diode_tester/Core/MyLibs/mylibs_defs.h b/diode_tester/Core/MyLibs/mylibs_defs.h index 1e54b68..3e0f1ac 100644 --- a/diode_tester/Core/MyLibs/mylibs_defs.h +++ b/diode_tester/Core/MyLibs/mylibs_defs.h @@ -56,7 +56,7 @@ extern void Error_Handler(void); #ifdef FREERTOS_DELAY #define msDelay(_ms_) osDelay(_ms_) #else - #define msDelay(_ms_) HAL_Delay(_ms_) + #define msDelay(_ms_) if(_ms_ != 0) HAL_Delay(_ms_-1) #endif /** DELAYS_DEFINES diff --git a/diode_tester/Core/Tester_main/tester_config.h b/diode_tester/Core/Tester_main/tester_config.h index 7fd21e6..94247f9 100644 --- a/diode_tester/Core/Tester_main/tester_config.h +++ b/diode_tester/Core/Tester_main/tester_config.h @@ -26,11 +26,11 @@ #define DEF_MS_TIME_FOR_POSITIVE 2000 /** - * @brief Задержка перед началом тестирования ПО УМОЛЧАНИЮ - * @details Задержка миллисекундная или тики for() @ref TIME_BEFORE_TEST_MS_DELAY + * @brief Задержка для дедтайма ПО УМОЛЧАНИЮ + * @details Задержка миллисекундная или тики for() @ref DEF_DEADTIME_MS_DELAY */ #define DEF_DEADTIME 500 -#define DEF_DEADTIME_MS_DELAY 1 ///< включение миллисекундной задержки для @ref DEF_DEADTIME по умолчанию +#define DEF_DEADTIME_MS_DELAY 0 ///< включение миллисекундной задержки для @ref DEF_DEADTIME по умолчанию /** * @brief Задержка перед началом тестирования ПО УМОЛЧАНИЮ @@ -78,8 +78,8 @@ #define LED1_Pin GPIO_PIN_13 ///< Пин светодиода (при перенастройке надо также перенастроить через cube) /* Периоды моргания светодиода */ -#define LED_POSITIVE_DIODE_PERIOD 250 ///< Моргание для индикации подключенного положительного напряжения -#define LED_NEGATIVE_DIODE_PERIOD 25 ///< Моргание для индикации подключенного отрицательного напряжения +#define LED_FORWARD_DIODE_PERIOD 250 ///< Моргание для индикации подключенного положительного напряжения +#define LED_REVERSE_DIODE_PERIOD 25 ///< Моргание для индикации подключенного отрицательного напряжения #define LED_BLINK_AS_ON 5 ///< Моргание незаметное для глаза (светодиод просто включен) @@ -100,32 +100,32 @@ */ /** - * @addtogroup TESTER_POWER_SW_CONFIG Configs for switches for power + * @addtogroup TESTER_PHASE_SW_CONFIG Configs for switches for phases * @ingroup TESTER_CONFIGS - * @brief Конфигурации для ключей питания + * @brief Конфигурации для ключей фаз @{ */ -#define USE_HAL_GPIO_FUNCTIONS ///< Использовать для переключения пинов HAL функции -#define ALL_SW_USE_SAME_PORT ///< Дефайн указывающий что все пины будут иметь один порт (для ускорения переключения) +//#define USE_HAL_GPIO_FUNCTIONS ///< По этому дефайну для переключения пинов будут использоваться HAL_GPIO функции +//#define RECONNECT_WITHOUT_DEADTIME ///< По этому дефайну дедтайм отключается. Если отключить и USE_HAL_GPIO_FUNCTIONS, то переключатся фазы будут почти синхронно (быстрее десятков мкс) /* Состояния ключей для подключения и откючения питания */ -#define POWER_CONNECT 1 ///< Питание подключено в данном состоянии пина -#define POWER_DISCONNECT 0 ///< Питание отключено в данном состоянии пина +#define PHASE_CONNECT 1 ///< Ключ замкнут подключено в данном состоянии пина +#define PHASE_DISCONNECT 0 ///< Ключ разомкнут отключено в данном состоянии пина -/* Ключи для подключения положительного питания к диоду */ +/* Ключи для прямого включения диода */ /* (при перенастройке надо также перенастроить через cube) */ -#define SWITCH_PHASE_A_Port GPIOB ///< Порт пина первого ключа для земли положительного источника питания -#define SWITCH_PHASE_A_HI_Pin GPIO_PIN_0 ///< Пин первого ключа для земли положительного источника питания -#define SWITCH_PHASE_A_LO_Pin GPIO_PIN_1 ///< Пин второго ключа для напряжения положительного источника ппитания +#define SWITCH_PHASE_FORWARD_Port GPIOB ///< Порт пина первого ключа для прямого включения диода +#define SWITCH_PHASE_FORWARD_HI_Pin GPIO_PIN_0 ///< Пин первого ключа для прямого включения диода +#define SWITCH_PHASE_FORWARD_LO_Pin GPIO_PIN_1 ///< Пин второго ключа для прямого включения диода -/* Ключи для подключения отрицательного питания к диоду */ +/* Ключи для обратного включения диода */ /* (при перенастройке надо также перенастроить через cube) */ -#define SWITCH_PHASE_B_Port GPIOB ///< Порт пина первого ключа для земли отрицательного источника ппитания -#define SWITCH_PHASE_B_HI_Pin GPIO_PIN_10 ///< Пин первого ключа для земли отрицательного источника ппитания -#define SWITCH_PHASE_B_LO_Pin GPIO_PIN_11 ///< Пин первого ключа для напряжения отрицательного источника ппитания +#define SWITCH_PHASE_REVERSE_Port GPIOB ///< Порт пина первого ключа для обратного включения диода +#define SWITCH_PHASE_REVERSE_HI_Pin GPIO_PIN_10 ///< Пин первого ключа для обратного включения диода +#define SWITCH_PHASE_REVERSE_LO_Pin GPIO_PIN_11 ///< Пин первого ключа для обратного включения диода -/** TESTER_POWER_SW_CONFIG +/** TESTER_PHASE_SW_CONFIG * @} */ diff --git a/diode_tester/Core/Tester_main/tester_func.c b/diode_tester/Core/Tester_main/tester_func.c index 245d28b..4f6124c 100644 --- a/diode_tester/Core/Tester_main/tester_func.c +++ b/diode_tester/Core/Tester_main/tester_func.c @@ -19,38 +19,38 @@ void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest, TESTER_LEDsTypeDef *leds /** * @brief Тест диодов: подключение прямого напряжения */ -void TESTER_TestDiode_PositivePower(TESTER_TestHandleTypeDef *htest) +void TESTER_TestDiode_Forward(TESTER_TestHandleTypeDef *htest) { /* Задержка, перед началом работы */ TESTER_Delay(&htest->SwTimings.ticks_before_test); - TESTER_LED_TestingDiode_Positive(&htest->leds->LED1); + TESTER_LED_TestingDiodeForward(&htest->leds->LED1); /* Включение континиус АЦП */ HAL_ADC_Start(htest->adc->hadc); - /* Подкючение питания к диоду */ - TESTER_Connect_Power(&htest->DCPosSw); + /* Прямое включение диода */ + TESTER_Connect_Phase(&htest->SwPhaseForward); - - /* Подключение питания на определенное время */ + /* Прямое включение на определенное время */ uint32_t tickstart = HAL_GetTick(); HAL_StatusTypeDef res; while(1) { /* Считывание АЦП пока таймаут истечет */ - res = ADC_ReadContinuous(htest->adc, htest->continuous_buff_size, tickstart, htest->SwTimings.msticks_for_positive_dc); + res = ADC_ReadContinuous(htest->adc, htest->continuous_buff_size, tickstart, htest->SwTimings.msticks_for_forward); if(res != HAL_OK) break; } /* Отключение питания от диода */ - TESTER_Disconnect_Power(&htest->DCPosSw); + TESTER_Disconnect_Phase(&htest->SwPhaseForward); + TESTER_Disconnect_Phase(&htest->SwPhaseReverse); /* Выключение континиус АЦП */ HAL_ADC_Stop(htest->adc->hadc); - TESTER_LED_TestingDiode_End(&htest->leds->LED1); + TESTER_LED_WaitForAction(&htest->leds->LED1); htest->DiodeForwardVolt = htest->adc->chAdc.U_Current; } @@ -58,31 +58,32 @@ void TESTER_TestDiode_PositivePower(TESTER_TestHandleTypeDef *htest) /** * @brief Тест диодов: подключение обратного напряжения */ -void TESTER_TestDiode_NegativePower(TESTER_TestHandleTypeDef *htest) +void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest) { /* Задержка, перед началом работы */ TESTER_Delay(&htest->SwTimings.ticks_before_test); - TESTER_LED_TestingDiode_Negative(&htest->leds->LED1); + TESTER_LED_TestingDiodeReverse(&htest->leds->LED1); /* Включение АЦП */ ADC_DMA_StartRead(htest->adc); /* Задержка, перед предполагаемым скачком */ - TESTER_Delay(&htest->SwTimings.ticks_before_go_to_peak); + TESTER_Delay(&htest->SwTimings.ticks_before_expected_peak); - /* Подкючение питания к диоду */ - TESTER_Connect_Power(&htest->DCNegSw); + /* Обратное включение диода */ + TESTER_Connect_Phase(&htest->SwPhaseReverse); - /* Подключение питания на определенное время */ + /* Обратное включение на определенное время */ TESTER_Delay(&htest->SwTimings.ticks_before_disconnect); /* Отключение питания от диода */ - TESTER_Disconnect_Power(&htest->DCNegSw); + TESTER_Disconnect_Phase(&htest->SwPhaseReverse); + TESTER_Disconnect_Phase(&htest->SwPhaseForward); /* Обработка DMA */ ADC_DMA_ReadForPeak(htest->adc, ADC_READ_TIMEOUT_MS); - TESTER_LED_TestingDiode_End(&htest->leds->LED1); + TESTER_LED_WaitForAction(&htest->leds->LED1); htest->DiodePeakVolt = htest->adc->chAdc.U_Current; } @@ -91,102 +92,112 @@ void TESTER_TestDiode_NegativePower(TESTER_TestHandleTypeDef *htest) /** * @brief Тест диодов: подключение прямого, а потом обратного напряжения */ -void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest) +void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest) { /* Задержка, перед началом работы */ TESTER_Delay(&htest->SwTimings.ticks_before_test); - TESTER_LED_TestingDiode_Positive(&htest->leds->LED1); + TESTER_LED_TestingDiodeForward(&htest->leds->LED1); - /* Подкючение питания к диоду */ - TESTER_Connect_Power(&htest->DCPosSw); + /* Прямое включение диода */ + TESTER_Connect_Phase(&htest->SwPhaseForward); - /* Подкючение положительного питания к диоду */ - msDelay(htest->SwTimings.msticks_for_positive_dc); + /* Прямое включение на определенное время */ + msDelay(htest->SwTimings.msticks_for_forward); htest->DiodeForwardVolt = htest->adc->chAdc.U_Current; - TESTER_LED_TestingDiode_Negative(&htest->leds->LED1); + TESTER_LED_TestingDiodeReverse(&htest->leds->LED1); /* Включение АЦП */ ADC_DMA_StartRead(htest->adc); /* Ожидается задержка, перед предполагаемым скачком */ - TESTER_Delay(&htest->SwTimings.ticks_before_go_to_peak); + TESTER_Delay(&htest->SwTimings.ticks_before_expected_peak); - /* Отключение питания от диода */ - TESTER_Reconnect_Power(&htest->DCPosSw, &htest->DCNegSw); + /* Переход из прямого включения в обратное */ + TESTER_Reconnect_TwoPhases(&htest->SwPhaseForward, &htest->SwPhaseReverse, &htest->SwTimings.ticks_deadtime); - /* Подключение отрицательного питания на определенное время */ + /* Обратное включение на определенное время */ TESTER_Delay(&htest->SwTimings.ticks_before_disconnect); /* Отключение питания от диода */ - TESTER_Disconnect_Power(&htest->DCNegSw); + TESTER_Disconnect_Phase(&htest->SwPhaseReverse); + TESTER_Disconnect_Phase(&htest->SwPhaseForward); /* Обработка DMA */ ADC_DMA_ReadForPeak(htest->adc, ADC_READ_TIMEOUT_MS); - TESTER_LED_TestingDiode_End(&htest->leds->LED1); + TESTER_LED_WaitForAction(&htest->leds->LED1); htest->DiodePeakVolt = htest->adc->chAdc.U_Current; } /** - * @brief Подключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef + * @brief Подключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */ -void TESTER_Connect_Power(TESTER_PowerSwitchTypeDef *DCSw) +void TESTER_Connect_Phase(TESTER_PhaseSwitchTypeDef *DCSw) { #ifdef USE_HAL_GPIO_FUNCTIONS // in tester_config.h - HAL_GPIO_WritePin(DCSw->SW_Port, DCSw->SwGND_Pin | DCSw->SwVDD_Pin, POWER_CONNECT); + HAL_GPIO_WritePin(DCSw->SW_Port, DCSw->SwHI_Pin | DCSw->SwLO_Pin, PHASE_CONNECT); #else // USE_HAL_GPIO_FUNCTIONS - #if (POWER_CONNECT == 1) - DCSw->SW_Port->BSRR = DCSw->SwGND_Pin | DCSw->SwVDD_Pin; - #else //POWER_CONNECT == 1 - DCSw->SW_Port->BSRR = (DCSw->SwGND_Pin | DCSw->SwVDD_Pin) << 16; - #endif //POWER_CONNECT == 1 + #if (PHASE_CONNECT == 1) + DCSw->SW_Port->BSRR = DCSw->SwHI_Pin | DCSw->SwLO_Pin; + #else //PHASE_CONNECT == 1 + DCSw->SW_Port->BSRR = (DCSw->SwHI_Pin | DCSw->SwLO_Pin) << 16; + #endif //PHASE_CONNECT == 1 #endif //USE_HAL_GPIO_FUNCTIONS } /** - * @brief Отключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef + * @brief Отключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */ -void TESTER_Disconnect_Power(TESTER_PowerSwitchTypeDef *DCSw) +void TESTER_Disconnect_Phase(TESTER_PhaseSwitchTypeDef *DCSw) { #ifdef USE_HAL_GPIO_FUNCTIONS - HAL_GPIO_WritePin(DCSw->SW_Port, DCSw->SwGND_Pin | DCSw->SwVDD_Pin, POWER_DISCONNECT); + HAL_GPIO_WritePin(DCSw->SW_Port, DCSw->SwHI_Pin | DCSw->SwLO_Pin, PHASE_DISCONNECT); #else // USE_HAL_GPIO_FUNCTIONS - #if (POWER_DISCONNECT == 0) - DCSw->SW_Port->BSRR = (DCSw->SwGND_Pin | DCSw->SwVDD_Pin) << 16; - #else //POWER_CONNECT == 1 - DCSw->SW_Port->BSRR = DCSw->SwGND_Pin | DCSw->SwVDD_Pin; - #endif //POWER_CONNECT == 1 + #if (PHASE_DISCONNECT == 0) + DCSw->SW_Port->BSRR = (DCSw->SwHI_Pin | DCSw->SwLO_Pin) << 16; + #else //PHASE_CONNECT == 1 + DCSw->SW_Port->BSRR = DCSw->SwHI_Pin | DCSw->SwLO_Pin; + #endif //PHASE_CONNECT == 1 #endif //USE_HAL_GPIO_FUNCTIONS } /** -* @brief Переключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef + * @brief Переключить две фазы с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */ -void TESTER_Reconnect_Power(TESTER_PowerSwitchTypeDef *DCPosSw, TESTER_PowerSwitchTypeDef *DCNegSw) +void TESTER_Reconnect_TwoPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_PhaseSwitchTypeDef *SwPhaseB, TESTER_TicksDelayTypeDef *deadtime) { #ifdef USE_HAL_GPIO_FUNCTIONS - HAL_GPIO_WritePin(DCPosSw->SW_Port, DCPosSw->SwGND_Pin | DCPosSw->SwVDD_Pin, POWER_DISCONNECT); - HAL_GPIO_WritePin(DCNegSw->SW_Port, DCNegSw->SwGND_Pin | DCNegSw->SwVDD_Pin, POWER_CONNECT); -#else // USE_HAL_GPIO_FUNCTIONS - #ifdef ALL_SW_USE_SAME_PORT - #if (POWER_CONNECT == 1) && (POWER_DISCONNECT == 0) - DCPosSw->SW_Port->BSRR = ((DCNegSw->SwGND_Pin | DCNegSw->SwVDD_Pin) | ((DCPosSw->SwGND_Pin | DCPosSw->SwVDD_Pin) << 16)); - #elif (POWER_CONNECT == 1) && (POWER_DISCONNECT == 0) - DCPosSw->SW_Port->BSRR = (((DCNegSw->SwGND_Pin | DCNegSw->SwVDD_Pin) << 16)| (DCPosSw->SwGND_Pin | DCPosSw->SwVDD_Pin)); - #endif //POWER_CONNECT && POWER_DISCONNECT - #else //ALL_SW_USE_SAME_PORT - #if (POWER_DISCONNECT == 0) - DCPosSw->SW_Port->BSRR = (DCPosSw->SwGND_Pin | DCPosSw->SwVDD_Pin) << 16; - #else //POWER_DISCONNECT == 1 - DCPosSw->SW_Port->BSRR = DCPosSw->SwGND_Pin | DCPosSw->SwVDD_Pin; - #endif //POWER_DISCONNECT + HAL_GPIO_WritePin(SwPhaseA->SW_Port, SwPhaseA->SwHI_Pin | SwPhaseA->SwLO_Pin, PHASE_DISCONNECT); - #if (POWER_CONNECT == 1) - DCNegSw->SW_Port->BSRR = DCNegSw->SwGND_Pin | DCNegSw->SwVDD_Pin; - #else //POWER_CONNECT == 0 - DCNegSw->SW_Port->BSRR = (DCNegSw->SwGND_Pin | DCNegSw->SwVDD_Pin) << 16; - #endif //POWER_CONNECT - #endif //ALL_SW_USE_SAME_PORT + #ifndef RECONNECT_WITHOUT_DEADTIME + /* Ожидается задержка дедтайм */ + TESTER_Delay(deadtime); + #endif //RECONNECT_WITHOUT_DEADTIME + + HAL_GPIO_WritePin(SwPhaseB->SW_Port, SwPhaseB->SwHI_Pin | SwPhaseB->SwLO_Pin, PHASE_CONNECT); +#else // USE_HAL_GPIO_FUNCTIONS + #ifdef RECONNECT_WITHOUT_DEADTIME + #if (PHASE_CONNECT == 1) && (PHASE_DISCONNECT == 0) + SwPhaseA->SW_Port->BSRR = ((SwPhaseB->SwHI_Pin | SwPhaseB->SwLO_Pin) | ((SwPhaseA->SwHI_Pin | SwPhaseA->SwLO_Pin) << 16)); + #elif (PHASE_CONNECT == 1) && (PHASE_DISCONNECT == 0) + SwPhaseA->SW_Port->BSRR = (((SwPhaseB->SwHI_Pin | SwPhaseB->SwLO_Pin) << 16)| (SwPhaseA->SwHI_Pin | SwPhaseA->SwLO_Pin)); + #endif //PHASE_CONNECT && PHASE_DISCONNECT + #else //RECONNECT_WITHOUT_DEADTIME + #if (PHASE_DISCONNECT == 0) + SwPhaseA->SW_Port->BSRR = (SwPhaseA->SwHI_Pin | SwPhaseA->SwLO_Pin) << 16; + #else //PHASE_DISCONNECT == 1 + SwPhaseA->SW_Port->BSRR = SwPhaseA->SwHI_Pin | SwPhaseA->SwLO_Pin; + #endif //PHASE_DISCONNECT + + /* Ожидается задержка дедтайм */ + TESTER_Delay(deadtime); + + #if (PHASE_CONNECT == 1) + SwPhaseB->SW_Port->BSRR = SwPhaseB->SwHI_Pin | SwPhaseB->SwLO_Pin; + #else //PHASE_CONNECT == 0 + SwPhaseB->SW_Port->BSRR = (SwPhaseB->SwHI_Pin | SwPhaseB->SwLO_Pin) << 16; + #endif //PHASE_CONNECT + #endif //RECONNECT_WITHOUT_DEADTIME #endif //USE_HAL_GPIO_FUNCTIONS } @@ -195,13 +206,14 @@ void TESTER_Reconnect_Power(TESTER_PowerSwitchTypeDef *DCPosSw, TESTER_PowerSwit */ void TESTER_Delay(TESTER_TicksDelayTypeDef *tickdelay) { - /* Задержка, перед подключением питания */ - if(tickdelay->msdelay == 0) // если миллисекундная задержка выключена + /* если миллисекундная задержка выключена */ + if(tickdelay->msdelay == 0) { /* Задержка, в тиках */ for(int i = 0; i < tickdelay->ticks; i++); } - else // если миллисекундная задержка включена + /* если миллисекундная задержка включена */ + else { /* Задержка, в миллисекундах */ msDelay(tickdelay->ticks); diff --git a/diode_tester/Core/Tester_main/tester_func.h b/diode_tester/Core/Tester_main/tester_func.h index 95dd0aa..120ae5f 100644 --- a/diode_tester/Core/Tester_main/tester_func.h +++ b/diode_tester/Core/Tester_main/tester_func.h @@ -16,14 +16,14 @@ /** - * @brief Структура для пинов, которые отвечают за ключи, которые подключают питание + * @brief Структура для пинов, которые отвечают за ключи, которые подключают фазы */ typedef struct { - GPIO_TypeDef *SW_Port; ///< Порт первого ключа для питания - uint32_t SwGND_Pin; ///< Пин первого ключа для питания - uint32_t SwVDD_Pin; ///< Пин второго ключа для питания -}TESTER_PowerSwitchTypeDef; + GPIO_TypeDef *SW_Port; ///< Порт первого ключа для фазы + uint32_t SwHI_Pin; ///< Пин первого ключа для фазы + uint32_t SwLO_Pin; ///< Пин второго ключа для фазы +}TESTER_PhaseSwitchTypeDef; /** @@ -40,10 +40,11 @@ typedef struct */ typedef struct { - uint32_t msticks_for_positive_dc; ///< миллисекундная задержка для положительного напряжения @ref TESTER_TestDiode_PositivePower + uint32_t msticks_for_forward; ///< миллисекундная задержка для положительного напряжения @ref TESTER_TestDiode_Forward TESTER_TicksDelayTypeDef ticks_before_test; ///< задержка перед началом тестирования (мс или тики for()) - TESTER_TicksDelayTypeDef ticks_before_go_to_peak; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или тики for()) - TESTER_TicksDelayTypeDef ticks_before_disconnect; ///< задержка перед выключением питания (мс или тики for()) + TESTER_TicksDelayTypeDef ticks_deadtime; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или тики for()) + TESTER_TicksDelayTypeDef ticks_before_expected_peak; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или тики for()) + TESTER_TicksDelayTypeDef ticks_before_disconnect; ///< задержка перед выключением фаз (мс или тики for()) }TESTER_SwitchTimingsTypeDef; /** @@ -55,8 +56,8 @@ typedef struct TESTER_SwitchTimingsTypeDef SwTimings; ///< Тайминги для ключей - TESTER_PowerSwitchTypeDef DCPosSw; ///< Пины ключей для положительного источника - TESTER_PowerSwitchTypeDef DCNegSw; ///< Пины ключей для отрицательного источника + TESTER_PhaseSwitchTypeDef SwPhaseForward; ///< Пины ключей фаз для прямого включения + TESTER_PhaseSwitchTypeDef SwPhaseReverse; ///< Пины ключей фаз для обратного включения uint32_t continuous_buff_size; @@ -73,19 +74,19 @@ extern TESTER_TestHandleTypeDef hTestDiode; void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest, TESTER_LEDsTypeDef *leds); /* Тест диодов: подключение прямого напряжения */ -void TESTER_TestDiode_PositivePower(TESTER_TestHandleTypeDef *htest); +void TESTER_TestDiode_Forward(TESTER_TestHandleTypeDef *htest); /* Тест диодов: подключение обратного напряжения */ -void TESTER_TestDiode_NegativePower(TESTER_TestHandleTypeDef *htest); +void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest); /* Тест диодов: подключение прямого, а потом обратного напряжения */ -void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest); +void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest); -/* Подключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef */ -void TESTER_Connect_Power(TESTER_PowerSwitchTypeDef *DCSw); -/* Отключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef */ -void TESTER_Disconnect_Power(TESTER_PowerSwitchTypeDef *DCSw); -/* Переключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef */ -void TESTER_Reconnect_Power(TESTER_PowerSwitchTypeDef *DCPosSw, TESTER_PowerSwitchTypeDef *DCNegSw); -/* Формирование задержки перед подключением питания (в тиках или миллисекундная) */ +/* Подключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */ +void TESTER_Connect_Phase(TESTER_PhaseSwitchTypeDef *DCSw); +/* Отключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */ +void TESTER_Disconnect_Phase(TESTER_PhaseSwitchTypeDef *DCSw); +/* Переключить две фазы с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */ +void TESTER_Reconnect_TwoPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_PhaseSwitchTypeDef *SwPhaseB, TESTER_TicksDelayTypeDef *deadtime); +/* Формирование задержки (в тиках или миллисекундная) */ void TESTER_Delay(TESTER_TicksDelayTypeDef *tickdelay); #endif //_TESTER_FUNC_H_ diff --git a/diode_tester/Core/Tester_main/tester_interface_func.c b/diode_tester/Core/Tester_main/tester_interface_func.c index 0637268..502a04e 100644 --- a/diode_tester/Core/Tester_main/tester_interface_func.c +++ b/diode_tester/Core/Tester_main/tester_interface_func.c @@ -12,21 +12,21 @@ void TESTER_InterfaceInit(TESTER_SwitchStartTypeDef *swstart, TESTER_LEDsTypeDef /** * @brief Включить индикацию прямого подключения диода */ -void TESTER_LED_TestingDiode_Positive(TESTER_LEDTypeDef *led) +void TESTER_LED_TestingDiodeForward(TESTER_LEDTypeDef *led) { - led->period = LED_POSITIVE_DIODE_PERIOD; + led->period = LED_FORWARD_DIODE_PERIOD; } /** * @brief Включить индикацию обратного подключения диода */ -void TESTER_LED_TestingDiode_Negative(TESTER_LEDTypeDef *led) +void TESTER_LED_TestingDiodeReverse(TESTER_LEDTypeDef *led) { - led->period = LED_NEGATIVE_DIODE_PERIOD; + led->period = LED_REVERSE_DIODE_PERIOD; } /** - * @brief Выключить индикацию активного теста диодов +* @brief Выключить индикацию ожидания комманды */ -void TESTER_LED_TestingDiode_End(TESTER_LEDTypeDef *led) +void TESTER_LED_WaitForAction(TESTER_LEDTypeDef *led) { led->period = LED_BLINK_AS_ON; } diff --git a/diode_tester/Core/Tester_main/tester_interface_func.h b/diode_tester/Core/Tester_main/tester_interface_func.h index 28bfdd1..39ec1d7 100644 --- a/diode_tester/Core/Tester_main/tester_interface_func.h +++ b/diode_tester/Core/Tester_main/tester_interface_func.h @@ -48,11 +48,11 @@ void TESTER_InterfaceInit(TESTER_SwitchStartTypeDef *swstart, TESTER_LEDsTypeDef /* Включить индикацию прямого подключения диода */ -void TESTER_LED_TestingDiode_Positive(TESTER_LEDTypeDef *led); +void TESTER_LED_TestingDiodeForward(TESTER_LEDTypeDef *led); /* Включить индикацию обратного подключения диода */ -void TESTER_LED_TestingDiode_Negative(TESTER_LEDTypeDef *led); +void TESTER_LED_TestingDiodeReverse(TESTER_LEDTypeDef *led); /* Выключить индикацию активного теста диодов */ -void TESTER_LED_TestingDiode_End(TESTER_LEDTypeDef *led); +void TESTER_LED_WaitForAction(TESTER_LEDTypeDef *led); /* Считать состоянии кнопки запуска */ uint8_t TESTER_ReadSwichStart(TESTER_SwitchStartTypeDef *swstart); diff --git a/diode_tester/Core/Tester_main/tester_main.c b/diode_tester/Core/Tester_main/tester_main.c index 8338ad1..305a4d7 100644 --- a/diode_tester/Core/Tester_main/tester_main.c +++ b/diode_tester/Core/Tester_main/tester_main.c @@ -49,46 +49,46 @@ void TESTER_main_while(TESTER_ProjectTypeDef *tester) msDelay(tester->delay); /* ТЕСТ В ОБРАТНОМ ВКЛЮЧЕНИИ */ - if(tester->func.test_diode_neg) + if(tester->func.test_diode_reverse) { tester->f.flag_test_active = 1; - TESTER_TestDiode_NegativePower(tester->htest); + TESTER_TestDiode_Reverse(tester->htest); /* Запись данных в modbus */ tester->mbdata->InRegs.PeakVoltage = tester->htest->DiodePeakVolt*1000; if(tester->func.disable_reset_call == 0) - tester->func.test_diode_neg = 0; + tester->func.test_diode_reverse = 0; tester->f.flag_test_active = 0; } /* ТЕСТ В ПРЯМОМ ВКЛЮЧЕНИИ */ - if(tester->func.test_diode_pos) + if(tester->func.test_diode_forward) { tester->f.flag_test_active = 1; - TESTER_TestDiode_PositivePower(tester->htest); + TESTER_TestDiode_Forward(tester->htest); /* Запись данных в modbus */ tester->mbdata->InRegs.ForwardVoltage = tester->htest->DiodeForwardVolt*1000; if(tester->func.disable_reset_call == 0) - tester->func.test_diode_pos = 0; + tester->func.test_diode_forward = 0; tester->f.flag_test_active = 0; } /* ТЕСТ ПЕРЕХОДА ИЗ ПРЯМОГО В ОБРАТНОЕ ВКЛЮЧЕНИЯ*/ - if(tester->func.test_diode_posneg) + if(tester->func.test_diode_switch_connection) { tester->f.flag_test_active = 1; - TESTER_TestDiode_PosNegPower(tester->htest); + TESTER_TestDiode_SwitchConnection(tester->htest); /* Запись данных в modbus */ tester->mbdata->InRegs.PeakVoltage = tester->htest->DiodePeakVolt*1000; tester->mbdata->InRegs.ForwardVoltage = tester->htest->DiodeForwardVolt*1000; if(tester->func.disable_reset_call == 0) - tester->func.test_diode_posneg = 0; + tester->func.test_diode_switch_connection = 0; tester->f.flag_test_active = 0; } @@ -117,16 +117,16 @@ void TESTER_InterfaceHandle(TESTER_ProjectTypeDef *tester) TESTER_UpdateSettings(tester->htest, tester->mbdata); switch(tester->mode) { - case TEST_POSITIVE: - tester->func.test_diode_pos = 1; + case TEST_FORWARD: + tester->func.test_diode_forward = 1; break; - case TEST_NEGATIVE: - tester->func.test_diode_neg = 1; + case TEST_REVERSE: + tester->func.test_diode_reverse = 1; break; - case TEST_POSNEG: - tester->func.test_diode_posneg = 1; + case TEST_SWITCH_CONNECTION: + tester->func.test_diode_switch_connection = 1; break; default: @@ -146,12 +146,14 @@ void TESTER_InterfaceHandle(TESTER_ProjectTypeDef *tester) void TESTER_UpdateSettings(TESTER_TestHandleTypeDef *htest, MB_DataStructureTypeDef *mbdata) { htest->SwTimings.ticks_before_disconnect.ticks = mbdata->HoldRegs.TimeBeforeDisconnect; - htest->SwTimings.ticks_before_go_to_peak.ticks = mbdata->HoldRegs.TimeBeforePeak; + htest->SwTimings.ticks_deadtime.ticks = mbdata->HoldRegs.TimeDeadtime; + htest->SwTimings.ticks_before_expected_peak.ticks = mbdata->HoldRegs.TimeBeforePeak; htest->SwTimings.ticks_before_test.ticks = mbdata->HoldRegs.TimeBeforeTest; - htest->SwTimings.msticks_for_positive_dc = mbdata->HoldRegs.TimeForPositiveDC; + htest->SwTimings.msticks_for_forward = mbdata->HoldRegs.TimeForForward; htest->SwTimings.ticks_before_disconnect.msdelay = mbdata->Coils.msTimeBeforeDisconnect_enable; - htest->SwTimings.ticks_before_go_to_peak.msdelay = mbdata->Coils.msTimeBeforePeak_enable; + htest->SwTimings.ticks_deadtime.msdelay = mbdata->Coils.msTimeDeadtime_enable; + htest->SwTimings.ticks_before_expected_peak.msdelay = mbdata->Coils.msTimeBeforePeak_enable; htest->SwTimings.ticks_before_test.msdelay = mbdata->Coils.msTimeBeforeTest_enable; TESTER_ADC_UpdateSettings(htest->adc, mbdata); @@ -163,18 +165,18 @@ void TESTER_UpdateSettings(TESTER_TestHandleTypeDef *htest, MB_DataStructureType */ void TESTER_Set_Default_Settings(TESTER_ProjectTypeDef *tester) { - tester->mbdata->Coils.PositiveTest = 1; - tester->mbdata->Coils.NegativeTest = 1; + tester->mbdata->Coils.ForwardTest = 1; + tester->mbdata->Coils.ReverseTest = 1; - /* Настройка пинов для подключения отрицательного источника */ - tester->htest->DCNegSw.SW_Port = SWITCH_PHASE_B_Port; - tester->htest->DCNegSw.SwGND_Pin = SWITCH_PHASE_B_HI_Pin; - tester->htest->DCNegSw.SwVDD_Pin = SWITCH_PHASE_B_LO_Pin; + /* Настройка пинов для прямого включения */ + tester->htest->SwPhaseForward.SW_Port = SWITCH_PHASE_REVERSE_Port; + tester->htest->SwPhaseForward.SwHI_Pin = SWITCH_PHASE_REVERSE_HI_Pin; + tester->htest->SwPhaseForward.SwLO_Pin = SWITCH_PHASE_REVERSE_LO_Pin; - /* Настройка пинов для подключения положительного источника */ - tester->htest->DCPosSw.SW_Port = SWITCH_PHASE_A_Port; - tester->htest->DCPosSw.SwGND_Pin = SWITCH_PHASE_A_HI_Pin; - tester->htest->DCPosSw.SwVDD_Pin = SWITCH_PHASE_A_LO_Pin; + /* Настройка пинов для обратного включения */ + tester->htest->SwPhaseReverse.SW_Port = SWITCH_PHASE_FORWARD_Port; + tester->htest->SwPhaseReverse.SwHI_Pin = SWITCH_PHASE_FORWARD_HI_Pin; + tester->htest->SwPhaseReverse.SwLO_Pin = SWITCH_PHASE_FORWARD_LO_Pin; /* Настройка пинов для кнопки старта */ @@ -189,11 +191,14 @@ void TESTER_Set_Default_Settings(TESTER_ProjectTypeDef *tester) /* Настройка таймингов по умолчанию для тестирования */ - tester->mbdata->HoldRegs.TimeForPositiveDC = DEF_MS_TIME_FOR_POSITIVE; + tester->mbdata->HoldRegs.TimeForForward = DEF_MS_TIME_FOR_POSITIVE; tester->mbdata->HoldRegs.TimeBeforeDisconnect = DEF_TIME_BEFORE_DISCONNECT; tester->mbdata->Coils.msTimeBeforeDisconnect_enable = DEF_TIME_BEFORE_DISCONNECT_MS_DELAY; + tester->mbdata->HoldRegs.TimeDeadtime = DEF_DEADTIME; + tester->mbdata->Coils.msTimeDeadtime_enable = DEF_DEADTIME_MS_DELAY; + tester->mbdata->HoldRegs.TimeBeforePeak = DEF_TIME_BEFORE_PEAK; tester->mbdata->Coils.msTimeBeforePeak_enable = DEF_TIME_BEFORE_PEAK_MS_DELAY; diff --git a/diode_tester/Core/Tester_main/tester_main.h b/diode_tester/Core/Tester_main/tester_main.h index ffff79f..9aa0bea 100644 --- a/diode_tester/Core/Tester_main/tester_main.h +++ b/diode_tester/Core/Tester_main/tester_main.h @@ -19,9 +19,9 @@ */ typedef struct { - unsigned test_diode_neg:1; - unsigned test_diode_posneg:1; - unsigned test_diode_pos:1; + unsigned test_diode_reverse:1; + unsigned test_diode_switch_connection:1; + unsigned test_diode_forward:1; unsigned disable_reset_call:1; }function_calls; @@ -38,9 +38,9 @@ typedef struct typedef enum { TEST_DISABLE = 0, - TEST_POSITIVE = 1, - TEST_NEGATIVE = 2, - TEST_POSNEG = 3 + TEST_FORWARD = 1, + TEST_REVERSE = 2, + TEST_SWITCH_CONNECTION = 3 }TESTER_TestModeTypeDef;