#3 Сделаны улучшенные функции управления ключами, добавлены настройки по таймингам в tester_config.h

По переключениям:
-Теперь для двух ключей одного питания должен быть один порт

- Добавлена функция реконнекта питания TESTER_Reconnect_Power(), чтобы быстрее переключать с положительного на отрицательный. А не через отдельные функции TESTER_Disconnect_Power(), TESTER_Connect_Power()

- Сделан дефайн USE_HAL_GPIO_FUNCTIONS для испольщования HAL GPIO функций. Его можно убрать и пины будуте переключаться напрямую через BSRR.

- Также сделан дефайн ALL_SW_USE_SAME_PORT, чтобы переключать все 4 пина в BSRR в одну комманду

Это поможет в случае функции реконнекта, где HAL функции сначала отключают питание, а потом подключат другое. Из-за этого появляются задержки в 580 мкс (SW Timings with HAL GPIO write.sal),

Если убрать USE_HAL_GPIO_FUNCTIONS, то сократиться время переключения между питаниями до 160мкс (SW Timings without HAL GPIO write and different ports.sal)

А если еще выставить ALL_SW_USE_SAME_PORT, то через BSRR будет выставлятся все 4 пина, и задержек нет (SW Timings without HAL GPIO write.sal). Ну почти, иногда проскакивают 2 мкс (SW Timings without HAL GPIO write 2.sal)
This commit is contained in:
2024-12-19 13:57:51 +03:00
parent 7f6932631e
commit 13825e068c
10 changed files with 164 additions and 41 deletions

View File

