From a45ac66258c7a9a42f77b7ad9af60e0eacb7633c Mon Sep 17 00:00:00 2001 From: cfif Date: Thu, 2 Apr 2026 17:15:04 +0300 Subject: [PATCH] Init --- MainModesArbiter.c | 53 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/MainModesArbiter.c b/MainModesArbiter.c index 1db6c5a..fb97f20 100644 --- a/MainModesArbiter.c +++ b/MainModesArbiter.c @@ -71,7 +71,19 @@ int32_t CalculateSteps(float Rout_required, int32_t *CountStep100, int32_t *Coun * @param CountStep10 Указатель для сохранения шагов точного резистора (0-255) * @return 0 - успех, -1 - ошибка */ -int32_t CalculateSteps2(float Rout_required, float R_constS,float R_constL, int32_t *CountStep100, int32_t *CountStep10) { +/** + * Расчет шагов для двухкаскадного цифрового потенциометра + * Приоритет заполнения точного резистора (10 кОм) + * Резисторы: 100 кОм (грубый) и 10 кОм (точный) + * Постоянное сопротивление: 163.4 Ом + * + * @param Rout_required Требуемое сопротивление в Омах + * @param CountStep100 Указатель для сохранения шагов грубого резистора (0-255) + * @param CountStep10 Указатель для сохранения шагов точного резистора (0-255) + * @return 0 - успех, -1 - ошибка + */ +int32_t CalculateSteps2(float Rout_required, int32_t *CountStep100, int32_t *CountStep10) { + const float R_constL = 163.4f; const float R_ab_100k = 100000.0f; const float R_ab_10k = 10000.0f; @@ -79,22 +91,41 @@ int32_t CalculateSteps2(float Rout_required, float R_constS,float R_constL, int3 return -1; } - const float Step100 = R_ab_100k / 256.0f; - const float Step10 = R_ab_10k / 256.0f; + const float Step100 = R_ab_100k / 256.0f; // ~390.625 Ом на шаг + const float Step10 = R_ab_10k / 256.0f; // ~39.0625 Ом на шаг - float Rout = Rout_required - R_constS + R_constL; + float Rout = Rout_required - R_constL; if (Rout < 0) Rout = 0; - *CountStep100 = (int32_t) (Rout / Step100); + // Приоритет 1: Сначала заполняем точный резистор (10 кОм) + *CountStep10 = (int32_t)(Rout / Step10 + 0.5f); + if (*CountStep10 > 255) *CountStep10 = 255; + if (*CountStep10 < 0) *CountStep10 = 0; + + // Вычисляем остаток после установки точного резистора + float R_remaining = Rout - (float)(*CountStep10) * Step10; + if (R_remaining < 0) R_remaining = 0; + + // Приоритет 2: Остаток добираем грубым резистором (100 кОм) + *CountStep100 = (int32_t)(R_remaining / Step100 + 0.5f); if (*CountStep100 > 255) *CountStep100 = 255; if (*CountStep100 < 0) *CountStep100 = 0; - float R_tail = Rout - (float) (*CountStep100) * Step100; - if (R_tail < 0) R_tail = 0; + // Опционально: корректировка для минимизации общей ошибки + // Если грубый резистор перекомпенсировал, уменьшаем точный + float R_actual = R_constL + (float)(*CountStep100) * Step100 + (float)(*CountStep10) * Step10; + float R_error = R_actual - Rout_required; - *CountStep10 = (int32_t) (R_tail / Step10 + 0.5f); - if (*CountStep10 > 255) *CountStep10 = 255; - if (*CountStep10 < 0) *CountStep10 = 0; + // Если ошибка положительная и большая, пробуем скорректировать + if (R_error > Step10 && *CountStep10 > 0) { + // Уменьшаем точный резистор на 1 шаг + (*CountStep10)--; + // Пересчитываем грубый резистор + R_remaining = Rout - (float)(*CountStep10) * Step10; + if (R_remaining < 0) R_remaining = 0; + *CountStep100 = (int32_t)(R_remaining / Step100 + 0.5f); + if (*CountStep100 > 255) *CountStep100 = 255; + } return 0; } @@ -183,7 +214,7 @@ static _Noreturn void Mma_Thread(tMma *env) { float required_resistance = 8000.00f; - CalculateSteps2(required_resistance, 0, 0, &step100, &step10); + CalculateSteps2(required_resistance, &step100, &step10); // CalculateSteps(required_resistance, &step100, &step10); step100 = 255 - step100;