From 15774d179b283a0d117eb89dca26d465b7eca076 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Mon, 23 Dec 2024 15:30:35 +0300 Subject: [PATCH] =?UTF-8?q?#3=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B8=D0=BD=D0=B4=D0=B8=D0=BA=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=20=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=D0=BB=D0=BE=D0=BC=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=20?= =?UTF-8?q?=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