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