88 lines
3.8 KiB
C
88 lines
3.8 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"
|
||
|
||
// Типы таблиц 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;
|
||
|
||
// Структура для хранения таблиц быстрого доступа для каждой конфигурации
|
||
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
|