From a56859a4c2df87a159e874fde21c358d6ba97069 Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 16 Dec 2025 11:12:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ADC_Temp.c | 199 +++++ ADC_Temp.h | 46 ++ ADC_Temp_KST45-14-2.c | 1771 ----------------------------------------- ADC_Temp_KST45-14-2.h | 20 - ADC_Temp_Table.c | 1037 ++++++++++++++++++++++++ ADC_Temp_Table.h | 13 + 6 files changed, 1295 insertions(+), 1791 deletions(-) create mode 100644 ADC_Temp.c create mode 100644 ADC_Temp.h delete mode 100644 ADC_Temp_KST45-14-2.c delete mode 100644 ADC_Temp_KST45-14-2.h create mode 100644 ADC_Temp_Table.c create mode 100644 ADC_Temp_Table.h diff --git a/ADC_Temp.c b/ADC_Temp.c new file mode 100644 index 0000000..233fdee --- /dev/null +++ b/ADC_Temp.c @@ -0,0 +1,199 @@ +// +// Created by cfif on 02.12.2025. +// +#include "stdint.h" +#include "ADC_Temp.h" +#include + +adc_temp_lookup fast_lookup[TABLE_SIZE_LOOKUP]; // Таблица на TABLE_SIZE_LOOKUP значений + +// Таблица из документа KST45-14-2 +static const ntc_table_entry ntc_table[] = { + {-40, 100950.0f}, + {-35, 72777.0f}, + {-30, 53100.0f}, + {-25, 39111.0f}, + {-20, 29121.0f}, + {-15, 21879.0f}, + {-10, 16599.0f}, + {-5, 12695.0f}, + {0, 9795.0f}, + {5, 7616.0f}, + {10, 5970.0f}, + {15, 4712.0f}, + {20, 3747.0f}, + {25, 3000.0f}, + {30, 2417.0f}, + {35, 1959.0f}, + {40, 1598.0f}, + {45, 1311.0f}, + {50, 1081.0f}, + {55, 895.9f}, + {60, 746.4f}, + {65, 624.9f}, + {70, 525.6f}, + {75, 444.4f}, + {80, 377.4f}, + {85, 321.7f} +}; + + +// Функция расчёта сопротивления NTC из значения АЦП +static float calculate_resistance(uint16_t adc_value) { + if (adc_value == 0 || adc_value >= (uint16_t) ADC_MAX) { + return 0.0f; + } + // Формула делителя напряжения: R_ntc = R1 * (ADC_MAX / adc_value - 1) + // float R_ntc = R1 * (ADC_MAX / (float)adc_value - 1.0f); + + float R_ntc = R1 * (float) adc_value / (ADC_MAX - (float) adc_value); + + return R_ntc; +} + + +// Бинарный поиск в таблице +static int find_interval_index(float resistance) { + int left = 0; + int right = TABLE_SIZE - 1; + + // Проверка границ + if (resistance >= ntc_table[0].r_nom) return 0; + if (resistance <= ntc_table[right].r_nom) return right - 1; + + // Бинарный поиск + while (left <= right) { + int mid = left + (right - left) / 2; + + if (mid < TABLE_SIZE - 1 && + resistance <= ntc_table[mid].r_nom && + resistance >= ntc_table[mid + 1].r_nom) { + return mid; + } + + if (resistance > ntc_table[mid].r_nom) { + right = mid - 1; + } else { + left = mid + 1; + } + } + + return -1; // Не найден +} + +// Интерполяция с использованием уравнения Стейнхарта-Харта между точками +static float interpolate_steinhart(float resistance, int index) { + // Берем две соседние точки из таблицы + float t1 = (float) ntc_table[index].temp_c + 273.15f; // в Кельвинах + float t2 = (float) ntc_table[index + 1].temp_c + 273.15f; + float r1 = ntc_table[index].r_nom; + float r2 = ntc_table[index + 1].r_nom; + + // Вычисляем коэффициент B для интервала + float B = logf(r1 / r2) / (1.0f / t1 - 1.0f / t2); + + // Используем уравнение Стейнхарта-Харта для вычисления температуры + float steinhart = logf(resistance / r1) / B + 1.0f / t1; + float temp_k = 1.0f / steinhart; + + return temp_k - 273.15f; // Конвертация в °C +} + +// Линейная интерполяция в логарифмическом масштабе +static float interpolate_log_linear(float resistance, int index) { + float t1 = (float) ntc_table[index].temp_c; + float t2 = (float) ntc_table[index + 1].temp_c; + float r1 = ntc_table[index].r_nom; + float r2 = ntc_table[index + 1].r_nom; + + float log_r1 = logf(r1); + float log_r2 = logf(r2); + float log_r = logf(resistance); + + return t1 + (t2 - t1) * (log_r - log_r1) / (log_r2 - log_r1); +} + +// Более надежная версия с проверкой параметров +static float interpolate_steinhart_full(float resistance, int index) { + // Проверка корректности входных данных + if (resistance <= 0.0f) { + return -273.15f; // Абсолютный ноль при некорректном сопротивлении + } + + // Для повышения точности можно использовать таблицу как справочную, + // но основное вычисление - по уравнению с коэффициентами + double L = logf(resistance); + + // Для термисторов NTC коэффициент C обычно очень маленький (порядка 1e-7...1e-8) + // Убедимся, что кубический член вычислен корректно + double L3 = L * L * L; + double inv_T = koef_A + koef_B * L + koef_C * L3; + + // Проверка на физическую реализуемость (температура должна быть положительной в Кельвинах) + if (inv_T <= 0.0f || inv_T > 1.0f) { // 1/T не может быть <= 0 (T < 0K) или слишком большим + // В случае ошибки возвращаем температуру из таблицы по индексу + return (float) ntc_table[index].temp_c; + } + + double temp_K = 1.0f / inv_T; + + // Дополнительная проверка диапазона (например, для NTC обычно -50...+150°C) + if (temp_K < 223.15f || temp_K > 423.15f) { // -50°C...150°C в Кельвинах + // Возвращаем значение из таблицы как запасной вариант + return (float) ntc_table[index].temp_c; + } + + return (float) (temp_K - 273.15f); +} + +// Основная функция для получения температуры +float get_temperature_from_adc(uint16_t adc_value, eAlg use_alg) { + float resistance = calculate_resistance(adc_value); + + if (resistance <= 0.0f) { + return -273.15f; // Ошибка + } + + int index = find_interval_index(resistance); + + if (index < 0 || index >= TABLE_SIZE - 1) { + // Вне диапазона таблицы + if (resistance >= ntc_table[0].r_nom) return TABLE_START_TEMP; + if (resistance <= ntc_table[TABLE_SIZE - 1].r_nom) return TABLE_END_TEMP; + return -273.15f; // Ошибка + } + + if (use_alg == ALG_STEINHART) { + return interpolate_steinhart(resistance, index); + } else if (use_alg == ALG_STEINHART_FULL) { + return interpolate_steinhart_full(resistance, index); + } else { + return interpolate_log_linear(resistance, index); + } +} + + +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(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(uint16_t adc_value, adc_temp_lookup *fast_temp_lookup, uint16_t size_fast_temp_lookup) { + // Простой поиск в таблице с линейной интерполяцией + uint16_t index = adc_value / + (uint8_t) roundf(ADC_MAX / ((float) size_fast_temp_lookup - 1)); // Делим на 16 для TABLE_SIZE_LOOKUP = 256 + if (index >= (size_fast_temp_lookup - 1)) return fast_temp_lookup[size_fast_temp_lookup - 1].temp_c; + + uint16_t adc1 = fast_temp_lookup[index].adc_value; + uint16_t adc2 = fast_temp_lookup[index + 1].adc_value; + int16_t temp1 = fast_temp_lookup[index].temp_c; + int16_t temp2 = fast_temp_lookup[index + 1].temp_c; + + // Линейная интерполяция + return temp1 + ((temp2 - temp1) * (adc_value - adc1)) / (adc2 - adc1); +} diff --git a/ADC_Temp.h b/ADC_Temp.h new file mode 100644 index 0000000..b08fa8c --- /dev/null +++ b/ADC_Temp.h @@ -0,0 +1,46 @@ +// +// 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 3000.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 struct { + int temp_c; // Температура (°C) + float r_nom; // Номинальное сопротивление (Ω) +} ntc_table_entry; + +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, adc_temp_lookup *fast_temp_lookup, uint16_t size_fast_temp_lookup); + +#endif //MDF_ADC_TEMP_KST45_14_2_H diff --git a/ADC_Temp_KST45-14-2.c b/ADC_Temp_KST45-14-2.c deleted file mode 100644 index 305df2c..0000000 --- a/ADC_Temp_KST45-14-2.c +++ /dev/null @@ -1,1771 +0,0 @@ -// -// Created by cfif on 02.12.2025. -// -#include "stdint.h" -#include "ADC_Temp_KST45-14-2.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 38 - -// Параметры Steinhart-Hart для термистора -#define koef_A 0.001741624168166423 -#define koef_B 0.00017003940268680147 -#define koef_C 0.0000004890545443703666 - -#define TABLE_SIZE_LOOKUP 512 - -// Структура для хранения табличных данных -typedef struct { - int temp_c; // Температура (°C) - float r_nom; // Номинальное сопротивление (Ω) -} ntc_table_entry; - -/* -// Таблица из документа KST45-14-2 -static const ntc_table_entry ntc_table[] = { - {-40, 100950.0f}, - {-35, 72777.0f}, - {-30, 53100.0f}, - {-25, 39111.0f}, - {-20, 29121.0f}, - {-15, 21879.0f}, - {-10, 16599.0f}, - {-5, 12695.0f}, - {0, 9795.0f}, - {5, 7616.0f}, - {10, 5970.0f}, - {15, 4712.0f}, - {20, 3747.0f}, - {25, 3000.0f}, - {30, 2417.0f}, - {35, 1959.0f}, - {40, 1598.0f}, - {45, 1311.0f}, - {50, 1081.0f}, - {55, 895.9f}, - {60, 746.4f}, - {65, 624.9f}, - {70, 525.6f}, - {75, 444.4f}, - {80, 377.4f}, - {85, 321.7f} -}; -*/ - -/* -ntc_table_entry ntc_table[] = { - {0,-2731}, - {8,2605}, - {16,2164}, - {24,1937}, - {32,1789}, - {40,1680}, - {48,1594}, - {56,1524}, - {64,1466}, - {72,1415}, - {80,1371}, - {88,1331}, - {96,1296}, - {104,1264}, - {112,1234}, - {120,1207}, - {128,1182}, - {136,1159}, - {144,1138}, - {152,1117}, - {160,1098}, - {168,1080}, - {176,1063}, - {184,1047}, - {192,1032}, - {200,1017}, - {208,1003}, - {216,989}, - {224,976}, - {232,964}, - {240,952}, - {248,941}, - {256,930}, - {264,919}, - {272,909}, - {280,899}, - {288,889}, - {296,880}, - {304,871}, - {312,862}, - {320,853}, - {328,845}, - {336,837}, - {344,829}, - {352,821}, - {360,813}, - {368,806}, - {376,799}, - {384,792}, - {392,785}, - {400,778}, - {408,772}, - {416,766}, - {424,759}, - {432,753}, - {440,747}, - {448,741}, - {456,735}, - {464,730}, - {472,724}, - {480,718}, - {488,713}, - {496,708}, - {504,702}, - {512,697}, - {520,692}, - {528,687}, - {536,682}, - {544,678}, - {552,673}, - {560,668}, - {568,664}, - {576,659}, - {584,655}, - {592,650}, - {600,646}, - {608,641}, - {616,637}, - {624,633}, - {632,629}, - {640,625}, - {648,621}, - {656,617}, - {664,613}, - {672,609}, - {680,605}, - {688,601}, - {696,597}, - {704,594}, - {712,590}, - {720,586}, - {728,583}, - {736,579}, - {744,576}, - {752,572}, - {760,569}, - {768,565}, - {776,562}, - {784,559}, - {792,555}, - {800,552}, - {808,549}, - {816,546}, - {824,542}, - {832,539}, - {840,536}, - {848,533}, - {856,530}, - {864,527}, - {872,524}, - {880,521}, - {888,518}, - {896,515}, - {904,512}, - {912,509}, - {920,506}, - {928,503}, - {936,500}, - {944,497}, - {952,494}, - {960,492}, - {968,489}, - {976,486}, - {984,483}, - {992,481}, - {1000,478}, - {1008,475}, - {1016,473}, - {1024,470}, - {1032,468}, - {1040,465}, - {1048,462}, - {1056,460}, - {1064,457}, - {1072,455}, - {1080,452}, - {1088,450}, - {1096,447}, - {1104,445}, - {1112,442}, - {1120,440}, - {1128,437}, - {1136,435}, - {1144,433}, - {1152,430}, - {1160,428}, - {1168,425}, - {1176,423}, - {1184,421}, - {1192,418}, - {1200,416}, - {1208,414}, - {1216,411}, - {1224,409}, - {1232,407}, - {1240,405}, - {1248,402}, - {1256,400}, - {1264,398}, - {1272,396}, - {1280,394}, - {1288,391}, - {1296,389}, - {1304,387}, - {1312,385}, - {1320,383}, - {1328,381}, - {1336,378}, - {1344,376}, - {1352,374}, - {1360,372}, - {1368,370}, - {1376,368}, - {1384,366}, - {1392,364}, - {1400,362}, - {1408,360}, - {1416,358}, - {1424,356}, - {1432,354}, - {1440,352}, - {1448,350}, - {1456,348}, - {1464,346}, - {1472,344}, - {1480,342}, - {1488,340}, - {1496,338}, - {1504,336}, - {1512,334}, - {1520,332}, - {1528,330}, - {1536,328}, - {1544,326}, - {1552,324}, - {1560,322}, - {1568,320}, - {1576,318}, - {1584,316}, - {1592,314}, - {1600,312}, - {1608,311}, - {1616,309}, - {1624,307}, - {1632,305}, - {1640,303}, - {1648,301}, - {1656,299}, - {1664,297}, - {1672,296}, - {1680,294}, - {1688,292}, - {1696,290}, - {1704,288}, - {1712,286}, - {1720,285}, - {1728,283}, - {1736,281}, - {1744,279}, - {1752,277}, - {1760,276}, - {1768,274}, - {1776,272}, - {1784,270}, - {1792,268}, - {1800,267}, - {1808,265}, - {1816,263}, - {1824,261}, - {1832,260}, - {1840,258}, - {1848,256}, - {1856,254}, - {1864,253}, - {1872,251}, - {1880,249}, - {1888,247}, - {1896,246}, - {1904,244}, - {1912,242}, - {1920,240}, - {1928,239}, - {1936,237}, - {1944,235}, - {1952,233}, - {1960,232}, - {1968,230}, - {1976,228}, - {1984,227}, - {1992,225}, - {2000,223}, - {2008,221}, - {2016,220}, - {2024,218}, - {2032,216}, - {2040,215}, - {2048,213}, - {2056,211}, - {2064,209}, - {2072,208}, - {2080,206}, - {2088,204}, - {2096,203}, - {2104,201}, - {2112,199}, - {2120,198}, - {2128,196}, - {2136,194}, - {2144,193}, - {2152,191}, - {2160,189}, - {2168,188}, - {2176,186}, - {2184,184}, - {2192,182}, - {2200,181}, - {2208,179}, - {2216,177}, - {2224,176}, - {2232,174}, - {2240,172}, - {2248,171}, - {2256,169}, - {2264,167}, - {2272,166}, - {2280,164}, - {2288,162}, - {2296,161}, - {2304,159}, - {2312,157}, - {2320,156}, - {2328,154}, - {2336,152}, - {2344,151}, - {2352,149}, - {2360,147}, - {2368,146}, - {2376,144}, - {2384,142}, - {2392,141}, - {2400,139}, - {2408,137}, - {2416,136}, - {2424,134}, - {2432,132}, - {2440,130}, - {2448,129}, - {2456,127}, - {2464,125}, - {2472,124}, - {2480,122}, - {2488,120}, - {2496,119}, - {2504,117}, - {2512,115}, - {2520,114}, - {2528,112}, - {2536,110}, - {2544,109}, - {2552,107}, - {2560,105}, - {2568,104}, - {2576,102}, - {2584,100}, - {2592,98}, - {2600,97}, - {2608,95}, - {2616,93}, - {2624,92}, - {2632,90}, - {2640,88}, - {2648,86}, - {2656,85}, - {2664,83}, - {2672,81}, - {2680,79}, - {2688,78}, - {2696,76}, - {2704,74}, - {2712,73}, - {2720,71}, - {2728,69}, - {2736,67}, - {2744,66}, - {2752,64}, - {2760,62}, - {2768,60}, - {2776,58}, - {2784,57}, - {2792,55}, - {2800,53}, - {2808,51}, - {2816,50}, - {2824,48}, - {2832,46}, - {2840,44}, - {2848,42}, - {2856,41}, - {2864,39}, - {2872,37}, - {2880,35}, - {2888,33}, - {2896,31}, - {2904,30}, - {2912,28}, - {2920,26}, - {2928,24}, - {2936,22}, - {2944,20}, - {2952,18}, - {2960,16}, - {2968,15}, - {2976,13}, - {2984,11}, - {2992,9}, - {3000,7}, - {3008,5}, - {3016,3}, - {3024,1}, - {3032,0}, - {3040,-2}, - {3048,-4}, - {3056,-6}, - {3064,-8}, - {3072,-10}, - {3080,-12}, - {3088,-14}, - {3096,-16}, - {3104,-18}, - {3112,-20}, - {3120,-22}, - {3128,-24}, - {3136,-26}, - {3144,-28}, - {3152,-30}, - {3160,-32}, - {3168,-34}, - {3176,-36}, - {3184,-38}, - {3192,-40}, - {3200,-42}, - {3208,-44}, - {3216,-47}, - {3224,-49}, - {3232,-51}, - {3240,-53}, - {3248,-55}, - {3256,-58}, - {3264,-60}, - {3272,-62}, - {3280,-64}, - {3288,-67}, - {3296,-69}, - {3304,-71}, - {3312,-73}, - {3320,-76}, - {3328,-78}, - {3336,-80}, - {3344,-83}, - {3352,-85}, - {3360,-88}, - {3368,-90}, - {3376,-92}, - {3384,-95}, - {3392,-97}, - {3400,-100}, - {3408,-102}, - {3416,-105}, - {3424,-107}, - {3432,-110}, - {3440,-112}, - {3448,-115}, - {3456,-118}, - {3464,-120}, - {3472,-123}, - {3480,-126}, - {3488,-128}, - {3496,-131}, - {3504,-134}, - {3512,-137}, - {3520,-140}, - {3528,-142}, - {3536,-145}, - {3544,-148}, - {3552,-151}, - {3560,-154}, - {3568,-157}, - {3576,-160}, - {3584,-163}, - {3592,-166}, - {3600,-170}, - {3608,-173}, - {3616,-176}, - {3624,-179}, - {3632,-182}, - {3640,-186}, - {3648,-189}, - {3656,-193}, - {3664,-196}, - {3672,-200}, - {3680,-203}, - {3688,-207}, - {3696,-211}, - {3704,-214}, - {3712,-218}, - {3720,-222}, - {3728,-226}, - {3736,-230}, - {3744,-234}, - {3752,-238}, - {3760,-242}, - {3768,-247}, - {3776,-251}, - {3784,-256}, - {3792,-260}, - {3800,-265}, - {3808,-270}, - {3816,-275}, - {3824,-280}, - {3832,-285}, - {3840,-290}, - {3848,-296}, - {3856,-301}, - {3864,-307}, - {3872,-313}, - {3880,-319}, - {3888,-325}, - {3896,-332}, - {3904,-338}, - {3912,-345}, - {3920,-352}, - {3928,-360}, - {3936,-368}, - {3944,-376}, - {3952,-384}, - {3960,-393}, - {3968,-403}, - {3976,-412}, - {3984,-423}, - {3992,-434}, - {4000,-446}, - {4008,-459}, - {4016,-472}, - {4024,-487}, - {4032,-504}, - {4040,-522}, - {4048,-543}, - {4056,-568}, - {4064,-597}, - {4072,-634}, - {4080,-684}, - {4088,-768} -}; -*/ - -ntc_table_entry ntc_table[] = { -{0,-2731}, -{8,0}, -{16,0}, -{24,0}, -{32,0}, -{40,0}, -{48,0}, -{56,0}, -{64,0}, -{72,0}, -{80,0}, -{88,0}, -{96,0}, -{104,0}, -{112,0}, -{120,0}, -{128,0}, -{136,0}, -{144,0}, -{152,0}, -{160,0}, -{168,0}, -{176,0}, -{184,0}, -{192,0}, -{200,0}, -{208,0}, -{216,0}, -{224,0}, -{232,0}, -{240,0}, -{248,0}, -{256,0}, -{264,0}, -{272,0}, -{280,0}, -{288,0}, -{296,0}, -{304,0}, -{312,0}, -{320,0}, -{328,0}, -{336,0}, -{344,0}, -{352,0}, -{360,0}, -{368,845}, -{376,838}, -{384,831}, -{392,824}, -{400,817}, -{408,810}, -{416,803}, -{424,796}, -{432,790}, -{440,784}, -{448,777}, -{456,771}, -{464,765}, -{472,760}, -{480,754}, -{488,748}, -{496,743}, -{504,737}, -{512,732}, -{520,726}, -{528,721}, -{536,716}, -{544,711}, -{552,706}, -{560,701}, -{568,696}, -{576,692}, -{584,687}, -{592,682}, -{600,678}, -{608,673}, -{616,669}, -{624,664}, -{632,660}, -{640,656}, -{648,652}, -{656,647}, -{664,643}, -{672,639}, -{680,635}, -{688,631}, -{696,627}, -{704,623}, -{712,620}, -{720,616}, -{728,612}, -{736,608}, -{744,605}, -{752,601}, -{760,597}, -{768,594}, -{776,590}, -{784,587}, -{792,583}, -{800,580}, -{808,577}, -{816,573}, -{824,570}, -{832,567}, -{840,563}, -{848,560}, -{856,557}, -{864,554}, -{872,550}, -{880,547}, -{888,544}, -{896,541}, -{904,538}, -{912,535}, -{920,532}, -{928,529}, -{936,526}, -{944,523}, -{952,520}, -{960,517}, -{968,514}, -{976,512}, -{984,509}, -{992,506}, -{1000,503}, -{1008,500}, -{1016,498}, -{1024,495}, -{1032,492}, -{1040,489}, -{1048,487}, -{1056,484}, -{1064,481}, -{1072,479}, -{1080,476}, -{1088,474}, -{1096,471}, -{1104,468}, -{1112,466}, -{1120,463}, -{1128,461}, -{1136,458}, -{1144,456}, -{1152,453}, -{1160,451}, -{1168,448}, -{1176,446}, -{1184,443}, -{1192,441}, -{1200,439}, -{1208,436}, -{1216,434}, -{1224,431}, -{1232,429}, -{1240,427}, -{1248,424}, -{1256,422}, -{1264,420}, -{1272,418}, -{1280,415}, -{1288,413}, -{1296,411}, -{1304,408}, -{1312,406}, -{1320,404}, -{1328,402}, -{1336,400}, -{1344,397}, -{1352,395}, -{1360,393}, -{1368,391}, -{1376,389}, -{1384,386}, -{1392,384}, -{1400,382}, -{1408,380}, -{1416,378}, -{1424,376}, -{1432,374}, -{1440,371}, -{1448,369}, -{1456,367}, -{1464,365}, -{1472,363}, -{1480,361}, -{1488,359}, -{1496,357}, -{1504,355}, -{1512,353}, -{1520,351}, -{1528,349}, -{1536,347}, -{1544,345}, -{1552,343}, -{1560,341}, -{1568,339}, -{1576,337}, -{1584,335}, -{1592,333}, -{1600,331}, -{1608,329}, -{1616,327}, -{1624,325}, -{1632,323}, -{1640,321}, -{1648,319}, -{1656,317}, -{1664,315}, -{1672,314}, -{1680,312}, -{1688,310}, -{1696,308}, -{1704,306}, -{1712,304}, -{1720,302}, -{1728,300}, -{1736,298}, -{1744,297}, -{1752,295}, -{1760,293}, -{1768,291}, -{1776,289}, -{1784,287}, -{1792,285}, -{1800,283}, -{1808,282}, -{1816,280}, -{1824,278}, -{1832,276}, -{1840,274}, -{1848,272}, -{1856,271}, -{1864,269}, -{1872,267}, -{1880,265}, -{1888,263}, -{1896,262}, -{1904,260}, -{1912,258}, -{1920,256}, -{1928,254}, -{1936,253}, -{1944,251}, -{1952,249}, -{1960,247}, -{1968,245}, -{1976,244}, -{1984,242}, -{1992,240}, -{2000,238}, -{2008,237}, -{2016,235}, -{2024,233}, -{2032,231}, -{2040,230}, -{2048,228}, -{2056,226}, -{2064,224}, -{2072,222}, -{2080,221}, -{2088,219}, -{2096,217}, -{2104,215}, -{2112,214}, -{2120,212}, -{2128,210}, -{2136,208}, -{2144,207}, -{2152,205}, -{2160,203}, -{2168,202}, -{2176,200}, -{2184,198}, -{2192,196}, -{2200,195}, -{2208,193}, -{2216,191}, -{2224,189}, -{2232,188}, -{2240,186}, -{2248,184}, -{2256,182}, -{2264,181}, -{2272,179}, -{2280,177}, -{2288,176}, -{2296,174}, -{2304,172}, -{2312,170}, -{2320,169}, -{2328,167}, -{2336,165}, -{2344,163}, -{2352,162}, -{2360,160}, -{2368,158}, -{2376,156}, -{2384,155}, -{2392,153}, -{2400,151}, -{2408,150}, -{2416,148}, -{2424,146}, -{2432,144}, -{2440,143}, -{2448,141}, -{2456,139}, -{2464,137}, -{2472,136}, -{2480,134}, -{2488,132}, -{2496,130}, -{2504,129}, -{2512,127}, -{2520,125}, -{2528,123}, -{2536,122}, -{2544,120}, -{2552,118}, -{2560,116}, -{2568,115}, -{2576,113}, -{2584,111}, -{2592,109}, -{2600,108}, -{2608,106}, -{2616,104}, -{2624,102}, -{2632,101}, -{2640,99}, -{2648,97}, -{2656,95}, -{2664,94}, -{2672,92}, -{2680,90}, -{2688,88}, -{2696,86}, -{2704,85}, -{2712,83}, -{2720,81}, -{2728,79}, -{2736,77}, -{2744,76}, -{2752,74}, -{2760,72}, -{2768,70}, -{2776,68}, -{2784,66}, -{2792,65}, -{2800,63}, -{2808,61}, -{2816,59}, -{2824,57}, -{2832,55}, -{2840,53}, -{2848,52}, -{2856,50}, -{2864,48}, -{2872,46}, -{2880,44}, -{2888,42}, -{2896,40}, -{2904,38}, -{2912,37}, -{2920,35}, -{2928,33}, -{2936,31}, -{2944,29}, -{2952,27}, -{2960,25}, -{2968,23}, -{2976,21}, -{2984,19}, -{2992,17}, -{3000,15}, -{3008,13}, -{3016,11}, -{3024,9}, -{3032,7}, -{3040,5}, -{3048,3}, -{3056,1}, -{3064,0}, -{3072,-2}, -{3080,-4}, -{3088,-6}, -{3096,-8}, -{3104,-10}, -{3112,-12}, -{3120,-14}, -{3128,-16}, -{3136,-18}, -{3144,-21}, -{3152,-23}, -{3160,-25}, -{3168,-27}, -{3176,-29}, -{3184,-31}, -{3192,-33}, -{3200,-36}, -{3208,-38}, -{3216,-40}, -{3224,-42}, -{3232,-44}, -{3240,-47}, -{3248,-49}, -{3256,-51}, -{3264,-53}, -{3272,-56}, -{3280,-58}, -{3288,-60}, -{3296,-63}, -{3304,-65}, -{3312,-67}, -{3320,-70}, -{3328,-72}, -{3336,-75}, -{3344,-77}, -{3352,-79}, -{3360,-82}, -{3368,-84}, -{3376,-87}, -{3384,-89}, -{3392,-92}, -{3400,-94}, -{3408,-97}, -{3416,-100}, -{3424,-102}, -{3432,-105}, -{3440,-107}, -{3448,-110}, -{3456,-113}, -{3464,-116}, -{3472,-118}, -{3480,-121}, -{3488,-124}, -{3496,-127}, -{3504,-129}, -{3512,-132}, -{3520,-135}, -{3528,-138}, -{3536,-141}, -{3544,-144}, -{3552,-147}, -{3560,-150}, -{3568,-153}, -{3576,-156}, -{3584,-159}, -{3592,-163}, -{3600,-166}, -{3608,-169}, -{3616,-172}, -{3624,-176}, -{3632,-179}, -{3640,-183}, -{3648,-186}, -{3656,-190}, -{3664,-193}, -{3672,-197}, -{3680,-200}, -{3688,-204}, -{3696,-208}, -{3704,-212}, -{3712,-216}, -{3720,-220}, -{3728,-224}, -{3736,-228}, -{3744,-232}, -{3752,-236}, -{3760,-240}, -{3768,-245}, -{3776,-249}, -{3784,-254}, -{3792,-259}, -{3800,-263}, -{3808,-268}, -{3816,-273}, -{3824,-278}, -{3832,-283}, -{3840,-289}, -{3848,-294}, -{3856,-300}, -{3864,-306}, -{3872,-312}, -{3880,-318}, -{3888,-324}, -{3896,-331}, -{3904,-338}, -{3912,-345}, -{3920,-352}, -{3928,-360}, -{3936,-367}, -{3944,-376}, -{3952,-384}, -{3960,-393}, -{3968,-403}, -{3976,-413}, -{3984,-423}, -{3992,-434}, -{4000,-446}, -{4008,-459}, -{4016,-473}, -{4024,-488}, -{4032,-505}, -{4040,-524}, -{4048,-545}, -{4056,-569}, -{4064,-599}, -{4072,-636}, -{4080,-686}, -{4088,-770}, -}; - -// Функция расчёта сопротивления NTC из значения АЦП -static float calculate_resistance(uint16_t adc_value) { - if (adc_value == 0 || adc_value >= (uint16_t) ADC_MAX) { - return 0.0f; - } - // Формула делителя напряжения: R_ntc = R1 * (ADC_MAX / adc_value - 1) - // float R_ntc = R1 * (ADC_MAX / (float)adc_value - 1.0f); - - float R_ntc = R1 * (float) adc_value / (ADC_MAX - (float) adc_value); - - return R_ntc; -} - - -// Бинарный поиск в таблице -static int find_interval_index(float resistance) { - int left = 0; - int right = TABLE_SIZE - 1; - - // Проверка границ - if (resistance >= ntc_table[0].r_nom) return 0; - if (resistance <= ntc_table[right].r_nom) return right - 1; - - // Бинарный поиск - while (left <= right) { - int mid = left + (right - left) / 2; - - if (mid < TABLE_SIZE - 1 && - resistance <= ntc_table[mid].r_nom && - resistance >= ntc_table[mid + 1].r_nom) { - return mid; - } - - if (resistance > ntc_table[mid].r_nom) { - right = mid - 1; - } else { - left = mid + 1; - } - } - - return -1; // Не найден -} - -// Интерполяция с использованием уравнения Стейнхарта-Харта между точками -static float interpolate_steinhart(float resistance, int index) { - // Берем две соседние точки из таблицы - float t1 = (float) ntc_table[index].temp_c + 273.15f; // в Кельвинах - float t2 = (float) ntc_table[index + 1].temp_c + 273.15f; - float r1 = ntc_table[index].r_nom; - float r2 = ntc_table[index + 1].r_nom; - - // Вычисляем коэффициент B для интервала - float B = logf(r1 / r2) / (1.0f / t1 - 1.0f / t2); - - // Используем уравнение Стейнхарта-Харта для вычисления температуры - float steinhart = logf(resistance / r1) / B + 1.0f / t1; - float temp_k = 1.0f / steinhart; - - return temp_k - 273.15f; // Конвертация в °C -} - -// Линейная интерполяция в логарифмическом масштабе -static float interpolate_log_linear(float resistance, int index) { - float t1 = (float) ntc_table[index].temp_c; - float t2 = (float) ntc_table[index + 1].temp_c; - float r1 = ntc_table[index].r_nom; - float r2 = ntc_table[index + 1].r_nom; - - float log_r1 = logf(r1); - float log_r2 = logf(r2); - float log_r = logf(resistance); - - return t1 + (t2 - t1) * (log_r - log_r1) / (log_r2 - log_r1); -} - -// Более надежная версия с проверкой параметров -static float interpolate_steinhart_full(float resistance, int index) { - // Проверка корректности входных данных - if (resistance <= 0.0f) { - return -273.15f; // Абсолютный ноль при некорректном сопротивлении - } - - // Для повышения точности можно использовать таблицу как справочную, - // но основное вычисление - по уравнению с коэффициентами - double L = logf(resistance); - - // Для термисторов NTC коэффициент C обычно очень маленький (порядка 1e-7...1e-8) - // Убедимся, что кубический член вычислен корректно - double L3 = L * L * L; - double inv_T = koef_A + koef_B * L + koef_C * L3; - - // Проверка на физическую реализуемость (температура должна быть положительной в Кельвинах) - if (inv_T <= 0.0f || inv_T > 1.0f) { // 1/T не может быть <= 0 (T < 0K) или слишком большим - // В случае ошибки возвращаем температуру из таблицы по индексу - return (float) ntc_table[index].temp_c; - } - - double temp_K = 1.0f / inv_T; - - // Дополнительная проверка диапазона (например, для NTC обычно -50...+150°C) - if (temp_K < 223.15f || temp_K > 423.15f) { // -50°C...150°C в Кельвинах - // Возвращаем значение из таблицы как запасной вариант - return (float) ntc_table[index].temp_c; - } - - return (float) (temp_K - 273.15f); -} - -// Основная функция для получения температуры -float get_temperature_from_adc_KST45(uint16_t adc_value, eAlg use_alg) { - float resistance = calculate_resistance(adc_value); - - if (resistance <= 0.0f) { - return -273.15f; // Ошибка - } - - int index = find_interval_index(resistance); - - if (index < 0 || index >= TABLE_SIZE - 1) { - // Вне диапазона таблицы - if (resistance >= ntc_table[0].r_nom) return TABLE_START_TEMP; - if (resistance <= ntc_table[TABLE_SIZE - 1].r_nom) return TABLE_END_TEMP; - return -273.15f; // Ошибка - } - - if (use_alg == ALG_STEINHART) { - return interpolate_steinhart(resistance, index); - } else if (use_alg == ALG_STEINHART_FULL) { - return interpolate_steinhart_full(resistance, index); - } else { - return interpolate_log_linear(resistance, index); - } -} - - -// Предварительно вычисленная таблица для быстрого доступа -typedef struct { - uint16_t adc_value; // Значение АЦП - int16_t temp_c; // Температура в °C * 10 (для фиксированной точки) -} adc_temp_lookup; - -static adc_temp_lookup fast_lookup[TABLE_SIZE_LOOKUP] = { - {0,-2731}, - {8,2672}, - {16,2220}, - {24,1988}, - {32,1837}, - {40,1725}, - {48,1638}, - {56,1567}, - {64,1507}, - {72,1455}, - {80,1410}, - {88,1370}, - {96,1334}, - {104,1301}, - {112,1271}, - {120,1244}, - {128,1218}, - {136,1195}, - {144,1173}, - {152,1152}, - {160,1133}, - {168,1114}, - {176,1097}, - {184,1080}, - {192,1065}, - {200,1050}, - {208,1035}, - {216,1022}, - {224,1009}, - {232,996}, - {240,984}, - {248,972}, - {256,961}, - {264,950}, - {272,940}, - {280,929}, - {288,920}, - {296,910}, - {304,901}, - {312,892}, - {320,883}, - {328,875}, - {336,866}, - {344,858}, - {352,850}, - {360,843}, - {368,835}, - {376,828}, - {384,821}, - {392,814}, - {400,807}, - {408,800}, - {416,794}, - {424,788}, - {432,781}, - {440,775}, - {448,769}, - {456,763}, - {464,758}, - {472,752}, - {480,746}, - {488,741}, - {496,735}, - {504,730}, - {512,725}, - {520,720}, - {528,715}, - {536,710}, - {544,705}, - {552,700}, - {560,695}, - {568,690}, - {576,686}, - {584,681}, - {592,677}, - {600,672}, - {608,668}, - {616,664}, - {624,659}, - {632,655}, - {640,651}, - {648,647}, - {656,643}, - {664,639}, - {672,635}, - {680,631}, - {688,627}, - {696,623}, - {704,619}, - {712,616}, - {720,612}, - {728,608}, - {736,605}, - {744,601}, - {752,598}, - {760,594}, - {768,591}, - {776,587}, - {784,584}, - {792,580}, - {800,577}, - {808,574}, - {816,571}, - {824,567}, - {832,564}, - {840,561}, - {848,558}, - {856,555}, - {864,552}, - {872,549}, - {880,546}, - {888,543}, - {896,539}, - {904,536}, - {912,534}, - {920,531}, - {928,528}, - {936,525}, - {944,522}, - {952,519}, - {960,516}, - {968,513}, - {976,511}, - {984,508}, - {992,505}, - {1000,502}, - {1008,500}, - {1016,497}, - {1024,494}, - {1032,492}, - {1040,489}, - {1048,486}, - {1056,484}, - {1064,481}, - {1072,479}, - {1080,476}, - {1088,474}, - {1096,471}, - {1104,469}, - {1112,466}, - {1120,464}, - {1128,461}, - {1136,459}, - {1144,456}, - {1152,454}, - {1160,451}, - {1168,449}, - {1176,447}, - {1184,444}, - {1192,442}, - {1200,440}, - {1208,437}, - {1216,435}, - {1224,433}, - {1232,430}, - {1240,428}, - {1248,426}, - {1256,423}, - {1264,421}, - {1272,419}, - {1280,417}, - {1288,415}, - {1296,412}, - {1304,410}, - {1312,408}, - {1320,406}, - {1328,404}, - {1336,401}, - {1344,399}, - {1352,397}, - {1360,395}, - {1368,393}, - {1376,391}, - {1384,389}, - {1392,387}, - {1400,384}, - {1408,382}, - {1416,380}, - {1424,378}, - {1432,376}, - {1440,374}, - {1448,372}, - {1456,370}, - {1464,368}, - {1472,366}, - {1480,364}, - {1488,362}, - {1496,360}, - {1504,358}, - {1512,356}, - {1520,354}, - {1528,352}, - {1536,350}, - {1544,348}, - {1552,346}, - {1560,344}, - {1568,342}, - {1576,340}, - {1584,338}, - {1592,337}, - {1600,335}, - {1608,333}, - {1616,331}, - {1624,329}, - {1632,327}, - {1640,325}, - {1648,323}, - {1656,321}, - {1664,319}, - {1672,318}, - {1680,316}, - {1688,314}, - {1696,312}, - {1704,310}, - {1712,308}, - {1720,306}, - {1728,305}, - {1736,303}, - {1744,301}, - {1752,299}, - {1760,297}, - {1768,295}, - {1776,294}, - {1784,292}, - {1792,290}, - {1800,288}, - {1808,286}, - {1816,285}, - {1824,283}, - {1832,281}, - {1840,279}, - {1848,277}, - {1856,276}, - {1864,274}, - {1872,272}, - {1880,270}, - {1888,269}, - {1896,267}, - {1904,265}, - {1912,263}, - {1920,262}, - {1928,260}, - {1936,258}, - {1944,256}, - {1952,255}, - {1960,253}, - {1968,251}, - {1976,249}, - {1984,248}, - {1992,246}, - {2000,244}, - {2008,242}, - {2016,241}, - {2024,239}, - {2032,237}, - {2040,235}, - {2048,234}, - {2056,232}, - {2064,230}, - {2072,229}, - {2080,227}, - {2088,225}, - {2096,223}, - {2104,222}, - {2112,220}, - {2120,218}, - {2128,217}, - {2136,215}, - {2144,213}, - {2152,211}, - {2160,210}, - {2168,208}, - {2176,206}, - {2184,205}, - {2192,203}, - {2200,201}, - {2208,200}, - {2216,198}, - {2224,196}, - {2232,194}, - {2240,193}, - {2248,191}, - {2256,189}, - {2264,188}, - {2272,186}, - {2280,184}, - {2288,183}, - {2296,181}, - {2304,179}, - {2312,178}, - {2320,176}, - {2328,174}, - {2336,172}, - {2344,171}, - {2352,169}, - {2360,167}, - {2368,166}, - {2376,164}, - {2384,162}, - {2392,161}, - {2400,159}, - {2408,157}, - {2416,155}, - {2424,154}, - {2432,152}, - {2440,150}, - {2448,149}, - {2456,147}, - {2464,145}, - {2472,144}, - {2480,142}, - {2488,140}, - {2496,138}, - {2504,137}, - {2512,135}, - {2520,133}, - {2528,132}, - {2536,130}, - {2544,128}, - {2552,126}, - {2560,125}, - {2568,123}, - {2576,121}, - {2584,120}, - {2592,118}, - {2600,116}, - {2608,114}, - {2616,113}, - {2624,111}, - {2632,109}, - {2640,107}, - {2648,106}, - {2656,104}, - {2664,102}, - {2672,100}, - {2680,99}, - {2688,97}, - {2696,95}, - {2704,93}, - {2712,92}, - {2720,90}, - {2728,88}, - {2736,86}, - {2744,85}, - {2752,83}, - {2760,81}, - {2768,79}, - {2776,77}, - {2784,76}, - {2792,74}, - {2800,72}, - {2808,70}, - {2816,68}, - {2824,67}, - {2832,65}, - {2840,63}, - {2848,61}, - {2856,59}, - {2864,57}, - {2872,56}, - {2880,54}, - {2888,52}, - {2896,50}, - {2904,48}, - {2912,46}, - {2920,44}, - {2928,43}, - {2936,41}, - {2944,39}, - {2952,37}, - {2960,35}, - {2968,33}, - {2976,31}, - {2984,29}, - {2992,27}, - {3000,25}, - {3008,23}, - {3016,22}, - {3024,20}, - {3032,18}, - {3040,16}, - {3048,14}, - {3056,12}, - {3064,10}, - {3072,8}, - {3080,6}, - {3088,4}, - {3096,2}, - {3104,0}, - {3112,-1}, - {3120,-4}, - {3128,-6}, - {3136,-8}, - {3144,-10}, - {3152,-12}, - {3160,-14}, - {3168,-16}, - {3176,-18}, - {3184,-20}, - {3192,-22}, - {3200,-25}, - {3208,-27}, - {3216,-29}, - {3224,-31}, - {3232,-33}, - {3240,-35}, - {3248,-38}, - {3256,-40}, - {3264,-42}, - {3272,-44}, - {3280,-47}, - {3288,-49}, - {3296,-51}, - {3304,-54}, - {3312,-56}, - {3320,-58}, - {3328,-61}, - {3336,-63}, - {3344,-65}, - {3352,-68}, - {3360,-70}, - {3368,-73}, - {3376,-75}, - {3384,-78}, - {3392,-80}, - {3400,-83}, - {3408,-85}, - {3416,-88}, - {3424,-90}, - {3432,-93}, - {3440,-95}, - {3448,-98}, - {3456,-101}, - {3464,-103}, - {3472,-106}, - {3480,-109}, - {3488,-112}, - {3496,-114}, - {3504,-117}, - {3512,-120}, - {3520,-123}, - {3528,-126}, - {3536,-129}, - {3544,-132}, - {3552,-134}, - {3560,-137}, - {3568,-140}, - {3576,-144}, - {3584,-147}, - {3592,-150}, - {3600,-153}, - {3608,-156}, - {3616,-159}, - {3624,-163}, - {3632,-166}, - {3640,-170}, - {3648,-173}, - {3656,-176}, - {3664,-180}, - {3672,-184}, - {3680,-187}, - {3688,-191}, - {3696,-195}, - {3704,-198}, - {3712,-202}, - {3720,-206}, - {3728,-210}, - {3736,-214}, - {3744,-218}, - {3752,-222}, - {3760,-227}, - {3768,-231}, - {3776,-236}, - {3784,-240}, - {3792,-245}, - {3800,-249}, - {3808,-254}, - {3816,-259}, - {3824,-264}, - {3832,-270}, - {3840,-275}, - {3848,-280}, - {3856,-286}, - {3864,-292}, - {3872,-298}, - {3880,-304}, - {3888,-310}, - {3896,-317}, - {3904,-323}, - {3912,-330}, - {3920,-338}, - {3928,-345}, - {3936,-353}, - {3944,-361}, - {3952,-370}, - {3960,-379}, - {3968,-388}, - {3976,-398}, - {3984,-409}, - {3992,-420}, - {4000,-432}, - {4008,-445}, - {4016,-459}, - {4024,-474}, - {4032,-491}, - {4040,-510}, - {4048,-531}, - {4056,-556}, - {4064,-585}, - {4072,-622}, - {4080,-673}, - {4088,-758}, -}; // Таблица на 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); - 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) { - // Простой поиск в таблице с линейной интерполяцией - 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; - - uint16_t adc1 = fast_lookup[index].adc_value; - uint16_t adc2 = fast_lookup[index + 1].adc_value; - int16_t temp1 = fast_lookup[index].temp_c; - int16_t temp2 = fast_lookup[index + 1].temp_c; - - // Линейная интерполяция - return temp1 + ((temp2 - temp1) * (adc_value - adc1)) / (adc2 - adc1); -} diff --git a/ADC_Temp_KST45-14-2.h b/ADC_Temp_KST45-14-2.h deleted file mode 100644 index c470a39..0000000 --- a/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/ADC_Temp_Table.c b/ADC_Temp_Table.c new file mode 100644 index 0000000..8a97770 --- /dev/null +++ b/ADC_Temp_Table.c @@ -0,0 +1,1037 @@ +// +// Created by cfif on 16.12.2025. +// +#include "ADC_Temp.h" + +const adc_temp_lookup fast_lookup_KST45[TABLE_SIZE_LOOKUP] = { + {0,-2731}, + {8,2748}, + {16,2276}, + {24,2035}, + {32,1878}, + {40,1762}, + {48,1672}, + {56,1598}, + {64,1536}, + {72,1483}, + {80,1436}, + {88,1395}, + {96,1358}, + {104,1324}, + {112,1293}, + {120,1265}, + {128,1239}, + {136,1214}, + {144,1192}, + {152,1171}, + {160,1151}, + {168,1132}, + {176,1114}, + {184,1097}, + {192,1081}, + {200,1065}, + {208,1051}, + {216,1037}, + {224,1023}, + {232,1010}, + {240,998}, + {248,986}, + {256,974}, + {264,963}, + {272,952}, + {280,942}, + {288,932}, + {296,922}, + {304,913}, + {312,903}, + {320,894}, + {328,886}, + {336,877}, + {344,869}, + {352,861}, + {360,853}, + {368,845}, + {376,838}, + {384,831}, + {392,824}, + {400,817}, + {408,810}, + {416,803}, + {424,796}, + {432,790}, + {440,784}, + {448,777}, + {456,771}, + {464,765}, + {472,760}, + {480,754}, + {488,748}, + {496,743}, + {504,737}, + {512,732}, + {520,726}, + {528,721}, + {536,716}, + {544,711}, + {552,706}, + {560,701}, + {568,696}, + {576,692}, + {584,687}, + {592,682}, + {600,678}, + {608,673}, + {616,669}, + {624,664}, + {632,660}, + {640,656}, + {648,652}, + {656,647}, + {664,643}, + {672,639}, + {680,635}, + {688,631}, + {696,627}, + {704,623}, + {712,620}, + {720,616}, + {728,612}, + {736,608}, + {744,605}, + {752,601}, + {760,597}, + {768,594}, + {776,590}, + {784,587}, + {792,583}, + {800,580}, + {808,577}, + {816,573}, + {824,570}, + {832,567}, + {840,563}, + {848,560}, + {856,557}, + {864,554}, + {872,550}, + {880,547}, + {888,544}, + {896,541}, + {904,538}, + {912,535}, + {920,532}, + {928,529}, + {936,526}, + {944,523}, + {952,520}, + {960,517}, + {968,514}, + {976,512}, + {984,509}, + {992,506}, + {1000,503}, + {1008,500}, + {1016,498}, + {1024,495}, + {1032,492}, + {1040,489}, + {1048,487}, + {1056,484}, + {1064,481}, + {1072,479}, + {1080,476}, + {1088,474}, + {1096,471}, + {1104,468}, + {1112,466}, + {1120,463}, + {1128,461}, + {1136,458}, + {1144,456}, + {1152,453}, + {1160,451}, + {1168,448}, + {1176,446}, + {1184,443}, + {1192,441}, + {1200,439}, + {1208,436}, + {1216,434}, + {1224,431}, + {1232,429}, + {1240,427}, + {1248,424}, + {1256,422}, + {1264,420}, + {1272,418}, + {1280,415}, + {1288,413}, + {1296,411}, + {1304,408}, + {1312,406}, + {1320,404}, + {1328,402}, + {1336,400}, + {1344,397}, + {1352,395}, + {1360,393}, + {1368,391}, + {1376,389}, + {1384,386}, + {1392,384}, + {1400,382}, + {1408,380}, + {1416,378}, + {1424,376}, + {1432,374}, + {1440,371}, + {1448,369}, + {1456,367}, + {1464,365}, + {1472,363}, + {1480,361}, + {1488,359}, + {1496,357}, + {1504,355}, + {1512,353}, + {1520,351}, + {1528,349}, + {1536,347}, + {1544,345}, + {1552,343}, + {1560,341}, + {1568,339}, + {1576,337}, + {1584,335}, + {1592,333}, + {1600,331}, + {1608,329}, + {1616,327}, + {1624,325}, + {1632,323}, + {1640,321}, + {1648,319}, + {1656,317}, + {1664,315}, + {1672,314}, + {1680,312}, + {1688,310}, + {1696,308}, + {1704,306}, + {1712,304}, + {1720,302}, + {1728,300}, + {1736,298}, + {1744,297}, + {1752,295}, + {1760,293}, + {1768,291}, + {1776,289}, + {1784,287}, + {1792,285}, + {1800,283}, + {1808,282}, + {1816,280}, + {1824,278}, + {1832,276}, + {1840,274}, + {1848,272}, + {1856,271}, + {1864,269}, + {1872,267}, + {1880,265}, + {1888,263}, + {1896,262}, + {1904,260}, + {1912,258}, + {1920,256}, + {1928,254}, + {1936,253}, + {1944,251}, + {1952,249}, + {1960,247}, + {1968,245}, + {1976,244}, + {1984,242}, + {1992,240}, + {2000,238}, + {2008,237}, + {2016,235}, + {2024,233}, + {2032,231}, + {2040,230}, + {2048,228}, + {2056,226}, + {2064,224}, + {2072,222}, + {2080,221}, + {2088,219}, + {2096,217}, + {2104,215}, + {2112,214}, + {2120,212}, + {2128,210}, + {2136,208}, + {2144,207}, + {2152,205}, + {2160,203}, + {2168,202}, + {2176,200}, + {2184,198}, + {2192,196}, + {2200,195}, + {2208,193}, + {2216,191}, + {2224,189}, + {2232,188}, + {2240,186}, + {2248,184}, + {2256,182}, + {2264,181}, + {2272,179}, + {2280,177}, + {2288,176}, + {2296,174}, + {2304,172}, + {2312,170}, + {2320,169}, + {2328,167}, + {2336,165}, + {2344,163}, + {2352,162}, + {2360,160}, + {2368,158}, + {2376,156}, + {2384,155}, + {2392,153}, + {2400,151}, + {2408,150}, + {2416,148}, + {2424,146}, + {2432,144}, + {2440,143}, + {2448,141}, + {2456,139}, + {2464,137}, + {2472,136}, + {2480,134}, + {2488,132}, + {2496,130}, + {2504,129}, + {2512,127}, + {2520,125}, + {2528,123}, + {2536,122}, + {2544,120}, + {2552,118}, + {2560,116}, + {2568,115}, + {2576,113}, + {2584,111}, + {2592,109}, + {2600,108}, + {2608,106}, + {2616,104}, + {2624,102}, + {2632,101}, + {2640,99}, + {2648,97}, + {2656,95}, + {2664,94}, + {2672,92}, + {2680,90}, + {2688,88}, + {2696,86}, + {2704,85}, + {2712,83}, + {2720,81}, + {2728,79}, + {2736,77}, + {2744,76}, + {2752,74}, + {2760,72}, + {2768,70}, + {2776,68}, + {2784,66}, + {2792,65}, + {2800,63}, + {2808,61}, + {2816,59}, + {2824,57}, + {2832,55}, + {2840,53}, + {2848,52}, + {2856,50}, + {2864,48}, + {2872,46}, + {2880,44}, + {2888,42}, + {2896,40}, + {2904,38}, + {2912,37}, + {2920,35}, + {2928,33}, + {2936,31}, + {2944,29}, + {2952,27}, + {2960,25}, + {2968,23}, + {2976,21}, + {2984,19}, + {2992,17}, + {3000,15}, + {3008,13}, + {3016,11}, + {3024,9}, + {3032,7}, + {3040,5}, + {3048,3}, + {3056,1}, + {3064,0}, + {3072,-2}, + {3080,-4}, + {3088,-6}, + {3096,-8}, + {3104,-10}, + {3112,-12}, + {3120,-14}, + {3128,-16}, + {3136,-18}, + {3144,-21}, + {3152,-23}, + {3160,-25}, + {3168,-27}, + {3176,-29}, + {3184,-31}, + {3192,-33}, + {3200,-36}, + {3208,-38}, + {3216,-40}, + {3224,-42}, + {3232,-44}, + {3240,-47}, + {3248,-49}, + {3256,-51}, + {3264,-53}, + {3272,-56}, + {3280,-58}, + {3288,-60}, + {3296,-63}, + {3304,-65}, + {3312,-67}, + {3320,-70}, + {3328,-72}, + {3336,-75}, + {3344,-77}, + {3352,-79}, + {3360,-82}, + {3368,-84}, + {3376,-87}, + {3384,-89}, + {3392,-92}, + {3400,-94}, + {3408,-97}, + {3416,-100}, + {3424,-102}, + {3432,-105}, + {3440,-107}, + {3448,-110}, + {3456,-113}, + {3464,-116}, + {3472,-118}, + {3480,-121}, + {3488,-124}, + {3496,-127}, + {3504,-129}, + {3512,-132}, + {3520,-135}, + {3528,-138}, + {3536,-141}, + {3544,-144}, + {3552,-147}, + {3560,-150}, + {3568,-153}, + {3576,-156}, + {3584,-159}, + {3592,-163}, + {3600,-166}, + {3608,-169}, + {3616,-172}, + {3624,-176}, + {3632,-179}, + {3640,-183}, + {3648,-186}, + {3656,-190}, + {3664,-193}, + {3672,-197}, + {3680,-200}, + {3688,-204}, + {3696,-208}, + {3704,-212}, + {3712,-216}, + {3720,-220}, + {3728,-224}, + {3736,-228}, + {3744,-232}, + {3752,-236}, + {3760,-240}, + {3768,-245}, + {3776,-249}, + {3784,-254}, + {3792,-259}, + {3800,-263}, + {3808,-268}, + {3816,-273}, + {3824,-278}, + {3832,-283}, + {3840,-289}, + {3848,-294}, + {3856,-300}, + {3864,-306}, + {3872,-312}, + {3880,-318}, + {3888,-324}, + {3896,-331}, + {3904,-338}, + {3912,-345}, + {3920,-352}, + {3928,-360}, + {3936,-367}, + {3944,-376}, + {3952,-384}, + {3960,-393}, + {3968,-403}, + {3976,-413}, + {3984,-423}, + {3992,-434}, + {4000,-446}, + {4008,-459}, + {4016,-473}, + {4024,-488}, + {4032,-505}, + {4040,-524}, + {4048,-545}, + {4056,-569}, + {4064,-599}, + {4072,-636}, + {4080,-686}, + {4088,-770} +}; // Таблица на TABLE_SIZE_LOOKUP значений + +const adc_temp_lookup fast_lookup_Incar[TABLE_SIZE_LOOKUP] = { + + {0,-2731}, + {8,2605}, + {16,2164}, + {24,1937}, + {32,1789}, + {40,1680}, + {48,1594}, + {56,1524}, + {64,1466}, + {72,1415}, + {80,1371}, + {88,1331}, + {96,1296}, + {104,1264}, + {112,1234}, + {120,1207}, + {128,1182}, + {136,1159}, + {144,1138}, + {152,1117}, + {160,1098}, + {168,1080}, + {176,1063}, + {184,1047}, + {192,1032}, + {200,1017}, + {208,1003}, + {216,989}, + {224,976}, + {232,964}, + {240,952}, + {248,941}, + {256,930}, + {264,919}, + {272,909}, + {280,899}, + {288,889}, + {296,880}, + {304,871}, + {312,862}, + {320,853}, + {328,845}, + {336,837}, + {344,829}, + {352,821}, + {360,813}, + {368,806}, + {376,799}, + {384,792}, + {392,785}, + {400,778}, + {408,772}, + {416,766}, + {424,759}, + {432,753}, + {440,747}, + {448,741}, + {456,735}, + {464,730}, + {472,724}, + {480,718}, + {488,713}, + {496,708}, + {504,702}, + {512,697}, + {520,692}, + {528,687}, + {536,682}, + {544,678}, + {552,673}, + {560,668}, + {568,664}, + {576,659}, + {584,655}, + {592,650}, + {600,646}, + {608,641}, + {616,637}, + {624,633}, + {632,629}, + {640,625}, + {648,621}, + {656,617}, + {664,613}, + {672,609}, + {680,605}, + {688,601}, + {696,597}, + {704,594}, + {712,590}, + {720,586}, + {728,583}, + {736,579}, + {744,576}, + {752,572}, + {760,569}, + {768,565}, + {776,562}, + {784,559}, + {792,555}, + {800,552}, + {808,549}, + {816,546}, + {824,542}, + {832,539}, + {840,536}, + {848,533}, + {856,530}, + {864,527}, + {872,524}, + {880,521}, + {888,518}, + {896,515}, + {904,512}, + {912,509}, + {920,506}, + {928,503}, + {936,500}, + {944,497}, + {952,494}, + {960,492}, + {968,489}, + {976,486}, + {984,483}, + {992,481}, + {1000,478}, + {1008,475}, + {1016,473}, + {1024,470}, + {1032,468}, + {1040,465}, + {1048,462}, + {1056,460}, + {1064,457}, + {1072,455}, + {1080,452}, + {1088,450}, + {1096,447}, + {1104,445}, + {1112,442}, + {1120,440}, + {1128,437}, + {1136,435}, + {1144,433}, + {1152,430}, + {1160,428}, + {1168,425}, + {1176,423}, + {1184,421}, + {1192,418}, + {1200,416}, + {1208,414}, + {1216,411}, + {1224,409}, + {1232,407}, + {1240,405}, + {1248,402}, + {1256,400}, + {1264,398}, + {1272,396}, + {1280,394}, + {1288,391}, + {1296,389}, + {1304,387}, + {1312,385}, + {1320,383}, + {1328,381}, + {1336,378}, + {1344,376}, + {1352,374}, + {1360,372}, + {1368,370}, + {1376,368}, + {1384,366}, + {1392,364}, + {1400,362}, + {1408,360}, + {1416,358}, + {1424,356}, + {1432,354}, + {1440,352}, + {1448,350}, + {1456,348}, + {1464,346}, + {1472,344}, + {1480,342}, + {1488,340}, + {1496,338}, + {1504,336}, + {1512,334}, + {1520,332}, + {1528,330}, + {1536,328}, + {1544,326}, + {1552,324}, + {1560,322}, + {1568,320}, + {1576,318}, + {1584,316}, + {1592,314}, + {1600,312}, + {1608,311}, + {1616,309}, + {1624,307}, + {1632,305}, + {1640,303}, + {1648,301}, + {1656,299}, + {1664,297}, + {1672,296}, + {1680,294}, + {1688,292}, + {1696,290}, + {1704,288}, + {1712,286}, + {1720,285}, + {1728,283}, + {1736,281}, + {1744,279}, + {1752,277}, + {1760,276}, + {1768,274}, + {1776,272}, + {1784,270}, + {1792,268}, + {1800,267}, + {1808,265}, + {1816,263}, + {1824,261}, + {1832,260}, + {1840,258}, + {1848,256}, + {1856,254}, + {1864,253}, + {1872,251}, + {1880,249}, + {1888,247}, + {1896,246}, + {1904,244}, + {1912,242}, + {1920,240}, + {1928,239}, + {1936,237}, + {1944,235}, + {1952,233}, + {1960,232}, + {1968,230}, + {1976,228}, + {1984,227}, + {1992,225}, + {2000,223}, + {2008,221}, + {2016,220}, + {2024,218}, + {2032,216}, + {2040,215}, + {2048,213}, + {2056,211}, + {2064,209}, + {2072,208}, + {2080,206}, + {2088,204}, + {2096,203}, + {2104,201}, + {2112,199}, + {2120,198}, + {2128,196}, + {2136,194}, + {2144,193}, + {2152,191}, + {2160,189}, + {2168,188}, + {2176,186}, + {2184,184}, + {2192,182}, + {2200,181}, + {2208,179}, + {2216,177}, + {2224,176}, + {2232,174}, + {2240,172}, + {2248,171}, + {2256,169}, + {2264,167}, + {2272,166}, + {2280,164}, + {2288,162}, + {2296,161}, + {2304,159}, + {2312,157}, + {2320,156}, + {2328,154}, + {2336,152}, + {2344,151}, + {2352,149}, + {2360,147}, + {2368,146}, + {2376,144}, + {2384,142}, + {2392,141}, + {2400,139}, + {2408,137}, + {2416,136}, + {2424,134}, + {2432,132}, + {2440,130}, + {2448,129}, + {2456,127}, + {2464,125}, + {2472,124}, + {2480,122}, + {2488,120}, + {2496,119}, + {2504,117}, + {2512,115}, + {2520,114}, + {2528,112}, + {2536,110}, + {2544,109}, + {2552,107}, + {2560,105}, + {2568,104}, + {2576,102}, + {2584,100}, + {2592,98}, + {2600,97}, + {2608,95}, + {2616,93}, + {2624,92}, + {2632,90}, + {2640,88}, + {2648,86}, + {2656,85}, + {2664,83}, + {2672,81}, + {2680,79}, + {2688,78}, + {2696,76}, + {2704,74}, + {2712,73}, + {2720,71}, + {2728,69}, + {2736,67}, + {2744,66}, + {2752,64}, + {2760,62}, + {2768,60}, + {2776,58}, + {2784,57}, + {2792,55}, + {2800,53}, + {2808,51}, + {2816,50}, + {2824,48}, + {2832,46}, + {2840,44}, + {2848,42}, + {2856,41}, + {2864,39}, + {2872,37}, + {2880,35}, + {2888,33}, + {2896,31}, + {2904,30}, + {2912,28}, + {2920,26}, + {2928,24}, + {2936,22}, + {2944,20}, + {2952,18}, + {2960,16}, + {2968,15}, + {2976,13}, + {2984,11}, + {2992,9}, + {3000,7}, + {3008,5}, + {3016,3}, + {3024,1}, + {3032,0}, + {3040,-2}, + {3048,-4}, + {3056,-6}, + {3064,-8}, + {3072,-10}, + {3080,-12}, + {3088,-14}, + {3096,-16}, + {3104,-18}, + {3112,-20}, + {3120,-22}, + {3128,-24}, + {3136,-26}, + {3144,-28}, + {3152,-30}, + {3160,-32}, + {3168,-34}, + {3176,-36}, + {3184,-38}, + {3192,-40}, + {3200,-42}, + {3208,-44}, + {3216,-47}, + {3224,-49}, + {3232,-51}, + {3240,-53}, + {3248,-55}, + {3256,-58}, + {3264,-60}, + {3272,-62}, + {3280,-64}, + {3288,-67}, + {3296,-69}, + {3304,-71}, + {3312,-73}, + {3320,-76}, + {3328,-78}, + {3336,-80}, + {3344,-83}, + {3352,-85}, + {3360,-88}, + {3368,-90}, + {3376,-92}, + {3384,-95}, + {3392,-97}, + {3400,-100}, + {3408,-102}, + {3416,-105}, + {3424,-107}, + {3432,-110}, + {3440,-112}, + {3448,-115}, + {3456,-118}, + {3464,-120}, + {3472,-123}, + {3480,-126}, + {3488,-128}, + {3496,-131}, + {3504,-134}, + {3512,-137}, + {3520,-140}, + {3528,-142}, + {3536,-145}, + {3544,-148}, + {3552,-151}, + {3560,-154}, + {3568,-157}, + {3576,-160}, + {3584,-163}, + {3592,-166}, + {3600,-170}, + {3608,-173}, + {3616,-176}, + {3624,-179}, + {3632,-182}, + {3640,-186}, + {3648,-189}, + {3656,-193}, + {3664,-196}, + {3672,-200}, + {3680,-203}, + {3688,-207}, + {3696,-211}, + {3704,-214}, + {3712,-218}, + {3720,-222}, + {3728,-226}, + {3736,-230}, + {3744,-234}, + {3752,-238}, + {3760,-242}, + {3768,-247}, + {3776,-251}, + {3784,-256}, + {3792,-260}, + {3800,-265}, + {3808,-270}, + {3816,-275}, + {3824,-280}, + {3832,-285}, + {3840,-290}, + {3848,-296}, + {3856,-301}, + {3864,-307}, + {3872,-313}, + {3880,-319}, + {3888,-325}, + {3896,-332}, + {3904,-338}, + {3912,-345}, + {3920,-352}, + {3928,-360}, + {3936,-368}, + {3944,-376}, + {3952,-384}, + {3960,-393}, + {3968,-403}, + {3976,-412}, + {3984,-423}, + {3992,-434}, + {4000,-446}, + {4008,-459}, + {4016,-472}, + {4024,-487}, + {4032,-504}, + {4040,-522}, + {4048,-543}, + {4056,-568}, + {4064,-597}, + {4072,-634}, + {4080,-684}, + {4088,-768} + + +}; // Таблица на TABLE_SIZE_LOOKUP значений \ No newline at end of file diff --git a/ADC_Temp_Table.h b/ADC_Temp_Table.h new file mode 100644 index 0000000..a9526a0 --- /dev/null +++ b/ADC_Temp_Table.h @@ -0,0 +1,13 @@ +// +// Created by cfif on 16.12.2025. +// + +#ifndef HVAC_M7_ADC_TEMP_TABLE_H +#define HVAC_M7_ADC_TEMP_TABLE_H + +#include "ADC_Temp.h" + +extern const adc_temp_lookup fast_lookup_Incar[TABLE_SIZE_LOOKUP]; +extern const adc_temp_lookup fast_lookup_KST45[TABLE_SIZE_LOOKUP]; + +#endif //HVAC_M7_ADC_TEMP_TABLE_H