Энкодер. Некоторые ньюансы.

Статей о работе с энкодером написано немало. В общем как и статей о других, рассматриваемых на этом сайте вопросах. Однако существуют, и имеют на это полное право, сотни рецептов приготовления борща или, допустим, шашлыка — каждый выбирает наиболее подходящий для себя. Это есть в некоторой степени выражение пресловутой «свободы выбора» и, если бы мой блог был философской направленности, то, вслед за вступлением, на головы читателей полились бы потоки дальнейших рассуждений о сущности бытия и прочее 🙂 Хорошо что это не так, и я здесь просто покажу мой подход к использованию этого весьма удобного элемента в связке с микроконтроллерами.
Об устройстве инкрементального энкодера неплохо написано здесь, или, допустим здесь — ничего сложного там не имеется. В простейшем случае — это как две кнопки, замыкающиеся определённым образом при вращении ротора. Удобная вещь, а, если ещё и с дополнительной кнопкой — то вообще универсальное устройство ввода для конструкций на микроконтроллерах!
Цена энкодеров почему-то до сих пор относительно высока, ну, конечно не слишком, но как для двух кнопок, то… Поэтому, прогуливаясь по различным барахолкам и блошиным рынкам, советую обращать внимание на распродажи битых плат зарубежных радиоэлектронных изделий по бросовым ценам — можно за копейки купить плату с установленным там хорошим качественным энкодером. Мне посчастливилось купить таким образом плату управления от фирменного музцентра «Sony» из которой я и выпаял героя сегодняшней публикации. Качественная сборка, отсутствие люфтов, чёткая фиксация и тактильные ощущения при вращении ротора позволили мне верить надписи на корпусе «Jpn». Поиск даташита в интернет по маркировке не принёс никаких результатов, поэтому для определения распиновки я применил хорошо работающую методику, которой пользуюсь уже давно. Прозвонка мультиметром не даст вам однозначного ответа, который из выводов общий.
Для точного определения выводов понадобится двухлучевой осциллограф, источник питания 3 — 5 В, резистор 5 — 100 кОм и сам энкодер. От плюса источника через резистор присоедините  параллельно два проводника к двум любым выводам энкодера и на каждый из этих двух выводов присоедините по каналу осциллографа. Оставшийся вывод энкодера вешаем на минус (общий) питания, туда же и корпус осциллографа. Крутим ротор и наблюдаем картинку…
Лично я, чтоб не морочиться с резистором и батарейками, просто подключил энкодер к микроконтроллерному модулю предварительно прошив кристалл программкой, переводящей какой-либо порт  в режим входов с подключенными pull-up внутренними резисторами — это суть та же схема, что я описывал выше.
Соединитель с жёлтым кембриком — это корпус, два с синим — +5В с порта чипа. Так вот, о картинке… Мне повезло, и я с первого раза подключил правильно. Картинка получается такая:
Поменяем местами «корпусной» провод с любым из двух других. Ещё раз крутим:

Сравнение осциллограмм явно показывает, что при правильном подключении общего вывода значений на входах порта будет четыре, а при любом другом только три — можете поэкспериментировать. Примем «жёлтый» канал осциллографа как старший разряд. Слева направо отсчитываем значения: 1-я осциллограмма — 00, 01, 11, 10, 00 … — код Грея ; 2-я осциллограмма — 00, 01, 11, 00 … —  болт от кода Грея. Четвёртый вывод моего энкодера оказался никуда не подключенным, видимо в других модификациях сюда подключается вывод дополнительной кнопки, замыкающейся при нажатии на ротор.
Теперь о программной реализации. Яростный холивар на форумах о том, как же лучше обрабатывать энкодер — по внешнему прерыванию или циклическим опросом, ясно показывает, что народ спорит каждый о своём. В дествительности же всё зависит от КОНКРЕТНОЙ задачи. Для меня энкодер — устройство ввода информации (управления меню), и отдавать на его обработку столь драгоценный ресурс как внешнее прерывание нет смысла. Поэтому для себя я написал универсальную библиотечку и пользуюсь ей во всех своих проектах, где применяется энкодер. В заголовочном файле выбираются порт и разряды, его обслуживающие . Кроме того при вызове функции устанавливаются минимальные и максимальные значения — это очень удобно! Ведь для установки одних параметров нужен, например,  диапазон 0 — 10, а для других — 2000 — 50000. Ещё в функцию добавил фрагмент который позволяет учитывать сколько изменений состояний в конкретном энкодере на один щелчок. Кстати, именно поэтому мультиметром трудно вызвонить распиновку энкодера! Ведь «поймать» четыре, даже два,  промежуточных состояния ротора между соседними щелчками ой как непросто! Функцию можно вызывать в главном цикле или по переполнению таймера с определённой периодичностью, или как Вам захочется. Переменные EncState, EncData объявляйте как глобальные в главном файле проекта, а если они «перевариваются» в обработчике прерываний — то ещё и volatile. Удачи, коллеги!

Архив с исходниками на С.

Запись опубликована в рубрике Микроконтроллерный конструктор с метками , . Добавьте в закладки постоянную ссылку.

23 комментария на «Энкодер. Некоторые ньюансы.»

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.