Обновление

This commit is contained in:
cfif 2026-02-09 14:34:23 +03:00
parent 0e79aff0af
commit 5b206d8493
2 changed files with 56 additions and 44 deletions

View File

@ -7,37 +7,48 @@
adc_temp_lookup fast_lookup[TABLE_SIZE_LOOKUP]; // Таблица на TABLE_SIZE_LOOKUP значений adc_temp_lookup fast_lookup[TABLE_SIZE_LOOKUP]; // Таблица на TABLE_SIZE_LOOKUP значений
// Таблица из документа KST45-14-2 // Таблица из документа InCar
static const ntc_table_entry ntc_table[] = { static const ntc_table_entry ntc_table[] = {
{-40, 100950.0f}, {-40, 101000.0f},
{-35, 72777.0f}, {-35, 72600.0f},
{-30, 53100.0f}, {-30, 52720.0f},
{-25, 39111.0f}, {-25, 38660.0f},
{-20, 29121.0f}, {-20, 28620.0f},
{-15, 21879.0f}, {-15, 21390.0f},
{-10, 16599.0f}, {-10, 16120.0f},
{-5, 12695.0f}, {-5, 12260.0f},
{0, 9795.0f}, {-4, 11620.0f},
{5, 7616.0f}, {-3, 11010.0f},
{10, 5970.0f}, {-2, 10440.0f},
{15, 4712.0f}, {-1, 9907.0f},
{20, 3747.0f}, {0, 9399.0f},
{25, 3000.0f}, {1, 8924.0f},
{30, 2417.0f}, {2, 8473.0f},
{35, 1959.0f}, {3, 8048.0f},
{40, 1598.0f}, {4, 7646.0f},
{45, 1311.0f}, {5, 7267.0f},
{50, 1081.0f}, {6, 6909.0f},
{55, 895.9f}, {7, 6570.0f},
{60, 746.4f}, {8, 6250.0f},
{65, 624.9f}, {9, 5947.0f},
{70, 525.6f}, {10, 5661.0f},
{75, 444.4f}, {15, 4441.0f},
{80, 377.4f}, {20, 3512.0f},
{85, 321.7f} {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 из значения АЦП // Функция расчёта сопротивления NTC из значения АЦП
static float calculate_resistance(uint16_t adc_value) { static float calculate_resistance(uint16_t adc_value) {
if (adc_value == 0 || adc_value >= (uint16_t) ADC_MAX) { if (adc_value == 0 || adc_value >= (uint16_t) ADC_MAX) {
@ -173,6 +184,8 @@ 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) { void init_fast_lookup_table(eAlg use_alg) {
// Создаем таблицу для быстрого преобразования АЦП->температура // Создаем таблицу для быстрого преобразования АЦП->температура
for (uint16_t i = 0; i < TABLE_SIZE_LOOKUP; i++) { for (uint16_t i = 0; i < TABLE_SIZE_LOOKUP; i++) {
@ -183,16 +196,15 @@ void init_fast_lookup_table(eAlg use_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) {
// Простой поиск в таблице с линейной интерполяцией // Простой поиск в таблице с линейной интерполяцией
uint16_t index = adc_value / uint16_t index = adc_value / (uint8_t)roundf(ADC_MAX / (TABLE_SIZE_LOOKUP - 1)); // Делим на 16 для TABLE_SIZE_LOOKUP = 256
(uint8_t) roundf(ADC_MAX / ((float) size_fast_temp_lookup - 1)); // Делим на 16 для TABLE_SIZE_LOOKUP = 256 if (index >= (TABLE_SIZE_LOOKUP - 1)) return fast_lookup[TABLE_SIZE_LOOKUP - 1].temp_c;
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 adc1 = fast_lookup[index].adc_value;
uint16_t adc2 = fast_temp_lookup[index + 1].adc_value; uint16_t adc2 = fast_lookup[index + 1].adc_value;
int16_t temp1 = fast_temp_lookup[index].temp_c; int16_t temp1 = fast_lookup[index].temp_c;
int16_t temp2 = fast_temp_lookup[index + 1].temp_c; int16_t temp2 = fast_lookup[index + 1].temp_c;
// Линейная интерполяция // Линейная интерполяция
return temp1 + ((temp2 - temp1) * (adc_value - adc1)) / (adc2 - adc1); return temp1 + ((temp2 - temp1) * (adc_value - adc1)) / (adc2 - adc1);

View File

@ -9,7 +9,7 @@
// Константы // Константы
#define ADC_MAX 4095.0f // 12-битный АЦП #define ADC_MAX 4095.0f // 12-битный АЦП
#define R1 3000.0f // Сопротивление делителя напряжения #define R1 3400.0f // Сопротивление делителя напряжения
#define TABLE_START_TEMP (-40) #define TABLE_START_TEMP (-40)
#define TABLE_END_TEMP 85 #define TABLE_END_TEMP 85
#define TABLE_SIZE 38 #define TABLE_SIZE 38
@ -19,7 +19,7 @@
#define koef_B 0.00017003940268680147 #define koef_B 0.00017003940268680147
#define koef_C 0.0000004890545443703666 #define koef_C 0.0000004890545443703666
#define TABLE_SIZE_LOOKUP 512 #define TABLE_SIZE_LOOKUP 1024
// Структура для хранения табличных данных // Структура для хранения табличных данных
typedef struct { typedef struct {
@ -41,6 +41,6 @@ typedef struct {
void init_fast_lookup_table(eAlg use_alg); void init_fast_lookup_table(eAlg use_alg);
float get_temperature_from_adc(uint16_t adc_value, eAlg 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 #endif //MDF_ADC_TEMP_KST45_14_2_H