Найти тему
Разумный мир

Декодер для энкодера. Аппаратный и программный

Оглавление

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

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

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

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

Энкодер снаружи и изнутри

Если посмотреть на то, какие красивые термины используют некоторые производители, то новичку может стать даже страшновато. Так Bourns для своих энкодеров PEC16 пишут, что они выдают на выходе "2-bit quadrature code". К счастью, на самом деле все гораздо проще!

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

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

Но принцип их работы совсем иной.

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

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

Функциональное устройство механического энкодера. Иллюстрация моя.
Функциональное устройство механического энкодера. Иллюстрация моя.

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

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

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

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

Временные соотношения фаз (сигналов) энкодера

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

При вращении по часовой стрелке сначала замыкается контакт фазы А, а потом контакт фазы В.

Последовательность замыкания контактов при вращении вала энкодера по часовой стрелке
Последовательность замыкания контактов при вращении вала энкодера по часовой стрелке

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

При вращении против часовой стрелки сначала замыкается контакт фазы В, а потом контакт фазы А

Последовательность замыкания контактов при вращении вала энкодера против часовой стрелки
Последовательность замыкания контактов при вращении вала энкодера против часовой стрелки

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

Параметры энкодеров

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

Параметры контактных групп

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

Производитель может указывать сопротивление контактов в замкнутом состоянии, как это делает Borns. Например, для энкодеров PEC16 максимальное состояние замкнутых контактов может достигать 3Ом.

Или могут указываться уровни напряжений при определенной схеме включения контактов, некий аналог уровне логического нуля и единицы. Так Alpsalpine для енкодеров EC12 указывает, что при подключении контактов к источнику напряжения 5В через резистор 5кОм низкий уровень напряжения на замкнутых контактах не превысит 2.5В, а высокий уровень при разомкнутых контактах не будет ниже 2.5В. Разумеется, речь в данном случае идет об уже сильно изношенных контактах.

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

Кроме того, может нормироваться и минимальный/максимальный ток через контакты. Так для EC12 ток не должен быть меньше 1мА и больше 10мА. Хотя энкодер не плохо работает и при токе порядка 200мкА.

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

Для PEC16 производитель просто указывает, что дребезг может длительностью до 5мс. А вот для EC12 указывается и время дребезга, 3мс, и время нестабильности при замкнутом состоянии, 2мс.

Временные параметры и быстродействие

Скорость срабатывания механических контактов конечна. Поэтому и максимальная скорость вращения вала ограничена. Для PEC16 скорость вращения не должна превышать 100 об/мин. Для EC12 предельная скорость в явном виде не указана.

Не стоит гнаться за высокой скоростью . В конечном итоге эти энкодеры предназначены для использования людьми.

Но есть гораздо более важный параметр энкодеров - количество импульсов за полный оборот. И это количество может быть разными. Типичные значения от 12 до 36 импульсов. Вместе с максимальной скоростью вращения это определяет минимальный период сигнала каждой фазы.

И еще один параметр, количество щелчков. Это положения вала, которые четко ощущаются при вращении. Щелчков может не быть вовсе. Количество щелчков может совпадать с количеством импульсов. Или щелчков может быть в два раза больше. Так для EC12 (EC12D1524403) указано 15 импульсов за оборот и 30 щелчков за оборот.

Аппаратный декодер на дискретной логике

Давайте еще раз посмотрим на временные диаграммы

-5

Так и просится аналогия, фаза А это данные, а фаза В это тактовые импульсы. Мы можем просто фиксировать уровень на фазе А при положительном фронте импульса на фазе B.

Если А при этом имеет высокий уровень, то вращение осуществляется по часовой стрелке. Что обычно соответствует действию "+1" для регулируемого параметра.

А если А имеет низкий уровень, то вращение осуществляется против часовой стрелки. Что обычно соответствует действию "-1".

И для определения направления вращения нам достаточно обычного D-триггера, тактирование которого осуществляется по переднему фронту.

Определение направления вращения вала энкодера с помощью D-триггера. Иллюстрация моя
Определение направления вращения вала энкодера с помощью D-триггера. Иллюстрация моя

Но это только направление вращение. А нам нужны импульсы "+1" и "-1", которые мы можем подавать на на другие узлы схемы. С этим нет никаких сложностей.

