Оглавление:

Простой поворотный декодер: 4 шага
Простой поворотный декодер: 4 шага

Видео: Простой поворотный декодер: 4 шага

Видео: Простой поворотный декодер: 4 шага
Видео: Энкодеры. Подробный обзор с экспериментами! 2024, Июль
Anonim
Image
Image
Простой поворотный декодер
Простой поворотный декодер

В этом руководстве описывается простой метод декодирования последовательного поворотного энкодера с использованием Arduino Uno R3.

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

Предоставляются версии кода с прерыванием и без прерывания.

Версия кода прерывания требует только одного вывода прерывания.

Изображений:

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

Шаг 1: Принципиальная схема

Принципиальная электрическая схема
Принципиальная электрическая схема

Схема подключения энкодера представлена на рис.1.

Провода перемычки припаяны непосредственно к контактам энкодера.

Поменяйте местами два синих провода, если направление счета меняется на противоположное.

Шаг 2: Список деталей

Следующие детали были получены с

  • 1 только Arduino UNO R3 с USB-кабелем.
  • 1 только последовательный энкодер (EC11 или аналог) с переключателем.
  • 1 только ручка для вала.
  • 3 только перемычки Arduino «папа-папа».

Шаг 3: теория

Теория
Теория

Последовательные поворотные энкодеры генерируют две прямоугольные волны, каждая из которых смещена на 90 градусов, как показано на рисунке 1.

Логические схемы на контакте A и контакте B различаются, когда вал вращается по часовой стрелке (CW) и против часовой стрелки (CCW) в положениях с 1 по 6.

Общие методы определения направления вращения включают:

  • аппаратное обеспечение
  • двойные прерывания
  • таблицы поиска шаблонов

В этом проекте используется программный метод, не требующий таблиц поиска. [1]

Направление

Вместо того, чтобы смотреть на шаблоны вывода от контакта A и контакта B, давайте сосредоточимся на контакте A.

Если мы выберем контакт B после каждого перехода контакта A, мы заметим, что:

  • Контакт A и контакт B имеют противоположные логические состояния, когда энкодер вращается по часовой стрелке.
  • Контакт A и контакт B имеют одинаковое логическое состояние, когда энкодер вращается против часовой стрелки.

Актуальный код:

// ----- Подсчет переходов

CurrentStateA = stateContactA (); если (CurrentStateA! = LastStateA) {CurrentStateB = digitalRead (ContactB); если (CurrentStateA == CurrentStateB) Count ++; if (CurrentStateA! = CurrentStateB) Count--; LastStateA = CurrentStateA; }

Этот метод дает следующие преимущества:

  • таблицы поиска не требуются
  • требуется только одна линия прерывания

Debounce

Все механические энкодеры страдают от «дребезга контактов».

Если переключающий контакт не замыкается / размыкается чисто, его логическое состояние будет быстро меняться от ВЫСОКОГО до НИЗКОГО, пока переключающий контакт не установится. Это приводит к ложным подсчетам.

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

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

Программное обеспечение Debouncing

В этом методе используются два счетчика (открытый и закрытый), которые установлены на ноль. [2]

При обнаружении перехода на контакте A:

  • Постоянно опрашивайте Контакт А.
  • Увеличивайте счетчик открытия и сбрасывайте счетчик закрытия всякий раз, когда Контакт A ВЫСОКИЙ.
  • Увеличивайте счетчик закрытия и сбрасывайте счетчик открытия всякий раз, когда на контакте A НИЗКИЙ уровень.
  • Выйдите из цикла, когда один из счетчиков достигнет заранее установленного значения. Мы эффективно ищем период устойчивого состояния после любого отскока контакта.

Актуальный код:

// ----- Контакт A для устранения дребезга

while (1) {if (digitalRead (ContactA)) {// ----- ContactA открыт-закрыт = 0; // Пустой противоположный интегратор Open ++; // Интегрируем if (Open> MaxCount) return HIGH; } else {// ----- ContactA закрыт Открыто = 0; // Пустой противоположный интегратор Closed ++; // Интегрировать if (Closed> MaxCount) return LOW; }}

Нет необходимости отключать контакт B, поскольку переходы между контактами A и B не совпадают.

Подсчет

Механический «фиксатор» эффективно удваивает ваш счет, поскольку между щелчками регистрируется два счета (см. Рис. 1).

Количество «фиксаторов» может быть определено с использованием арифметики по модулю 2, как показано ниже.

Актуальный код:

// ----- Подсчет "фиксаторов"

если (Счетчик% 2 == 0) {Serial.print ("Счетчик:"); Serial.println (Счетчик / 2); }

использованная литература

Дополнительную информацию можно найти по адресу:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Шаг 4: Программное обеспечение

Для этого проекта требуется последняя версия IDE Ardino Uno R3 (интегрированная среда разработки), доступная по адресу

Загрузите каждый из следующих двух скетчей Arduino (прилагается)

  • rotary_encoder_1.ino (версия опроса)
  • rotary_encoder_2.no (версия с прерыванием)

Дважды щелкните нужную версию и следуйте инструкциям на экране.

Наслаждаться …

Щелкните здесь, чтобы просмотреть другие мои инструкции.

Рекомендуемые: