за свое отвечу:
#define DeltaConst 3
Есть текущее значение CurrentInput и есть нужное положение var_n. Если CurrentInput<var_n, то CurrentInput нужно увеличить, наоборот - уменьшить. Так?
Делаем мы это включая двигатель в разные стороны.
Можно написать что-то вроде
Код:
if (CurrentInput<var_n)
{
digitalWrite(m3_r,HIGH);
digitalWrite(m3_l,LOW);
}
else
if (CurrentInput>var_n)
{
digitalWrite(m3_r,LOW);
digitalWrite(m3_l,HIGH);
}
else
{
digitalWrite(m3_r,LOW); //выключаем двигатель, мы в нужной точке!
digitalWrite(m3_l,LOW);
}
Написав такой код мы столкнемся с одной проблемой: жужжание.
Связано оно с тем, что двигатель имеет инерцию, в редукторе есть люфты, а аналого-цифровой преобразователь шумит - даже при одном и том же входящем напряжении может выдавать, к примеру, то 170, то 171, то 169. А если еще по шине питания процессора идет какой-то ток, то и на 10-20 прыгать.
Что с этим делать? Надо заменить точку назначения интервалом, положение внутри которого считается нормальным и двигатель выключать. Обозначим начало интервала var_n1, а конец var_n2.
Код:
if (CurrentInput<var_n1)
{
digitalWrite(m3_r,HIGH);
digitalWrite(m3_l,LOW);
}
else
if (CurrentInput>var_n2)
{
digitalWrite(m3_r,LOW);
digitalWrite(m3_l,HIGH);
}
else
{
digitalWrite(m3_r,LOW);
digitalWrite(m3_l,LOW);
}
так? Делаем интервал достаточно широким и наслаждаемся тишиной.
Но для этого нам же придется вместо одного значения var_n хранить два var_n1 и var_n2! А это нехорошо, учитывая, что у нас на самом деле не одно значение, а массив! Сделаем интервал чуть по-другому - будем хранить только середину интервала var_n и точность DeltaConst.
То есть
var_n1=var_n-DeltaConst
var_n2=var_n+DeltaConst
получаем
Код:
if (CurrentInput<var_n-DeltaConst)
{
digitalWrite(m3_r,HIGH);
digitalWrite(m3_l,LOW);
}
else
if (CurrentInput>var_n+DeltaConst)
{
digitalWrite(m3_r,LOW);
digitalWrite(m3_l,HIGH);
}
else
{
digitalWrite(m3_r,LOW);
digitalWrite(m3_l,LOW);
}
А теперь еще раз оптимизируем - меняем этот код на
if (CurrentInput<var_n-DeltaConst)
digitalWrite(m3_r,HIGH);
else
digitalWrite(m3_r,LOW);
if (CurrentInput>var_n+DeltaConst)
digitalWrite(m3_l,HIGH);
else
digitalWrite(m3_l,LOW);
Он становится менее понимаемым, но результат у него абсолютно тот же.
Проверить несложно, поставив мысленный эксперимент - что происходит при всех трех положениях
CurrentInput<var_n-DeltaConst
var_n-DeltaConst<CurrentInput<var_n+DeltaConst
CurrentInput>var_n+DeltaConst