diff --git a/diode_tester/Core/Src/adc.c b/diode_tester/Core/Src/adc.c index 2da8cda..a11fa99 100644 --- a/diode_tester/Core/Src/adc.c +++ b/diode_tester/Core/Src/adc.c @@ -98,7 +98,7 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; - hdma_adc1.Init.Mode = DMA_CIRCULAR; + hdma_adc1.Init.Mode = DMA_NORMAL; hdma_adc1.Init.Priority = DMA_PRIORITY_LOW; if (HAL_DMA_Init(&hdma_adc1) != HAL_OK) { diff --git a/diode_tester/Core/Src/main.c b/diode_tester/Core/Src/main.c index 6fdddef..ce7eb5e 100644 --- a/diode_tester/Core/Src/main.c +++ b/diode_tester/Core/Src/main.c @@ -27,7 +27,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "rs_message.h" -#include "tester_adc_func.h" +#include "tester_main.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -103,23 +103,18 @@ int main(void) /* USER CODE BEGIN 2 */ // HAL_ADC_Start_DMA(&hadc1, (uint32_t *)buff, ADC_BUFF_SIZE); // HAL_TIM_Base_Start_IT(&htim3); - TESTER_ADC_StructInit(&tester_adc); + TESTER_Init(&TESTER); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ + TESTER_pre_while(&TESTER); while (1) { - if(delay_en) - msDelay(delay); -// HAL_UART_Transmit(&huart1, (uint8_t *)"axaxa", 5, 100); + TESTER_main_delay(&TESTER); + TESTER_main_while(&TESTER); + HAL_UART_Transmit(&huart1, (uint8_t *)"axaxa", 5, 100); - ADC_DMA_StartRead(&tester_adc); - for(int i = 0; i < before_pulse_delay; i++); - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 1); - for(int i = 0; i < pulse_delay; i++); - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0); - ADC_DMA_ReadWhileDMA(&tester_adc, 1000); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ diff --git a/diode_tester/Core/Tester_main/tester_adc_func.c b/diode_tester/Core/Tester_main/tester_adc_func.c index 0324f4d..7022c4e 100644 --- a/diode_tester/Core/Tester_main/tester_adc_func.c +++ b/diode_tester/Core/Tester_main/tester_adc_func.c @@ -77,17 +77,10 @@ void TESTER_ADC_StructInit(TESTER_ADCTypeDef *adc) { ClearStruct(*adc); adc->hadc = &hadc1; - adc->chAdc.pulse_width = 4; - adc->filter.array_size = FOSTER_STUDENT_N; - adc->chAdc.ChMask = ADC_MEASURE_CHANNEL_0; - -#ifdef FOSTER_STUDENT_USER_T_CRITICAL - adc->filter.t_critical = FOSTER_STUDENT_USER_T_CRITICAL; -#else - adc->filter.precise_table_ind = 2; -#endif -// adc->DMA_HalfBuff = ADC_DMA_HalfBuff; -// adc->DMA_Buff = ADC_DMA_Buff; + 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; } @@ -146,7 +139,7 @@ void ADC_DMA_Fuel_Cell_Reset(TESTER_ADCChannelTypeDef *adc_fc) adc_fc->ADC_Filtered = 0; adc_fc->ADC_Max = 0; adc_fc->ADC_Min = 0; - adc_fc->max_value_ind = 0; + adc_fc->pulse_peak_ind = 0; adc_fc->state = 0; } @@ -162,96 +155,8 @@ void ADC_DMA_Channels_Prepare(TESTER_ADCChannelTypeDef *adc_fuel_cells, uint8_t } } -//uint8_t FosterStudent(TESTER_ADCChannelTypeDef *adc_fc, TESTER_ADCFilterTypeDef *Filter, uint32_t ind) -//{ -//#ifndef FOSTER_STUDENT_USER_T_CRITICAL -// uint32_t t_critical[] = FOSTER_STUDENT_T_CRITICALS; -//#endif //FOSTER_STUDENT_USER_T_CRITICAL -// uint8_t res = 0; -// -// uint8_t m = 0; -// uint8_t l = 0; -// -// uint16_t max = adc_fc->ADC_Buff[ind]; -// uint16_t min = adc_fc->ADC_Buff[ind]; -// -// int16_t d_sum = 0; -// uint32_t t; -// -// uint16_t arr_size; -// if(ind < Filter->array_size) -// return 0xFF; -// -// for(int i = ind; i > ind - Filter->array_size; i--) -// { -// -// if(adc_fc->ADC_Buff[i] > max) -// { -// max = adc_fc->ADC_Buff[i]; -// m = 1; -// } -// else -// m = 0; -// if(adc_fc->ADC_Buff[i] < min) -// { -// min = adc_fc->ADC_Buff[i]; -// l = 1; -// } -// else -// l = 0; -// d_sum += (m-l); -// } -// -//#define fixed_base 1000 -// if(d_sum < 0) -// d_sum = -d_sum; -// t = d_sum*fixed_base*fixed_base/FOSTER_STUDENT_MSE; -// -// Filter->t_current = t; -//#ifndef FOSTER_STUDENT_USER_T_CRITICAL -// Filter->t_critical = t_critical[Filter->precise_table_ind]; -//#endif //FOSTER_STUDENT_USER_T_CRITICAL -// -// -// if(Filter->t_current > Filter->t_critical) -// { -// res = 1; -// } -// else -// { -// res = 0; -// } -// -// -// -// return res; -//} - -void ADC_DMA_WaitForStableVoltage(TESTER_ADCChannelTypeDef *adc_fc, TESTER_ADCFilterTypeDef *Filter, uint32_t ind) -{ -// if(FosterStudent(adc_fc, Filter, ind) == 0) -// { -// /* Сохраняем индекс еще стабильного напряжения */ -// adc_fc->stable_start_ind = ind - Filter->array_size/2; -// /* Переключение на стабильное напряжение найдено */ -// adc_fc->state = WAIT_FOR_DROP; -// } -} - - -void ADC_DMA_WaitForDropVoltage(TESTER_ADCChannelTypeDef *adc_fc, TESTER_ADCFilterTypeDef *Filter, uint32_t ind) -{ -// if(FosterStudent(adc_fc, Filter, ind) == 1) -// { -// /* Сохраняем индекс еще стабильного напряжения */ -// adc_fc->stable_end_ind = ind-Filter->array_size/2; -// /* Переключение на стабильное напряжение найдено */ -// adc_fc->state = STABLE_FOUND; -// } -} - -void ADC_DMA_CalcStabilized(TESTER_ADCChannelTypeDef *adc_fc) +void ADC_DMA_ProcessBufferForPeak(TESTER_ADCChannelTypeDef *adc_fc) { uint16_t tmp_val = 0; uint32_t val_sum = 0; @@ -267,80 +172,45 @@ void ADC_DMA_CalcStabilized(TESTER_ADCChannelTypeDef *adc_fc) if(tmp_val > adc_fc->ADC_Max) { adc_fc->ADC_Max = tmp_val; - adc_fc->max_value_ind = i; + + if(adc_fc->s.expected_pulse_sign == 0) + adc_fc->pulse_peak_ind = i; } /* Обновление минимального значения */ if(tmp_val < adc_fc->ADC_Min) { adc_fc->ADC_Min = tmp_val; + adc_fc->pulse_peak_ind = i; + + if(adc_fc->s.expected_pulse_sign == 1) + adc_fc->pulse_peak_ind = i; } } /* Расчет среднего значения в пике */ - for(int i = (adc_fc->max_value_ind - adc_fc->pulse_width)/2; i < (adc_fc->max_value_ind + adc_fc->pulse_width/2); i++) + for(int i = (adc_fc->pulse_peak_ind - adc_fc->s.pulse_width/2); i < (adc_fc->pulse_peak_ind + adc_fc->s.pulse_width/2); i++) { tmp_val = adc_fc->ADC_Buff[i]; /* Накопление значений для расчета среднего */ val_sum += tmp_val; } - adc_fc->ADC_Filtered = val_sum/(adc_fc->pulse_width); + adc_fc->ADC_Filtered = val_sum/(adc_fc->s.pulse_width); -} - -void ADC_DMA_ProcessSingleBuffer(TESTER_ADCChannelTypeDef *adc_fc) -{ + adc_fc->U_Current = adc_fc->s.U_step*adc_fc->ADC_Filtered; } -void ADC_DMA_ProcessBuffer(TESTER_ADCTypeDef *adc) -{ - ADC_DMA_ProcessSingleBuffer(&adc->chAdc); -} - -void ADC_DMA_BufferHandler(TESTER_ADCChannelTypeDef *adc_fc, TESTER_ADCFilterTypeDef *Filter, uint32_t ind) -{ -// switch(adc_fc->state) -// { -// /* Канал не проверяется */ -// case NOT_CHECKING: -// break; -// -// /* Пока на каналах не зарядится кондер */ -// case WAIT_FOR_STABLE: -//// ADC_DMA_WaitForStableVoltage(adc_fc, Filter, ind); -// break; -// -// /* Проверка пока на первом канале не начнет разряжаться кондер */ -// case WAIT_FOR_DROP: -//// ADC_DMA_WaitForDropVoltage(adc_fc, Filter, ind); -// break; -// -// /* Стабильное напряжение найдено */ -// case STABLE_FOUND: -// /* Стабильное напряжение НЕ найдено */ -// case STABLE_NOT_FOUND: -// /* Конец стабильного напряжения НЕ найден */ -// case DROP_NOT_FOUND: -// break; -// -// -// /* Если состояние неопределенное */ -// default: -// adc_fc->state = NOT_CHECKING; -// break; -// -// } -} - - /** - * @brief Считывать АЦП до тех пор, пока буфер DMA не заполнится и не будет обработан + * @brief Считать буфер DMA и найти в нем пик (скачок напряжения) + * @details Основа функции взята из МЗКТЭ. Здесь немного неоптимизированная: + * в while(1) просто ждеться когда DMA не будет заполнен, + * потом можно будет сделать какую-то обработку пока он заполняется, чтобы не простаивать. */ -HAL_StatusTypeDef ADC_DMA_ReadWhileDMA(TESTER_ADCTypeDef *adc, uint32_t Timeout) +HAL_StatusTypeDef ADC_DMA_ReadForPeak(TESTER_ADCTypeDef *adc, uint32_t Timeout) { uint32_t tickstart = HAL_GetTick(); @@ -398,7 +268,7 @@ HAL_StatusTypeDef ADC_DMA_ReadWhileDMA(TESTER_ADCTypeDef *adc, uint32_t Timeout) if(run_adc_check) { /* Вызов обработчиков буфера DMA для каждого канала, если он выбран */ - ADC_DMA_BufferHandler(&adc->chAdc, &adc->filter, adc_buff_ind); +// ADC_DMA_BufferHandler(&adc->chAdc, &adc->filter, adc_buff_ind); @@ -451,7 +321,36 @@ HAL_StatusTypeDef ADC_DMA_ReadWhileDMA(TESTER_ADCTypeDef *adc, uint32_t Timeout) } } - ADC_DMA_CalcStabilized(&adc->chAdc); + ADC_DMA_ProcessBufferForPeak(&adc->chAdc); return HAL_OK; -} \ No newline at end of file +} + + +/** + * @brief Считывать АЦП, который работает в континуес режиме + */ +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; + if(buff_size == 0) + return HAL_ERROR; + + for(int i = 0; i < buff_size; i++) + { + if(HAL_GetTick() - tickstart > timeout) + { + res = HAL_TIMEOUT; + break; + } + + HAL_ADC_PollForConversion(adc->hadc, 1); + adc->chAdc.ADC_Buff[i] = HAL_ADC_GetValue(adc->hadc); + val_sum += adc->chAdc.ADC_Buff[i]; + } + + adc->chAdc.ADC_Filtered = val_sum/(buff_size); + 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 9517168..15f363e 100644 --- a/diode_tester/Core/Tester_main/tester_adc_func.h +++ b/diode_tester/Core/Tester_main/tester_adc_func.h @@ -13,40 +13,6 @@ #include "mylibs_include.h" -#define ADC_MEASURE_CHANNEL_0_Pos 0x00 -#define ADC_MEASURE_CHANNEL_1_Pos 0x01 -#define ADC_MEASURE_CHANNEL_2_Pos 0x02 -#define ADC_MEASURE_CHANNEL_3_Pos 0x03 - -#define ADC_MEASURE_CHANNEL_0 (0x01 << ADC_MEASURE_CHANNEL_0_Pos) -#define ADC_MEASURE_CHANNEL_1 (0x01 << ADC_MEASURE_CHANNEL_1_Pos) -#define ADC_MEASURE_CHANNEL_2 (0x01 << ADC_MEASURE_CHANNEL_2_Pos) -#define ADC_MEASURE_CHANNEL_3 (0x01 << ADC_MEASURE_CHANNEL_3_Pos) -#define ADC_CH_IGNORE NULL // должно быть NULL!!! - -#define Measure_Get_Channel(_chPtr_) (_chPtr_)->Tadc->chAdc -#define Measure_Get_Voltage(_chPtr_) ((_chPtr_)->Tadc->chAdc->U_Current) -#define Measure_Get_Zero(_chPtr_) ((_chPtr_)->Tadc->chAdc->refADC_zero) -#define Measure_Get_Calibr(_chPtr_) ((_chPtr_)->Tadc->chAdc->refADC_calibr) -#define Measure_Get_VoltStep(_chPtr_) ((_chPtr_)->Tadc->chAdc->refU_step) -#define Measure_Get_Filtered(_chPtr_) ((_chPtr_)->Tadc->chAdc->ADC_Filtered) - -#define Measure_Calc_CalibrDiff(_chPtr_) abs((int)Measure_Get_Calibr(_chPtr_) - Measure_Get_Zero(_chPtr_)) -#define Measure_Calc_FilterDiff(_chPtr_) abs((int)Measure_Get_Filtered(_chPtr_) - Measure_Get_Zero(_chPtr_)) -#define Measure_Calc_Voltage(_chPtr_) ((float)Measure_Calc_FilterDiff(_chPtr_)*Measure_Get_VoltStep(_chPtr_)) - -//#define ADC_GetChannel(_AdcChPtr_) (_AdcChPtr_)->Tadc->chAdc -////#define Measure_Get_Voltage(_AdcChPtr_) ((_AdcChPtr_)->Tadc->chAdc->U_Current) -////#define Measure_Get_Zero(_AdcChPtr_) ((_AdcChPtr_)->Tadc->chAdc->refADC_zero) -////#define Measure_Get_Calibr(_AdcChPtr_) ((_AdcChPtr_)->Tadc->chAdc->refADC_calibr) -////#define Measure_Get_VoltStep(_AdcChPtr_) ((_AdcChPtr_)->Tadc->chAdc->refU_step) -////#define Measure_Get_Filtered(_AdcChPtr_) ((_AdcChPtr_)->Tadc->chAdc->ADC_Filtered) - -//#define Channel_Calc_Diff(_AdcChPtr_, _value_) ((int)(_value_) - (_AdcChPtr_)->refADC_zero) -//#define Channel_Calc_CalibrValue(_AdcChPtr_) (abs(Channel_Calc_Diff((_AdcChPtr_), (_AdcChPtr_)->refADC_calibr)) ) -//#define Channel_Calc_AdcValue(_AdcChPtr_) (abs(Channel_Calc_Diff((_AdcChPtr_), (_AdcChPtr_)->ADC_Filtered)) ) -//#define Channel_Calc_Voltage(_AdcChPtr_) ((float)Channel_Calc_AdcValue(_AdcChPtr_)*(_AdcChPtr_)->refU_step) - typedef uint16_t ADC_BuffTypeDef[ADC_BUFF_SIZE]; typedef enum @@ -59,28 +25,30 @@ typedef enum ADC_DONE = 5, }ADC_ChannelState; - +typedef struct +{ + uint16_t ADC_zero; + uint16_t ADC_calibr; + float U_step; + unsigned pulse_width; + unsigned expected_pulse_sign; +}ADC_ParamsTypeDef; typedef struct { - ADC_BuffTypeDef ADC_Buff; - uint16_t ADC_Filtered; float U_Current; - - - - - /* Parameter for calc voltage */ - uint16_t refADC_zero; - uint16_t refADC_calibr; - float refU_step; + uint16_t ADC_Filtered; + ADC_BuffTypeDef ADC_Buff; uint16_t ADC_Max; uint16_t ADC_Min; - - unsigned pulse_width; - unsigned max_value_ind; - uint8_t ChMask; + + /* Parameter for calc voltage */ + ADC_ParamsTypeDef s; + + + unsigned pulse_peak_ind; + ADC_ChannelState state; ADCChannel_TrackerTypeDef adc_ch_err; @@ -106,7 +74,7 @@ typedef struct ADC_HandleTypeDef *hadc; - TESTER_ADCFilterTypeDef filter; +// TESTER_ADCFilterTypeDef filter; struct { @@ -128,11 +96,12 @@ void TESTER_ADC_StructInit(TESTER_ADCTypeDef *adc); void ADC_DMA_Handler(TESTER_ADCTypeDef *adc); -void ADC_DMA_ProcessBuffer(TESTER_ADCTypeDef *adc); +void ADC_DMA_ProcessBufferForPeak(TESTER_ADCChannelTypeDef *adc_fc); void ADC_DMA_Channels_Prepare(TESTER_ADCChannelTypeDef *adc_fuel_cells, uint8_t MaskForChannels, uint8_t state); HAL_StatusTypeDef ADC_DMA_StartRead(TESTER_ADCTypeDef *adc); -HAL_StatusTypeDef ADC_DMA_ReadWhileDMA(TESTER_ADCTypeDef *adc, uint32_t Timeout); +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); #ifndef printf_adc_result #define printf_adc_result(...) diff --git a/diode_tester/Core/Tester_main/tester_config.h b/diode_tester/Core/Tester_main/tester_config.h index 481a9e4..f1c0669 100644 --- a/diode_tester/Core/Tester_main/tester_config.h +++ b/diode_tester/Core/Tester_main/tester_config.h @@ -11,7 +11,37 @@ #ifndef _TESTER_CONFIG_H_ #define _TESTER_CONFIG_H_ +#define TESTER_PULES_EXPETCED_WIDTH 4 ///< Предполагаемая длительность пика в отчетах ацп + +/** + * @addtogroup TESTER_POWER_SW_CONFIG Configs for switches for power + * @ingroup TESTER_CONFIGS + * @brief Конфигурации для ключей питания + @{ + */ + +/* Состояния ключей для подключения и откючения питания */ +#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_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 ///< Пин первого ключа для отрицательного питания + +/** TESTER_POWER_SW_CONFIG + * @} + */ + /** * @addtogroup TESTER_ADC_CONFIG Configs for ADC * @ingroup TESTER_CONFIGS @@ -19,41 +49,15 @@ @{ */ -#define ADC_BUFF_SIZE (500) ///< Размер буфера АЦП -#define ADC_DMA_BUFF_SIZE (ADC_BUFF_SIZE*4) ///< Размер буфера ДМА (4 канала) +#define ADC_BUFF_SIZE (1000) ///< Размер буфера АЦП +#define ADC_DMA_BUFF_SIZE (ADC_BUFF_SIZE) ///< Размер буфера ДМА (1 канал) -#define ADC_U_CALIBR ((float)1.1) ///< Напряжение, которое подается при калибровке +#define ADC_U_CALIBR ((float)3.0) ///< Калибровочное напряжение +#define ADC_VALUE_CALIBR (0xFFF) ///< Значение АЦП при калибровочном напряжении @ref ADC_U_CALIBR +#define ADC_VALUE_ZERO (0) ///< Значение АЦП при нулевом напряжении -#define ADC_READ_TIMEOUT_MS 20 ///< Таймаут на ожидание разрядки конденсатора -#define ADC_ZERO_WAIT_TIMEOUS_MS 100 ///< Таймаут на ожидание нуля (при калибровке) +#define ADC_READ_TIMEOUT_MS 20 ///< Таймаут на ожидание разрядки конденсатора -#define FOSTER_STUDENT_N 40 ///< Выборка для определения начала разрядки конденсатора -#define FOSTER_STUDENT_MSE 2561 /*!< @brief Среднеквадратическая ошибка для выборки размером FOSTER_STUDENT_N, умноженная на 1000 - @details Выражение для СКО: sqrt(2*ln(N) - 0,8456) - URL: https://old.stgau.ru/company/personal/user/7750/files/lib/%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20%D0%BF%D1%80%D0%BE%D0%B3%D0%BD%D0%BE%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D1%82%D0%B5%D0%BC%D0%B0%201.pdf - */ - -/** - * @brief Критическое значение Стьюдента - * @details Используется для определения разрядки конденсатора. - * Записывается в единицах*1000 - * @note Если закомментировать, то будет использоваться таблица указанная в @ref FOSTER_STUDENT_T_CRITICALS - с индексом, указанным в @ref precise_table_ind - */ -#define FOSTER_STUDENT_USER_T_CRITICAL 1600//2650//2500 -/** - * @brief Критическое значение Стьюдента для калибровки - * @details Используется для определения разрядки конденсатора при калибровке. - * Записывается в единицах*1000 - * @note Если закомментировать, то будет использоваться значение указанное в @ref FOSTER_STUDENT_USER_T_CRITICAL - */ -//#define FOSTER_STUDENT_USER_T_CRITICAL_CALIBR 2600//2650//2500 -/** - * @brief Таблица критических значений Стьюдента с разной погрешностью - * @details Используется для определения разрядки конденсатора при закомментированном - * @ref FOSTER_STUDENT_USER_T_CRITICAL - */ -#define FOSTER_STUDENT_T_CRITICALS {257, 688, 1328, 1729, 2093, 2539} /** TESTER_ADC_CONFIG * @} */ diff --git a/diode_tester/Core/Tester_main/tester_func.c b/diode_tester/Core/Tester_main/tester_func.c new file mode 100644 index 0000000..6c98576 --- /dev/null +++ b/diode_tester/Core/Tester_main/tester_func.c @@ -0,0 +1,154 @@ +#include "tester_func.h" + +TESTER_TestHandleTypeDef hTestDiode; + +/**s + * @brief Инициализация хендла тестера диодов + */ +void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest) +{ + 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->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; +} + + +/** + * @brief Тест диодов: подключение прямого напряжения + */ +void TESTER_TestDiode_PositivePower(TESTER_TestHandleTypeDef *htest) +{ + /* Включение континиус АЦП */ + HAL_ADC_Start(htest->adc->hadc); + + /* Задержка, перед подключением питания */ + TESTER_Delay(&htest->SwTimings.ticks_before_connect); + + /* Подкючение питания к диоду */ + TESTER_Connect_Power(&htest->DCPosSw); + + + /* Подключение питания на определенное время */ + uint32_t tickstart = HAL_GetTick(); + HAL_StatusTypeDef res; + while(1) + { + /* Считывание АЦП пока таймаут истечет */ + res = ADC_ReadContinuous(htest->adc, htest->continuous_buff_size, tickstart, htest->SwTimings.msticks_for_positive_dc); + + if(res != HAL_OK) + break; + } + + /* Отключение питания от диода */ + TESTER_Disconnect_Power(&htest->DCPosSw); + + /* Выключение континиус АЦП */ + HAL_ADC_Stop(htest->adc->hadc); + +} + +/** + * @brief Тест диодов: подключение обратного напряжения + */ +void TESTER_TestDiode_NegativePower(TESTER_TestHandleTypeDef *htest) +{ + /* Включение АЦП */ + ADC_DMA_StartRead(htest->adc); + + /* Задержка, перед подключением питания */ + TESTER_Delay(&htest->SwTimings.ticks_before_connect); + + /* Подкючение питания к диоду */ + TESTER_Connect_Power(&htest->DCNegSw); + + /* Подключение питания на определенное время */ + TESTER_Delay(&htest->SwTimings.ticks_before_disconnect); + + /* Отключение питания от диода */ + TESTER_Disconnect_Power(&htest->DCNegSw); + + /* Обработка DMA */ + ADC_DMA_ReadForPeak(htest->adc, ADC_READ_TIMEOUT_MS); + +} + + +/** + * @brief Тест диодов: подключение прямого, а потом обратного напряжения + */ +void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest) +{ + + /* Задержка, перед подключением питания */ + TESTER_Delay(&htest->SwTimings.ticks_before_connect); + + /* Подкючение питания к диоду */ + TESTER_Connect_Power(&htest->DCPosSw); + + /* Подключение питания на определенное время */ + TESTER_Delay(&htest->SwTimings.ticks_before_reconnect); + + /* Включение АЦП */ + ADC_DMA_StartRead(htest->adc); + + /* Отключение питания от диода */ + TESTER_Disconnect_Power(&htest->DCPosSw); + TESTER_Connect_Power(&htest->DCNegSw); + + /* Подключение питания на определенное время */ + TESTER_Delay(&htest->SwTimings.ticks_before_disconnect); + + /* Отключение питания от диода */ + TESTER_Disconnect_Power(&htest->DCNegSw); + + /* Обработка DMA */ + ADC_DMA_ReadForPeak(htest->adc, ADC_READ_TIMEOUT_MS); + +} + +/** + * @brief Подключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef + */ +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); +} +/** + * @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); +} + +/** + * @brief Формирование задержки (в тиках или миллисекундная) + */ +void TESTER_Delay(TESTER_TicksDelayTypeDef *tickdelay) +{ + /* Задержка, перед подключением питания */ + if(tickdelay->msdelay == 0) // если миллисекундная задержка выключена + { + /* Задержка, в тиках */ + for(int i = 0; i < tickdelay->ticks; i++); + } + else // если миллисекундная задержка включена + { + /* Задержка, в миллисекундах */ + msDelay(tickdelay->ticks); + } +} \ No newline at end of file diff --git a/diode_tester/Core/Tester_main/tester_func.h b/diode_tester/Core/Tester_main/tester_func.h new file mode 100644 index 0000000..60f8f56 --- /dev/null +++ b/diode_tester/Core/Tester_main/tester_func.h @@ -0,0 +1,76 @@ +/** +************************************************************************** +* @file tester_func.h +* @brief Заголовочный файл для функций МЗКТ. +************************************************************************** +@details + +*************************************************************************/ + + +#ifndef _TESTER_FUNC_H_ +#define _TESTER_FUNC_H_ + +#include "tester_adc_func.h" + + +typedef struct +{ + GPIO_TypeDef *SW1_Port; + uint32_t SW1_Pin; + + GPIO_TypeDef *SW2_Port; + uint32_t SW2_Pin; +}TESTER_PowerSwitchTypeDef; + + +typedef struct +{ + unsigned msdelay:1; + uint32_t ticks; +}TESTER_TicksDelayTypeDef; + + +typedef struct +{ + uint32_t msticks_for_positive_dc; + TESTER_TicksDelayTypeDef ticks_before_connect; + TESTER_TicksDelayTypeDef ticks_before_disconnect; + TESTER_TicksDelayTypeDef ticks_before_reconnect; +}TESTER_SwitchTimingsTypeDef; + +typedef struct +{ + TESTER_ADCTypeDef *adc; + + TESTER_SwitchTimingsTypeDef SwTimings; + + TESTER_PowerSwitchTypeDef DCPosSw; + TESTER_PowerSwitchTypeDef DCNegSw; + + uint32_t continuous_buff_size; + + float DiodeVolt; +}TESTER_TestHandleTypeDef; +extern TESTER_TestHandleTypeDef hTestDiode; + + + +/* Инициализация хендла тестера диодов */ +void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest); + +/* Тест диодов: подключение прямого напряжения */ +void TESTER_TestDiode_PositivePower(TESTER_TestHandleTypeDef *htest); +/* Тест диодов: подключение обратного напряжения */ +void TESTER_TestDiode_NegativePower(TESTER_TestHandleTypeDef *htest); +/* Тест диодов: подключение прямого, а потом обратного напряжения */ +void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest); + +/* Подключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef */ +void TESTER_Connect_Power(TESTER_PowerSwitchTypeDef *DCSw); +/* Отключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef */ +void TESTER_Disconnect_Power(TESTER_PowerSwitchTypeDef *DCSw); +/* Формирование задержки перед подключением питания (в тиках или миллисекундная) */ +void TESTER_Delay(TESTER_TicksDelayTypeDef *tickdelay); +#endif //_TESTER_FUNC_H_ + diff --git a/diode_tester/Core/Tester_main/tester_main.c b/diode_tester/Core/Tester_main/tester_main.c new file mode 100644 index 0000000..bbfaa31 --- /dev/null +++ b/diode_tester/Core/Tester_main/tester_main.c @@ -0,0 +1,72 @@ +#include "tester_main.h" + + +TESTER_ProjectTypeDef TESTER; + + +/**s + * @brief Инициализация всех модулей для работы тестера + */ +void TESTER_Init(TESTER_ProjectTypeDef *tester) +{ + tester->delay = 250; + tester->delay_en = 1; + + tester->func.disable_reset_call = 1; + tester->htest = &hTestDiode; + TESTER_HandleInit(tester->htest); +} + + +/**s + * @brief Функция подготовки тестера к while(1) + */ +void TESTER_pre_while(TESTER_ProjectTypeDef *tester) +{ +} + + + +/** + * @brief Главная функция работы тестера + */ +void TESTER_main_while(TESTER_ProjectTypeDef *tester) +{ + if(tester->delay_en) + msDelay(tester->delay); + + /* ТЕСТ В ОБРАТНОМ ВКЛЮЧЕНИИ */ + if(tester->func.test_diode_neg) + { + if(tester->func.disable_reset_call == 0) + tester->func.test_diode_neg = 0; + + TESTER_TestDiode_NegativePower(tester->htest); + } + + /* ТЕСТ В ПРЯМОМ ВКЛЮЧЕНИИ */ + if(tester->func.test_diode_pos) + { + if(tester->func.disable_reset_call == 0) + tester->func.test_diode_pos = 0; + + TESTER_TestDiode_PositivePower(tester->htest); + } + /* ТЕСТ ПЕРЕХОДА ИЗ ПРЯМОГО В ОБРАТНОЕ ВКЛЮЧЕНИЯ*/ + if(tester->func.test_diode_posneg) + { + if(tester->func.disable_reset_call == 0) + tester->func.test_diode_posneg = 0; + + TESTER_TestDiode_PosNegPower(tester->htest); + } +} + +/** + * @brief Задеркжка главного цикла + */ +void TESTER_main_delay(TESTER_ProjectTypeDef *tester) +{ + if(tester->delay_en) + msDelay(tester->delay); +} \ No newline at end of file diff --git a/diode_tester/Core/Tester_main/tester_main.h b/diode_tester/Core/Tester_main/tester_main.h new file mode 100644 index 0000000..fb11c8e --- /dev/null +++ b/diode_tester/Core/Tester_main/tester_main.h @@ -0,0 +1,51 @@ +/** +************************************************************************** +* @file tester_func.h +* @brief Заголовочный файл для функций МЗКТ. +************************************************************************** +@details + +*************************************************************************/ + + +#ifndef _TESTER_MAIN_H_ +#define _TESTER_MAIN_H_ + +#include "tester_func.h" + + +/** + * @brief Структура для вызова различных функций + */ +typedef struct +{ + unsigned test_diode_neg:1; + unsigned test_diode_posneg:1; + unsigned test_diode_pos:1; + + unsigned disable_reset_call:1; +}function_calls; + +typedef struct +{ + function_calls func; + + TESTER_TestHandleTypeDef *htest; + + uint32_t delay; + uint32_t delay_en:1; +}TESTER_ProjectTypeDef; +extern TESTER_ProjectTypeDef TESTER; + + + +/* Протестировать диод */ +void TESTER_Init(TESTER_ProjectTypeDef *tester); +/* Подключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef */ +void TESTER_pre_while(TESTER_ProjectTypeDef *tester); +/* Отключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef */ +void TESTER_main_while(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 26c819a..085e7b8 100644 --- a/diode_tester/MDK-ARM/diode_tester.uvoptx +++ b/diode_tester/MDK-ARM/diode_tester.uvoptx @@ -153,7 +153,7 @@ 0 1 - tester_adc,0x10 + tester_adc,0x0A 1 @@ -165,12 +165,22 @@ 0 2 - before_pulse_delay + TESTER,0x0A 1 2 - pulse_delay + tickstart,0x0A + + + 2 + 2 + uwTick,0x0A + + + 3 + 2 + timeout,0x0A @@ -256,6 +266,18 @@ 0 0 0 + ..\Core\Tester_main\tester_config.h + tester_config.h + 0 + 0 + + + 1 + 2 + 5 + 0 + 0 + 0 ..\Core\MyLibs\mylibs_config.h mylibs_config.h 0 @@ -263,7 +285,7 @@ 1 - 2 + 3 5 0 0 @@ -275,7 +297,7 @@ 1 - 3 + 4 5 0 0 @@ -285,18 +307,6 @@ 0 0 - - 1 - 4 - 5 - 0 - 0 - 0 - ..\Core\Tester_main\tester_config.h - tester_config.h - 0 - 0 - @@ -312,6 +322,54 @@ 0 0 0 + ..\Core\Tester_main\tester_main.c + tester_main.c + 0 + 0 + + + 2 + 6 + 5 + 0 + 0 + 0 + ..\Core\Tester_main\tester_main.h + tester_main.h + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\Core\Tester_main\tester_func.c + tester_func.c + 0 + 0 + + + 2 + 8 + 5 + 0 + 0 + 0 + ..\Core\Tester_main\tester_func.h + tester_func.h + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 ..\Core\Tester_main\tester_adc_func.c tester_adc_func.c 0 @@ -319,7 +377,7 @@ 2 - 6 + 10 5 0 0 @@ -339,7 +397,7 @@ 0 3 - 7 + 11 1 0 0 @@ -351,7 +409,7 @@ 3 - 8 + 12 5 0 0 @@ -363,7 +421,7 @@ 3 - 9 + 13 1 0 0 @@ -375,7 +433,7 @@ 3 - 10 + 14 5 0 0 @@ -387,7 +445,7 @@ 3 - 11 + 15 5 0 0 @@ -399,7 +457,7 @@ 3 - 12 + 16 1 0 0 @@ -411,7 +469,7 @@ 3 - 13 + 17 5 0 0 @@ -431,7 +489,7 @@ 0 4 - 14 + 18 5 0 0 @@ -443,7 +501,7 @@ 4 - 15 + 19 5 0 0 @@ -455,7 +513,7 @@ 4 - 16 + 20 5 0 0 @@ -467,7 +525,7 @@ 4 - 17 + 21 5 0 0 @@ -487,7 +545,7 @@ 0 5 - 18 + 22 2 0 0 @@ -507,7 +565,7 @@ 0 6 - 19 + 23 1 0 0 @@ -519,7 +577,7 @@ 6 - 20 + 24 1 0 0 @@ -531,7 +589,7 @@ 6 - 21 + 25 1 0 0 @@ -543,7 +601,7 @@ 6 - 22 + 26 1 0 0 @@ -555,7 +613,7 @@ 6 - 23 + 27 1 0 0 @@ -567,7 +625,7 @@ 6 - 24 + 28 1 0 0 @@ -579,7 +637,7 @@ 6 - 25 + 29 1 0 0 @@ -591,7 +649,7 @@ 6 - 26 + 30 1 0 0 @@ -611,7 +669,7 @@ 0 7 - 27 + 31 1 0 0 @@ -623,7 +681,7 @@ 7 - 28 + 32 1 0 0 @@ -635,7 +693,7 @@ 7 - 29 + 33 1 0 0 @@ -647,7 +705,7 @@ 7 - 30 + 34 1 0 0 @@ -659,7 +717,7 @@ 7 - 31 + 35 1 0 0 @@ -671,7 +729,7 @@ 7 - 32 + 36 1 0 0 @@ -683,7 +741,7 @@ 7 - 33 + 37 1 0 0 @@ -695,7 +753,7 @@ 7 - 34 + 38 1 0 0 @@ -707,7 +765,7 @@ 7 - 35 + 39 1 0 0 @@ -719,7 +777,7 @@ 7 - 36 + 40 1 0 0 @@ -731,7 +789,7 @@ 7 - 37 + 41 1 0 0 @@ -743,7 +801,7 @@ 7 - 38 + 42 1 0 0 @@ -755,7 +813,7 @@ 7 - 39 + 43 1 0 0 @@ -767,7 +825,7 @@ 7 - 40 + 44 1 0 0 @@ -779,7 +837,7 @@ 7 - 41 + 45 1 0 0 @@ -791,7 +849,7 @@ 7 - 42 + 46 1 0 0 @@ -811,7 +869,7 @@ 0 8 - 43 + 47 1 0 0 diff --git a/diode_tester/MDK-ARM/diode_tester.uvprojx b/diode_tester/MDK-ARM/diode_tester.uvprojx index 6fe95c4..189d5f3 100644 --- a/diode_tester/MDK-ARM/diode_tester.uvprojx +++ b/diode_tester/MDK-ARM/diode_tester.uvprojx @@ -385,6 +385,11 @@ Configs + + tester_config.h + 5 + ..\Core\Tester_main\tester_config.h + mylibs_config.h 5 @@ -400,16 +405,31 @@ 5 ..\Core\MyLibs\mylibs_include.h - - tester_config.h - 5 - ..\Core\Tester_main\tester_config.h - Tester Main + + tester_main.c + 1 + ..\Core\Tester_main\tester_main.c + + + tester_main.h + 5 + ..\Core\Tester_main\tester_main.h + + + tester_func.c + 1 + ..\Core\Tester_main\tester_func.c + + + tester_func.h + 5 + ..\Core\Tester_main\tester_func.h + tester_adc_func.c 1 diff --git a/diode_tester/diode_tester.ioc b/diode_tester/diode_tester.ioc index 3148886..0562454 100644 --- a/diode_tester/diode_tester.ioc +++ b/diode_tester/diode_tester.ioc @@ -14,7 +14,7 @@ Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY Dma.ADC1.0.Instance=DMA1_Channel1 Dma.ADC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD Dma.ADC1.0.MemInc=DMA_MINC_ENABLE -Dma.ADC1.0.Mode=DMA_CIRCULAR +Dma.ADC1.0.Mode=DMA_NORMAL Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE Dma.ADC1.0.Priority=DMA_PRIORITY_LOW