Добавлены коилы для включения отдельных ключей. Протестирован modbus - работает.
Чуть оптимизированы функции переключения ключей: теперь ifdef для использования HAL функций не в test_func.c а в test_func.h
This commit is contained in:
@@ -106,7 +106,7 @@
|
||||
@{
|
||||
*/
|
||||
//#define USE_HAL_GPIO_FUNCTIONS ///< По этому дефайну для переключения пинов будут использоваться HAL_GPIO функции
|
||||
//#define RECONNECT_WITHOUT_DEADTIME ///< По этому дефайну дедтайм отключается. Если отключить и USE_HAL_GPIO_FUNCTIONS, то переключатся фазы будут почти синхронно (быстрее десятков мкс)
|
||||
//#define RECONNECT_WITHOUT_DEADTIME ///< По этому дефайну дедтайм отключается. Если отключить и USE_HAL_GPIO_FUNCTIONS, то переключатся фазы будут почти синхронно (160 нс)
|
||||
|
||||
/* Состояния ключей для подключения и откючения питания */
|
||||
#define PHASE_CONNECT 1 ///< Ключ замкнут подключено в данном состоянии пина
|
||||
|
||||
@@ -21,6 +21,8 @@ void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest, TESTER_LEDsTypeDef *leds
|
||||
*/
|
||||
void TESTER_TestDiode_Forward(TESTER_TestHandleTypeDef *htest)
|
||||
{
|
||||
/* Отключение питания от диода */
|
||||
TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward);
|
||||
/* Очистка буферов каналов */
|
||||
ClearStruct(htest->adc->chAdc.ADC_Buff);
|
||||
|
||||
@@ -48,8 +50,7 @@ void TESTER_TestDiode_Forward(TESTER_TestHandleTypeDef *htest)
|
||||
}
|
||||
|
||||
/* Отключение питания от диода */
|
||||
TESTER_Disconnect_Phase(&htest->SwPhaseForward);
|
||||
TESTER_Disconnect_Phase(&htest->SwPhaseReverse);
|
||||
TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward);
|
||||
|
||||
/* Выключение континиус АЦП */
|
||||
HAL_ADC_Stop(htest->adc->hadc);
|
||||
@@ -64,6 +65,8 @@ void TESTER_TestDiode_Forward(TESTER_TestHandleTypeDef *htest)
|
||||
*/
|
||||
void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest)
|
||||
{
|
||||
/* Отключение питания от диода */
|
||||
TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward);
|
||||
/* Очистка буферов каналов */
|
||||
ClearStruct(htest->adc->chAdc.ADC_Buff);
|
||||
|
||||
@@ -85,8 +88,7 @@ void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest)
|
||||
TESTER_Delay(&htest->SwTimings.ticks_before_disconnect, &hmcstim);
|
||||
|
||||
/* Отключение питания от диода */
|
||||
TESTER_Disconnect_Phase(&htest->SwPhaseReverse);
|
||||
TESTER_Disconnect_Phase(&htest->SwPhaseForward);
|
||||
TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward);
|
||||
|
||||
/* Обработка DMA */
|
||||
ADC_DMA_ReadForPeak(htest->adc, ADC_READ_TIMEOUT_MS);
|
||||
@@ -102,6 +104,8 @@ void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest)
|
||||
*/
|
||||
void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest)
|
||||
{
|
||||
/* Отключение питания от диода */
|
||||
TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward);
|
||||
/* Очистка буферов каналов */
|
||||
ClearStruct(htest->adc->chAdc.ADC_Buff);
|
||||
|
||||
@@ -125,8 +129,7 @@ void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest)
|
||||
TESTER_Delay(&htest->SwTimings.ticks_before_disconnect, &hmcstim);
|
||||
|
||||
/* Отключение питания от диода */
|
||||
TESTER_Disconnect_Phase(&htest->SwPhaseReverse);
|
||||
TESTER_Disconnect_Phase(&htest->SwPhaseForward);
|
||||
TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward);
|
||||
|
||||
/* Обработка DMA */
|
||||
ADC_DMA_ReadForPeak(htest->adc, ADC_READ_TIMEOUT_MS);
|
||||
@@ -136,37 +139,45 @@ void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest)
|
||||
htest->DiodeReversePeakVolt = htest->adc->chAdc.U_Current;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Тестирование одного ключа
|
||||
*/
|
||||
void TESTER_TestOneSwitch(GPIO_TypeDef *SwPort, uint32_t SwPin, uint8_t flag)
|
||||
{
|
||||
if(flag)
|
||||
{
|
||||
TESTER_PhaseSwSingle_Set(SwPort, SwPin);
|
||||
}
|
||||
else
|
||||
{
|
||||
TESTER_PhaseSwSingle_Reset(SwPort, SwPin);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Подключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef
|
||||
*/
|
||||
void TESTER_Connect_Phase(TESTER_PhaseSwitchTypeDef *DCSw)
|
||||
void TESTER_Connect_Phase(TESTER_PhaseSwitchTypeDef *PhaseSw)
|
||||
{
|
||||
#ifdef USE_HAL_GPIO_FUNCTIONS // in tester_config.h
|
||||
HAL_GPIO_WritePin(DCSw->SW_Port, DCSw->SwHI_Pin | DCSw->SwLO_Pin, PHASE_CONNECT);
|
||||
#else // USE_HAL_GPIO_FUNCTIONS
|
||||
#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
|
||||
TESTER_PhaseSw_Set(PhaseSw);
|
||||
}
|
||||
/**
|
||||
* @brief Отключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef
|
||||
*/
|
||||
void TESTER_Disconnect_Phase(TESTER_PhaseSwitchTypeDef *DCSw)
|
||||
void TESTER_Disconnect_Phase(TESTER_PhaseSwitchTypeDef *PhaseSw)
|
||||
{
|
||||
#ifdef USE_HAL_GPIO_FUNCTIONS
|
||||
HAL_GPIO_WritePin(DCSw->SW_Port, DCSw->SwHI_Pin | DCSw->SwLO_Pin, PHASE_DISCONNECT);
|
||||
#else // USE_HAL_GPIO_FUNCTIONS
|
||||
#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
|
||||
TESTER_PhaseSw_Reset(PhaseSw);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Отключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef
|
||||
*/
|
||||
void TESTER_Disconnect_AllPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_PhaseSwitchTypeDef *SwPhaseB)
|
||||
{
|
||||
TESTER_PhaseSw_Reset(SwPhaseA);
|
||||
TESTER_PhaseSw_Reset(SwPhaseB);
|
||||
}
|
||||
/**
|
||||
* @brief Переключить две фазы с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef
|
||||
*/
|
||||
@@ -174,68 +185,40 @@ void TESTER_Reconnect_TwoPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_Phas
|
||||
{
|
||||
/* Если дедтайм меньше 100 мкс, то сначала запускаем АЦП а потом дедтаймим */
|
||||
/* Потому что эта функция по длительности порядка 30 мкс, поэтому дедтайм получается не может быть меньше 30 мкс*/
|
||||
#ifndef RECONNECT_WITHOUT_DEADTIME
|
||||
if(deadtime->msdelay == 0)
|
||||
{
|
||||
if(deadtime->ticks < 100)
|
||||
{
|
||||
#endif //RECONNECT_WITHOUT_DEADTIME
|
||||
/* Включение АЦП */
|
||||
ADC_DMA_StartRead(hTestDiode.adc);
|
||||
ADC_DMA_StartRead(hTestDiode.adc);
|
||||
|
||||
/* Ожидается задержка, перед предполагаемым скачком */
|
||||
TESTER_Delay(&hTestDiode.SwTimings.ticks_before_expected_peak, &hmcstim);
|
||||
#ifndef RECONNECT_WITHOUT_DEADTIME
|
||||
}
|
||||
}
|
||||
#endif //RECONNECT_WITHOUT_DEADTIME
|
||||
|
||||
|
||||
#ifdef USE_HAL_GPIO_FUNCTIONS
|
||||
|
||||
HAL_GPIO_WritePin(SwPhaseA->SW_Port, SwPhaseA->SwHI_Pin | SwPhaseA->SwLO_Pin, PHASE_DISCONNECT);
|
||||
TESTER_PhaseSw_Reset(SwPhaseA);
|
||||
|
||||
#ifndef RECONNECT_WITHOUT_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;
|
||||
#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
|
||||
SwPhaseB->SW_Port->BSRR = (SwPhaseB->SwHI_Pin | SwPhaseB->SwLO_Pin) << 16;
|
||||
#endif //PHASE_CONNECT
|
||||
#endif //RECONNECT_WITHOUT_DEADTIME
|
||||
#endif //USE_HAL_GPIO_FUNCTIONS
|
||||
|
||||
|
||||
TESTER_PhaseSw_Set(SwPhaseB);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Формирование задержки (в микро или миллисекундная)
|
||||
*/
|
||||
|
||||
@@ -17,7 +17,33 @@
|
||||
/**
|
||||
* @brief Хендл микросекундного таймера
|
||||
*/
|
||||
#define hmcstim htim3
|
||||
#define hmcstim htim3
|
||||
|
||||
|
||||
#ifdef USE_HAL_GPIO_FUNCTIONS
|
||||
#define TESTER_PhaseSw_Set(_sw_) HAL_GPIO_WritePin((_sw_)->SW_Port, (_sw_)->SwHI_Pin | (_sw_)->SwLO_Pin, PHASE_CONNECT)
|
||||
#define TESTER_PhaseSw_Reset(_sw_) HAL_GPIO_WritePin((_sw_)->SW_Port, (_sw_)->SwHI_Pin | (_sw_)->SwLO_Pin, PHASE_DISCONNECT)
|
||||
|
||||
#define TESTER_PhaseSwSingle_Set(_swport_, _swpin_) HAL_GPIO_WritePin((_swport_), (_swpin_), PHASE_CONNECT)
|
||||
#define TESTER_PhaseSwSingle_Reset(_swport_, _swpin_) HAL_GPIO_WritePin((_swport_), (_swpin_), PHASE_DISCONNECT)
|
||||
#else //USE_HAL_GPIO_FUNCTIONS
|
||||
|
||||
#if (PHASE_CONNECT == 1) && (PHASE_DISCONNECT == 0)
|
||||
#define TESTER_PhaseSw_Set(_sw_) (_sw_)->SW_Port->BSRR = (_sw_)->SwHI_Pin | (_sw_)->SwLO_Pin
|
||||
#define TESTER_PhaseSw_Reset(_sw_) (_sw_)->SW_Port->BSRR = ((_sw_)->SwHI_Pin | (_sw_)->SwLO_Pin) << 16
|
||||
|
||||
#define TESTER_PhaseSwSingle_Set(_swport_, _swpin_) (_swport_)->BSRR = (_swpin_)
|
||||
#define TESTER_PhaseSwSingle_Reset(_swport_, _swpin_) (_swport_)->BSRR = ((_swpin_) << 16)
|
||||
#elif (PHASE_CONNECT == 0) && (PHASE_DISCONNECT == 1)
|
||||
#define TESTER_PhaseSw_Set(_sw_) (_sw_)->SW_Port->BSRR = ((_sw_)->SwHI_Pin | _sw_->SwLO_Pin) << 16
|
||||
#define TESTER_PhaseSw_Reset(_sw_) (_sw_)->SW_Port->BSRR = (_sw_)->SwHI_Pin | (_sw_)->SwLO_Pin
|
||||
|
||||
#define TESTER_PhaseSwSingle_Set(_swport_, _swpin_) (_swport_)->BSRR = ((_swpin_) << 16)
|
||||
#define TESTER_PhaseSwSingle_Reset(_swport_, _swpin_) (_swport_)->BSRR = (_swpin_)
|
||||
#endif //POWER_CONNECT
|
||||
|
||||
#endif //USE_HAL_GPIO_FUNCTIONS
|
||||
|
||||
extern TIM_HandleTypeDef htim3;
|
||||
|
||||
/**
|
||||
@@ -85,10 +111,15 @@ void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest);
|
||||
/* Тест диодов: подключение прямого, а потом обратного напряжения */
|
||||
void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest);
|
||||
|
||||
/* Тестирование одного ключа */
|
||||
void TESTER_TestOneSwitch(GPIO_TypeDef *SwPort, uint32_t SwPin, uint8_t flag);
|
||||
|
||||
/* Подключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */
|
||||
void TESTER_Connect_Phase(TESTER_PhaseSwitchTypeDef *DCSw);
|
||||
void TESTER_Connect_Phase(TESTER_PhaseSwitchTypeDef *PhaseSw);
|
||||
/* Отключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */
|
||||
void TESTER_Disconnect_Phase(TESTER_PhaseSwitchTypeDef *DCSw);
|
||||
void TESTER_Disconnect_Phase(TESTER_PhaseSwitchTypeDef *PhaseSw);
|
||||
/* Отключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */
|
||||
void TESTER_Disconnect_AllPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_PhaseSwitchTypeDef *SwPhaseB);
|
||||
/* Переключить две фазы с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */
|
||||
void TESTER_Reconnect_TwoPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_PhaseSwitchTypeDef *SwPhaseB, TESTER_TicksDelayTypeDef *deadtime);
|
||||
/* Формирование задержки (в микро или миллисекундная) */
|
||||
|
||||
@@ -49,6 +49,19 @@ void TESTER_main_while(TESTER_ProjectTypeDef *tester)
|
||||
if(tester->delay_en)
|
||||
msDelay(tester->delay);
|
||||
|
||||
|
||||
/* ПОДТЯГИВАНИЕ СОСТОЯНИЯ КЛЮЧЕЙ С МОДБАС */
|
||||
TESTER_TestOneSwitch(tester->htest->SwPhaseForward.SW_Port, tester->htest->SwPhaseForward.SwHI_Pin,
|
||||
tester->mbdata->Coils.PhaseForwardHiTest);
|
||||
TESTER_TestOneSwitch(tester->htest->SwPhaseForward.SW_Port, tester->htest->SwPhaseForward.SwLO_Pin,
|
||||
tester->mbdata->Coils.PhaseForwardLoTest);
|
||||
TESTER_TestOneSwitch(tester->htest->SwPhaseForward.SW_Port, tester->htest->SwPhaseReverse.SwHI_Pin,
|
||||
tester->mbdata->Coils.PhaseReverseHiTest);
|
||||
TESTER_TestOneSwitch(tester->htest->SwPhaseForward.SW_Port, tester->htest->SwPhaseReverse.SwLO_Pin,
|
||||
tester->mbdata->Coils.PhaseReverseLoTest);
|
||||
|
||||
|
||||
|
||||
/* ТЕСТ В ОБРАТНОМ ВКЛЮЧЕНИИ */
|
||||
if(tester->func.test_diode_reverse)
|
||||
{
|
||||
@@ -106,14 +119,13 @@ void TESTER_InterfaceHandle(TESTER_ProjectTypeDef *tester)
|
||||
return;
|
||||
|
||||
|
||||
|
||||
|
||||
/* считывание режима тестера с модбас */
|
||||
tester->mode = *((TESTER_TestModeTypeDef *)&tester->mbdata->Coils);
|
||||
tester->mode = *((TESTER_TestModeTypeDef *)&tester->mbdata->Coils) & 0x3;
|
||||
|
||||
/* если кнопка нажата или пришла соответствующая комманда модбас */
|
||||
if(TESTER_ReadSwichStart(&tester->SwStart) || tester->mbdata->Coils.StartTest)
|
||||
{
|
||||
tester->mbdata->Coils.StartTest = 0;
|
||||
/* Обновление настроек тестера */
|
||||
TESTER_UpdateSettings(tester->htest, tester->mbdata);
|
||||
switch(tester->mode)
|
||||
|
||||
Reference in New Issue
Block a user