Files
UPP/UPP/Core/PowerMonitor/adc_tools.h

134 lines
5.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
******************************************************************************
* @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_