MODEL_ADC_EX/APP/inc/ADC_Temp.h

96 lines
4.1 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"
// Типы таблиц 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;
// Константы
#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_DUCT 26
#define TABLE_SIZE_INCAR 38
#define TABLE_SIZE_AMBIENT 39
#define TABLE_SIZE_LOOKUP 1024
// Предварительно вычисленная таблица для быстрого доступа для каждой таблицы
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 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;
} 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);
// Основные функции получения температуры
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