Init
This commit is contained in:
parent
64b1619db3
commit
dd3d551dd5
75
dig_pot.c
75
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;
|
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) {
|
uint32_t get_resistance_by_temperature_linear(const TablePoint *table, int table_size, int16_t temperature) {
|
||||||
// Проверка границ
|
// Проверка границ
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,13 @@ typedef struct {
|
||||||
uint32_t get_resistance_by_temperature_linear(const TablePoint *table, int table_size, int16_t temperature);
|
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(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_ambient_lookup_table_20000 4095
|
||||||
#define size_duct_lookup_table_3000 4095
|
#define size_duct_lookup_table_3000 4095
|
||||||
#define size_duct_lookup_table_20000 4095
|
#define size_duct_lookup_table_20000 4095
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue