Странные значения поворотного энкодера

Я пытаюсь понять этот поворотный энкодер, который у меня есть, но для меня это бессмысленно.

Я использую этот поворотный энкодер: https://www.amazon.com/gp/product/B07DM2YMT4/

CYT1100, он же CY110, он же EC11

Я использую эту проводку: https://i.imgur.com/G1FzH13.png

P2 — это "кнопка" и обеспечивает непрерывность при нажатии.

Я использую подделку Arduino Nano, и это мой простой скрипт:

#define PIN_CLK 2

void setup() 
{
    Serial.begin(9600);
    pinMode(PIN_CLK, INPUT);
}

void loop() 
{
    auto val = digitalRead(PIN_CLK);

    Serial.println("CLK:" + String(val));
}

Где PIN_CLK подключен к A (DW) или B (CLK) на диаграмме.

Я ожидаю, что A и B должны быть либо постоянными ВЫСОКИМ, либо НИЗКИМ, в зависимости от того, где щетки находятся внутри. Не переключаться на ВЫСОКИЙ или НИЗКИЙ на мгновение, а затем возвращаться к тому, что было раньше.

Когда я проверяю их мультиметром, они оба всегда 5 В (когда нет слабого контакта на макетной плате).

Последовательный плоттер повторяет переключение между HIGH и LOW:

https://i.imgur.com/Tks5O9x.png

То же самое с последовательным монитором:

https://i.imgur.com/BtwZvWg.png

Когда я вращаю энкодер, на выходе появляются промежутки LOW, например:

https://i.imgur.com/Ek7ivGT.png

Если я держу указательный и большой пальцы напротив P1 (5v) и A (CLK) во время вращения энкодера. Я получаю постоянный поток HIGH с LOW на каждом вращении метки:

https://i.imgur.com/JwgMOBa.png

Может ли кто-нибудь объяснить это поведение и как этот кодировщик должен работать?

Редактировать: я попробовал эту схему:

https://i.imgur.com/xaHbOsm.png

Каждый раз, когда я поворачиваю энкодер. Светодиод мигает несколько миллисекунд. Затем выключается.

Предполагается, что он останется неизменным в зависимости от 2-битных состояний?

Edit2: Если я поверну его очень медленно. Он включает светодиоды в порядке слева направо или справа налево в зависимости от направления.

Итак, приведенная выше схема со светодиодами работает, но мне это кажется странным.

, 👍1

Обсуждение

P1 и P2, вероятно, являются переключателем ... подключите один к GND, а другой к выводу IO ... включите подтягивающий резистор на вывод IO ... сделайте то же самое с B и A ... не подключайте контакты к 5 В, @jsotola

@jsotola Я отключил P1 от 5 В и подключил G к земле, A к D2, B к D3. Значения колеблются между ВЫСОКИМ и НИЗКИМ. Затем оба становятся низкими на несколько тиков при вращении энкодера. Тот же результат, что и раньше., @John

вы включили подтягивающие резисторы?, @jsotola

@jsotola Я сделал сейчас, @John

Это просто квадратурное кодирование/декодирование. Для этого есть учебники по всему интернету. Так работают старые мыши. Дополните этот комментарий, если вам нужно узнать больше, и я создам еще один ответ, основанный на этом подходе., @st2000


2 ответа


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

2

Здесь возникает несколько проблем. Поскольку ваш код охватывает только один входной контакт, я собираюсь поговорить о входе A. Этот контакт остается плавающим! Когда вы поворачиваете диск, щетка соединяет A и/или B с G на вашей фотографии, или, другими словами, контакты A/B заземляются. Но если A/B не подключен к земле, другого состояния напряжения нет — оно просто остается плавающим. У вас должен быть логический НИЗКИЙ 0 В и логический ВЫСОКИЙ (либо 3,3 В, либо 5 В в зависимости от вашей платы Arduino), чтобы Arduino мог различать состояния НИЗКИЙ и ВЫСОКИЙ. Вы можете решить эту проблему, изменив код на:

pinMode(PIN_CLK, INPUT_PULLUP);

Таким образом, когда контакт (A) не подключен к GND через (G), он удерживается в высоком логическом состоянии.

P1 & P2 для кнопки, поэтому вы не можете игнорировать один из контактов. Чтобы правильно подключить это с помощью подтяжки входа, P1 необходимо подключить к GND. P2 необходимо подключить к входному выводу с помощью другого input_pullup. Когда кнопка не нажата, состояние по умолчанию будет ВЫСОКОЕ. При нажатии она будет подключена к GND и будет отображаться как НИЗКИЙ уровень.

Вероятнее всего, вы используете изображения в Интернете для подключения энкодеров, которые уже установлены на печатной плате. На этой печатной плате есть 3 подтягивающих резистора. Независимо от того, используете ли вы для этого код или аппаратное обеспечение, схема должна выглядеть так. input_pullup на Arduino будет действовать точно так же, как резисторы, показанные на схеме.

Вот отличный ресурс: https://lastminuteengineers.com/rotary-encoder-arduino-tutorial/

,

У меня это заработало после того, как я использовал пример со светодиодом, чтобы понять, что ток течет только между выемками, а не все время. Требование подтягивания также было тем, чего мне не хватало. Единственная разница между вашим и моим в том, что я вообще не подключаю 5v. У меня есть еще несколько вопросов, если вы можете на них ответить. Для CLK и DT. Зачем использовать два резистора на сигнальных путях вместо одного резистора на пути заземления? Кажется, пока это работает нормально. Кроме того, нужны ли резисторы при подключении контакта Arduino к земле?, @John

Если вы объедините резисторы, CLK и DT одновременно станут НИЗКИМИ, что означает, что вы не сможете правильно использовать энкодер, если пытаетесь работать по часовой стрелке и против часовой стрелки. Вы действительно должны посмотреть учебник по кнопкам Arduino и ознакомиться с тем, что делают входные подтягивающие / подтягивающие резисторы, которые ответят на все ваши вопросы., @HavocRC

Не похоже, чтобы этот энкодер когда-либо включал одновременно CLK и DT. Если я попытаюсь его обойти. Он мерцает между ними, но они никогда не включаются одновременно. Редактировать: я проверил это, и как одиночный резистор, так и двойной резистор в конечном итоге имели двойные НИЗКИЕ показания при вращении энкодера., @John

Потратьте некоторое время на чтение этого учебника, на который я дал ссылку :), @HavocRC


1

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

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

Слабые соединения: Проверьте соединения проводов между поворотным энкодером и устройством, к которому он подключен. Убедитесь, что соединения надежны и правильно установлены.

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

Неправильная конфигурация. Проверьте настройку и конфигурацию поворотного энкодера в вашем коде или программном обеспечении. Убедитесь, что вы выбрали правильный тип энкодера (инкрементальный или абсолютный) и правильно реализована обработка сигнала.

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

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

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

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

,