Init
This commit is contained in:
parent
04ec32f4a9
commit
a45ac66258
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue