#3 Настройки перенесены в модбас, все подтягивается оттуда

- В modbus коилах задается режим и выставляется флаг запустить тест. Запустить тест также можно по кнопке

- Добавлена функция для выставления дефолтных настроек TESTER_Set_Default_Settings: она выставляет все настройки в modbus по дефолту и еще некоторые не modbus настройки (порты и пины ключей, кнопок, светодиодов)

- Добавлена функция для обновления настроек тестера TESTER_UpdateSettings: она подтягивает все настроки из modbus в соответствующие структуры тестера. Вызывается каждый раз перед тестированием
This commit is contained in:
Razvalyaev 2024-12-19 17:25:03 +03:00
parent a5704ae4be
commit 24b6295935
14 changed files with 270 additions and 135 deletions

View File

@ -262,13 +262,8 @@ MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, u
if(RegisterType == RegisterType_Holding)
{
// Устаки для напряжений ТЭ: предупреждения аварии
if(MB_Check_Address_For_Arr(Addr, Qnt, R_SETPOINTS_ADDR, R_SETPOINTS_QNT) == NO_ERRORS)
{
*pRegs = MB_Set_Register_Ptr(&MB_DATA.HoldRegs, Addr); // начало регистров хранения/входных
}
// Устаки для настройки МЗКТЭ: запрет опроса и настройки общения (MODBUS/UART)
else if(MB_Check_Address_For_Arr(Addr, Qnt, R_SETTINGS_ADDR, R_SETTINGS_QNT) == NO_ERRORS)
// Устаки для тестера
if(MB_Check_Address_For_Arr(Addr, Qnt, R_SETTINGS_ADDR, R_SETTINGS_QNT) == NO_ERRORS)
{
*pRegs = MB_Set_Register_Ptr(&MB_DATA.HoldRegs, Addr); // начало регистров хранения/входных
}
@ -280,13 +275,8 @@ MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, u
}
else if(RegisterType == RegisterType_Input)
{
// Напряжения на ТЭ
if(MB_Check_Address_For_Arr(Addr, Qnt, R_TE_VOLTAGE_ADDR, R_TE_VOLTAGE_QNT) == NO_ERRORS)
{
*pRegs = MB_Set_Register_Ptr(&MB_DATA.InRegs, Addr); // начало регистров хранения/входных
}
// Статус регистр МЗКТЭ
else if(MB_Check_Address_For_Arr(Addr, Qnt, R_STATUS_REG_ADDR, R_STATUS_REG_QNT) == NO_ERRORS)
// Измеренные параметры диода
if(MB_Check_Address_For_Arr(Addr, Qnt, R_MEASURED_ADDR, R_MEASURED_QNT) == NO_ERRORS)
{
*pRegs = MB_Set_Register_Ptr(&MB_DATA.InRegs, Addr); // начало регистров хранения/входных
}
@ -323,10 +313,14 @@ MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint
return ILLEGAL_DATA_VALUE; // return exception code
}
// peripheral control coils
if(MB_Check_Address_For_Arr(Addr, Qnt, C_TE_EXCLUDE_ADDR, C_TE_EXCLUDE_QNT) == NO_ERRORS)
// tester settings coils
if(MB_Check_Address_For_Arr(Addr, Qnt, C_SETTINGS_ADDR, C_SETTINGS_QNT) == NO_ERRORS)
{
*pCoils = MB_Set_Coil_Reg_Ptr(&MB_DATA.Coils, Addr-C_TE_EXCLUDE_ADDR);
*pCoils = MB_Set_Coil_Reg_Ptr(&MB_DATA.Coils, Addr);
}// tester control coils
else if(MB_Check_Address_For_Arr(Addr, Qnt, C_CONTROL_ADDR, C_CONTROL_QNT) == NO_ERRORS)
{
*pCoils = MB_Set_Coil_Reg_Ptr(&MB_DATA.Coils, Addr);
}
// if address doesnt match any array - return illegal data address response
else

View File

