// // 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); }