134 lines
5.7 KiB
C
134 lines
5.7 KiB
C
/**
|
||
******************************************************************************
|
||
* @file adc_tools.h
|
||
* @brief Модуль считывающий данные с АЦП
|
||
******************************************************************************
|
||
* @details
|
||
******************************************************************************/
|
||
|
||
#ifndef _ADC_TOOLS_H_
|
||
#define _ADC_TOOLS_H_
|
||
#include "main.h"
|
||
|
||
#define ADC_CHANNEL_UBA 0
|
||
#define ADC_CHANNEL_UAC 1
|
||
#define ADC_CHANNEL_IC 2
|
||
#define ADC_CHANNEL_IA 3
|
||
#define ADC_CHANNEL_TEMP1 4
|
||
#define ADC_CHANNEL_TEMP2 5
|
||
|
||
|
||
#define ADC_NUMB_OF_CHANNELS 6
|
||
#define ADC_NUMB_OF_U_CHANNELS 2
|
||
#define ADC_NUMB_OF_I_CHANNELS 2
|
||
#define ADC_NUMB_OF_T_CHANNELS 2
|
||
#define ADC_NUMB_OF_REGULAR_CHANNELS (ADC_NUMB_OF_U_CHANNELS+ADC_NUMB_OF_I_CHANNELS)
|
||
#define ADC_TEMP_CHANNELS_START ADC_NUMB_OF_REGULAR_CHANNELS
|
||
|
||
#define ADC_TEMPERATURES_QUANTS \
|
||
{ 2188, 2197, 2206, 2216, 2226, 2236, 2247, 2259, 2271, 2283, \
|
||
2296, 2310, 2324, 2338, 2354, 2369, 2385, 2402, 2419, 2437, \
|
||
2455, 2474, 2493, 2513, 2533, 2554, 2575, 2597, 2619, 2641, \
|
||
2664, 2688, 2711, 2735, 2759, 2784, 2809, 2833, 2859, 2884, \
|
||
2909, 2935, 2961, 2986, 3012, 3037, 3063, 3089, 3114, 3140, \
|
||
3165, 3190, 3215, 3239, 3263, 3288, 3312, 3335, 3359, 3381, \
|
||
3404, 3426, 3448, 3470, 3491, 3512, 3532, 3552, 3572, 3591, \
|
||
3610, 3628, 3646, 3663, 3681, 3697, 3714, 3729, 3745, 3760, \
|
||
3775, 3789, 3803, 3817, 3830, 3843, 3855, 3868, 3879, 3891, \
|
||
3902, 3913, 3924, 3934, 3944, 3954, 3963, 3972, 3981, 3989, \
|
||
3997, 4005, 4013, 4021, 4028, 4035, 4042, 4049, 4055, 4062, \
|
||
4068, 4074, 4079, 4085, 4091, 4096}
|
||
|
||
#define ADC_TEMPERATURES \
|
||
{ -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, \
|
||
-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, \
|
||
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, \
|
||
28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, \
|
||
46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, \
|
||
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, \
|
||
82, 83, 84, 85, 86, 87, 88, 89, 90}
|
||
|
||
static const float adc_temp_vals[] = ADC_TEMPERATURES;
|
||
static const float adc_temp_quants[] = ADC_TEMPERATURES_QUANTS;
|
||
|
||
#define Filter_t FilterMedianInt_t
|
||
#define Filter_Init FilterMedianInt_Init
|
||
#define Filter_Initializator 5, 2048
|
||
|
||
/**
|
||
* @brief Коэфициенты канала АЦП для пересчета в единицы измерения
|
||
*/
|
||
typedef struct
|
||
{
|
||
uint16_t lZero; ///< Нулевой уровень (в квантах АЦП)
|
||
float vMax; ///< Максимальный уровень Единиц Измерения (в Вольтах/Амперах)
|
||
uint16_t lMax; ///< Максимальный уровень АЦП (в квантах АЦП)
|
||
}ADC_Coefs_t;
|
||
|
||
typedef enum
|
||
{
|
||
ADC_LEVEL_DISABLE=0, ///< Статистика отключена
|
||
ADC_LEVEL_BASE, ///< Базовая статистика - Max/Min
|
||
ADC_LEVEL_AC, ///< Статистика для переменных сигналов - AVG, RMS
|
||
}ADC_StatLevel_t;
|
||
|
||
/**
|
||
* @brief Статистика АЦП
|
||
*/
|
||
typedef struct
|
||
{
|
||
float Max; ///< Пиковое значение
|
||
float Min; ///< Минимальное значение
|
||
float Avg; ///< Среднее арифметическое значение
|
||
float RMS; ///< Действующее значение
|
||
|
||
uint32_t SampleCount; ///< Для корректного расчета Avg/RMS
|
||
float Sum; ///< Накопитель для среднего
|
||
float SumSquares; ///< Накопитель для RMS
|
||
}ADC_Statistics;
|
||
|
||
/**
|
||
* @brief Хендл АЦП
|
||
*/
|
||
typedef struct
|
||
{
|
||
// Handles
|
||
TIM_HandleTypeDef *htim; ///< Хендл таймера, который запускает АЦП
|
||
ADC_HandleTypeDef *hadc; ///< Хендл АЦП
|
||
|
||
// Data and calculation
|
||
uint16_t RawData[ADC_NUMB_OF_CHANNELS]; ///< Сырые значения АЦП
|
||
ADC_Coefs_t Coefs[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Коэффициенты @ref ADC_Coefs_t для регулярных каналов (не температуры)
|
||
|
||
Filter_t filter[ADC_NUMB_OF_CHANNELS]; ///< Фильтр от шумов АЦП
|
||
|
||
FilterLUT_t temp_map[2]; ///< Коррекция нелинейности датчиков температуры
|
||
|
||
float Data[ADC_NUMB_OF_CHANNELS]; ///< Пересчитанные значения АЦП (в Вольтах/Амперах)
|
||
|
||
struct
|
||
{
|
||
unsigned Initialized:1; ///< Флаг инициализированности структуры
|
||
unsigned AdcRunning:1; ///< Флаг АЦП в работе
|
||
unsigned DataReady:1; ///< Флаг данные АЦП обработаны
|
||
}f; ///< Флаги
|
||
uint32_t LastTick; // Время последнего преобразования
|
||
}ADC_Periodic_t;
|
||
|
||
|
||
|
||
/* Инициализация периодического АЦП */
|
||
HAL_StatusTypeDef ADC_Init(ADC_Periodic_t *adc, TIM_HandleTypeDef *htim, ADC_HandleTypeDef *hadc);
|
||
/* Конфигуарция канала АЦП. */
|
||
HAL_StatusTypeDef ADC_ConfigChannel(ADC_Periodic_t *adc, int ChNumb, uint16_t levelZero, float valueMax, uint16_t levelMax);
|
||
/* Запуск АЦП. */
|
||
HAL_StatusTypeDef ADC_Start(ADC_Periodic_t *adc, float PeriodUs);
|
||
/* Остановка АЦП. */
|
||
HAL_StatusTypeDef ADC_Stop(ADC_Periodic_t *adc);
|
||
/* Обновление температур АЦП. */
|
||
HAL_StatusTypeDef ADC_UpdateTemperatures(ADC_Periodic_t *adc);
|
||
/* Обработка АЦП после получения данных. */
|
||
HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc);
|
||
|
||
#endif //_ADC_TOOLS_H_
|