Как работает энкодер?

назначил пины D2 и D3 на энкодер на код Леонида Ивановича .
все работает хорошо .
прерываний на тик от 2 до 5 на энкодер 600ppw
скорость проверял до 20000 мм. мин.
сбоев и потерь тиков нет.
шкала сигнала хорошая тоже без сбоев .

вот код который работает на D2 и D3
далее я прикручу мотор . лимит . джойстик и кнопки и выложу уже в своей теме .
DTG printer / принтер планшетный
еще попробую проверить с регулировкой скорости но уже будет с какой -то из библиотек .
с какой пока не знаю по мне так лучше совсем без них .

//Энкодер на пинах 2, 3. Используется внутренняя подтяжка.
volatile int enc;
void setup(){                
Serial.begin(115200);
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
PCIFR=PCIF2; PCICR=1<<PCIE2; //разрешить прерывание
PCMSK2=1<<PCINT18 | 1<<PCINT19; //выбрать вход на котором сработает прерывание 
}

ISR(PCINT2_vect){
static char EncPrev=0;      //предыдущее состояние энкодера
static char EncPrevPrev=0;  //пред-предыдущее состояние энкодера
  char EncCur = 0;
  if(!(PIND & (1 << PD2))){EncCur  = 1;} //опрос фазы 1 энкодера
  if(!(PIND & (1 << PD3))){ EncCur |= 2;} //опрос фазы 2 энкодера
  if(EncCur != EncPrev)             //если состояние изменилось,
  {
    if(EncPrev == 3 &&        //если предыдущее состояние 3
       EncCur != EncPrevPrev )      //и текущее и пред-предыдущее не равны,
    {
      if(EncCur == 2)          //если текущее состояние 2,
        enc++;            //шаг вверх
      else                          //иначе
        enc--;            //шаг вниз
    }
    EncPrevPrev = EncPrev;          //сохранение пред-предыдущего состояния
    EncPrev = EncCur;               //сохранение предыдущего состояния
  }


  }

void loop() {
Serial.println(enc); 
}