Files
UPP/UPP/Core/PowerMonitor/adc_tools.h
Razvalyaev deac6d5b06 Тесты в матлабе
А также:
- Коррекция фазового сдвига фильтра
- Определение порядка фаз
2026-01-30 15:56:09 +03:00

138 lines
6.0 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_U_CHANNELS_START 0
#define ADC_U_CHANNELS_END 1
#define ADC_I_CHANNELS_START 2
#define ADC_I_CHANNELS_END 3
#define ADC_TEMP_CHANNELS_START 4
#define ADC_TEMP_CHANNELS_END 5
#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;
/**
* @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 для регулярных каналов (не температуры)
FilterBandPass_t u_fltr[ADC_NUMB_OF_U_CHANNELS]; ///< Полосовой Фильтр Напряжений от шумов
FilterMedianInt_t i_fltr[ADC_NUMB_OF_I_CHANNELS]; ///< Медианный Фильтр Токов от шумов
FilterLUT_t temp_map[ADC_NUMB_OF_T_CHANNELS]; ///< Коррекция нелинейности датчиков температуры
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_UpdateRegular(ADC_Periodic_t *adc);
float ADC_GetPhaseCorrection(float freq);
#endif //_ADC_TOOLS_H_