@ -37,7 +37,8 @@
*/
typedef struct //MB_DataInRegsTypeDef
{
unsigned DUMMY;
uint16_t ForwardVoltage;
uint16_t PeakVoltage;
}MB_DataInRegsTypeDef;
@ -46,23 +47,26 @@ typedef struct //MB_DataInRegsTypeDef
*/
typedef struct //MB_DataInRegsTypeDef
{
unsigned DUMMY;
uint16_t TimeForPositiveDC;
uint16_t TimeBeforeTest;
uint16_t TimeBeforePeak;
uint16_t TimeBeforeDisconnect;
uint16_t Adc_PulseWidth;
uint16_t Adc_PulseSign;
uint16_t Adc_CalibrValue;
uint16_t Adc_ZeroValue;
uint16_t Adc_U_Calibr;
}MB_DataHoldRegsTypeDef;
// DEFINES FOR INPUT REGISTERS ARRAYS
#define R_TE_VOLTAGE_ADDR 0
#define R_TE_VOLTAGE_QNT 85
#define R_STATUS_REG_ADDR 85
#define R_STATUS_REG_QNT 1
#define R_MEASURED_ADDR 0
#define R_MEASURED_QNT 1
// DEFINES FOR HOLDING REGISTERS ARRAYS
#define R_SETPOINTS_ADDR 0
#define R_SETPOINTS_QNT 170
#define R_SETTINGS_ADDR 170
#define R_SETTINGS_QNT 5
#define R_SETTINGS_ADDR 0
#define R_SETTINGS_QNT 4
// DEFINES FOR REGISTERS LOCAL ADDRESSES
@ -95,12 +99,24 @@ typedef struct //MB_DataInRegsTypeDef
*/
typedef struct //MB_DataCoilsTypeDef
{
unsigned DUMMY;
/* reg 1 */
unsigned PositiveTest:1;
unsigned NegativeTest:1;
unsigned StartTest:1;
unsigned reserved:13;
/* reg 2 */
unsigned msTimeBeforeTest_enable:1;
unsigned msTimeBeforePeak_enable:1;
unsigned msTimeBeforeDisconnect_enable:1;
}MB_DataCoilsTypeDef;
// DEFINES FOR COIL ARRAYS
#define C_TE_EXCLUDE_ADDR 0
#define C_TE_EXCLUDE_QNT 85
#define C_CONTROL_ADDR 0
#define C_CONTROL_QNT 3
#define C_SETTINGS_ADDR 16
#define C_SETTINGS_QNT 3
/** MODBUS_DATA_COILS_DEFINES
* @}

View File

@ -186,7 +186,7 @@ RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huart, TIM_H
UART_Base_Init(suart);
hRS->huart = &suart->huart;
#else
RS_UART_Init();
// RS_UART_Init();
hRS->huart = huart;
#endif
@ -206,7 +206,7 @@ RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huart, TIM_H
hRS->htim = &stim->htim;
}
#else
RS_TIM_Init();
// RS_TIM_Init();
hRS->htim = htim;
#endif
@ -250,8 +250,6 @@ HAL_StatusTypeDef RS_ReInit_UART(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huar
UART_MspDeInit(&suart->huart);
RS_RES = UART_Base_Init(suart);
RS_RES = RS_UART_Init()
#else
// // check is settings are valid

View File

@ -77,12 +77,17 @@ void TESTER_ADC_StructInit(TESTER_ADCTypeDef *adc)
{
ClearStruct(*adc);
adc->hadc = &hadc1;
adc->chAdc.s.pulse_width = TESTER_PULES_EXPETCED_WIDTH;
adc->chAdc.s.ADC_calibr = ADC_VALUE_CALIBR;
adc->chAdc.s.ADC_zero = ADC_VALUE_ZERO;
adc->chAdc.s.U_step = ADC_U_CALIBR/adc->chAdc.s.ADC_calibr;
}
void TESTER_ADC_UpdateSettings(TESTER_ADCTypeDef *adc, MB_DataStructureTypeDef *mbdata)
{
adc->chAdc.s.ADC_calibr = mbdata->HoldRegs.Adc_CalibrValue;
adc->chAdc.s.ADC_zero = mbdata->HoldRegs.Adc_ZeroValue;
adc->chAdc.s.expected_pulse_sign = mbdata->HoldRegs.Adc_PulseSign;
adc->chAdc.s.pulse_width = mbdata->HoldRegs.Adc_PulseWidth;
adc->chAdc.s.U_step = (float)mbdata->HoldRegs.Adc_U_Calibr/(adc->chAdc.s.ADC_calibr - adc->chAdc.s.ADC_zero);
}
HAL_StatusTypeDef ADC_DMA_StartRead(TESTER_ADCTypeDef *adc)
{
@ -235,7 +240,7 @@ HAL_StatusTypeDef ADC_DMA_ReadForPeak(TESTER_ADCTypeDef *adc, uint32_t Timeout)
uint16_t filter_halfend = ADC_BUFF_SIZE/2;
uint16_t filter_end = ADC_BUFF_SIZE;
uint8_t run_adc_check = 0;
uint8_t expected_dmaBufferHalf = 1;
uint8_t expected_dmaBufferHalf = 2;
/* Обработка АЦП */
while(1)
@ -273,7 +278,7 @@ HAL_StatusTypeDef ADC_DMA_ReadForPeak(TESTER_ADCTypeDef *adc, uint32_t Timeout)
/* Переход на следующие во времени значения каналов АЦП */
adc_buff_ind++;
// adc_buff_ind++;
/* если это первая половина DMA буфера */
if(expected_dmaBufferHalf == 1)
{
@ -298,15 +303,15 @@ HAL_StatusTypeDef ADC_DMA_ReadForPeak(TESTER_ADCTypeDef *adc, uint32_t Timeout)
printf_adc_processing(": wait for processing complete...");
}
if(adc_buff_ind > filter_end) // Проверка первой половины закончена
{
// if(adc_buff_ind > filter_end) // Проверка первой половины закончена
// {
adc_buff_ind = 0; // Выставляем индекс на первую половину
run_adc_check = 0; // Сбрасываем флаг проверки каналов
expected_dmaBufferHalf = 1; // Устанавливаем ожидание готовности первой половины данных DMA буфера
printf_adc_processing("\n%d: ADC Processing DMA complete", uwTick);
break;
}
// }
}
/* если это "никакая" половина DMA буфера */
else
@ -333,16 +338,16 @@ HAL_StatusTypeDef ADC_DMA_ReadForPeak(TESTER_ADCTypeDef *adc, uint32_t Timeout)
HAL_StatusTypeDef ADC_ReadContinuous(TESTER_ADCTypeDef *adc, uint32_t buff_size, uint32_t tickstart, uint32_t timeout)
{
HAL_StatusTypeDef res = HAL_OK;
uint16_t val_sum;
uint16_t val_sum = 0;
if(buff_size == 0)
return HAL_ERROR;
for(int i = 0; i < buff_size; i++)
int i = 0;
for(i = 0; i < buff_size; i++)
{
if(HAL_GetTick() - tickstart > timeout)
{
res = HAL_TIMEOUT;
break;
return res;
}
HAL_ADC_PollForConversion(adc->hadc, 1);
@ -350,7 +355,7 @@ HAL_StatusTypeDef ADC_ReadContinuous(TESTER_ADCTypeDef *adc, uint32_t buff_size,
val_sum += adc->chAdc.ADC_Buff[i];
}
adc->chAdc.ADC_Filtered = val_sum/(buff_size);
adc->chAdc.ADC_Filtered = val_sum/(i);
adc->chAdc.U_Current = adc->chAdc.s.U_step*adc->chAdc.ADC_Filtered;
return res;
}

View File

@ -80,6 +80,7 @@ extern uint16_t ADC_DMA_HalfBuff[ADC_DMA_BUFF_SIZE/2];
void TESTER_ADC_StructInit(TESTER_ADCTypeDef *adc);
void TESTER_ADC_UpdateSettings(TESTER_ADCTypeDef *adc, MB_DataStructureTypeDef *mbdata);
void ADC_DMA_Handler(TESTER_ADCTypeDef *adc);
void ADC_DMA_ProcessBufferForPeak(TESTER_ADCChannelTypeDef *adc_fc);

View File

@ -12,46 +12,6 @@
#define _TESTER_CONFIG_H_
#define TESTER_PULES_EXPETCED_WIDTH 4 ///< Предполагаемая длительность пика в отчетах ацп
/**
* @addtogroup TESTER_INTERFACE_CONFIG Configs for interface of tester
* @ingroup TESTER_CONFIGS
* @brief Конфигурации для интерфейса тестера
@{
*/
/* Дефайны для светодиодов */
/* Состояния включенного и выключенного светодиода */
#define LED_ON 0 ///< Состояние включенного светодиода
#define LED_OFF 1 ///< Состояние выключенного светодиода
#define LED1_Port GPIOC ///< Порт светодиода (при перенастройке надо также перенастроить через cube)
#define LED1_Pin GPIO_PIN_13 ///< Пин светодиода (при перенастройке надо также перенастроить через cube)
/* Периоды моргания светодиода */
#define LED_POSITIVE_DIODE_PERIOD 250 ///< Моргание для индикации подключенного положительного напряжения
#define LED_NEGATIVE_DIODE_PERIOD 25 ///< Моргание для индикации подключенного отрицательного напряжения
#define LED_BLINK_AS_ON 5 ///< Моргание незаметное для глаза (светодиод просто включен)
/* Дефайны для кнопки */
/* Состояния нажатой и отжатой кнопки */
#define SW_ON 1 ///< Состояние нажатой кнопки
#define SW_OFF 0 ///< Состояние отжатой кнопки
/* Пин кнопки при перенастройке надо также перенастроить через cube) */
#define SWITCH_START_Port GPIOC ///< Порт кнокпи старта (при перенастройке надо также перенастроить через cube)
#define SWITCH_START_Pin GPIO_PIN_14 ///< Пин кнокпи старта (при перенастройке надо также перенастроить через cube)
/* Задержка для компенсации дребезга (в миллисекундах) */
#define SWITCH_ANTI_DREBEZG_DELAY 50 ///< Время которое выжидается для окончания дребезга
/** TESTER_INTERFACE_CONFIG
* @}
*/
/**
* @addtogroup TESTER_SW_TIMINGS_CONFIG Configs for switching timings
* @ingroup TESTER_CONFIGS
@ -63,7 +23,7 @@
* @brief Задержка (миллисекундная) для положительного напряжения ПО УМОЛЧАНИЮ
* @details Пока только миллисекунды, т.к. меньше я пока не реализовал, да и как понимаю не требуется
*/
#define DEF_MS_TIME_FOR_POSITIVE 1000
#define DEF_MS_TIME_FOR_POSITIVE 1500
/**
* @brief Задержка перед началом тестирования ПО УМОЛЧАНИЮ
@ -87,13 +47,51 @@
* @brief Задержка перед окончанием тестирования (отключение питания) ПО УМОЛЧАНИЮ
* @details Задержка миллисекундная или тики for() @ref TIME_BEFORE_DISCONNECT_MS_DELAY
*/
#define DEF_TIME_BEFORE_DISCONNECT 50
#define DEF_TIME_BEFORE_DISCONNECT 200
#define DEF_TIME_BEFORE_DISCONNECT_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_DISCONNECT (0 - задержка for(), 1 - миллисекундная)
/** TESTER_SW_TIMINGS_CONFIG
* @}
*/
/**
* @addtogroup TESTER_INTERFACE_CONFIG Configs for interface of tester
* @ingroup TESTER_CONFIGS
* @brief Конфигурации для интерфейса тестера
@{
*/
/* Дефайны для светодиодов */
/* Состояния включенного и выключенного светодиода */
#define LED_ON 0 ///< Состояние включенного светодиода
#define LED_OFF 1 ///< Состояние выключенного светодиода
#define LED1_Port GPIOC ///< Порт светодиода (при перенастройке надо также перенастроить через cube)
#define LED1_Pin GPIO_PIN_13 ///< Пин светодиода (при перенастройке надо также перенастроить через cube)
/* Периоды моргания светодиода */
#define LED_POSITIVE_DIODE_PERIOD 250 ///< Моргание для индикации подключенного положительного напряжения
#define LED_NEGATIVE_DIODE_PERIOD 25 ///< Моргание для индикации подключенного отрицательного напряжения
#define LED_BLINK_AS_ON 5 ///< Моргание незаметное для глаза (светодиод просто включен)
/* Дефайны для кнопки */
/* Состояния нажатой и отжатой кнопки */
#define SW_ON 1 ///< Состояние нажатой кнопки
#define SW_OFF 0 ///< Состояние отжатой кнопки
/* Пин кнопки при перенастройке надо также перенастроить через cube) */
#define SWITCH_START_Port GPIOC ///< Порт кнокпи старта (при перенастройке надо также перенастроить через cube)
#define SWITCH_START_Pin GPIO_PIN_14 ///< Пин кнокпи старта (при перенастройке надо также перенастроить через cube)
/* Задержка для компенсации дребезга (в миллисекундах) */
#define SWITCH_ANTI_DREBEZG_DELAY 50 ///< Время которое выжидается для окончания дребезга
/** TESTER_INTERFACE_CONFIG
* @}
*/
/**
* @addtogroup TESTER_POWER_SW_CONFIG Configs for switches for power
* @ingroup TESTER_CONFIGS
@ -101,7 +99,7 @@
@{
*/
//#define USE_HAL_GPIO_FUNCTIONS ///< Использовать для переключения пинов HAL функции
//#define ALL_SW_USE_SAME_PORT ///< Дефайн указывающий что все пины будут иметь один порт (для ускорения переключения)
#define ALL_SW_USE_SAME_PORT ///< Дефайн указывающий что все пины будут иметь один порт (для ускорения переключения)
/* Состояния ключей для подключения и откючения питания */
#define POWER_CONNECT 1 ///< Питание подключено в данном состоянии пина
@ -140,6 +138,8 @@
#define ADC_READ_TIMEOUT_MS 20 ///< Таймаут на ожидание разрядки конденсатора
#define TESTER_ADC_PULES_EXPETCED_WIDTH 4 ///< Предполагаемая длительность пика в отчетах ацп
/** TESTER_ADC_CONFIG
* @}
*/

View File

@ -11,31 +11,7 @@ void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest, TESTER_LEDsTypeDef *leds
htest->adc = &tester_adc;
htest->leds = leds;
TESTER_ADC_StructInit(htest->adc);
/* Настройка пинов для подключения отрицательного источника */
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->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;
}
@ -75,6 +51,8 @@ void TESTER_TestDiode_PositivePower(TESTER_TestHandleTypeDef *htest)
HAL_ADC_Stop(htest->adc->hadc);
TESTER_LED_TestingDiode_End(&htest->leds->LED1);
htest->DiodeForwardVolt = htest->adc->chAdc.U_Current;
}
/**
@ -104,7 +82,9 @@ void TESTER_TestDiode_NegativePower(TESTER_TestHandleTypeDef *htest)
/* Обработка DMA */
ADC_DMA_ReadForPeak(htest->adc, ADC_READ_TIMEOUT_MS);
TESTER_LED_TestingDiode_End(&htest->leds->LED1);
TESTER_LED_TestingDiode_End(&htest->leds->LED1);
htest->DiodePeakVolt = htest->adc->chAdc.U_Current;
}
@ -122,6 +102,7 @@ void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest)
/* Подкючение положительного питания к диоду */
msDelay(htest->SwTimings.msticks_for_positive_dc);
htest->DiodeForwardVolt = htest->adc->chAdc.U_Current;
TESTER_LED_TestingDiode_Negative(&htest->leds->LED1);
/* Включение АЦП */
@ -142,7 +123,9 @@ void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest)
/* Обработка DMA */
ADC_DMA_ReadForPeak(htest->adc, ADC_READ_TIMEOUT_MS);
TESTER_LED_TestingDiode_End(&htest->leds->LED1);
TESTER_LED_TestingDiode_End(&htest->leds->LED1);
htest->DiodePeakVolt = htest->adc->chAdc.U_Current;
}
/**
@ -206,6 +189,7 @@ void TESTER_Reconnect_Power(TESTER_PowerSwitchTypeDef *DCPosSw, TESTER_PowerSwit
#endif //ALL_SW_USE_SAME_PORT
#endif //USE_HAL_GPIO_FUNCTIONS
}
/**
* @brief Формирование задержки (в тиках или миллисекундная)
*/

