Энкодер, передающий значение между шагами

Я пытаюсь подключить кодер и дисплей 1602 i2c. Кажется, мой кодер выдает выходные данные между шагами.

Я постарался сделать свой код максимально простым и вывожу, вращался ли энкодер по часовой стрелке или против часовой стрелки в последовательный порт. Когда я поворачиваю ручку на один физический шаг по часовой стрелке, на последовательный монитор выводится «++» (разделенный новой линией), тогда как я ожидаю только «+». То же самое происходит при вращении против часовой стрелки, за исключением «--» вместо «++».

Детали:

  • Совет разработчиков ESP32
  • Поворотный энкодер
  • Код:

    #define enc1 32
    #define enc2 33
    #define button 25
    #define led 2;
    
    int oldPos1;
    int newPos1;
    int newPos2;
    
    void setup() {
      pinMode(enc1, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(enc1),encRead,CHANGE);
      pinMode(enc2, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(enc2),encRead,CHANGE);
      Serial.begin(115200);
    
      oldPos1 = digitalRead(enc1);
    }
    
    void encRead(){
      newPos1 = digitalRead(enc1);
      newPos2 = digitalRead(enc2);
      if(oldPos1 != newPos1){
        if (newPos1 == newPos2){
          Serial.println("+");
        }
        else{
          Serial.println("-");
        }
      }
      oldPos1 = newPos1;
    }
    
    void loop() {
      delay(10);
    }
    

, 👍2

Обсуждение

удалите enc2 attachInterrupt, @jsotola


2 ответа


Лучший ответ:

2

Подобная ситуация может случиться, если вы покупаете дешевые детали, которые приходят без какой-либо документации: вы не знаете, как они должно работать! Многие поворотные энкодеры имеют два фиксатора на импульс: если вы поворачиваете их на один фиксатор, вы получаете один переход на каждом приколоть. При использовании такого кодировщика вы действительно ожидаете одного + или - печатается для каждого фиксатора. А как насчет энкодера, который ты купил? Ты не можешь скажите, раз документации нет!

К счастью, один полезный человек оставил полезный отзыв на страница продукта, на которую вы дали ссылку. Это может служить эрзацем таблицы данных:

Каждое движение шпинделя от одного фиксатора к следующему приводит к контакты энкодера1 и энкодера2 проходят несколько переходов, а не один (как и следовало ожидать).

Предполагая, что вы подключили контакты энкодера к (скажем) 5 В с помощью резистор, вращение между фиксаторами, произведет набор энкодера переходы. Например: 11 10 00 01 11 (по часовой стрелке) или 11 01 00 10 11. (против часовой стрелки).

Это объясняет ваше поведение.

Примечание: как пишет jsotola в комментарии, вам следует удалите enc2 attachInterrupt(). В качестве обработчика прерываний явно игнорирует переходы в enc2 (он ничего не делает, если только enc1 изменилось), нет смысла прерывать работу процессора для тех, игнорируются переходы.

,

1

К сожалению, вы не предоставили ссылку на техническое описание кодера.

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

Другая возможная причина — "подпрыгивание" механических контактов в этом энкодере. Это означает, что при переключении между открытием и закрытием генерируется несколько импульсов. Следовательно, прерывания по изменению или по фронту являются правильным решением только в том случае, если вы принимаете во внимание отскок.

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

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

,