360 градусов ШИМ Ротари -энкодер прорыв
360 градусов ШИМ Ротари -энкодер прорыв
Описание
Этот тип переключателя является инкрементным вращающимся энкодером. На самом деле, это наиболее широко используется из всех вращающихся кодеров из -за его низкой стоимости и способности предоставлять сигналы, которые можно легко интерпретировать для предоставления информации, связанной с движением, такой как скорость.
Поворотом вращающийся энкодер может подсчитать частоту выходного импульса в положительном и обратном направлении во время вращения, в отличие от вращающегося счетчика потенциометра без ограничения подсчета. С кнопкой на роторном энкодере ее можно сбросить в начальное состояние, начиная с нуля.
Код тестирования
int redpin = 2;
int jellowpin = 3;
int greenpin = 4;
int apin = 6;
int bpin = 7;
int buttonpin = 5;
int state = 0;
int longperiod = 5000; // время в зеленом или красном
int shortperiod = 700; // период времени при смене
int targetCount = shortperiod;
int count = 0;
void setup ()
{
pinmode (apin, input);
pinmode (bpin, input);
PinMode (Buttonpin, вход);
pinmode (redpin, output);
pinmode (желтый, выход);
pinmode (greenpin, выход);
}
void loop ()
{
count ++;
if (DigitalRead (Buttonpin))
{
подсветки (высокие, высокие, высокие);
}
еще
{
int изменение = getEncoDerturn ();
int newperiod = longperiod + (изменение * 1000);
if (newperiod> = 1000 && newperiod <= 10000)
{
longperiod = newperiod;
}
if (count> targetCount)
{
setState ();
count = 0;
}
}
задержка (1);
}
int getEncoderturn ()
{
// возврат -1, 0, или +1
статический int olda = низкий;
static int oldb = low;
int result = 0;
int newa = DigitalRead (APIN);
int newb = DigitalRead (BPIN);
if (newa! = olda || newb! = Oldb)
{
// что -то изменилось
if (alla == low && newa == High)
{
Результат = - (OldB * 2 - 1);
}
}
Olda = newa;
OldB = newB;
результат возврата;
}
int setState ()
{
if (состояние == 0)
{
подсветки (высокие, низкие, низкие);
TargetCount = longperiod;
состояние = 1;
}
иначе if (состояние == 1)
{
подсветки (высокие, высокие, низкие);
TargetCount = shortPeriod;
состояние = 2;
}
иначе if (состояние == 2)
{
подсветки (низкий, низкий, высокий);
TargetCount = longperiod;
состояние = 3;
}
иначе if (состояние == 3)
{
подсветки (низкий, высокий, низкий);
TargetCount = shortPeriod;
состояние = 0;
}
}
void stights (int red, int желтый, int green)
{
DigitalWrite (Redpin, Red);
DigitalWrite (Yellowpin, Yellow);
DigitalWrite (Greenpin, Green);
}