// // Created by cfif on 04.12.2025. // #ifndef MDF_ADC_TEMP_KST45_14_2_H #define MDF_ADC_TEMP_KST45_14_2_H #include #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_STEINHART_FULL = 1, ALG_LINEAR = 2 } eAlg; // Параметры Steinhart-Hart для термистора (общие для всех таблиц) #define koef_A 0.001741624168166423 #define koef_B 0.00017003940268680147 #define koef_C 0.0000004890545443703666 // Размеры таблиц #define TABLE_SIZE_DUCT 26 #define TABLE_SIZE_INCAR 38 #define TABLE_SIZE_AMBIENT 39 #define TABLE_SIZE_LOOKUP 4096 // Предварительно вычисленная таблица для быстрого доступа для каждой таблицы 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; // Структура конфигурации для NTC typedef struct { eNtcTable table_type; // Тип используемой таблицы float r1; // Сопротивление делителя напряжения (Ом) float vcc_mv; // Напряжение питания делителя (мВ) float vref_mv; // Опорное напряжение АЦП (мВ) int16_t start_temp; // Начальная температура таблицы (°C) int16_t end_temp; // Конечная температура таблицы (°C) uint16_t table_size; // Размер таблицы } ntc_config_t; // Структура для хранения таблиц быстрого доступа для каждой конфигурации 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); void set_active_config(eNtcTable table_type, float r1); const ntc_config_t* get_active_config(void); 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); int16_t get_temperature_linear_fast(uint16_t adc_value); float get_resistance_log_fast(int16_t temperature_c10); float get_resistance_log_fast_for_table(int16_t temperature_c10, eNtcTable table_type); float get_resistance_fast_simple(int16_t temperature_c10); // Новые функции для получения напряжений 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