From dd3d551dd5fe57e67045a761688acccbd17cc2d4 Mon Sep 17 00:00:00 2001 From: cfif Date: Mon, 8 Jun 2026 13:19:19 +0300 Subject: [PATCH] Init --- dig_pot.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ dig_pot.h | 7 ++++++ 2 files changed, 82 insertions(+) diff --git a/dig_pot.c b/dig_pot.c index 07296a4..c85ad0d 100644 --- a/dig_pot.c +++ b/dig_pot.c @@ -153,6 +153,81 @@ uint32_t find_steps_for_resistance(uint32_t target_ohm, uint8_t *step_100k, uint return best_r; } +#define R_CORRECTION_AUTO 300//230 // вычитаемая поправка (Ом) + +uint32_t find_steps_for_resistance_auto(uint32_t target_ohm, + uint8_t *step_100k_1, + uint8_t *step_100k_2, + uint8_t *step_100k_3, + uint8_t *step_10k) { + + uint32_t remaining; + uint32_t best_r = 0; + uint32_t best_diff = 0xFFFFFFFF; + uint8_t best_n100_1 = 0, best_n100_2 = 0, best_n100_3 = 0, best_n10 = 0; + + // Пробуем разные варианты количества дополнительных 100к (0, 1 или 2) + for (uint8_t extra_pots = 0; extra_pots <= 2; extra_pots++) { + + // Вычитаем сопротивление дополнительных потенциометров (каждый на 255 = максимум) + uint32_t extra_resistance = extra_pots * pot_100k[255]; + + if (target_ohm <= extra_resistance) { + // Если цель меньше или равна сопротивлению дополнительных - не используем этот вариант + continue; + } + + remaining = target_ohm - extra_resistance; + + // Ищем оптимальную комбинацию для оставшегося сопротивления + for (uint16_t n100_1 = 0; n100_1 < 256; n100_1++) { + uint32_t r100_1 = pot_100k[n100_1]; + + for (uint16_t n10 = 0; n10 < 256; n10++) { + uint32_t r10 = pot_10k[n10]; + uint32_t r_total = r100_1 + r10 - R_CORRECTION_AUTO; + + uint32_t diff = (r_total > remaining) ? (r_total - remaining) : (remaining - r_total); + + if (diff < best_diff) { + best_diff = diff; + best_r = r_total + extra_resistance; + best_n100_1 = n100_1; + best_n10 = n10; + + // Устанавливаем дополнительные потенциометры + if (extra_pots >= 1) { + best_n100_2 = 255; + } else { + best_n100_2 = 0; + } + + if (extra_pots >= 2) { + best_n100_3 = 255; + } else { + best_n100_3 = 0; + } + + if (diff == 0) { + *step_100k_1 = best_n100_1; + *step_100k_2 = best_n100_2; + *step_100k_3 = best_n100_3; + *step_10k = best_n10; + return best_r; + } + } + } + } + } + + *step_100k_1 = best_n100_1; + *step_100k_2 = best_n100_2; + *step_100k_3 = best_n100_3; + *step_10k = best_n10; + return best_r; +} + + // Функция получения сопротивления по температуре с линейной интерполяцией uint32_t get_resistance_by_temperature_linear(const TablePoint *table, int table_size, int16_t temperature) { // Проверка границ diff --git a/dig_pot.h b/dig_pot.h index 4cbf07a..94470a6 100644 --- a/dig_pot.h +++ b/dig_pot.h @@ -16,6 +16,13 @@ typedef struct { uint32_t get_resistance_by_temperature_linear(const TablePoint *table, int table_size, int16_t temperature); uint32_t find_steps_for_resistance(uint32_t target_ohm, uint8_t *step_100k, uint8_t *step_10k); +uint32_t find_steps_for_resistance_auto(uint32_t target_ohm, + uint8_t *step_100k_1, + uint8_t *step_100k_2, + uint8_t *step_100k_3, + uint8_t *step_10k); + + #define size_ambient_lookup_table_20000 4095 #define size_duct_lookup_table_3000 4095 #define size_duct_lookup_table_20000 4095