From 24b6295935e2ee9c7dd33974c1e48dad97f4c8d9 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Thu, 19 Dec 2024 17:25:03 +0300 Subject: [PATCH] =?UTF-8?q?#3=20=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B2=20=D0=BC=D0=BE=D0=B4=D0=B1=D0=B0=D1=81,?= =?UTF-8?q?=20=D0=B2=D1=81=D0=B5=20=D0=BF=D0=BE=D0=B4=D1=82=D1=8F=D0=B3?= =?UTF-8?q?=D0=B8=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BE=D1=82=D1=82?= =?UTF-8?q?=D1=83=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - В modbus коилах задается режим и выставляется флаг запустить тест. Запустить тест также можно по кнопке - Добавлена функция для выставления дефолтных настроек TESTER_Set_Default_Settings: она выставляет все настройки в modbus по дефолту и еще некоторые не modbus настройки (порты и пины ключей, кнопок, светодиодов) - Добавлена функция для обновления настроек тестера TESTER_UpdateSettings: она подтягивает все настроки из modbus в соответствующие структуры тестера. Вызывается каждый раз перед тестированием --- diode_tester/Core/Interfaces/modbus.c | 28 ++-- diode_tester/Core/Interfaces/modbus_data.h | 46 ++++--- diode_tester/Core/Interfaces/rs_message.c | 6 +- .../Core/Tester_main/tester_adc_func.c | 33 +++-- .../Core/Tester_main/tester_adc_func.h | 1 + diode_tester/Core/Tester_main/tester_config.h | 86 ++++++------ diode_tester/Core/Tester_main/tester_func.c | 38 ++---- diode_tester/Core/Tester_main/tester_func.h | 3 +- .../Core/Tester_main/tester_interface_func.c | 8 -- .../Core/Tester_main/tester_interface_func.h | 1 + diode_tester/Core/Tester_main/tester_main.c | 126 +++++++++++++++++- diode_tester/Core/Tester_main/tester_main.h | 20 +++ diode_tester/MDK-ARM/diode_tester.uvoptx | 5 + diode_tester/diode_tester.ioc | 4 +- 14 files changed, 270 insertions(+), 135 deletions(-) diff --git a/diode_tester/Core/Interfaces/modbus.c b/diode_tester/Core/Interfaces/modbus.c index 83db20d..45204d2 100644 --- a/diode_tester/Core/Interfaces/modbus.c +++ b/diode_tester/Core/Interfaces/modbus.c @@ -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 diff --git a/diode_tester/Core/Interfaces/modbus_data.h b/diode_tester/Core/Interfaces/modbus_data.h index 5744cd7..b03deed 100644 --- a/diode_tester/Core/Interfaces/modbus_data.h +++ b/diode_tester/Core/Interfaces/modbus_data.h @@ -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 * @} diff --git a/diode_tester/Core/Interfaces/rs_message.c b/diode_tester/Core/Interfaces/rs_message.c index 0b4f3fb..3586c0e 100644 --- a/diode_tester/Core/Interfaces/rs_message.c +++ b/diode_tester/Core/Interfaces/rs_message.c @@ -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 diff --git a/diode_tester/Core/Tester_main/tester_adc_func.c b/diode_tester/Core/Tester_main/tester_adc_func.c index 7022c4e..7775991 100644 --- a/diode_tester/Core/Tester_main/tester_adc_func.c +++ b/diode_tester/Core/Tester_main/tester_adc_func.c @@ -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; } diff --git a/diode_tester/Core/Tester_main/tester_adc_func.h b/diode_tester/Core/Tester_main/tester_adc_func.h index 03983a6..0d00c05 100644 --- a/diode_tester/Core/Tester_main/tester_adc_func.h +++ b/diode_tester/Core/Tester_main/tester_adc_func.h @@ -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); diff --git a/diode_tester/Core/Tester_main/tester_config.h b/diode_tester/Core/Tester_main/tester_config.h index bd4af9e..d8be216 100644 --- a/diode_tester/Core/Tester_main/tester_config.h +++ b/diode_tester/Core/Tester_main/tester_config.h @@ -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 * @} */ diff --git a/diode_tester/Core/Tester_main/tester_func.c b/diode_tester/Core/Tester_main/tester_func.c index 4592731..245d28b 100644 --- a/diode_tester/Core/Tester_main/tester_func.c +++ b/diode_tester/Core/Tester_main/tester_func.c @@ -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 Формирование задержки (в тиках или миллисекундная) */ diff --git a/diode_tester/Core/Tester_main/tester_func.h b/diode_tester/Core/Tester_main/tester_func.h index 3683bb3..95dd0aa 100644 --- a/diode_tester/Core/Tester_main/tester_func.h +++ b/diode_tester/Core/Tester_main/tester_func.h @@ -60,7 +60,8 @@ typedef struct uint32_t continuous_buff_size; - float DiodeVolt; + float DiodeForwardVolt; + float DiodePeakVolt; TESTER_LEDsTypeDef *leds; }TESTER_TestHandleTypeDef; diff --git a/diode_tester/Core/Tester_main/tester_interface_func.c b/diode_tester/Core/Tester_main/tester_interface_func.c index d111d80..0637268 100644 --- a/diode_tester/Core/Tester_main/tester_interface_func.c +++ b/diode_tester/Core/Tester_main/tester_interface_func.c @@ -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; } diff --git a/diode_tester/Core/Tester_main/tester_interface_func.h b/diode_tester/Core/Tester_main/tester_interface_func.h index 76f35ff..28bfdd1 100644 --- a/diode_tester/Core/Tester_main/tester_interface_func.h +++ b/diode_tester/Core/Tester_main/tester_interface_func.h @@ -12,6 +12,7 @@ #define _TESTER_INTERFACE_FUNC_H_ #include "mylibs_include.h" +#include "rs_message.h" typedef struct diff --git a/diode_tester/Core/Tester_main/tester_main.c b/diode_tester/Core/Tester_main/tester_main.c index 045e42b..82f1a8e 100644 --- a/diode_tester/Core/Tester_main/tester_main.c +++ b/diode_tester/Core/Tester_main/tester_main.c @@ -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 Задеркжка главного цикла */ diff --git a/diode_tester/Core/Tester_main/tester_main.h b/diode_tester/Core/Tester_main/tester_main.h index 789f23f..ffff79f 100644 --- a/diode_tester/Core/Tester_main/tester_main.h +++ b/diode_tester/Core/Tester_main/tester_main.h @@ -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_ diff --git a/diode_tester/MDK-ARM/diode_tester.uvoptx b/diode_tester/MDK-ARM/diode_tester.uvoptx index 3ee88ac..6b690a2 100644 --- a/diode_tester/MDK-ARM/diode_tester.uvoptx +++ b/diode_tester/MDK-ARM/diode_tester.uvoptx @@ -182,6 +182,11 @@ 2 timeout,0x0A + + 4 + 2 + val_sum,0x0A + 0 diff --git a/diode_tester/diode_tester.ioc b/diode_tester/diode_tester.ioc index 4edb684..bbfd7cf 100644 --- a/diode_tester/diode_tester.ioc +++ b/diode_tester/diode_tester.ioc @@ -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