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

на контроллер 12 в , на энкодер и джостик 5 в

Про это уже кино даже сняли:

6 лайков

приколист!

Я, сначала, вообще за тролля принял, потом смотрю - нет, реальный чел)))

а понял, что он там изобретает?

Там даже ИИ есть. В чем прикол то?))

Сразу нет. Но потом нашёл его тему про принтер

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

Мотоцикл?

лучше дать ссылку откуда взят энкодер

Возможно дело в этом:

Для Ардуино УНО (и других плат на базе ATmega328/P) эти выводы:

  • D8 … D13 - генерируют запрос прерывания PCINT0
  • A0 … A5 - генерируют запрос прерывания PCINT1
  • D0 … D7 - генерируют запрос прерывания PCINT2

Таким образом входы-источники прерываний объединены в группы, каждой группе соответствует свой вектор и обработчик. Если мы, например, разрешим прерывания на всех выводах первой группы (PCINT0), то для всех поступающих от них запросов на прерывания будет вызываться один и тот же обработчик. Специальных средств для определения конкретного вывода, от которого поступил запрос прерывания, в микроконтроллере нет.

1 лайк

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

Я не знаю какой вариант кода у него был во время описываемых событий. Соответственно и не знаю, что там проверялось.

спасибо , прочитал про это , разобрался
да , все с этим завязано
сначала изучив это прерывания , как работает , решил сделать
на других пинах
но решил попробовать сделать так
ISR(PCINT1_vect, ISR_NOBLOCK)
При указании значения
ISR_NOBLOCK
в качестве второго параметра макроса ISR компилятор добавит в обработчик команду установки бита бита I , разрешая тем самым обработку вложенных прерываний что мне нужно
Да. это избавило от потерь после работы джойстика на пину A4 …
но вылезла проблема с лимитом . он взбесился .
Поработав с ним я его как бы утизомирил но что то мне не нравится
и нашел еще одну проблему которую я пока не могу решить .
В самый первый раз энкодеру нужно сделать dgcoge
например такой
G91 G21 F5000 Z+50
G04 P1.
G91 G21 F5000 Z-50
для того что бы он начал все последующие dgcoge точно обрабатывать
я пока в процессе изучения зачем ему это нужно

и чтобы это значило, сходить по Z туда сюда?
ты так и не дал ссылку на энкодер

если виж картинку и нужно что то узнать . делаю так

https://aliexpress.ru/item/1005001696915804.html?spm=a2g2w.orderdetail.0.0.56774aa6rMvq1P&sku_id=12000017196951563

такое чувство что ты меня тролишь
у меня есть хобитный лазерный станок на esp32
на нем есть ось z. для лазера \ не спрашивай зачем . он хоббитный
и что бы я на своем стендиине крутил энкодер вручную и что бы мне микросотки считать на стенде от энкодера_шаговик на микрометр
я выдергиваю оссь Z мотор станка и включаю туда мотор от стенда который крутит энкодр для того что я обьяснил выше .

нихрена не понял что ты наобъяснял, но вспоминая про делительную головку видится, что тебе надо устанавливать абсолютное положение вала приводимого в движение шаговым двигателем?


ну попробую еще раз я знаю это моя вина в неумении коротко изьяснить
так вот
я беру джостик или вручную двигаю каретку с микрометром напримерив нулевое положения . там будет находиться головка принтера
на стенде стоит упор для микрометра. .это и есть воображаемое нулевое положения .
далее . к примеру на микрометре зафиксировали любое число .
пусть это будет 4.55
далее я запускаю от лаз. станка джекод +50,-50
и каретка сделала ход туда сюда но первый раз она может вернуться не на 4.55 а куда угодно ±2-4 мм
далее я фиксирую на микрометре новый показатель 5.76
и далее запускаю снова джекоды и теперь сколько угодно раз каретка придет в 5.76
и будет это так пока я снова руками не поправлю каретку тогда все сбивается
что бы этого не было после того как я джостико или руками снова подвожу каретку например на 4.00 и мне нужно с первого раза чтобы после джекода наприер -5,-5,-5,+5,+5,+5,. микрометр показал 4.00 я должен сделать ресет uno. . тогда с первогоираз все сработае в чистуб а не только вторые и последующие разы
я должен как то автоматом очищать пллностью память не уверен сто это верно

Поставил энкодер на пины 9,10
все работает и мотор и джостик и лимит. но на маленьких оборотах энкодера
если резко дернуть то энкодер пропускает ходы
может я с регистрами напутал ? посмотрите
таблицу по пинам. и регистру брал здесь

тык

//Энкодер на пинах 9, 10. Используется внутренняя подтяжка.
volatile int enc;
void setup(){                
Serial.begin(115200);
pinMode(9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
PCIFR=PCIFR; PCICR=1<<PCIE0; //разрешить прерывание
PCMSK0=1<<PCINT1 | 1<<PCINT2; //выбрать вход на котором сработает прерывание 
}

ISR(PCINT0_vect){
static char EncPrev=0;      //предыдущее состояние энкодера
static char EncPrevPrev=0;  //пред-предыдущее состояние энкодера
  char EncCur = 0;
  if(!(PINB & (1 << PB1))){EncCur  = 1;} //опрос фазы 1 энкодера
  if(!(PINB & (1 << PB2))){ 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); 
}