From 5b206d8493a6c4acd98d297cb97d513692fa457b Mon Sep 17 00:00:00 2001 From: cfif Date: Mon, 9 Feb 2026 14:34:23 +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 | 94 ++++++++++++++++++++++++++++++------------------------ ADC_Temp.h | 6 ++-- 2 files changed, 56 insertions(+), 44 deletions(-) diff --git a/ADC_Temp.c b/ADC_Temp.c index e82b631..461a25b 100644 --- a/ADC_Temp.c +++ b/ADC_Temp.c @@ -7,37 +7,48 @@ adc_temp_lookup fast_lookup[TABLE_SIZE_LOOKUP]; // Таблица на TABLE_SIZE_LOOKUP значений -// Таблица из документа KST45-14-2 +// Таблица из документа InCar 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} + {-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) { if (adc_value == 0 || adc_value >= (uint16_t) ADC_MAX) { @@ -132,7 +143,7 @@ static float interpolate_steinhart_full(float resistance, int index) { // Проверка на физическую реализуемость (температура должна быть положительной в Кельвинах) if (inv_T <= 0.0f || inv_T > 1.0f) { // 1/T не может быть <= 0 (T < 0K) или слишком большим // В случае ошибки возвращаем температуру из таблицы по индексу - return (float) ntc_table[index].temp_c; + return (float)ntc_table[index].temp_c; } double temp_K = 1.0f / inv_T; @@ -140,10 +151,10 @@ static float interpolate_steinhart_full(float resistance, int index) { // Дополнительная проверка диапазона (например, для 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)ntc_table[index].temp_c; } - return (float) (temp_K - 273.15f); + return (float)(temp_K - 273.15f); } // Основная функция для получения температуры @@ -173,27 +184,28 @@ float get_temperature_from_adc(uint16_t adc_value, eAlg use_alg) { } +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) + 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, const adc_temp_lookup *fast_temp_lookup, uint16_t size_fast_temp_lookup) { +int16_t get_temperature_fast(uint16_t adc_value) { // Простой поиск в таблице с линейной интерполяцией - 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 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_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; + 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); -} +} \ No newline at end of file diff --git a/ADC_Temp.h b/ADC_Temp.h index bc4b105..7a46720 100644 --- a/ADC_Temp.h +++ b/ADC_Temp.h @@ -9,7 +9,7 @@ // Константы #define ADC_MAX 4095.0f // 12-битный АЦП -#define R1 3000.0f // Сопротивление делителя напряжения +#define R1 3400.0f // Сопротивление делителя напряжения #define TABLE_START_TEMP (-40) #define TABLE_END_TEMP 85 #define TABLE_SIZE 38 @@ -19,7 +19,7 @@ #define koef_B 0.00017003940268680147 #define koef_C 0.0000004890545443703666 -#define TABLE_SIZE_LOOKUP 512 +#define TABLE_SIZE_LOOKUP 1024 // Структура для хранения табличных данных typedef struct { @@ -41,6 +41,6 @@ typedef struct { 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, const adc_temp_lookup *fast_temp_lookup, uint16_t size_fast_temp_lookup); +int16_t get_temperature_fast(uint16_t adc_value); #endif //MDF_ADC_TEMP_KST45_14_2_H