View File

@ -60,7 +60,8 @@ typedef struct
uint32_t continuous_buff_size;
float DiodeVolt;
float DiodeForwardVolt;
float DiodePeakVolt;
TESTER_LEDsTypeDef *leds;
}TESTER_TestHandleTypeDef;

View File

@ -6,14 +6,6 @@
*/
void TESTER_InterfaceInit(TESTER_SwitchStartTypeDef *swstart, TESTER_LEDsTypeDef *leds)
{
swstart->Sw_Port = SWITCH_START_Port;
swstart->Sw_Pin = SWITCH_START_Pin;
swstart->Sw_FilterDelay = SWITCH_ANTI_DREBEZG_DELAY;
leds->LED1.LED_Port = LED1_Port;
leds->LED1.LED_Pin = LED1_Pin;
leds->LED1.period = LED_BLINK_AS_ON;
}

View File

@ -12,6 +12,7 @@
#define _TESTER_INTERFACE_FUNC_H_
#include "mylibs_include.h"
#include "rs_message.h"
typedef struct

View File

@ -18,8 +18,10 @@ void TESTER_Init(TESTER_ProjectTypeDef *tester)
tester->func.disable_reset_call = 0;
tester->htest = &hTestDiode;
TESTER_HandleInit(tester->htest, &tester->leds);
tester->f.flag_init_done = 1;
tester->hmodbus = &hmodbus1;
tester->mbdata = &MB_DATA;
MODBUS_FirstInit();
}
@ -28,7 +30,12 @@ void TESTER_Init(TESTER_ProjectTypeDef *tester)
*/
void TESTER_pre_while(TESTER_ProjectTypeDef *tester)
{
TESTER_Set_Default_Settings(tester);
TESTER_UpdateSettings(tester->htest, tester->mbdata);
RS_Receive_IT(tester->hmodbus, &MODBUS_MSG);
tester->leds.LED1.period = LED_BLINK_AS_ON;
tester->f.flag_init_done = 1;
}
@ -44,27 +51,46 @@ void TESTER_main_while(TESTER_ProjectTypeDef *tester)
/* ТЕСТ В ОБРАТНОМ ВКЛЮЧЕНИИ */
if(tester->func.test_diode_neg)
{
tester->f.flag_test_active = 1;
TESTER_TestDiode_NegativePower(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->f.flag_test_active = 0;
}
/* ТЕСТ В ПРЯМОМ ВКЛЮЧЕНИИ */
if(tester->func.test_diode_pos)
{
tester->f.flag_test_active = 1;
TESTER_TestDiode_PositivePower(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->f.flag_test_active = 0;
}
/* ТЕСТ ПЕРЕХОДА ИЗ ПРЯМОГО В ОБРАТНОЕ ВКЛЮЧЕНИЯ*/
if(tester->func.test_diode_posneg)
{
tester->f.flag_test_active = 1;
TESTER_TestDiode_PosNegPower(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->f.flag_test_active = 0;
}
}
@ -80,16 +106,108 @@ void TESTER_InterfaceHandle(TESTER_ProjectTypeDef *tester)
if(TESTER_ReadSwichStart(&tester->SwStart))
/* считывание режима тестера с модбас */
tester->mode = *((TESTER_TestModeTypeDef *)&tester->mbdata->Coils);
/* если кнопка нажата или пришла соответствующая комманда модбас */
if(TESTER_ReadSwichStart(&tester->SwStart) || tester->mbdata->Coils.StartTest)
{
tester->func.test_diode_posneg = 1;
/* Обновление настроек тестера */
TESTER_UpdateSettings(tester->htest, tester->mbdata);
switch(tester->mode)
{
case TEST_POSITIVE:
tester->func.test_diode_pos = 1;
break;
case TEST_NEGATIVE:
tester->func.test_diode_neg = 1;
break;
case TEST_POSNEG:
tester->func.test_diode_posneg = 1;
break;
default:
break;
}
}
TESTER_LED_Blink(&tester->leds.LED1);
}
/**
* @brief Обновление настроек тестера
*/
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_before_test.ticks = mbdata->HoldRegs.TimeBeforeTest;
htest->SwTimings.msticks_for_positive_dc = mbdata->HoldRegs.TimeForPositiveDC;
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_before_test.msdelay = mbdata->Coils.msTimeBeforeTest_enable;
TESTER_ADC_UpdateSettings(htest->adc, mbdata);
}
/**
* @brief Инициализация тестера по дефолтным настрйокам в tester_config.h
*/
void TESTER_Set_Default_Settings(TESTER_ProjectTypeDef *tester)
{
tester->mbdata->Coils.PositiveTest = 1;
tester->mbdata->Coils.NegativeTest = 1;
/* Настройка пинов для подключения отрицательного источника */
tester->htest->DCNegSw.SW_Port = SWITCH_DC_NEGATIVE_Port;
tester->htest->DCNegSw.SwGND_Pin = SWITCH_DC_NEGATIVE_GND_Pin;
tester->htest->DCNegSw.SwVDD_Pin = SWITCH_DC_NEGATIVE_VDD_Pin;
/* Настройка пинов для подключения положительного источника */
tester->htest->DCPosSw.SW_Port = SWITCH_DC_POSITIVE_Port;
tester->htest->DCPosSw.SwGND_Pin = SWITCH_DC_POSITIVE_GND_Pin;
tester->htest->DCPosSw.SwVDD_Pin = SWITCH_DC_POSITIVE_VDD_Pin;
/* Настройка пинов для кнопки старта */
tester->SwStart.Sw_Port = SWITCH_START_Port;
tester->SwStart.Sw_Pin = SWITCH_START_Pin;
tester->SwStart.Sw_FilterDelay = SWITCH_ANTI_DREBEZG_DELAY;
/* Настройка пинов для светодиода*/
tester->leds.LED1.LED_Port = LED1_Port;
tester->leds.LED1.LED_Pin = LED1_Pin;
tester->leds.LED1.period = LED_BLINK_AS_ON;
/* Настройка таймингов по умолчанию для тестирования */
tester->mbdata->HoldRegs.TimeForPositiveDC = 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.TimeBeforePeak = DEF_TIME_BEFORE_PEAK;
tester->mbdata->Coils.msTimeBeforePeak_enable = DEF_TIME_BEFORE_PEAK_MS_DELAY;
tester->mbdata->HoldRegs.TimeBeforeTest = DEF_TIME_BEFORE_TEST;
tester->mbdata->Coils.msTimeBeforeTest_enable = DEF_TIME_BEFORE_TEST_MS_DELAY;
/* Настройка АЦП */
tester->mbdata->HoldRegs.Adc_PulseWidth = TESTER_ADC_PULES_EXPETCED_WIDTH;
tester->mbdata->HoldRegs.Adc_CalibrValue = ADC_VALUE_CALIBR;
tester->mbdata->HoldRegs.Adc_ZeroValue = ADC_VALUE_ZERO;
tester->mbdata->HoldRegs.Adc_U_Calibr = ADC_U_CALIBR;
}
/**
* @brief Задеркжка главного цикла
*/

View File

@ -32,8 +32,18 @@ typedef struct
typedef struct
{
unsigned flag_init_done:1;
unsigned flag_test_active:1;
}TESTER_FlagsTypeDef;
typedef enum
{
TEST_DISABLE = 0,
TEST_POSITIVE = 1,
TEST_NEGATIVE = 2,
TEST_POSNEG = 3
}TESTER_TestModeTypeDef;
/**
* @brief Структура проекта тестер
*/
@ -41,8 +51,14 @@ typedef struct
{
function_calls func; ///< вызов разных функций
TESTER_TestModeTypeDef mode; ///< режим тестера
TESTER_TestHandleTypeDef *htest; ///< дескриптор тестера
RS_HandleTypeDef *hmodbus;
MB_DataStructureTypeDef *mbdata;
TESTER_SwitchStartTypeDef SwStart; ///< структура кнопки старта
TESTER_LEDsTypeDef leds; ///< структура светодиодов
@ -64,6 +80,10 @@ void TESTER_pre_while(TESTER_ProjectTypeDef *tester);
void TESTER_main_while(TESTER_ProjectTypeDef *tester);
/* Функция работы интерфейса */
void TESTER_InterfaceHandle(TESTER_ProjectTypeDef *tester);
/* Обновление настроек тестера */
void TESTER_UpdateSettings(TESTER_TestHandleTypeDef *htest, MB_DataStructureTypeDef *mbdata);
/* Инициализация тестера по дефолтным настрйокам в tester_config.h */
void TESTER_Set_Default_Settings(TESTER_ProjectTypeDef *tester);
/*Задеркжка главного цикла */
void TESTER_main_delay(TESTER_ProjectTypeDef *tester);
#endif //_TESTER_MAIN_H_

View File

@ -182,6 +182,11 @@
<WinNumber>2</WinNumber>
<ItemText>timeout,0x0A</ItemText>
</Ww>
<Ww>
<count>4</count>
<WinNumber>2</WinNumber>
<ItemText>val_sum,0x0A</ItemText>
</Ww>
</WatchWindow2>
<Tracepoint>
<THDelay>0</THDelay>

View File

@ -158,8 +158,8 @@ RCC.VCOOutput2Freq_Value=8000000
SH.ADCx_IN0.0=ADC1_IN0,IN0
SH.ADCx_IN0.ConfNb=1
TIM3.IPParameters=Period,Prescaler,TIM_MasterOutputTrigger
TIM3.Period=8999
TIM3.Prescaler=0
TIM3.Period=10000
TIM3.Prescaler=72-1
TIM3.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
USART1.IPParameters=VirtualMode
USART1.VirtualMode=VM_ASYNC