// // 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" // Типы таблиц NTC typedef enum { TABLE_KST45 = 0, // Таблица из документа KST45 TABLE_INCAR = 1 // Таблица из документа Incar } eNtcTable; // Алгоритмы расчёта температуры typedef enum { ALG_STEINHART = 0, ALG_STEINHART_FULL = 1, ALG_LINEAR = 2 } eAlg; // Константы #define ADC_MAX 4095.0f // 12-битный АЦП // Параметры Steinhart-Hart для термистора (общие для всех таблиц) #define koef_A 0.001741624168166423 #define koef_B 0.00017003940268680147 #define koef_C 0.0000004890545443703666 // Размеры таблиц #define TABLE_SIZE_KST45 26 #define TABLE_SIZE_INCAR 38 #define TABLE_SIZE_LOOKUP 4096 // Предварительно вычисленная таблица для быстрого доступа для каждой таблицы typedef struct { uint16_t adc_value; // Значение АЦП int16_t temp_c; // Температура в °C * 10 (для фиксированной точки) float resistance_ohm; // Сопротивление в Ом, соответствующее значению АЦП eNtcTable table_type; // Тип таблицы, для которой вычислены данные } adc_temp_lookup; // Структура конфигурации для NTC typedef struct { eNtcTable table_type; // Тип используемой таблицы float r1; // Сопротивление делителя напряжения (Ом) int16_t start_temp; // Начальная температура таблицы (°C) int16_t end_temp; // Конечная температура таблицы (°C) uint16_t table_size; // Размер таблицы } ntc_config_t; // Структура для хранения таблиц быстрого доступа для каждой конфигурации typedef struct { adc_temp_lookup kst45[TABLE_SIZE_LOOKUP]; adc_temp_lookup incar[TABLE_SIZE_LOOKUP]; bool kst45_initialized; bool incar_initialized; float kst45_r1; float incar_r1; } 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_both_tables(float r1_kst45, float r1_incar, 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); // Основные функции получения температуры 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); #endif //MDF_ADC_TEMP_KST45_14_2_H