// // Created by cfif on 04.12.2025. // #ifndef MDF_ADC_TEMP_KST45_14_2_H #define MDF_ADC_TEMP_KST45_14_2_H #include // Типы таблиц 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; // Функции инициализации и конфигурации void init_fast_lookup_table(eNtcTable table_type, float r1, eAlg use_alg); void set_active_config(eNtcTable table_type, float r1); const ntc_config_t* get_active_config(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_linear_fast(uint16_t adc_value); float get_resistance_log_fast(int16_t temperature_c10); float get_resistance_fast_simple(int16_t temperature_c10); // Вспомогательные функции void print_fast_lookup_table(void); void print_table_info(void); #endif //MDF_ADC_TEMP_KST45_14_2_H