назначил пины 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);
}