@@ -11,8 +11,50 @@
#ifndef _TESTER_CONFIG_H_
#define _TESTER_CONFIG_H_
#define TESTER_PULES_EXPETCED_WIDTH 4 ///< Предполагаемая длительность пика в отчетах ацп
/**
* @addtogroup TESTER_SW_TIMINGS_CONFIG Configs for switching timings
* @ingroup TESTER_CONFIGS
* @brief Конфигурации таймингов для ключей питания
@{
*/
/**
* @brief Задержка (миллисекундная) для положительного напряжения ПО УМОЛЧАНИЮ
* @details Пока только миллисекунды, т.к. меньше я пока не реализовал, да и как понимаю не требуется
*/
#define DEF_MS_TIME_FOR_POSITIVE 1000
/**
* @brief Задержка перед началом тестирования ПО УМОЛЧАНИЮ
* @details Задержка миллисекундная или тики for() @ref TIME_BEFORE_TEST_MS_DELAY
*/
#define DEF_TIME_BEFORE_TEST 500
#define DEF_TIME_BEFORE_TEST_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_TEST по умолчанию
/**
* @brief Задержка между включением АЦП и предполагаемым скачком напряжения ПО УМОЛЧАНИЮ
* @details Задержка нужна, чтобы точно поймать его в буфере АЦП.
*
* Задержка миллисекундная или тики for() @ref TIME_BEFORE_TEST_MS_DELAY
* @note Но если миллисекундная, то скорее всего скачок не попадет в буфер АЦП.
* Поэтому желательно только тики for() (@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 - миллисекундная)
/**
* @brief Задержка перед окончанием тестирования (отключение питания) ПО УМОЛЧАНИЮ
* @details Задержка миллисекундная или тики for() @ref TIME_BEFORE_DISCONNECT_MS_DELAY
*/
#define DEF_TIME_BEFORE_DISCONNECT 50
#define DEF_TIME_BEFORE_DISCONNECT_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_DISCONNECT (0 - задержка for(), 1 - миллисекундная)
/** TESTER_SW_TIMINGS_CONFIG
* @}
*/
/**
* @addtogroup TESTER_POWER_SW_CONFIG Configs for switches for power
@@ -20,28 +62,28 @@
* @brief Конфигурации для ключей питания
@{
*/
//#define USE_HAL_GPIO_FUNCTIONS ///< Использовать для переключения пинов HAL функции
//#define ALL_SW_USE_SAME_PORT ///< Дефайн указывающий что все пины будут иметь один порт (для ускорения переключения)
/* Состояния ключей для подключения и откючения питания */
#define POWER_CONNECT 1 ///< Питание подключено в данном состоянии пина
#define POWER_DISCONNECT 0 ///< Питание отключено в данном состоянии пина
/* Ключи для подключения положительного питания к диоду */
#define SWITCH_DC_POSITIVE_1_Port GPIOC ///< Порт пина первого ключа для положительного питания
#define SWITCH_DC_POSITIVE_1_Pin GPIO_PIN_13 ///< Пин первого ключа для положительного питания
#define SWITCH_DC_POSITIVE_2_Port GPIOA ///< Порт пина второго ключа для положительного питания
#define SWITCH_DC_POSITIVE_2_Pin GPIO_PIN_11 ///< Пин второго ключа для положительного питания
#define SWITCH_DC_POSITIVE_Port GPIOB ///< Порт пина первого ключа для земли положительного источника питания
#define SWITCH_DC_POSITIVE_GND_Pin GPIO_PIN_10 ///< Пин первого ключа для земли положительного источника питания
#define SWITCH_DC_POSITIVE_VDD_Pin GPIO_PIN_11 ///< Пин второго ключа для напряжения положительного источника ппитания
/* Ключи для подключения отрицательного питания к диоду */
#define SWITCH_DC_NEGATIVE_1_Port GPIOC ///< Порт пина первого ключа для отрицательного питания
#define SWITCH_DC_NEGATIVE_1_Pin GPIO_PIN_13 ///< Пин первого ключа для отрицательного питания
#define SWITCH_DC_NEGATIVE_2_Port GPIOA ///< Порт пина второго ключа для отрицательного питания
#define SWITCH_DC_NEGATIVE_2_Pin GPIO_PIN_11 ///< Пин первого ключа для отрицательного питания
#define SWITCH_DC_NEGATIVE_Port GPIOB ///< Порт пина первого ключа для земли отрицательного источника ппитания
#define SWITCH_DC_NEGATIVE_GND_Pin GPIO_PIN_0 ///< Пин первого ключа для земли отрицательного источника ппитания
#define SWITCH_DC_NEGATIVE_VDD_Pin GPIO_PIN_1 ///< Пин первого ключа для напряжения отрицательного источника ппитания
/** TESTER_POWER_SW_CONFIG
* @}
*/
/**
* @addtogroup TESTER_ADC_CONFIG Configs for ADC
* @ingroup TESTER_CONFIGS

View File

@@ -7,20 +7,35 @@ TESTER_TestHandleTypeDef hTestDiode;
*/
void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest)
{
htest->adc = &tester_adc;
/* Настройка структуры АЦП */
htest->adc = &tester_adc;
TESTER_ADC_StructInit(htest->adc);
htest->DCNegSw.SW1_Port = SWITCH_DC_NEGATIVE_1_Port;
htest->DCNegSw.SW2_Port = SWITCH_DC_NEGATIVE_2_Port;
htest->DCNegSw.SW1_Pin = SWITCH_DC_NEGATIVE_1_Pin;
htest->DCNegSw.SW2_Pin = SWITCH_DC_NEGATIVE_2_Pin;
/* Настройка пинов для подключения отрицательного источника */
htest->DCNegSw.SW_Port = SWITCH_DC_NEGATIVE_Port;
htest->DCNegSw.SwGND_Pin = SWITCH_DC_NEGATIVE_GND_Pin;
htest->DCNegSw.SwVDD_Pin = SWITCH_DC_NEGATIVE_VDD_Pin;
/* Настройка пинов для подключения положительного источника */
htest->DCPosSw.SW_Port = SWITCH_DC_POSITIVE_Port;
htest->DCPosSw.SwGND_Pin = SWITCH_DC_POSITIVE_GND_Pin;
htest->DCPosSw.SwVDD_Pin = SWITCH_DC_POSITIVE_VDD_Pin;
htest->DCPosSw.SW1_Port = SWITCH_DC_POSITIVE_1_Port;
htest->DCPosSw.SW2_Port = SWITCH_DC_POSITIVE_2_Port;
htest->DCPosSw.SW1_Pin = SWITCH_DC_POSITIVE_1_Pin;
htest->DCPosSw.SW2_Pin = SWITCH_DC_POSITIVE_2_Pin;
/* Настройка таймингов по умолчанию для тестирования */
htest->SwTimings.msticks_for_positive_dc = DEF_MS_TIME_FOR_POSITIVE;
htest->SwTimings.ticks_before_disconnect.ticks = DEF_TIME_BEFORE_DISCONNECT;
htest->SwTimings.ticks_before_disconnect.msdelay = DEF_TIME_BEFORE_DISCONNECT_MS_DELAY;
htest->SwTimings.ticks_before_go_to_peak.ticks = DEF_TIME_BEFORE_PEAK;
htest->SwTimings.ticks_before_go_to_peak.msdelay = DEF_TIME_BEFORE_PEAK_MS_DELAY;
htest->SwTimings.ticks_before_test.ticks = DEF_TIME_BEFORE_TEST;
htest->SwTimings.ticks_before_test.msdelay = DEF_TIME_BEFORE_TEST_MS_DELAY;
htest->continuous_buff_size = 20;
}
@@ -109,8 +124,7 @@ void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest)
TESTER_Delay(&htest->SwTimings.ticks_before_go_to_peak);
/* Отключение питания от диода */
TESTER_Disconnect_Power(&htest->DCPosSw);
TESTER_Connect_Power(&htest->DCNegSw);
TESTER_Reconnect_Power(&htest->DCPosSw, &htest->DCNegSw);
/* Подключение отрицательного питания на определенное время */
TESTER_Delay(&htest->SwTimings.ticks_before_disconnect);
@@ -128,18 +142,62 @@ void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest)
*/
void TESTER_Connect_Power(TESTER_PowerSwitchTypeDef *DCSw)
{
HAL_GPIO_WritePin(DCSw->SW1_Port, DCSw->SW1_Pin, POWER_CONNECT);
HAL_GPIO_WritePin(DCSw->SW2_Port, DCSw->SW2_Pin, POWER_CONNECT);
#ifdef USE_HAL_GPIO_FUNCTIONS // in tester_config.h
HAL_GPIO_WritePin(DCSw->SW_Port, DCSw->SwGND_Pin | DCSw->SwVDD_Pin, POWER_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
#endif //USE_HAL_GPIO_FUNCTIONS
}
/**
* @brief Отключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef
*/
void TESTER_Disconnect_Power(TESTER_PowerSwitchTypeDef *DCSw)
{
HAL_GPIO_WritePin(DCSw->SW1_Port, DCSw->SW1_Pin, POWER_DISCONNECT);
HAL_GPIO_WritePin(DCSw->SW2_Port, DCSw->SW2_Pin, POWER_DISCONNECT);
#ifdef USE_HAL_GPIO_FUNCTIONS
HAL_GPIO_WritePin(DCSw->SW_Port, DCSw->SwGND_Pin | DCSw->SwVDD_Pin, POWER_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
#endif //USE_HAL_GPIO_FUNCTIONS
}
/**
* @brief Переключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef
*/
void TESTER_Reconnect_Power(TESTER_PowerSwitchTypeDef *DCPosSw, TESTER_PowerSwitchTypeDef *DCNegSw)
{
#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
#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
#endif //USE_HAL_GPIO_FUNCTIONS
}
/**
* @brief Формирование задержки (в тиках или миллисекундная)
*/

View File

@@ -19,11 +19,9 @@
*/
typedef struct
{
GPIO_TypeDef *SW1_Port; ///< Порт пина первого ключа для питания
uint32_t SW1_Pin; ///< Пин первого ключа для питания
GPIO_TypeDef *SW2_Port; ///< Порт пина второго ключа для питания
uint32_t SW2_Pin; ///< Пин второго ключа для питания
GPIO_TypeDef *SW_Port; ///< Порт первого ключа для питания
uint32_t SwGND_Pin; ///< Пин первого ключа для питания
uint32_t SwVDD_Pin; ///< Пин второго ключа для питания
}TESTER_PowerSwitchTypeDef;
@@ -43,8 +41,8 @@ typedef struct
{
uint32_t msticks_for_positive_dc; ///< миллисекундная задержка для положительного напряжения @ref TESTER_TestDiode_PositivePower
TESTER_TicksDelayTypeDef ticks_before_test; ///< задержка перед началом тестирования (мс или тики for())
TESTER_TicksDelayTypeDef ticks_before_disconnect; ///< задержка перед выключением питания (мс или тики for())
TESTER_TicksDelayTypeDef ticks_before_go_to_peak; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или тики for())
TESTER_TicksDelayTypeDef ticks_before_disconnect; ///< задержка перед выключением питания (мс или тики for())
}TESTER_SwitchTimingsTypeDef;
/**
@@ -81,6 +79,8 @@ void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest);
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);
/* Формирование задержки перед подключением питания (в тиках или миллисекундная) */
void TESTER_Delay(TESTER_TicksDelayTypeDef *tickdelay);
#endif //_TESTER_FUNC_H_

View File

@@ -10,9 +10,9 @@ TESTER_ProjectTypeDef TESTER;
void TESTER_Init(TESTER_ProjectTypeDef *tester)
{
tester->delay = 250;
tester->delay_en = 1;
tester->delay_en = 0;
tester->func.disable_reset_call = 1;
tester->func.disable_reset_call = 0;
tester->htest = &hTestDiode;
TESTER_HandleInit(tester->htest);
}