Как подключить энкодер к контроллеру

Как подключить энкодер к контроллеру

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

Особенности инкрементального энкодера

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

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

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

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

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

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

У энкодера есть три информационных вывода один общий, остальные два обычно называют «A» и «B», на рисунке выше вы видите цоколевку энкодера с кнопкой – вы можете получать сигнал при нажатии на его вал.

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

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

Вот пример цоколевки реального энкодера:

Интересно:

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

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

Не менее наглядно это проиллюстрировано на следующей анимации (нажмите на рисунок):

Энкодер может быть и оптическим (сигнал формируется излучателями фотоприемниками, см. на рисунке ниже), и магнитным (работает на эффекте Холла). В таком случае у него нет контактов и больше срок службы.

Как уже было сказано, направление вращения можно определить по тому, какой из выходных сигналов раньше изменился, а вот так это выглядит на практике!

Точность управления зависит от разрешения энкодера – количества импульсов на оборот. Количество импульсов может быть от единиц до тысяч штук. Так как энкодер может выступать в качестве датчика положения, то чем больше импульсов – тем точнее будет происходить определение. Этот параметр обозначается как PPR – pulse per revolution.

Но есть небольшой нюанс, а именно похожее обозначение LPR – это количество меток на диске.

А количество обрабатываемых импульсов. Каждая метка на диске даёт 1 прямоугольный импульс на каждом из двух выходов. У импульса есть два фронта – задний и передний. Так как выхода два то с каждого из них мы в сумме получаем 4 импульса значения которых вы можете обработать.

Подключаем к Arduino

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

Модуль энкодера – это плата на которой расположен инкрементальный энкодер и подтягивающие резисторы. Пины можно использовать любые.

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

Разберем код подробнее, по порядку. В void setup() мы объявили что будем использовать связь через последовательный порт, а затем установили пины 2 и 8 в режим входа. Номера пинов выбираете сами исходя из вашей схемы подключения. Константа INPUT_PULLUP выставляет режим входа, у ардуино есть два варианта:

INPUT – вход без подтягивающих резисторов;

INPUT_PULLUP – подключение ко входу подтягивающих резисторов. Внутри микроконтроллера уже есть резисторы, через которые вход соединяется с плюсом питания (pullup).

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

Читайте также:  Что посадить у колодца на даче

Логика основной программы следующая: если на входе «2» у нас единица – выдаёт в монитор порта H, если нет – L. Таким образом при вращении в одну сторону на мониторе последовательного порта получится что-то вроде этого: LL HL HH LH LL. А в обратную: LL LH HH HL LL.

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

Заключение

Инкрементальные энкодеры нашли широкое практическое применение в усилителях для акустических систем – их использовали в качестве органа управления регулятора громкости, в автомагнитолах – для регулировки параметров звука и навигации по меню, в компьютерных мышках с его помощью вы ежедневно прокручиваете страницы (на его вале установлено колесико). А также в измерительных инструментах, ЧПУ станках, роботах, в сельсинах не только в качестве органов управления, но и измерения величин и определения положения.


Инкрементальный энкодер представляет собой механическое устройство (датчик) преобразующее угол поворота вала (ручки) в электрические сигналы. Энкодер имеет три вывода, или пять в зависимости от наличия встроенной кнопки. Здесь я рассматриваю наиболее распространенные энкодеры, которые встраивают в бытовую аппаратуру, например, для регулировки громкости, навигации в меню и т.д. В отличие от переменного резистора, положение ручки энкодера меняется дискретно, “щелчками”, при этом происходит несколько коммутаций, последовательность которых зависит от направления вращения. На один полный оборот ручки может приходиться различное количество дискретных положений (12, 20, 24), в зависимости от модели энкодера.

На рисунке ниже представлена функциональная схема поясняющие принцип действия энкодера.