Аппаратный декодер на дискретной логике без учета гашения дребезга. Иллюстрация моя
Аппаратный декодер на дискретной логике без учета гашения дребезга. Иллюстрация моя

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

-8

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

Аппаратный декодер на дискретной логике с гашением дребезга контактов. Иллюстрация моя
Аппаратный декодер на дискретной логике с гашением дребезга контактов. Иллюстрация моя

В общем, ничего сложного в этой схеме нет. Она может применяться и устройствах на дискретной логике, и в устройствах с микроконтроллерами. Я не показал цепи сброса триггера при включении питания, они совершенно типовые. Причем все микросхемы выпускаются, в том числе, в корпусах SOT23-6, и даже более миниатюрном SC70-6.

Но все таки, компонентов многовато... А можно ли обойтись всего одной микросхемой? Желательно в малогабаритном корпусе.

Программный декодер на микроконтроллере

У Microchip есть простейшие микроконтроллеры PIC в корпусе SOT23-6. И их можно использовать вместо всего множества компонентов аппаратного декодера. Вот такая схема

Микроконтроллер PIC10F200 в качестве аппаратного декодера. Иллюстрация моя
Микроконтроллер PIC10F200 в качестве аппаратного декодера. Иллюстрация моя

Да, это действительно все. Я здесь не показал конденсатор в цепи питания, но я такие конденсаторы не показывал и в схеме аппаратного декодера.

Подтягивающие резисторы на входах фаз А и В здесь расположены внутри микроконтроллера, они включаются программно. Типовой ток обеспечиваемый резисторами подтяжки равен 250 мкА (от 50 до 400 мкА). Этот ток меньше, чем указывается в документации на EC12, но энкодер работает устойчиво (и не в единственном экземпляре устройства). Если вы хотите увеличить ток через контакты, можете подключить внешние резисторы.

Еще одной особенностью, присущей всем микроконтроллерам, является то, все выводы при включении питания находятся в третьем состоянии (настроены как входы). Программа, в начале своей работы, выполняет настройку выводов, но небольшой промежуток времени (несколько мкс) после включения питания выходы "+1" и "-1" находятся в подвешенном состоянии. В дальнейшем на этих выводах обеспечиваются строгие логические уровни. Если для вас эти несколько микросекунд критичны, можете установить с выводов 3 и 4 на землю подтягивающие резисторы. Но в подавляющем большинстве случаев это не требуется.

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

При этом гашение дребезга осуществляется программно и не требует внешних элементов. На выходах "+1" и "-1" при вращении энкодера формируются импульсы положительной полярности длительностью 2 мс на один шаг.

Ссылку на полный текст программы я приведу в конце статьи. Для ее компиляции используется компилятор CC5X от "B Knudsen Data". Я уже давал на него ссылки в своих статьях.

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

Программа работает в непрерывном цикле, без использования режима сна. Сон не используется по очень простой причине - PIC10F200 относится с семейству BaseLine, в котором пробуждение из сна выполняется через сброс от WDT. Это не представляет особых сложностей, но требует наличия на выводах 3 и 4 (в данном случае) резисторов подтяжки к земле. А с учетом особенностей работы с энкодером особой экономии питания не получается.

В цикле, каждые 500 мс считывается состояние контактов энкодера. Считанные значения накапливаются в переменных a_level и b_level в виде последовательности бит (через сдвиг влево). Если в течении 4 мс (8 циклов считывания) переменная приняла значение 0х00, то на входе соответствующей фазы присутствует устойчивый нулевой уровень (контакты замкнуты). Если переменная приняла значение 0xFF, то на входе соответствующей фазы присутствует устойчивый уровень логической 1 (контакты разомкнуты).

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

Вот небольшой фрагмент программы

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

И наконец, обещанная ссылка на полный текст программы. Если у вас русскоязычные комментарии отображаются "кракозябрами", переключите кодировку браузера/редактора на UTF-8. Я не пользуюсь Windows (по разным причинам, это не обсуждается), поэтому у меня все файлы только в кодировке UTF-8.

Заключение

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

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

P.S. Я могу выслать уже запрограммированный PIC10F200. Теоретически, могу и собрать некоторое подобие модуля, например, для Ardiuno (только аппаратное). Я не уверен, что это имеет большой смысл, но периодически мне задают такие вопросы в комментариях или Мессенджере.

До новых встреч!