Каталог

Энкодер вращения

Что такое энкодер вращения

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

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

Принцип работы

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

Принцип работы энкодера вращения


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

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

Квадратурный энкодер вращения. Принцип работы

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

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

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

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

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

Датчик угла поворота в сервомашинке

Абсолютные и инкрементные энкодеры

Приведенный выше пример оптического энкодера вращения генерирует на выходе импульсы, по которым принимающее устройство определяет текущее положение вала путём подсчёта числа импульсов счётчиком. Такие энкодеры называют инкрементными или накапливающими. Сразу же после включения инкрементного энкодера положение вала неизвестно. Для привязки системы отсчёта к началу отсчёта инкрементные энкодеры могут иметь нулевые (референтные) метки, через которые нужно пройти после включения оборудования. К недостаткам также относится то, что невозможно определить пропуск импульсов от энкодера по каким-либо причинам. Это приводит к накоплению ошибки определения угла поворота вала до тех пор, пока не будет пройдена нуль-метка.

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

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

Этот пример наглядно иллюстрирует принцип кодирования углового положения на диске абсолютного энкодера. Для каждого положения вала формируется свой уникальный код. В данном случае для кодирования 16 положений потребовалось 4 концентрических дорожки. При увеличении разрешения абсолютного энкодера возрастает число дорожек и разрядность считываемого значения. Поэтому наряду с параллельным интерфейсом в абсолютных энкодерах широко применяются последовательные интерфейсы, такие как Profibus, CANopen, SSI, BiSS, ISI, Profinet, PWM, Ethernet Powerlink, EtherNet TCP/IP, Modbus, DeviceNet, EtherCAT. Также существуют энкодеры, возвращающие значение углового положения в виде аналогового сигнала.

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

Подключение инкрементного энкодера к Ардуино

Теперь после небольшой теоретической части можно перейти к практике. Попробуем подключить к Ардуино инкрементный энкодер вращения. У меня в распоряжении имеется модуль KY-040 (вроде того, что изображен на фото в начале этой статьи), который представляет из себя энкодер с разрешением 20 шагов на оборот со встроенной кнопкой, распаянный на плату с подтягивающими резисторами. Это идеальный компонент для организации меню: вращение вала энкодера можно интерпретировать как перемещение курсора по элементам меню, а нажатие кнопки - выбор конкретного элемента.

KY-040 распиновка

Модуль имеет 5 контактов, это:

  • CLK и DT - выводы энкодера, они подтянуты к линии питания резисторами 10кОм;
  • SW - вывод кнопки, при нажатии вывод замыкается на землю;
  • + и GND - линии питания и земли. Данный энкодер является механическим, питание для него не требуется, линии нужны для цепи с подтягивающими резисторами.

Подключим энкодер к Ардуино по следующей схеме:

Подключение KY-040 к АрдуиноСуществует 2 способа работы с энкодером: с использованием прерываний и путем опроса выводов энкодера в теле программы. Первый способ требует четкий сигнал на выводах энкодера, без помех. Поскольку данный энкодер является механическим, сигнал на его выходах искажен дребезгом контактов и не может быть использован для генерации прерываний (по крайней мере без дополнительных средств для восстановления сигнала). Поэтому сейчас реализуем второй способ и бороться с дребезгом будем программно. Загрузим в Ардуино следующий код:

#define pin_CLK 2
#define pin_DT  4
#define pin_Btn 3

unsigned long CurrentTime, LastTime;
enum eEncoderState {eNone, eLeft, eRight, eButton};
uint8_t EncoderA, EncoderB, EncoderAPrev;
int8_t counter;
bool ButtonPrev;

eEncoderState GetEncoderState() {
  // Считываем состояние энкодера
  eEncoderState Result = eNone;
  CurrentTime = millis();
  if (CurrentTime - LastTime >= 5) {
    // Считываем не чаще 1 раза в 5 мс для уменьшения ложных срабатываний
    LastTime = CurrentTime;
    if (digitalRead(pin_Btn) == LOW ) {
      if (ButtonPrev) {
        Result = eButton; // Нажата кнопка
        ButtonPrev = 0;
      }
    }
    else {
      ButtonPrev = 1;
      EncoderA = digitalRead(pin_DT);
      EncoderB = digitalRead(pin_CLK);
      if ((!EncoderA) && (EncoderAPrev)) { // Сигнал A изменился с 1 на 0
        if (EncoderB) Result = eRight;     // B=1 => энкодер вращается по часовой
        else          Result = eLeft;      // B=0 => энкодер вращается против часовой
      }
      EncoderAPrev = EncoderA; // запомним текущее состояние
    }
  }
  return Result;
}

void setup() {
  pinMode(pin_DT,  INPUT);
  pinMode(pin_CLK, INPUT);
  pinMode(pin_Btn, INPUT_PULLUP); // Кнопка не подтянута к +5 поэтому задействуем внутренний pull-up резистор
  Serial.begin(9600);
  counter = 0;
}

void loop() {
  switch (GetEncoderState()) {
    case eNone: return;
    case eLeft: {   // Энкодер вращается влево
        counter--;
        break;
      }
    case eRight: {  // Энкодер вращается вправо
        counter++;
        break;
      }
    case eButton: { // Нажали кнопку
        counter = 0;
        break;
      }
  }
  Serial.println(counter);
}

Для удобства работы код опроса энкодера помещен в отдельную функцию. "Подавление" дребезга достигается за счет добавления в функцию условия, которое обеспечивает опрос энкодера не чаще 1 раза в 5мс. Итак, прошиваем код в Ардуино, запускаем монитор порта и вращаем ручку энкодера. Должно получиться что-то вроде этого:

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

footer shadow
Контакты

г. Москва, Пятницкое ш. д. 18, пав. 566

zakaz@compacttool.ru

8-495-752-55-22

compacttool logoadaptive site

accepted payment systems

Информация представленная на данном информационном ресурсе преследует исключительно рекламные цели и не является договором-офертой !

© Все права защищены 2015 - 2024г https://compacttool.ru