Как видно из временных диаграмм, при повороте на одно дискретное положение (на один “щелчок”), на выводах A и B формируются отрицательные импульсы (полярность импульсов зависит от схемы подключения), сдвинутые по фазе между собой. Сдвиг фаз зависит от направления вращения. Из временной диаграммы можно выделить четыре состояния, которые составляют период одного дискретного изменения (“щелчка”), длительность периода варьируется примерно от 2 мс до 4 мс.

На следующем рисунке представлена схема подключения энкодера к микроконтроллеру:

Выводы A и B энкодера необходимо подтянуть к линии питания +5В с помощью резисторов, также необходимо установить конденсаторы C1 и C2 которые уменьшают влияние дребезга контактов.

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

Ниже представлен код программы, в которой реализован периодический опрос состояния выводов энкодера. Опрос состояний выводов А и B энкодера выполняется в подпрограмме обработки прерываний, которая периодически вызывается по переполнению таймера TMR0 (см. Таймеры. Организация временной задержки). В моем варианте таймер переполняется примерно через 1 мс, то есть энкодер опрашивается каждую миллисекунду.

Внутри обработчика прерываний сначала сохраняется текущее состояние выводов энкодера, для этого используется дополнительный регистр flag, содержимое которого всегда перед выходом из обработчика сдвигается влево на два бита, таким образом сохраняется предыдущее состояние выводов энкодера. После сохранения текущего состояния в 0-й и 1-й бит регистра flag, осуществляется проверка предыдущего состояния, то есть анализируются 2-й и 3-й биты. Алгоритм следующий: если предыдущее состояние обоих выводов соответствовало логической единице, проверяем текущее сохраненное значение (биты 0,1 регистра flag), если значение битов равно 0 и 1, произошел поворот в одну сторону, если значение равно 1 и 0, произошел поворот в противоположную сторону. После определения факта поворота происходит инкремент или декремент регистра shet, содержимое которого (число от 0 до 255) в основной программе выводится на семисегментные индикаторы. Инкремент производится до числа 255 и ограничивается на этом значении, даже при дальнейшем повороте ручки энкодера, то же самое и при декременте до 0.

Если предыдущее состояние обоих выводов не соответствует 1, просто выходим из обработчика, также смещая содержимое регистра flag влево. Это необходимо чтобы пропустить все остальные возможные состояния выводов энкодера, то есть для определения направления вращения используется половина периода одного дискретного изменения (два состояния из четырех возможных).

При использовании такого алгоритма выявились некоторые недостатки, сам факт поворота ручки определялся стабильно, но из-за наличия дребезга контактов в конце периода одного дискретного изменения (после “щелчка”), происходило повторное определение факта поворота, причем в обратную сторону. То есть после инкремента регистра shet происходил декремент и наоборот. Чтобы избежать этого, после инкремента/декремента регистра shet, я дополнительно добавил условие для многократной проверки состояния выводов энкодера на соответствие высокому логическому уровню. После инкремента/декремента shet, перед выходом из обработчика прерывания устанавливается флаг (0-й бит) в дополнительном регистре flag1. При последующих входах в обработчик, после проверки предыдущего состояния и соответствия выводов энкодера высокому логическому уровню, по установленному флагу в регистре flag1 происходит инкремент регистра shet1. Если его содержимое не равно числу 3 происходит выход из обработчика. Таким образом, после факта поворота, следующее определение состояния энкодера будет выполняться, при условии трехкратной фиксации высоких логических уровней на выводах энкодера, после чего регистр shet1 обнуляется и сбрасывается флаг регистра flag1.

Читайте также:  Частный дом из керамзитоблоков

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

Теперь рассмотрим программу опроса энкодера основанную на прерываниях по изменению уровня на входах микроконтроллера:

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

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

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

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

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

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

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

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

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

В качестве испытуемого взял первую попавшую тестовую плату на микроконтроллере ATmega8. Кроме контроллера на плате меня интересовал разъем для программирования, контакты для подключения энкодера и интерфейс для подключения к COM порту компьютера. Для обеспечения стабильности связи микроконтроллера с ПК на плате предусмотрен кварцевый резонатор на 4МГц.

