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

К слову, шаговый привод не должен терять положение при правильном управлении. Не вполне понятна цель ТС.

Как резко? У энкодера тоже есть свои пределы.
И, с чего вы взяли, что именно энкодер виноват?
Кусочек кода, что вы выложили - оно так не работает. Код надо смотреть целиком. Косяк может быть в любом другом месте.
Если хотите получить помощь - выкладывайте полную схему, полный код, и чёткое описание поставленной задачи.
Возможно, она вообще не выполнима на этом железе, или выполнима частично

И, кстати, зачем вы зашли в чужую тему, у вас ведь своя есть?

На аналоговых пинах если крутнуть энкодер очень резко то выйдет тиков столько сколько крутнуть на оборот. , я смотрю на монитор. там нет пропуска , на цифровых пинах если крутнуть чуток резко или увеличить обороты даже всего до 500 мм мин то на мониторе сразу начинаются пропуски было например 10 чуть крутнешь , должно быть 300-400 показывает только 12-18 . я подумал прикручу код на мотор. , может что изменится , нет мотор ведет аналогично манитору .
поэтому сначала этот кусок кода можно будет допилить а код на мотор нормальный ,
я конечно теперь уйду на аналог. , сам я не смогу на цифре что то изменить , я вижу что сделал правильно все , аналогично что был код ранее , но что то не так .

да не вопрос , я наоборот что бы не засирать тему , ведь она о битве энкодера , а тут еще с разными железками залезу
виноват код энкодера который я переделал .

в своей постараюсь не засорять , а вылаживать болеменее рабочий код
и эта тема более чем моя подходиь для разбора работы энкодера
спасибо…

Вам надо разобраться с назначением пинов в ардуино.
“Аналоговые” пины работают как аналоговые, лишь когда используем АЦП, т.е. функцию analogRead()

А с чего вы взяли, что пропуски из-за энкодера?
Вывод в сериал занимает время, и, может существенно тормозить.

я на цифровых пинах с энкодером пока не смогу разобраться
нужно больше знаний и практики . поэтому я отложил код в сторонку вернулся к аналоговым пинам и в коде сделал костыль на лимит его забросил и теперь нормально работает
конечно я доразберусь с чистотой кода и буду еще шаманить.
сегодня снял видио , где обьяснил немного сбивчева. как все работает
как загружу сегодня на ютуб , в своей теме выложу код

Блин, 185 ответов, когда ошибка видна сразу - прямо крупный ТРАНСПАРАНТ
Замените в attachInterrupt CHANGE на FALLING или RISING и будет счастье
Ну и конденсаторы на землю на обоих ногах нужны, если не подавляете дребезг программно. В прерывании не рекомендуется делать вызовы внешних функций, особенно которые сами по себе работают по прерываниям

Что вы не внимательны)))

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

Ещё раз попробую. У ATmega328p есть только два исключительно “аналоговых” пина - ADC6 и ADC7,и то, они есть только у микросхем в корпусах TQFP и 32MLF, с 32 ножками. Остальные пины - многофункциональны, согласно с даташитом. Т.е. если, к примеру, т.н. “аналоговый” пин А0 настроить как цифровой(pinMode)-
он будет работать как цифровой.

Так я и говорю, что вряд-ли потери в энкодере.
Надо проверить, что на каждый тик (энкодера) стабильно приходится шаг мотора. Выяснить причину, почему иногда теряются миллиметры. Как то: глюк программы, косяк в управлении мотором, или неточность измерительного прибора.

Таки у него и цифровой номер есть - 14

2 лайка

а я недавно соображал , что не так с A6 и A7
пока такая необходимость отпала .

собрал код Л.И на pin D2 и D3
мотор джойстик лимит кнопки .
все отлично работает ничего друг другу не мешает
буду пробовать добавлять переменную тик на шаг для регулировки
в коде на энкодер попробовал поставить запрос по адресам . все это работает тоже но вернул обратно , так как я хоть и сделал но смысла в этом нет он и так точно и быстро обрабатывает да и у меня только логика а базовых знаний нет
погонял код минут 10 , перекушу и продолжу тесты и если все также хорошо выложу код в своей теме .

Вообще-то, скорее всего, A6 и A7 0 исключения из общего правила.
А общее правило таково:
Есть GPIO (цифровые) пины, которые могут работать на вход, на выход, а также иметь дополнительные функции. На вход и выход работают все GPIO пины, а дополнительные функции могут либо быть, либо не быть на конкретном пине. К дополнительным функциям относятся: всевозможные протоколы (UART, I2C, SPI…) аппаратный ШИМ, АЦП и другие.
То есть цифровые пины - все, а аналоговые лишь часть из цифровых, точно так же, как только часть цифровых можно использовать для ШИМ либо аппаратно реализованных протоколов.
Исключение в виде А6 и А7, видимо, обусловлено историческими причинами: когда разрабатывалась микросхема в 28-выводном DIP корпусе, для аналогового ввода было назначено 6 каналов, для для удешевления проектирования был взят стандартный мультиплексор на 8 входов, два из которых ни к чему не подключались. Никакого “запаса” по GPIO, естественно, предусмотрено не было. А когда те же кристаллы стали паковать в 32-выволдной корпус, к двум из “лишних” ног подключили свободные каналы мультиплексора. Так образовались уникальные “аналоговые входы”, не обладающие функциями GPIO.

14 й это ножка вывода микроконтроллера ?
на моей плате есть семь аналоговых , и цифровые 2.3.4.5.6.7.8.9.10.и 12 под вопросом
и все они будут нужны я еще один мотор буду ставить .
но так как я задействовал pin 2,3 под энкодер , теперь не т этой возможности
так как под step
1 мотора pin 2
2 мотора pin 3
3 мотора pin 4 dir 7 сейчас он у меня и задействован
а аналоги я трогать пока не хочу так как в этом коде прерывания идут целиком на порты по 7 за раз
боротся с ними в этом коде можно только как вы показали
timeMillis >= checkBtnPeriod)//опрос кнопок и джойстика
я с этим не разобрался пока
я немного вник как работают прерывания и мне для освобождения pin ов
думаю попроще будет написать код энкодера для pin9 и pin 10 на
запросе прерывания на входе INT
и порты не будут висеть на прерываниях .
таблицы с регистрами есть , адреса тоже есть .
код для прерывания светодиода есть .
а далее аналогично сверяем показатели с двух пинов только там идут ни как здесь на увеличения и уменьшения а стандартно 1 и -1
думаю через пару неделек если будет необходимость во втором моторе почитаю попробую написать код .

Именно на этих пинах есть нормальные прерывания, код Л.И можно упростить - отказаться от ненужных проверок.

да я уже сегодня так пробовал и там где
if(!(PINC & (1 << PC0))) //опрос фазы
можно лучше и можно адресно и короче
тоже пробовал все работает . но в этом смысла нет для меня . обработка проходит быстро и не ломается
а вот если я буду делать с регулировкой тик на шаг то может и пригодится и то только для того что бы не писать длинный код на сравнивания и обработку одного и того же тика на энкодере
так как их и 50 может попасться одинаковых .
я оставил все стандартно только флаг регистра поправил . у него он не выставлен был .

Это номер пина, D14

#define LED_BUILTIN 13

#define PIN_A0   (14)
#define PIN_A1   (15)
#define PIN_A2   (16)
#define PIN_A3   (17)
#define PIN_A4   (18)
#define PIN_A5   (19)
#define PIN_A6   (20)
#define PIN_A7   (21)