MODEL_ADC_EX/APP/inc/ADC_Temp.h

128 lines
5.8 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.

//
// Created by cfif on 04.12.2025.
//
#ifndef MDF_ADC_TEMP_KST45_14_2_H
#define MDF_ADC_TEMP_KST45_14_2_H
#include <stdint.h>
#include "stdbool.h"
// ==================== НАСТРАИВАЕМЫЕ ПАРАМЕТРЫ ====================
#define ADC_MAX 4095.0f // 12-битный АЦП (0-4095)
// Используем целые числа для препроцессора (значения в милливольтах)
#define VREF_MV_INT 5000 // Опорное напряжение АЦП в мВ (5.0V)
#define VCC_DIVIDER_MV_INT 4960 // Напряжение питания делителя в мВ (4.96V)
// Для использования в коде - преобразуем в float
#define VREF_MV ((float)VREF_MV_INT)
#define VCC_DIVIDER_MV ((float)VCC_DIVIDER_MV_INT)
// Статическая проверка во время компиляции (работает с целыми числами)
#if VCC_DIVIDER_MV_INT == VREF_MV_INT
#define VCC_EQUALS_VREF 1
#else
#define VCC_EQUALS_VREF 0
#endif
// =================================================================
// Типы таблиц NTC
typedef enum {
TABLE_DUCT = 0, // Таблица из документа KST45 (Duct)
TABLE_INCAR = 1, // Таблица из документа Incar
TABLE_AMBIENT = 2 // Таблица для NTC 10 кОм (Ambient)
} eNtcTable;
// Алгоритмы расчёта температуры
typedef enum {
ALG_STEINHART = 0,
ALG_LINEAR = 1
} eAlg;
// Размеры таблиц
#define TABLE_SIZE_DUCT 26
#define TABLE_SIZE_INCAR 38
#define TABLE_SIZE_AMBIENT 39
#define TABLE_SIZE_LOOKUP 1024 // Размер таблицы для быстрого доступа
#define ADC_STEP (ADC_MAX / TABLE_SIZE_LOOKUP) // Шаг между значениями АЦП (4095/1024 ≈ 4)
// Предварительно вычисленная таблица для быстрого доступа для каждой таблицы
typedef struct {
uint16_t adc_value; // Значение АЦП
int16_t temp_c; // Температура в °C * 10 (для фиксированной точки)
float resistance_ohm; // Сопротивление в Ом, соответствующее значению АЦП
uint16_t voltage_mv; // Напряжение на NTC в милливольтах
float v_ntc_mv; // Точное напряжение на NTC
float v_r1_mv; // Напряжение на балластном резисторе
eNtcTable table_type; // Тип таблицы, для которой вычислены данные
} adc_temp_lookup;
// Структура для хранения таблиц быстрого доступа для каждой конфигурации
typedef struct {
adc_temp_lookup duct[TABLE_SIZE_LOOKUP];
adc_temp_lookup incar[TABLE_SIZE_LOOKUP];
adc_temp_lookup ambient[TABLE_SIZE_LOOKUP];
bool duct_initialized;
bool incar_initialized;
bool ambient_initialized;
float duct_r1;
float incar_r1;
float ambient_r1;
float vcc_mv; // Общее Vcc для всех таблиц
float vref_mv; // Общее Vref для всех таблиц
} fast_lookup_tables_t;
// Глобальная структура для доступа к таблицам
extern fast_lookup_tables_t g_fast_tables;
// Функции инициализации и конфигурации
void init_fast_lookup_table(eNtcTable table_type, float r1, eAlg use_alg);
void init_duct_table(float r1, eAlg use_alg);
void init_incar_table(float r1, eAlg use_alg);
void init_ambient_table(float r1, eAlg use_alg);
void init_all_tables(float r1_duct, float r1_incar, float r1_ambient, eAlg use_alg);
const fast_lookup_tables_t* get_fast_tables(void);
// Вспомогательные функции для преобразований
static inline uint16_t adc_to_voltage_mv(uint16_t adc_value) {
return (uint16_t)(((uint32_t)adc_value * (uint32_t)VREF_MV_INT) / (uint32_t)ADC_MAX);
}
// Функция для получения напряжения на NTC с учетом VCC и VREF
static inline float get_ntc_voltage_mv(uint16_t adc_value) {
return (adc_value * VREF_MV) / ADC_MAX;
}
// Функция для получения напряжения на балластном резисторе
static inline float get_r1_voltage_mv(uint16_t adc_value) {
return VCC_DIVIDER_MV - get_ntc_voltage_mv(adc_value);
}
// Основные функции получения температуры
float get_temperature_from_adc(uint16_t adc_value, eAlg alg);
float get_temperature_from_adc_with_table(uint16_t adc_value, eAlg alg, eNtcTable table_type, float r1);
float get_resistance_from_adc(uint16_t adc_value);
float get_resistance_from_adc_with_table(uint16_t adc_value, eNtcTable table_type, float r1);
// Быстрые функции с использованием предварительно вычисленной таблицы
int16_t get_temperature_log_fast(uint16_t adc_value);
int16_t get_temperature_log_fast_for_table(uint16_t adc_value, eNtcTable table_type);
float get_resistance_log_fast(int16_t temperature_c10);
float get_resistance_log_fast_for_table(int16_t temperature_c10, eNtcTable table_type);
// Новые функции для получения напряжений
uint16_t get_voltage_from_adc(uint16_t adc_value);
uint16_t get_voltage_fast_for_table(uint16_t adc_value, eNtcTable table_type);
float get_ntc_voltage_fast(uint16_t adc_value);
float get_r1_voltage_fast(uint16_t adc_value);
// Функция для получения информации о конфигурации VCC/VREF
void get_vcc_vref_info(float* vcc_mv, float* vref_mv);
float get_vcc_divider_voltage(void);
float get_vref_voltage(void);
bool is_vcc_equal_to_vref(void);
#endif //MDF_ADC_TEMP_KST45_14_2_H