HVAC_M7_ADC_TEMP/ADC_Temp.h

88 lines
3.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"
// Типы таблиц 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 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 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