This commit is contained in:
cfif 2026-04-02 17:15:04 +03:00
parent 04ec32f4a9
commit a45ac66258
1 changed files with 42 additions and 11 deletions

View File

@ -71,7 +71,19 @@ int32_t CalculateSteps(float Rout_required, int32_t *CountStep100, int32_t *Coun
* @param CountStep10 Указатель для сохранения шагов точного резистора (0-255) * @param CountStep10 Указатель для сохранения шагов точного резистора (0-255)
* @return 0 - успех, -1 - ошибка * @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_100k = 100000.0f;
const float R_ab_10k = 10000.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; return -1;
} }
const float Step100 = R_ab_100k / 256.0f; const float Step100 = R_ab_100k / 256.0f; // ~390.625 Ом на шаг
const float Step10 = R_ab_10k / 256.0f; 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; 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 > 255) *CountStep100 = 255;
if (*CountStep100 < 0) *CountStep100 = 0; 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 (R_error > Step10 && *CountStep10 > 0) {
if (*CountStep10 < 0) *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; return 0;
} }
@ -183,7 +214,7 @@ static _Noreturn void Mma_Thread(tMma *env) {
float required_resistance = 8000.00f; float required_resistance = 8000.00f;
CalculateSteps2(required_resistance, 0, 0, &step100, &step10); CalculateSteps2(required_resistance, &step100, &step10);
// CalculateSteps(required_resistance, &step100, &step10); // CalculateSteps(required_resistance, &step100, &step10);
step100 = 255 - step100; step100 = 255 - step100;