From ae2887acfeaa496ed624a6196e52d6a9ccbc9bd5 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Mon, 23 Dec 2024 12:52:11 +0300 Subject: [PATCH 1/5] =?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; From b0c9cb058c8f52f3d35cbce9667c3e790fddfb5a Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Mon, 23 Dec 2024 13:42:01 +0300 Subject: [PATCH 2/5] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B2=20=D1=82=D0=B8=D0=BA=D0=B0=D1=85=20for()=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BC=D0=B8=D0=BA=D1=80=D0=BE=D1=81=D0=B5=D0=BA=D1=83=D0=BD?= =?UTF-8?q?=D0=B4=D0=BD=D1=83=D1=8E=20=D0=BF=D0=BE=20=D1=82=D0=B0=D0=B9?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=D1=83=20TIM3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit И соответственно обновлены регистры модбас --- diode_tester/Core/Src/tim.c | 4 +- diode_tester/Core/Tester_main/tester_config.h | 14 ++--- diode_tester/Core/Tester_main/tester_func.c | 55 ++++++++++++------- diode_tester/Core/Tester_main/tester_func.h | 17 ++++-- diode_tester/Core/Tester_main/tester_main.c | 13 +++-- diode_tester/MDK-ARM/diode_tester.uvoptx | 5 ++ diode_tester/diode_tester.ioc | 2 +- 7 files changed, 69 insertions(+), 41 deletions(-) diff --git a/diode_tester/Core/Src/tim.c b/diode_tester/Core/Src/tim.c index 4e9eae5..6f96cfc 100644 --- a/diode_tester/Core/Src/tim.c +++ b/diode_tester/Core/Src/tim.c @@ -82,9 +82,9 @@ void MX_TIM3_Init(void) /* USER CODE END TIM3_Init 1 */ htim3.Instance = TIM3; - htim3.Init.Prescaler = 0; + htim3.Init.Prescaler = 72-1; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; - htim3.Init.Period = 8999; + htim3.Init.Period = 65535; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim3) != HAL_OK) diff --git a/diode_tester/Core/Tester_main/tester_config.h b/diode_tester/Core/Tester_main/tester_config.h index 94247f9..7e61df3 100644 --- a/diode_tester/Core/Tester_main/tester_config.h +++ b/diode_tester/Core/Tester_main/tester_config.h @@ -27,14 +27,14 @@ /** * @brief Задержка для дедтайма ПО УМОЛЧАНИЮ - * @details Задержка миллисекундная или тики for() @ref DEF_DEADTIME_MS_DELAY + * @details Задержка миллисекундная или микросекундная @ref DEF_DEADTIME_MS_DELAY */ #define DEF_DEADTIME 500 #define DEF_DEADTIME_MS_DELAY 0 ///< включение миллисекундной задержки для @ref DEF_DEADTIME по умолчанию /** * @brief Задержка перед началом тестирования ПО УМОЛЧАНИЮ - * @details Задержка миллисекундная или тики for() @ref TIME_BEFORE_TEST_MS_DELAY + * @details Задержка миллисекундная или микросекундная @ref TIME_BEFORE_TEST_MS_DELAY */ #define DEF_TIME_BEFORE_TEST 500 #define DEF_TIME_BEFORE_TEST_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_TEST по умолчанию @@ -43,19 +43,19 @@ * @brief Задержка между включением АЦП и предполагаемым скачком напряжения ПО УМОЛЧАНИЮ * @details Задержка нужна, чтобы точно поймать его в буфере АЦП. * - * Задержка миллисекундная или тики for() @ref TIME_BEFORE_TEST_MS_DELAY + * Задержка миллисекундная или микросекундная @ref TIME_BEFORE_TEST_MS_DELAY * @note Но если миллисекундная, то скорее всего скачок не попадет в буфер АЦП. - * Поэтому желательно только тики for() (@ref TIME_BEFORE_PEAK_MS_DELAY = 0) + * Поэтому желательно только микросекундная (@ref TIME_BEFORE_PEAK_MS_DELAY = 0) */ #define DEF_TIME_BEFORE_PEAK 5 -#define DEF_TIME_BEFORE_PEAK_MS_DELAY 0 ///< включение миллисекундной задержки для @ref TIME_BEFORE_PEAK(0 - задержка for(), 1 - миллисекундная) +#define DEF_TIME_BEFORE_PEAK_MS_DELAY 0 ///< включение миллисекундной задержки для @ref TIME_BEFORE_PEAK /** * @brief Задержка перед окончанием тестирования (отключение питания) ПО УМОЛЧАНИЮ - * @details Задержка миллисекундная или тики for() @ref TIME_BEFORE_DISCONNECT_MS_DELAY + * @details Задержка миллисекундная или микросекундная @ref TIME_BEFORE_DISCONNECT_MS_DELAY */ #define DEF_TIME_BEFORE_DISCONNECT 2000 -#define DEF_TIME_BEFORE_DISCONNECT_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_DISCONNECT (0 - задержка for(), 1 - миллисекундная) +#define DEF_TIME_BEFORE_DISCONNECT_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_DISCONNECT /** TESTER_SW_TIMINGS_CONFIG * @} diff --git a/diode_tester/Core/Tester_main/tester_func.c b/diode_tester/Core/Tester_main/tester_func.c index 4f6124c..a80dcc4 100644 --- a/diode_tester/Core/Tester_main/tester_func.c +++ b/diode_tester/Core/Tester_main/tester_func.c @@ -22,7 +22,7 @@ void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest, TESTER_LEDsTypeDef *leds void TESTER_TestDiode_Forward(TESTER_TestHandleTypeDef *htest) { /* Задержка, перед началом работы */ - TESTER_Delay(&htest->SwTimings.ticks_before_test); + TESTER_Delay(&htest->SwTimings.ticks_before_test, &hmcstim); TESTER_LED_TestingDiodeForward(&htest->leds->LED1); /* Включение континиус АЦП */ @@ -61,20 +61,20 @@ void TESTER_TestDiode_Forward(TESTER_TestHandleTypeDef *htest) void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest) { /* Задержка, перед началом работы */ - TESTER_Delay(&htest->SwTimings.ticks_before_test); + TESTER_Delay(&htest->SwTimings.ticks_before_test, &hmcstim); TESTER_LED_TestingDiodeReverse(&htest->leds->LED1); /* Включение АЦП */ ADC_DMA_StartRead(htest->adc); /* Задержка, перед предполагаемым скачком */ - TESTER_Delay(&htest->SwTimings.ticks_before_expected_peak); + TESTER_Delay(&htest->SwTimings.ticks_before_expected_peak, &hmcstim); /* Обратное включение диода */ TESTER_Connect_Phase(&htest->SwPhaseReverse); /* Обратное включение на определенное время */ - TESTER_Delay(&htest->SwTimings.ticks_before_disconnect); + TESTER_Delay(&htest->SwTimings.ticks_before_disconnect, &hmcstim); /* Отключение питания от диода */ TESTER_Disconnect_Phase(&htest->SwPhaseReverse); @@ -95,7 +95,7 @@ void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest) void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest) { /* Задержка, перед началом работы */ - TESTER_Delay(&htest->SwTimings.ticks_before_test); + TESTER_Delay(&htest->SwTimings.ticks_before_test, &hmcstim); TESTER_LED_TestingDiodeForward(&htest->leds->LED1); /* Прямое включение диода */ @@ -105,18 +105,12 @@ void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest) msDelay(htest->SwTimings.msticks_for_forward); htest->DiodeForwardVolt = htest->adc->chAdc.U_Current; TESTER_LED_TestingDiodeReverse(&htest->leds->LED1); - - /* Включение АЦП */ - ADC_DMA_StartRead(htest->adc); - - /* Ожидается задержка, перед предполагаемым скачком */ - TESTER_Delay(&htest->SwTimings.ticks_before_expected_peak); - + /* Переход из прямого включения в обратное */ TESTER_Reconnect_TwoPhases(&htest->SwPhaseForward, &htest->SwPhaseReverse, &htest->SwTimings.ticks_deadtime); /* Обратное включение на определенное время */ - TESTER_Delay(&htest->SwTimings.ticks_before_disconnect); + TESTER_Delay(&htest->SwTimings.ticks_before_disconnect, &hmcstim); /* Отключение питания от диода */ TESTER_Disconnect_Phase(&htest->SwPhaseReverse); @@ -171,17 +165,28 @@ void TESTER_Reconnect_TwoPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_Phas #ifndef RECONNECT_WITHOUT_DEADTIME /* Ожидается задержка дедтайм */ - TESTER_Delay(deadtime); + TESTER_Delay(deadtime, &hmcstim); #endif //RECONNECT_WITHOUT_DEADTIME + /* Включение АЦП */ + ADC_DMA_StartRead(hTestDiode.adc); + /* Ожидается задержка, перед предполагаемым скачком */ + TESTER_Delay(&hTestDiode.SwTimings.ticks_before_expected_peak, &hmcstim); + HAL_GPIO_WritePin(SwPhaseB->SW_Port, SwPhaseB->SwHI_Pin | SwPhaseB->SwLO_Pin, PHASE_CONNECT); #else // USE_HAL_GPIO_FUNCTIONS #ifdef RECONNECT_WITHOUT_DEADTIME + /* Включение АЦП */ + ADC_DMA_StartRead(hTestDiode.adc); + /* Ожидается задержка, перед предполагаемым скачком */ + TESTER_Delay(&hTestDiode.SwTimings.ticks_before_expected_peak, &hmcstim); + #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; @@ -190,7 +195,12 @@ void TESTER_Reconnect_TwoPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_Phas #endif //PHASE_DISCONNECT /* Ожидается задержка дедтайм */ - TESTER_Delay(deadtime); + TESTER_Delay(deadtime, &hmcstim); + + /* Включение АЦП */ + ADC_DMA_StartRead(hTestDiode.adc); + /* Ожидается задержка, перед предполагаемым скачком */ + TESTER_Delay(&hTestDiode.SwTimings.ticks_before_expected_peak, &hmcstim); #if (PHASE_CONNECT == 1) SwPhaseB->SW_Port->BSRR = SwPhaseB->SwHI_Pin | SwPhaseB->SwLO_Pin; @@ -202,15 +212,22 @@ void TESTER_Reconnect_TwoPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_Phas } /** - * @brief Формирование задержки (в тиках или миллисекундная) +* @brief Формирование задержки (в микро или миллисекундная) */ -void TESTER_Delay(TESTER_TicksDelayTypeDef *tickdelay) +void TESTER_Delay(TESTER_TicksDelayTypeDef *tickdelay, TIM_HandleTypeDef *htim) { /* если миллисекундная задержка выключена */ if(tickdelay->msdelay == 0) { - /* Задержка, в тиках */ - for(int i = 0; i < tickdelay->ticks; i++); + htim->Instance->CNT = 1; + uint32_t tickstart = HAL_GetTick(); + /* Задержка, в мкс */ + while(htim->Instance->CNT < tickdelay->ticks) + { + /* Если прошло уже больше секунды, а микросекундная задержка не закончилась - возврат */ + if(HAL_GetTick() - tickstart > 1000) + return; + } } /* если миллисекундная задержка включена */ else diff --git a/diode_tester/Core/Tester_main/tester_func.h b/diode_tester/Core/Tester_main/tester_func.h index 120ae5f..feddbb1 100644 --- a/diode_tester/Core/Tester_main/tester_func.h +++ b/diode_tester/Core/Tester_main/tester_func.h @@ -14,6 +14,11 @@ #include "tester_adc_func.h" #include "tester_interface_func.h" +/** + * @brief Хендл микросекундного таймера + */ +#define hmcstim htim3 +extern TIM_HandleTypeDef htim3; /** * @brief Структура для пинов, которые отвечают за ключи, которые подключают фазы @@ -41,10 +46,10 @@ typedef struct typedef struct { uint32_t msticks_for_forward; ///< миллисекундная задержка для положительного напряжения @ref TESTER_TestDiode_Forward - TESTER_TicksDelayTypeDef ticks_before_test; ///< задержка перед началом тестирования (мс или тики for()) - TESTER_TicksDelayTypeDef ticks_deadtime; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или тики for()) - TESTER_TicksDelayTypeDef ticks_before_expected_peak; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или тики for()) - TESTER_TicksDelayTypeDef ticks_before_disconnect; ///< задержка перед выключением фаз (мс или тики for()) + TESTER_TicksDelayTypeDef ticks_before_test; ///< задержка перед началом тестирования (мс или мкс) + TESTER_TicksDelayTypeDef ticks_deadtime; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или мкс) + TESTER_TicksDelayTypeDef ticks_before_expected_peak; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или мкс) + TESTER_TicksDelayTypeDef ticks_before_disconnect; ///< задержка перед выключением фаз (мс или мкс) }TESTER_SwitchTimingsTypeDef; /** @@ -86,7 +91,7 @@ void TESTER_Connect_Phase(TESTER_PhaseSwitchTypeDef *DCSw); 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); +/* Формирование задержки (в микро или миллисекундная) */ +void TESTER_Delay(TESTER_TicksDelayTypeDef *tickdelay, TIM_HandleTypeDef *htim); #endif //_TESTER_FUNC_H_ diff --git a/diode_tester/Core/Tester_main/tester_main.c b/diode_tester/Core/Tester_main/tester_main.c index 305a4d7..06de807 100644 --- a/diode_tester/Core/Tester_main/tester_main.c +++ b/diode_tester/Core/Tester_main/tester_main.c @@ -36,6 +36,7 @@ void TESTER_pre_while(TESTER_ProjectTypeDef *tester) RS_Receive_IT(tester->hmodbus, &MODBUS_MSG); tester->leds.LED1.period = LED_BLINK_AS_ON; tester->f.flag_init_done = 1; + HAL_TIM_Base_Start(&hmcstim); } @@ -169,14 +170,14 @@ void TESTER_Set_Default_Settings(TESTER_ProjectTypeDef *tester) tester->mbdata->Coils.ReverseTest = 1; /* Настройка пинов для прямого включения */ - 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->SwPhaseReverse.SW_Port = SWITCH_PHASE_REVERSE_Port; + tester->htest->SwPhaseReverse.SwHI_Pin = SWITCH_PHASE_REVERSE_HI_Pin; + tester->htest->SwPhaseReverse.SwLO_Pin = SWITCH_PHASE_REVERSE_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; + tester->htest->SwPhaseForward.SW_Port = SWITCH_PHASE_FORWARD_Port; + tester->htest->SwPhaseForward.SwHI_Pin = SWITCH_PHASE_FORWARD_HI_Pin; + tester->htest->SwPhaseForward.SwLO_Pin = SWITCH_PHASE_FORWARD_LO_Pin; /* Настройка пинов для кнопки старта */ diff --git a/diode_tester/MDK-ARM/diode_tester.uvoptx b/diode_tester/MDK-ARM/diode_tester.uvoptx index 2e5a87f..05114cd 100644 --- a/diode_tester/MDK-ARM/diode_tester.uvoptx +++ b/diode_tester/MDK-ARM/diode_tester.uvoptx @@ -207,6 +207,11 @@ 2 val_sum,0x0A + + 5 + 2 + ADC_DMA_HalfBuff,0x0A + 0 diff --git a/diode_tester/diode_tester.ioc b/diode_tester/diode_tester.ioc index bbfd7cf..479873a 100644 --- a/diode_tester/diode_tester.ioc +++ b/diode_tester/diode_tester.ioc @@ -158,7 +158,7 @@ RCC.VCOOutput2Freq_Value=8000000 SH.ADCx_IN0.0=ADC1_IN0,IN0 SH.ADCx_IN0.ConfNb=1 TIM3.IPParameters=Period,Prescaler,TIM_MasterOutputTrigger -TIM3.Period=10000 +TIM3.Period=65535 TIM3.Prescaler=72-1 TIM3.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE USART1.IPParameters=VirtualMode From 0cba8cda8a31951b65c4bd4458692bbc6c0efcff Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Mon, 23 Dec 2024 14:16:33 +0300 Subject: [PATCH 3/5] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D1=82=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=D1=87=D0=BA=D0=B0=20=D0=BD=D0=B0=D0=BF=D1=80=D1=8F=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PeakVoltage >ReversePeakVoltage --- diode_tester/Core/Interfaces/modbus_data.h | 2 +- diode_tester/Core/Tester_main/tester_func.c | 4 ++-- diode_tester/Core/Tester_main/tester_func.h | 2 +- diode_tester/Core/Tester_main/tester_main.c | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/diode_tester/Core/Interfaces/modbus_data.h b/diode_tester/Core/Interfaces/modbus_data.h index a882f51..f31cbd2 100644 --- a/diode_tester/Core/Interfaces/modbus_data.h +++ b/diode_tester/Core/Interfaces/modbus_data.h @@ -38,7 +38,7 @@ typedef struct //MB_DataInRegsTypeDef { uint16_t ForwardVoltage; - uint16_t PeakVoltage; + uint16_t ReversePeakVoltage; }MB_DataInRegsTypeDef; diff --git a/diode_tester/Core/Tester_main/tester_func.c b/diode_tester/Core/Tester_main/tester_func.c index a80dcc4..d834757 100644 --- a/diode_tester/Core/Tester_main/tester_func.c +++ b/diode_tester/Core/Tester_main/tester_func.c @@ -85,7 +85,7 @@ void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest) TESTER_LED_WaitForAction(&htest->leds->LED1); - htest->DiodePeakVolt = htest->adc->chAdc.U_Current; + htest->DiodeReversePeakVolt = htest->adc->chAdc.U_Current; } @@ -121,7 +121,7 @@ void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest) TESTER_LED_WaitForAction(&htest->leds->LED1); - htest->DiodePeakVolt = htest->adc->chAdc.U_Current; + htest->DiodeReversePeakVolt = htest->adc->chAdc.U_Current; } /** diff --git a/diode_tester/Core/Tester_main/tester_func.h b/diode_tester/Core/Tester_main/tester_func.h index feddbb1..c9403de 100644 --- a/diode_tester/Core/Tester_main/tester_func.h +++ b/diode_tester/Core/Tester_main/tester_func.h @@ -67,7 +67,7 @@ typedef struct uint32_t continuous_buff_size; float DiodeForwardVolt; - float DiodePeakVolt; + float DiodeReversePeakVolt; TESTER_LEDsTypeDef *leds; }TESTER_TestHandleTypeDef; diff --git a/diode_tester/Core/Tester_main/tester_main.c b/diode_tester/Core/Tester_main/tester_main.c index 06de807..fbe639e 100644 --- a/diode_tester/Core/Tester_main/tester_main.c +++ b/diode_tester/Core/Tester_main/tester_main.c @@ -14,7 +14,7 @@ void TESTER_Init(TESTER_ProjectTypeDef *tester) tester->delay = 250; tester->delay_en = 0; - + tester->htest->adc->chAdc.s tester->func.disable_reset_call = 0; tester->htest = &hTestDiode; TESTER_HandleInit(tester->htest, &tester->leds); @@ -56,7 +56,7 @@ void TESTER_main_while(TESTER_ProjectTypeDef *tester) TESTER_TestDiode_Reverse(tester->htest); /* Запись данных в modbus */ - tester->mbdata->InRegs.PeakVoltage = tester->htest->DiodePeakVolt*1000; + tester->mbdata->InRegs.ReversePeakVoltage = tester->htest->DiodeReversePeakVolt*1000; if(tester->func.disable_reset_call == 0) tester->func.test_diode_reverse = 0; @@ -85,7 +85,7 @@ void TESTER_main_while(TESTER_ProjectTypeDef *tester) TESTER_TestDiode_SwitchConnection(tester->htest); /* Запись данных в modbus */ - tester->mbdata->InRegs.PeakVoltage = tester->htest->DiodePeakVolt*1000; + tester->mbdata->InRegs.ReversePeakVoltage = tester->htest->DiodeReversePeakVolt*1000; tester->mbdata->InRegs.ForwardVoltage = tester->htest->DiodeForwardVolt*1000; if(tester->func.disable_reset_call == 0) From 7181f678f76100605b387c13085f6103569de93c Mon Sep 17 00:00:00 2001 From: Coal56AB Date: Mon, 23 Dec 2024 14:17:13 +0300 Subject: [PATCH 4/5] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 119 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 67 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 6be9774..7d9c7ad 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,79 @@ # Diod_Test ## Управление тестером -Тест может запускаться по кнопке или по коилу №2 StartTest. +Тест может запускаться по кнопке или по коилу №2 `StartTest`. Режим тестирования (прямое/обратное включение) выставляется в двух коилах: -- №0 PositiveTest -- №1 NegativeTest -Если включены оба, то будет тест перехода от прямого подлключения к обратному. +- 0: `ForwardTest` - тест напряжения при прямом включении +- 1: `ReverseTest` - тест скачка напряжения при обратном включении + +Если включены оба, то будет тест скачка напряжения при переходе от прямого подлключения к обратному. ## Настройка таймингов Тайминги выставляются в регистрах модбас №0-4: - - TimeForPositiveDC - миллисекундная задержка для положительного напряжения (только миллисекунды_ - - TimeBeforeTest - задержка перед началом тестирования (миллисекундная или тики for()) - - TimeBeforePeak - задержка между включением АЦП и предполагаемым скачком напряжения (миллисекундная или тики for()) - - TimeBeforeDisconnect - задержка перед выключением питания (миллисекундная или тики for()) + - 0: `TimeForForward` - миллисекундная задержка для прямого включения (только миллисекунды) + - 1: `TimeBeforeTest` - задержка перед началом тестирования (миллисекундная или микросекундная) + - 2: `TimeDeadtime` - задержка при переключении с прямого включения в обратное (миллисекундная или микросекундная) + - 3: `TimeBeforePeak` - задержка между включением АЦП и предполагаемым скачком напряжения (миллисекундная или микросекундная) + - 4: `TimeBeforeDisconnect` - задержка перед выключением питания (миллисекундная или микросекундная) -В коилах модбас №16-18, можно выставить флаги - использовать миллисекундную или пустой цикл for() для соответствующей задержки: - - msTimeBeforeTest_enable - - msTimeBeforePeak_enable - - msTimeBeforeDisconnect_enable +В коилах модбас №16-19, можно выставить флаги - использовать миллисекундную задержку вместо микросекундной для соответствующего тайминга: + - 16: `msTimeBeforeTest_enable` + - 17: `msTimeDeadtime_enable` + - 18: `msTimeBeforePeak_enable` + - 19: `msTimeBeforeDisconnect_enable` ## Настройка АЦП Настройки АЦП выставляются в регистрах модбас №5-9: - - Adc_PulseWidth - ожидаемая длительность импульса в отчетах ацп - - Adc_PulseSign - полярность импульса - - Adc_CalibrValue - калибровочное значение ацп - - Adc_ZeroValue - нулевое значение ацп - - Adc_U_Calibr - калибровочное напряжение ацп + - 5: `Adc_PulseWidth` - ожидаемая длительность импульса в отчетах ацп + - 6: `Adc_PulseSign` - полярность импульса + - 7: `Adc_CalibrValue` - калибровочное значение ацп + - 8: `Adc_ZeroValue` - нулевое значение ацп + - 9: `Adc_U_Calibr` - калибровочное напряжение ацп -Из этого рассчитывается шаг АЦП: Adc_U_Calibr/(Adc_CalibrValue - Adc_ZeroValue) +Из этого рассчитывается шаг АЦП: `Adc_U_Calibr/(Adc_CalibrValue - Adc_ZeroValue)` # Тестирование -## Тест в прямом подключении (TESTER_TestDiode_PositivePower) -- ожидается задержка, перед началом работы ticks_before_test +## Тест в прямом подключении (`TESTER_TestDiode_Forward`) +- ожидается задержка, перед началом работы `ticks_before_test` - включается АЦП в континуес режиме -- подключается положительное напряжение на заданное время msticks_for_positive_dc. и все это время считывается АЦП и накапливаются заданное количество для расчета среднего. +- диод подключается в прямом направлении на заданное время `msticks_for_forward`. +- считывается АЦП и накапливаются заданное количество для расчета среднего. и так по кругу пока диод подключен - после таймаута отключается напряжение и останавливается АЦП -По итогу сохраняется напряжение прямого включения диода +По итогу сохраняется напряжение прямого включения диода `htest->DiodeForwardVolt`. -## Тест в обратном подключении (TESTER_TestDiode_NegativePower) -- ожидается задержка, перед началом работы ticks_before_test +## Тест в обратном подключении (`TESTER_TestDiode_Reverse`) +- ожидается задержка, перед началом работы `ticks_before_test` - включается АЦП в дма режиме -- ожидается задержка, перед предполагаемым скачком ticks_before_go_to_peak -- подключается отрицательное напряжение на заданное время ticks_before_disconnect, и отключается +- ожидается задержка, перед предполагаемым скачком `ticks_before_peak` +- диод подключается в обратном направлении на заданное время `ticks_before_disconnect`, и отключается - после дожидается окончание заполнения буфера ДМА и обрабатывается: находится минимальный/максимальный пик и среднее напряжение в том районе -По итогу сохраняется скачок напряжение при обратном включении диода +По итогу сохраняется скачок напряжение при обратном включении диода `htest->DiodeReversePeakVolt`. -## Тест перехода из прямого подключении в обратное (TESTER_TestDiode_PosNegPower) -- ожидается задержка, перед началом работы ticks_before_test -- подключается положительное напряжение на заданное время msticks_for_positive_dc -- включается АЦП в дма режиме -- ожидается задержка, перед предполагаемым скачком ticks_before_go_to_peak -- переключается положительное напряжение на отрицательное на заданное время ticks_before_disconnect +## Тест перехода из прямого подключении в обратное (`TESTER_TestDiode_SwitchConnection`) +- ожидается задержка, перед началом работы `ticks_before_test` +- диод подключается в прямом направлении на заданное время `msticks_for_forward` +- после истечения задержки сохраняется прямое напражение на диоде +- диод отключается от питания и выжидается мертвое время `ticks_deadtime` +- включается АЦП в дма режиме +- ожидается задержка, перед предполагаемым скачком `ticks_before_peak` +- диод подключается в обратном направлении на заданное время `ticks_before_disconnect` - дожидается окончание заполнения буфера ДМА и обрабатывается: находится минимальный/максимальный пик и среднее напряжение в том районе -По итогу сохраняется напряжение прямого включения диода и скачок при обратном +По итогу сохраняется напряжение прямого включения диода `htest->DiodeForwardVolt` и скачок при обратном `htest->DiodeReversePeakVolt`. # Внутренняя настройка -В начале программы в регистрах модбас выставляются дефолтные настройки из tester_config.h (TESTER_Set_Default_Settings) -После эти настройки подтягиваются в структуры тестера, через отдельную функцию (TESTER_UpdateSettings). Она вызывается перед каждым тестом. +В начале программы в регистрах модбас выставляются дефолтные настройки из tester_config.h (`TESTER_Set_Default_Settings`) +После эти настройки подтягиваются в структуры тестера, через отдельную функцию (`TESTER_UpdateSettings`). Она вызывается перед каждым тестом. ## tester_config.h -Содержит дефолтные настройки для таймингов (TESTER_SW_TIMINGS_CONFIG): -- количество тиков и дефайн для включения миллисекундной задержки. +Содержит дефолтные настройки для таймингов (`TESTER_SW_TIMINGS_CONFIG`): +- количество тиков и дефайн для включения миллисекундной разных задержек. -для светодиода и кнопки (TESTER_INTERFACE_CONFIG): +для светодиода и кнопки (`TESTER_INTERFACE_CONFIG`): - состояния пина для включения и выключения светодиода - порт и пин светодиода - частоты моргания для разных режимов работы @@ -75,17 +81,26 @@ - порт и пин кнопки - задержка для выжидания дребезга -для управления ключами (TESTER_ADC_CONFIG): -- USE_HAL_GPIO_FUNCTIONS - использовать HAL_GPIO-функции. Без неё переключается быстрее -- ALL_SW_USE_SAME_PORT - используется один пор для всех ключей. Если не используется HAL, то позволяет переключить ключи на обоих источникам синхронно -- состояния пина для подключения и отключения питания -- порт и пины для ключей положительного питания (порт общий для двух ключей) -- порт и пины для ключей положительного питания +для управления ключами (`TESTER_PHASE_SW_CONFIG`): +- `USE_HAL_GPIO_FUNCTIONS` - использовать HAL_GPIO-функции. Без неё переключается быстрее +- `RECONNECT_WITHOUT_DEADTIME` - отключить дедтайм при переключении. Если отключить еще и USE_HAL_GPIO_FUNCTIONS, то переключатся фазы будут почти синхронно (быстрее десятков мкс). Хз надо ли такое, но возможность есть +- порт и пины для двух ключей обратного подключения диода (порт общий для двух ключей) +- порт и пины для двух ключей обратного подключения диода (порт общий для двух ключей) -для АЦП (TESTER_ADC_CONFIG): -- размер dma буффера (ADC_BUFF_SIZE, ADC_DMA_BUFF_SIZE) -- калибровочное напряжение АЦП (ADC_U_CALIBR) -- значение АЦП при калибровочном напряжении (ADC_VALUE_CALIBR) -- значение АЦП при нулевом напряжении (ADC_VALUE_ZERO) -- таймаут на чтение АЦП (ADC_READ_TIMEOUT_MS) -- ожидаемая длина импульса в отсчетах АЦП (TESTER_ADC_PULES_EXPETCED_WIDTH) \ No newline at end of file +для АЦП (`TESTER_ADC_CONFIG`): +- размер dma буффера (`ADC_BUFF_SIZE, ADC_DMA_BUFF_SIZE`) +- калибровочное напряжение АЦП (`ADC_U_CALIBR`) +- значение АЦП при калибровочном напряжении (`ADC_VALUE_CALIBR`) +- значение АЦП при нулевом напряжении (`ADC_VALUE_ZERO`) +- таймаут на чтение АЦП (`ADC_READ_TIMEOUT_MS`) +- ожидаемая длина импульса в отсчетах АЦП (`TESTER_ADC_PULES_EXPETCED_WIDTH`) +Из этого рассчитывается шаг АЦП: `Adc_U_Calibr/(Adc_CalibrValue - Adc_ZeroValue)` + +## Структуры для настроек +Настройки для таймингов записываются в структуру `SwTimings`, которая находится в `htest`/`hTestDiode (глобально)`, а она уже в главной структуре проекта `TESTER`. + +Настройки светодиода и кнопки записываются в структуры `leds.LED1` и `SwStart`. Они находятся в структуре проекта `TESTER` + +Настройки для портов и пинов ключей записываются в структуры `SwPhaseForward` и `SwPhaseReverse`, которые находится в `htest`/`hTestDiode (глобально)`, а она уже в главной структуре проекта `TESTER`. + +Настройки для АЦП записыватся в структуру `TESTER.htest->adc->chAdc.s` (`ADC_ParamsTypeDef`). \ No newline at end of file From 15774d179b283a0d117eb89dca26d465b7eca076 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Mon, 23 Dec 2024 15:30:35 +0300 Subject: [PATCH 5/5] =?UTF-8?q?#3=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B8=D0=BD=D0=B4=D0=B8=D0=BA=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=87=D0=B0=D0=BB=D0=BE=D0=BC=20=D1=82=D0=B5=D1=81=D1=82=D0=B0?= =?UTF-8?q?=20=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7=D0=BC=20=D0=B4=D0=B5=D0=B4?= =?UTF-8?q?=D1=82=D0=B0=D0=B9=D0=BC=D0=B0=20=D0=B8=20=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=D0=BB=D0=BE=20=D1=81=D1=87=D0=B8=D1=82=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=90=D0=A6=D0=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Теперь это считается в TESTER_Reconnect_TwoPhases: Если дедтайм меньше 100мкс, сначала начинает считывание АЦП, а потом переключаем ключи. Потому что функция запуска АЦП занимает 30мкс и в таком случае она будет сильно увеличивать заданный дедтайм. Иначе сначала диод отключается от всего, выжидается дедтайм, потом запускается АЦП и включается в обратном направлении. В таком порядке потому что запуск АЦП должен быть рядом с включем диода в обратном направлении, чтобы словить пик в буффере АЦП --- .../Core/Tester_main/tester_adc_func.c | 4 +-- diode_tester/Core/Tester_main/tester_config.h | 4 +-- diode_tester/Core/Tester_main/tester_func.c | 33 ++++++++++++++--- .../Core/Tester_main/tester_interface_func.c | 36 +++++++++++++++---- .../Core/Tester_main/tester_interface_func.h | 15 ++++++-- diode_tester/Core/Tester_main/tester_main.c | 4 +-- diode_tester/MDK-ARM/diode_tester.uvoptx | 5 +++ 7 files changed, 83 insertions(+), 18 deletions(-) diff --git a/diode_tester/Core/Tester_main/tester_adc_func.c b/diode_tester/Core/Tester_main/tester_adc_func.c index 7775991..b4e9a2d 100644 --- a/diode_tester/Core/Tester_main/tester_adc_func.c +++ b/diode_tester/Core/Tester_main/tester_adc_func.c @@ -93,8 +93,8 @@ HAL_StatusTypeDef ADC_DMA_StartRead(TESTER_ADCTypeDef *adc) { HAL_StatusTypeDef res; - /* Очистка буферов каналов */ - ClearStruct(adc->chAdc.ADC_Buff); + if(adc->f.adc_running) + return HAL_BUSY; /* Очистка флага какая половина DMA уже готова */ adc->f.dmaBufferHalfDone = 0; // никакая, данные DMA пока не готовы в принципе diff --git a/diode_tester/Core/Tester_main/tester_config.h b/diode_tester/Core/Tester_main/tester_config.h index 7e61df3..f9ecec1 100644 --- a/diode_tester/Core/Tester_main/tester_config.h +++ b/diode_tester/Core/Tester_main/tester_config.h @@ -78,8 +78,8 @@ #define LED1_Pin GPIO_PIN_13 ///< Пин светодиода (при перенастройке надо также перенастроить через cube) /* Периоды моргания светодиода */ -#define LED_FORWARD_DIODE_PERIOD 250 ///< Моргание для индикации подключенного положительного напряжения -#define LED_REVERSE_DIODE_PERIOD 25 ///< Моргание для индикации подключенного отрицательного напряжения +#define LED_FORWARD_DIODE_PERIOD 250 ///< Моргание для индикации подключенного положительного напряжения +#define LED_REVERSE_DIODE_PERIOD 25 ///< Моргание для индикации подключенного отрицательного напряжения #define LED_BLINK_AS_ON 5 ///< Моргание незаметное для глаза (светодиод просто включен) diff --git a/diode_tester/Core/Tester_main/tester_func.c b/diode_tester/Core/Tester_main/tester_func.c index d834757..fcfdfc2 100644 --- a/diode_tester/Core/Tester_main/tester_func.c +++ b/diode_tester/Core/Tester_main/tester_func.c @@ -21,7 +21,11 @@ void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest, TESTER_LEDsTypeDef *leds */ void TESTER_TestDiode_Forward(TESTER_TestHandleTypeDef *htest) { + /* Очистка буферов каналов */ + ClearStruct(htest->adc->chAdc.ADC_Buff); + /* Задержка, перед началом работы */ + TESTER_LED_TimeoutForStartTest(&htest->leds->LED1); TESTER_Delay(&htest->SwTimings.ticks_before_test, &hmcstim); TESTER_LED_TestingDiodeForward(&htest->leds->LED1); @@ -60,7 +64,11 @@ void TESTER_TestDiode_Forward(TESTER_TestHandleTypeDef *htest) */ void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest) { + /* Очистка буферов каналов */ + ClearStruct(htest->adc->chAdc.ADC_Buff); + /* Задержка, перед началом работы */ + TESTER_LED_TimeoutForStartTest(&htest->leds->LED1); TESTER_Delay(&htest->SwTimings.ticks_before_test, &hmcstim); TESTER_LED_TestingDiodeReverse(&htest->leds->LED1); @@ -94,7 +102,11 @@ void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest) */ void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest) { + /* Очистка буферов каналов */ + ClearStruct(htest->adc->chAdc.ADC_Buff); + /* Задержка, перед началом работы */ + TESTER_LED_TimeoutForStartTest(&htest->leds->LED1); TESTER_Delay(&htest->SwTimings.ticks_before_test, &hmcstim); TESTER_LED_TestingDiodeForward(&htest->leds->LED1); @@ -160,7 +172,20 @@ void TESTER_Disconnect_Phase(TESTER_PhaseSwitchTypeDef *DCSw) */ void TESTER_Reconnect_TwoPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_PhaseSwitchTypeDef *SwPhaseB, TESTER_TicksDelayTypeDef *deadtime) { + /* Если дедтайм меньше 100 мкс, то сначала запускаем АЦП а потом дедтаймим */ + /* Потому что эта функция по длительности порядка 30 мкс, поэтому дедтайм получается не может быть меньше 30 мкс*/ + if(deadtime->msdelay == 0) + { + if(deadtime->ticks < 100) + { + /* Включение АЦП */ + ADC_DMA_StartRead(hTestDiode.adc); + } + } + + #ifdef USE_HAL_GPIO_FUNCTIONS + HAL_GPIO_WritePin(SwPhaseA->SW_Port, SwPhaseA->SwHI_Pin | SwPhaseA->SwLO_Pin, PHASE_DISCONNECT); #ifndef RECONNECT_WITHOUT_DEADTIME @@ -186,22 +211,22 @@ void TESTER_Reconnect_TwoPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_Phas #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, &hmcstim); - + /* Включение АЦП */ ADC_DMA_StartRead(hTestDiode.adc); /* Ожидается задержка, перед предполагаемым скачком */ TESTER_Delay(&hTestDiode.SwTimings.ticks_before_expected_peak, &hmcstim); - + #if (PHASE_CONNECT == 1) SwPhaseB->SW_Port->BSRR = SwPhaseB->SwHI_Pin | SwPhaseB->SwLO_Pin; #else //PHASE_CONNECT == 0 diff --git a/diode_tester/Core/Tester_main/tester_interface_func.c b/diode_tester/Core/Tester_main/tester_interface_func.c index 502a04e..da63284 100644 --- a/diode_tester/Core/Tester_main/tester_interface_func.c +++ b/diode_tester/Core/Tester_main/tester_interface_func.c @@ -8,12 +8,20 @@ void TESTER_InterfaceInit(TESTER_SwitchStartTypeDef *swstart, TESTER_LEDsTypeDef { } +/** +* @brief Включить индикацию таймаута старта при активации теста + */ +void TESTER_LED_TimeoutForStartTest(TESTER_LEDTypeDef *led) +{ + TESTER_LED_Off(led); +} /** * @brief Включить индикацию прямого подключения диода */ void TESTER_LED_TestingDiodeForward(TESTER_LEDTypeDef *led) { + led->state = LED_IS_BLINKING; led->period = LED_FORWARD_DIODE_PERIOD; } /** @@ -21,13 +29,16 @@ void TESTER_LED_TestingDiodeForward(TESTER_LEDTypeDef *led) */ void TESTER_LED_TestingDiodeReverse(TESTER_LEDTypeDef *led) { + led->state = LED_IS_BLINKING; led->period = LED_REVERSE_DIODE_PERIOD; } /** -* @brief Выключить индикацию ожидания комманды + * @brief Выключить индикацию ожидания комманды + * @details Сделано через моргание, чтобы понимать, что системные тики работают */ void TESTER_LED_WaitForAction(TESTER_LEDTypeDef *led) { + led->state = LED_IS_BLINKING; led->period = LED_BLINK_AS_ON; } @@ -63,6 +74,7 @@ uint8_t TESTER_ReadSwichStart(TESTER_SwitchStartTypeDef *swstart) */ void TESTER_LED_On(TESTER_LEDTypeDef *led) { + led->state = LED_IS_ON; HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, LED_ON); } /** @@ -70,18 +82,30 @@ void TESTER_LED_On(TESTER_LEDTypeDef *led) */ void TESTER_LED_Off(TESTER_LEDTypeDef *led) { + led->state = LED_IS_OFF; HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, LED_OFF); } +/** + * @brief Активировать моргание светодиодом + */ +void TESTER_LED_Blink_Start(TESTER_LEDTypeDef *led) +{ + led->state = LED_IS_BLINKING; +} + /** * @brief Моргание светодиодом */ -void TESTER_LED_Blink(TESTER_LEDTypeDef *led) +void TESTER_LEDBlink_Handle(TESTER_LEDTypeDef *led) { - uint32_t tickcurrent = HAL_GetTick(); - if((tickcurrent - led->tickprev) > led->period) + if(led->state == LED_IS_BLINKING) { - HAL_GPIO_TogglePin(led->LED_Port, led->LED_Pin); - led->tickprev = tickcurrent; + uint32_t tickcurrent = HAL_GetTick(); + if((tickcurrent - led->tickprev) > led->period) + { + HAL_GPIO_TogglePin(led->LED_Port, led->LED_Pin); + led->tickprev = tickcurrent; + } } } diff --git a/diode_tester/Core/Tester_main/tester_interface_func.h b/diode_tester/Core/Tester_main/tester_interface_func.h index 39ec1d7..37cfd72 100644 --- a/diode_tester/Core/Tester_main/tester_interface_func.h +++ b/diode_tester/Core/Tester_main/tester_interface_func.h @@ -14,9 +14,17 @@ #include "mylibs_include.h" #include "rs_message.h" +typedef enum +{ + LED_IS_OFF = 0, + LED_IS_ON = 1, + LED_IS_BLINKING = 2, +}TESTER_LEDStateTypeDef; typedef struct { + TESTER_LEDStateTypeDef state; + GPIO_TypeDef *LED_Port; uint32_t LED_Pin; @@ -46,7 +54,8 @@ typedef struct void TESTER_InterfaceInit(TESTER_SwitchStartTypeDef *swstart, TESTER_LEDsTypeDef *leds); - +/* Включить индикацию таймаута старта при активации теста */ +void TESTER_LED_TimeoutForStartTest(TESTER_LEDTypeDef *led); /* Включить индикацию прямого подключения диода */ void TESTER_LED_TestingDiodeForward(TESTER_LEDTypeDef *led); /* Включить индикацию обратного подключения диода */ @@ -60,7 +69,9 @@ uint8_t TESTER_ReadSwichStart(TESTER_SwitchStartTypeDef *swstart); void TESTER_LED_On(TESTER_LEDTypeDef *led); /* Выключить светодиод */ void TESTER_LED_Off(TESTER_LEDTypeDef *led); +/* Активировать моргание светодиодом */ +void TESTER_LED_Blink_Start(TESTER_LEDTypeDef *led); /* Моргание светодиодом */ -void TESTER_LED_Blink(TESTER_LEDTypeDef *led); +void TESTER_LEDBlink_Handle(TESTER_LEDTypeDef *led); #endif //_TESTER_INTERFACE_FUNC_H_ diff --git a/diode_tester/Core/Tester_main/tester_main.c b/diode_tester/Core/Tester_main/tester_main.c index fbe639e..cdb4fd5 100644 --- a/diode_tester/Core/Tester_main/tester_main.c +++ b/diode_tester/Core/Tester_main/tester_main.c @@ -14,7 +14,7 @@ void TESTER_Init(TESTER_ProjectTypeDef *tester) tester->delay = 250; tester->delay_en = 0; - tester->htest->adc->chAdc.s + tester->func.disable_reset_call = 0; tester->htest = &hTestDiode; TESTER_HandleInit(tester->htest, &tester->leds); @@ -136,7 +136,7 @@ void TESTER_InterfaceHandle(TESTER_ProjectTypeDef *tester) } - TESTER_LED_Blink(&tester->leds.LED1); + TESTER_LEDBlink_Handle(&tester->leds.LED1); } diff --git a/diode_tester/MDK-ARM/diode_tester.uvoptx b/diode_tester/MDK-ARM/diode_tester.uvoptx index 05114cd..b1024a4 100644 --- a/diode_tester/MDK-ARM/diode_tester.uvoptx +++ b/diode_tester/MDK-ARM/diode_tester.uvoptx @@ -212,6 +212,11 @@ 2 ADC_DMA_HalfBuff,0x0A + + 6 + 2 + \\diode_tester\../Core/Tester_main/tester_main.c\TESTER + 0