Добавлены библиотеки adc, modbus (его надо проверить)
В библиотеке adc пока только сделана заготовка для считывания выброса, надо доделать: Пока в main крутиться тест: формирование импульса ножкой светодиодом и считыание АЦП. Считывается этот импульс и определяется его пик (максимальное значение) и в районе этого пика беруться значения для расчета его амплитуды Modbus добавлен но не проверен
This commit is contained in:
457
diode_tester/Core/Tester_main/tester_adc_func.c
Normal file
457
diode_tester/Core/Tester_main/tester_adc_func.c
Normal 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;
|
||||
}
|
||||
156
diode_tester/Core/Tester_main/tester_adc_func.h
Normal file
156
diode_tester/Core/Tester_main/tester_adc_func.h
Normal 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_
|
||||
|
||||
67
diode_tester/Core/Tester_main/tester_config.h
Normal file
67
diode_tester/Core/Tester_main/tester_config.h
Normal 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_
|
||||
|
||||
Reference in New Issue
Block a user