Схема подключения энкодера очень простая:
Средний вывод подключаем на землю;
Правый выход подключаем к 4 вывод МК;
Левый вывод подключаем к 5 выводу МК;.

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

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

Счетчик увеличивается при вращении энкодера вправо и уменьшается при вращении влево.

Вот и сам текст программы (смело вставляем его в проект для CodeVisionAVR, там все будет красиво и аккуратно выглядеть, а здесь оформление текста программы сильно хромает):

//———настройка USART—————————————————————-
UCSRB=1

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

P.S. В процессе испытаний ни одного радиоэлемента не пострадало! Энкодеры благополучно собраны обратно и продолжают выполнять свои функции.

Смотрите также

Метки: avr, энкодер

Комментарии 76

Тоже попробовал такой энкодер задействовать. На Arduino Uno проблем нет, а вот на Pro Mini не все так гладко — почему-то попеременно то уменьшает то увеличивет счетчик с интервалом в несколько оборотов.

Проблема в дребезге контактов. Я для этого поставил конденсаторы между выводами энкодера.

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

Если кому интересно, скетч для ардуино здесь www.drive2.ru/c/3158536/

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

Если быть совсем точным, то такой энкодер называется квадратурным инкрементальным (инкрементным) энкодером.

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

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

Читайте также:  Как правильно крепить карниз к потолку

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

Для систем позиционирования, например. Зачем тогда в проц встраивать аппаратный квадратурный декодер, если все решается программно?
Как, например, отследить перемещение оптического энкодера с разрешением 10000 имп на 1/4 имп, потом обратно? Или бывает, что система встала в граничном состоянии на метке, на которой висит прерывание. Беда в том, что на таких малых перемещениях мы имеем неправильное трактование движения энкодера, и, вместо сложения импульсов, проц делает декремент. Сначала это незаметно, постепенно ошибка набегает.

Ну речь то идет о энкодере с 24 импульсами на оборот, который руками крутят. Естественно, что если обработывать оптический валкодер, который вращантся от электромотора с частотой тыщи 3 — 4 оборотов в минуту, то программная обработка на avr не подойдет. Но материал написан для начинающих с целью ознакомления с принципом работы энкодера, который практически каждый автолюбитель вращает по десять раз на день.

Для систем позиционирования, например. Зачем тогда в проц встраивать аппаратный квадратурный декодер, если все решается программно?
Как, например, отследить перемещение оптического энкодера с разрешением 10000 имп на 1/4 имп, потом обратно? Или бывает, что система встала в граничном состоянии на метке, на которой висит прерывание. Беда в том, что на таких малых перемещениях мы имеем неправильное трактование движения энкодера, и, вместо сложения импульсов, проц делает декремент. Сначала это незаметно, постепенно ошибка набегает.

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

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

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

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

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

Я же не писал про позиционирование сложных технических систем или о профессиональных решениях! Речь идет исключительно о радиолюбительской практики. К тому же материал носит исключительро обзорный характер и не претендует на энциклопедическую полноту.

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

Причем вообще не понимаю, для чего вы это вообще смотрели, если вам и так все известно?! Хотите кого-то предостеречь от ошибок, возможных в следствии чтения делитантских писулек?

Лучше потрудитесь самостоятельно что-то написать, чем тратить время на бесполезную критику!

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

Два года прошло.

Добрый вечер) Подскажите плиз., как можно подключить кнопки к энкодеру что регулирует звук в автомагнитоле? Пока только такое фото… СПС.

В каком плане подключить кнопку?

Чтоб кнопки дублирували энкодер. Тоисть кнопки на руле установить и абытолько звук регулировали.

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

А обманка как, с прошивкой или просто зборная компонентов?

Добрый вечер) Подскажите плиз., как можно подключить кнопки к энкодеру что регулирует звук в автомагнитоле? Пока только такое фото… СПС.

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