MODEL_ADC_EX/APP/inc/ADC_Temp.h

146 lines
6.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_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