From 4bffa087ea55363cf99da06954a23226ed4d9664 Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 16 Dec 2025 11:20:21 +0300 Subject: [PATCH] Init --- APP/inc/ADC_Temp.h | 40 ++++++++++ APP/inc/ADC_Temp_KST45-14-2.h | 20 ----- APP/main.c | 24 ++++-- APP/src/{ADC_Temp_KST45-14-2.c => ADC_Temp.c} | 79 ++++++++++++------- 4 files changed, 107 insertions(+), 56 deletions(-) create mode 100644 APP/inc/ADC_Temp.h delete mode 100644 APP/inc/ADC_Temp_KST45-14-2.h rename APP/src/{ADC_Temp_KST45-14-2.c => ADC_Temp.c} (84%) diff --git a/APP/inc/ADC_Temp.h b/APP/inc/ADC_Temp.h new file mode 100644 index 0000000..27e1cfb --- /dev/null +++ b/APP/inc/ADC_Temp.h @@ -0,0 +1,40 @@ +// +// Created by cfif on 04.12.2025. +// + +#ifndef MDF_ADC_TEMP_KST45_14_2_H +#define MDF_ADC_TEMP_KST45_14_2_H + +#include + +// Константы +#define ADC_MAX 4095.0f // 12-битный АЦП +#define R1 3300.0f // Сопротивление делителя напряжения +#define TABLE_START_TEMP (-40) +#define TABLE_END_TEMP 85 +#define TABLE_SIZE 38 + +// Параметры Steinhart-Hart для термистора +#define koef_A 0.001741624168166423 +#define koef_B 0.00017003940268680147 +#define koef_C 0.0000004890545443703666 + +#define TABLE_SIZE_LOOKUP 512 + +typedef enum { + ALG_STEINHART = 0, + ALG_STEINHART_FULL = 1, + ALG_LINEAR = 2 +} eAlg; + +// Предварительно вычисленная таблица для быстрого доступа +typedef struct { + uint16_t adc_value; // Значение АЦП + int16_t temp_c; // Температура в °C * 10 (для фиксированной точки) +} adc_temp_lookup; + +void init_fast_lookup_table(eAlg use_alg); +float get_temperature_from_adc(uint16_t adc_value, eAlg alg); +int16_t get_temperature_fast(uint16_t adc_value); + +#endif //MDF_ADC_TEMP_KST45_14_2_H diff --git a/APP/inc/ADC_Temp_KST45-14-2.h b/APP/inc/ADC_Temp_KST45-14-2.h deleted file mode 100644 index c470a39..0000000 --- a/APP/inc/ADC_Temp_KST45-14-2.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// Created by cfif on 04.12.2025. -// - -#ifndef MDF_ADC_TEMP_KST45_14_2_H -#define MDF_ADC_TEMP_KST45_14_2_H - -#include - -typedef enum { - ALG_STEINHART = 0, - ALG_STEINHART_FULL = 1, - ALG_LINEAR = 2 -} eAlg; - -void init_fast_lookup_table(eAlg use_alg); -float get_temperature_from_adc_KST45(uint16_t adc_value, eAlg alg); -int16_t get_temperature_fast_KST45(uint16_t adc_value); - -#endif //MDF_ADC_TEMP_KST45_14_2_H diff --git a/APP/main.c b/APP/main.c index f0cb05c..ceda7c6 100644 --- a/APP/main.c +++ b/APP/main.c @@ -3,21 +3,31 @@ #include #include #include -#include "ADC_Temp_KST45-14-2.h" +#include "ADC_Temp.h" #include "aterlux.h" // value 0..4095 - Это диапазон АЦП, Нужно проверить крайние значения и смоделировать таблицы + +extern adc_temp_lookup fast_lookup[TABLE_SIZE_LOOKUP]; + int main() { init_fast_lookup_table(ALG_STEINHART); - //uint16_t value = 4095 / 2; // Должно быть 25 градусов. Это середина диапазона АЦП - uint16_t value = 3200; - float T_ALG_LINEAR = get_temperature_from_adc_KST45(value, ALG_LINEAR); - float T_ALG_STEINHART = get_temperature_from_adc_KST45(value, ALG_STEINHART); - float T_ALG_STEINHART_FULL = get_temperature_from_adc_KST45(value, ALG_STEINHART_FULL); - float T_FAST = get_temperature_fast_KST45(value); + for (int i = 0; i < TABLE_SIZE_LOOKUP; ++i) { + printf("{%u,%d}, \n", fast_lookup[i].adc_value, fast_lookup[i].temp_c); + } + + + + //uint16_t value = 4095 / 2; // Должно быть 25 градусов. Это середина диапазона АЦП + uint16_t value = 1980; + + float T_ALG_LINEAR = get_temperature_from_adc(value, ALG_LINEAR); + float T_ALG_STEINHART = get_temperature_from_adc(value, ALG_STEINHART); + float T_ALG_STEINHART_FULL = get_temperature_from_adc(value, ALG_STEINHART_FULL); + float T_FAST = get_temperature_fast(value); float T_ATERLUX = calc_temperature(value); printf("T_ALG_LINEAR = %f \n", T_ALG_LINEAR); diff --git a/APP/src/ADC_Temp_KST45-14-2.c b/APP/src/ADC_Temp.c similarity index 84% rename from APP/src/ADC_Temp_KST45-14-2.c rename to APP/src/ADC_Temp.c index eb79a56..71e7897 100644 --- a/APP/src/ADC_Temp_KST45-14-2.c +++ b/APP/src/ADC_Temp.c @@ -2,30 +2,17 @@ // Created by cfif on 02.12.2025. // #include "stdint.h" -#include "ADC_Temp_KST45-14-2.h" +#include "ADC_Temp.h" #include -// Константы -#define ADC_MAX 4095.0f // 12-битный АЦП -#define R1 3000.0f // Сопротивление делителя напряжения -#define TABLE_START_TEMP (-40) -#define TABLE_END_TEMP 85 -#define TABLE_SIZE 26 - -// Параметры Steinhart-Hart для термистора -#define koef_A 0.001741624168166423 -#define koef_B 0.00017003940268680147 -#define koef_C 0.0000004890545443703666 - -#define TABLE_SIZE_LOOKUP 32 - // Структура для хранения табличных данных typedef struct { int temp_c; // Температура (°C) float r_nom; // Номинальное сопротивление (Ω) } ntc_table_entry; -// Таблица из документа +/* +// Таблица из документа KST45 static const ntc_table_entry ntc_table[] = { {-40, 100950.0f}, {-35, 72777.0f}, @@ -54,6 +41,49 @@ static const ntc_table_entry ntc_table[] = { {80, 377.4f}, {85, 321.7f} }; +*/ + +// Таблица из документа Incar +ntc_table_entry ntc_table[] = { + {-40, 101000.0f}, + {-35, 72600.0f}, + {-30, 52720.0f}, + {-25, 38660.0f}, + {-20, 28620.0f}, + {-15, 21390.0f}, + {-10, 16120.0f}, + {-5, 12260.0f}, + {-4, 11620.0f}, + {-3, 11010.0f}, + {-2, 10440.0f}, + {-1, 9907.0f}, + {0, 9399.0f}, + {1, 8924.0f}, + {2, 8473.0f}, + {3, 8048.0f}, + {4, 7646.0f}, + {5, 7267.0f}, + {6, 6909.0f}, + {7, 6570.0f}, + {8, 6250.0f}, + {9, 5947.0f}, + {10, 5661.0f}, + {15, 4441.0f}, + {20, 3512.0f}, + {25, 2795.0f}, + {30, 2239.0f}, + {35, 1806.0f}, + {40, 1464.0f}, + {45, 1195.0f}, + {50, 980.0f}, + {55, 809.0f}, + {60, 670.0f}, + {65, 559.0f}, + {70, 468.0f}, + {75, 394.0f}, + {80, 333.0f}, + {85, 283.0f} +}; // Функция расчёта сопротивления NTC из значения АЦП static float calculate_resistance(uint16_t adc_value) { @@ -164,7 +194,7 @@ static float interpolate_steinhart_full(float resistance, int index) { } // Основная функция для получения температуры -float get_temperature_from_adc_KST45(uint16_t adc_value, eAlg use_alg) { +float get_temperature_from_adc(uint16_t adc_value, eAlg use_alg) { float resistance = calculate_resistance(adc_value); if (resistance <= 0.0f) { @@ -190,28 +220,19 @@ float get_temperature_from_adc_KST45(uint16_t adc_value, eAlg use_alg) { } - - - -// Предварительно вычисленная таблица для быстрого доступа -typedef struct { - uint16_t adc_value; // Значение АЦП - int16_t temp_c; // Температура в °C * 10 (для фиксированной точки) -} adc_temp_lookup; - -static adc_temp_lookup fast_lookup[TABLE_SIZE_LOOKUP]; // Таблица на TABLE_SIZE_LOOKUP значений +adc_temp_lookup fast_lookup[TABLE_SIZE_LOOKUP]; // Таблица на TABLE_SIZE_LOOKUP значений void init_fast_lookup_table(eAlg use_alg) { // Создаем таблицу для быстрого преобразования АЦП->температура for (uint16_t i = 0; i < TABLE_SIZE_LOOKUP; i++) { uint16_t adc = i * (uint8_t)roundf(ADC_MAX / (TABLE_SIZE_LOOKUP - 1)); // Для 12-битного АЦП (0-4095) - float temp = get_temperature_from_adc_KST45(adc, use_alg); + float temp = get_temperature_from_adc(adc, use_alg); fast_lookup[i].adc_value = adc; fast_lookup[i].temp_c = (int16_t) (temp * 10.0f); // Храним с точностью 0.1°C } } -int16_t get_temperature_fast_KST45(uint16_t adc_value) { +int16_t get_temperature_fast(uint16_t adc_value) { // Простой поиск в таблице с линейной интерполяцией uint16_t index = adc_value / (uint8_t)roundf(ADC_MAX / (TABLE_SIZE_LOOKUP - 1)); // Делим на 16 для TABLE_SIZE_LOOKUP = 256 if (index >= (TABLE_SIZE_LOOKUP - 1)) return fast_lookup[TABLE_SIZE_LOOKUP - 1].temp_c;