125 lines
5.6 KiB
C
125 lines
5.6 KiB
C
//
|
||
// 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_LINEAR = 1
|
||
} eAlg;
|
||
|
||
// Размеры таблиц
|
||
#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;
|
||
|
||
// Структура для хранения таблиц быстрого доступа для каждой конфигурации
|
||
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);
|
||
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);
|
||
float get_resistance_log_fast(int16_t temperature_c10);
|
||
float get_resistance_log_fast_for_table(int16_t temperature_c10, eNtcTable table_type);
|
||
|
||
// Новые функции для получения напряжений
|
||
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
|