#3 Добавлена индикация перед началом теста и изменен механизм дедтайма и начало считывания АЦП

Теперь это считается в TESTER_Reconnect_TwoPhases:
Если дедтайм меньше 100мкс, сначала начинает считывание АЦП, а потом переключаем ключи. Потому что функция запуска АЦП занимает 30мкс и в таком случае она будет сильно увеличивать заданный дедтайм.
Иначе сначала диод отключается от всего, выжидается дедтайм, потом запускается АЦП и включается в обратном направлении. В таком порядке потому что запуск АЦП должен быть рядом с включем диода в обратном направлении, чтобы словить пик в буффере АЦП
This commit is contained in:
Razvalyaev 2024-12-23 15:30:35 +03:00
parent 0cba8cda8a
commit 15774d179b
7 changed files with 83 additions and 18 deletions

View File

@ -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 пока не готовы в принципе

View File

@ -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

View File

@ -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 Выключить индикацию ожидания комманды
* @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,13 +82,24 @@ 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)
{
if(led->state == LED_IS_BLINKING)
{
uint32_t tickcurrent = HAL_GetTick();
if((tickcurrent - led->tickprev) > led->period)
@ -85,3 +108,4 @@ void TESTER_LED_Blink(TESTER_LEDTypeDef *led)
led->tickprev = tickcurrent;
}
}
}

View File

@ -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_

View File

@ -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);
}

View File

@ -212,6 +212,11 @@
<WinNumber>2</WinNumber>
<ItemText>ADC_DMA_HalfBuff,0x0A</ItemText>
</Ww>
<Ww>
<count>6</count>
<WinNumber>2</WinNumber>
<ItemText>\\diode_tester\../Core/Tester_main/tester_main.c\TESTER</ItemText>
</Ww>
</WatchWindow2>
<Tracepoint>
<THDelay>0</THDelay>