Добавлены библиотеки adc, modbus (его надо проверить)

В библиотеке adc пока только сделана заготовка для считывания выброса, надо доделать:
Пока в main крутиться тест: формирование импульса ножкой светодиодом и считыание АЦП. Считывается этот импульс и определяется его пик (максимальное значение) и в районе этого пика беруться значения для расчета его амплитуды

Modbus добавлен но не проверен
This commit is contained in:
2024-12-17 18:24:41 +03:00
parent 580bac9f52
commit a2043006cc
35 changed files with 12115 additions and 85 deletions

View File

@@ -0,0 +1,457 @@
#include "tester_adc_func.h"
#include "adc.h"
TESTER_ADCTypeDef tester_adc = {0};
uint16_t ADC_DMA_Buff[ADC_DMA_BUFF_SIZE];
uint16_t ADC_DMA_HalfBuff[ADC_DMA_BUFF_SIZE/2];
void ADC_DMA_Handler(TESTER_ADCTypeDef *adc)
{
int flag_parse_dma = 0;
int buff_start_ind = 0;
int buff_end_ind = 0;
if(adc->f.dmaHandlerbusy)
return;
adc->f.dmaHandlerbusy = 1;
__disable_irq();
if(DMA1->ISR & DMA_FLAG_HT1)
{
memcpy(ADC_DMA_HalfBuff, ADC_DMA_Buff, sizeof(ADC_DMA_HalfBuff));
adc->f.dmaBufferHalfDone = 1;
buff_start_ind = 0;
buff_end_ind = ADC_BUFF_SIZE/2;
flag_parse_dma = 1;
}
else if (DMA1->ISR & DMA_FLAG_TC1)
{
memcpy(ADC_DMA_HalfBuff, (ADC_DMA_Buff+ADC_DMA_BUFF_SIZE/2), sizeof(ADC_DMA_HalfBuff));
adc->f.dmaBufferHalfDone = 2;
buff_start_ind = ADC_BUFF_SIZE/2;
buff_end_ind = ADC_BUFF_SIZE;
flag_parse_dma = 1;
}
else
{
flag_parse_dma = 0;
TrackerCnt_Warn(adc->adc_err);
}
__enable_irq();
if(adc->f.enable_dmaBuffTransfer && flag_parse_dma)
{
int dma_ind = 0;
for(int buff_ind = buff_start_ind;
buff_ind < buff_end_ind;
buff_ind++)
{
adc->chAdc.ADC_Buff[buff_ind] = ADC_DMA_HalfBuff[dma_ind];
dma_ind += 1;
}
printf_adc_it("\n%d: ADC DMA IT Done %d-half", uwTick, adc->f.dmaBufferHalfDone);
adc->f.dmaHandlerbusy = 0;
TrackerCnt_Ok(adc->adc_err);
}
else
{
TrackerCnt_Warn(adc->adc_err);
}
}
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;
}
HAL_StatusTypeDef ADC_DMA_StartRead(TESTER_ADCTypeDef *adc)
{
HAL_StatusTypeDef res;
/* Очистка буферов каналов */
ClearStruct(adc->chAdc.ADC_Buff);
/* Очистка флага какая половина DMA уже готова */
adc->f.dmaBufferHalfDone = 0; // никакая, данные DMA пока не готовы в принципе
/* Разрешение заполнения буферов каналов */
adc->f.enable_dmaBuffTransfer = 1;
/* Выставления флага, что АЦП работает */
adc->f.adc_running = 1;
printf_adc("\n%d: ADC DMA Start", uwTick);
/* Старт АЦП с DMA */
res = HAL_ADC_Start_DMA(adc->hadc, (uint32_t *)ADC_DMA_Buff, ADC_DMA_BUFF_SIZE);
/* Если старт неудачен - запрет заполнения буферов каналов */
if(res != HAL_OK)
{
adc->f.enable_dmaBuffTransfer = 0;
adc->f.adc_running = 0;
}
return res;
}
HAL_StatusTypeDef ADC_DMA_StopRead(TESTER_ADCTypeDef *adc)
{
HAL_StatusTypeDef res;
if(adc->f.adc_running)
{
/* Остановка АЦП */
res = HAL_ADC_Stop_DMA(adc->hadc);
/* Очищение флагов АЦП */
adc->f.adc_running = 0;
adc->f.enable_dmaBuffTransfer = 0;
adc->f.dmaHandlerbusy = 0;
printf_adc("\n%d: ADC DMA Stop", uwTick);
}
return res;
}
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->state = 0;
}
void ADC_DMA_Channels_Prepare(TESTER_ADCChannelTypeDef *adc_fuel_cells, uint8_t MaskForChannels, uint8_t state)
{
for(int i = 0; i < 4; i++)
{
if(MaskForChannels&(1<<i))
{
ADC_DMA_Fuel_Cell_Reset(&adc_fuel_cells[i]);
adc_fuel_cells[i].state = state;
}
}
}
//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)
{
uint16_t tmp_val = 0;
uint32_t val_sum = 0;
adc_fc->ADC_Max = 0;
adc_fc->ADC_Min = 0xFFFF;
/* Просмотр стабильных значений в буфере */
for(int i = 0; i < ADC_BUFF_SIZE; i++)
{
tmp_val = adc_fc->ADC_Buff[i];
/* Обновление максимального значения */
if(tmp_val > adc_fc->ADC_Max)
{
adc_fc->ADC_Max = tmp_val;
adc_fc->max_value_ind = i;
}
/* Обновление минимального значения */
if(tmp_val < adc_fc->ADC_Min)
{
adc_fc->ADC_Min = tmp_val;
}
}
/* Расчет среднего значения в пике */
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++)
{
tmp_val = adc_fc->ADC_Buff[i];
/* Накопление значений для расчета среднего */
val_sum += tmp_val;
}
adc_fc->ADC_Filtered = val_sum/(adc_fc->pulse_width);
}
void ADC_DMA_ProcessSingleBuffer(TESTER_ADCChannelTypeDef *adc_fc)
{
}
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 не заполнится и не будет обработан
*/
HAL_StatusTypeDef ADC_DMA_ReadWhileDMA(TESTER_ADCTypeDef *adc, uint32_t Timeout)
{
uint32_t tickstart = HAL_GetTick();
/* Проверка принятых параметров функции */
if(adc == 0)
{
ADC_DMA_StopRead(adc);
printf_adc_err("\n%d: Error ADC: Handle is NULL)", uwTick);
return HAL_ERROR;
}
if(Timeout == 0)
{
ADC_DMA_StopRead(adc);
printf_adc_err("\n%d: Error ADC: Read timeout is NULL)", uwTick);
return HAL_ERROR;
}
int adc_buff_ind = 1;
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;
/* Обработка АЦП */
while(1)
{
/* Проверка на таймаут */
if(HAL_GetTick() - tickstart > Timeout)
{
ADC_DMA_StopRead(adc);
printf_adc_err("\n%d: Error ADC: Stable Not Found (Timeout)", uwTick);
return HAL_TIMEOUT;
}
/* Запуск обработки данных из DMA буфера, когда они готовы */
if( (expected_dmaBufferHalf == adc->f.dmaBufferHalfDone) && // Ожидаемая половина DMA буфера готова
(run_adc_check == 0)) // Обработка предыдущей половины не активна
{
run_adc_check = 1;
if(adc->f.dmaBufferHalfDone == 1)
printf_adc_processing("\n%d: ADC Processing DMA start...", uwTick);
else if(adc->f.dmaBufferHalfDone == 2)
printf_adc_processing("\n%d: ADC Processing DMA 2-half start...", uwTick);
}
/* Обработка буфера DMA */
if(run_adc_check)
{
/* Вызов обработчиков буфера DMA для каждого канала, если он выбран */
ADC_DMA_BufferHandler(&adc->chAdc, &adc->filter, adc_buff_ind);
/* Переход на следующие во времени значения каналов АЦП */
adc_buff_ind++;
/* если это первая половина DMA буфера */
if(expected_dmaBufferHalf == 1)
{
if(adc_buff_ind > filter_halfend) // Проверка первой половины закончена
{
adc_buff_ind = filter_halfend; // Выставляем индекс на вторую половину
run_adc_check = 0; // Сбрасываем флаг проверки каналов
expected_dmaBufferHalf = 2; // Устанавливаем ожидание готовности второй половины данных DMA буфера
printf_adc_processing("\n%d: ADC Processing 1-half DMA complete, wait for 2-half...", uwTick);
}
}
/* если это вторая половина DMA буфера */
else if(expected_dmaBufferHalf == 2)
{
/* Если АЦП работает - останавливаем его */
// note: пока без кольцевого режима, если за один цикл буфера ничего не удалось словить, вряд ли далее что-то появиться??
if(adc->f.adc_running)
{
ADC_DMA_StopRead(adc);
printf_adc_processing(": wait for processing complete...");
}
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
{ /* Сброс всего */
printf_adc_err("\n%d: ADC Processing DMA unexcpected half", uwTick);
adc_buff_ind = 0;
run_adc_check = 0;
expected_dmaBufferHalf = 1;
}
}
}
ADC_DMA_CalcStabilized(&adc->chAdc);
return HAL_OK;
}

View File

@@ -0,0 +1,156 @@
/**
**************************************************************************
* @file tester_func.h
* @brief Заголовочный файл для функций МЗКТ.
**************************************************************************
@details
*************************************************************************/
#ifndef _TESTER_ADC_FUNC_H_
#define _TESTER_ADC_FUNC_H_
#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
{
ADC_DISABLED = 0,
WAIT_FOR_FIRST_HALF = 1,
PROCESSING_FIRST_HALF = 2,
WAIT_FOR_SECOND_HALF = 3,
PROCESSING_SECOND_HALF = 4,
ADC_DONE = 5,
}ADC_ChannelState;
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_Max;
uint16_t ADC_Min;
unsigned pulse_width;
unsigned max_value_ind;
uint8_t ChMask;
ADC_ChannelState state;
ADCChannel_TrackerTypeDef adc_ch_err;
}TESTER_ADCChannelTypeDef;
typedef struct
{
int32_t t_current;
int32_t t_critical;
#ifdef FOSTER_STUDENT_USER_T_CRITICAL
#else
uint8_t precise_table_ind;
#endif
uint16_t array_size;
}TESTER_ADCFilterTypeDef;
typedef struct
{
TESTER_ADCChannelTypeDef chAdc;
ADC_HandleTypeDef *hadc;
TESTER_ADCFilterTypeDef filter;
struct
{
unsigned adc_running:1;
unsigned enable_dmaBuffTransfer:1;
unsigned dmaBufferHalfDone:2;
unsigned dmaHandlerbusy:1;
}f;
ADC_TrackerTypeDef adc_err;
}TESTER_ADCTypeDef;
extern TESTER_ADCTypeDef tester_adc;
extern uint16_t ADC_DMA_Buff[ADC_DMA_BUFF_SIZE];
extern uint16_t ADC_DMA_HalfBuff[ADC_DMA_BUFF_SIZE/2];
void TESTER_ADC_StructInit(TESTER_ADCTypeDef *adc);
void ADC_DMA_Handler(TESTER_ADCTypeDef *adc);
void ADC_DMA_ProcessBuffer(TESTER_ADCTypeDef *adc);
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);
#ifndef printf_adc_result
#define printf_adc_result(...)
#endif
#ifndef printf_adc_processing
#define printf_adc_processing(...)
#endif
#ifndef printf_adc_err
#define printf_adc_err(...)
#endif
#ifndef printf_adc_it
#define printf_adc_it(...)
#endif
#ifndef printf_adc
#define printf_adc(...)
#endif
#endif //_TESTER_ADC_FUNC_H_

View File

@@ -0,0 +1,67 @@
/**
**************************************************************************
* @file tester_config.h
* @brief Конфигурации для тестера диодов
**************************************************************************
* @defgroup TESTER_CONFIGS Configs for project
* @brief Конфигурации для тестера диодов
* @details
@{
*************************************************************************/
#ifndef _TESTER_CONFIG_H_
#define _TESTER_CONFIG_H_
/**
* @addtogroup TESTER_ADC_CONFIG Configs for ADC
* @ingroup TESTER_CONFIGS
* @brief Конфигурации для АЦП
@{
*/
#define ADC_BUFF_SIZE (500) ///< Размер буфера АЦП
#define ADC_DMA_BUFF_SIZE (ADC_BUFF_SIZE*4) ///< Размер буфера ДМА (4 канала)
#define ADC_U_CALIBR ((float)1.1) ///< Напряжение, которое подается при калибровке
#define ADC_READ_TIMEOUT_MS 20 ///< Таймаут на ожидание разрядки конденсатора
#define ADC_ZERO_WAIT_TIMEOUS_MS 100 ///< Таймаут на ожидание нуля (при калибровке)
#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
* @}
*/
/** TESTER_CONFIGS
* @}
*/
#endif //_TESTER_CONFIG_H_