Рубрики
Схемы на PIC

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

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

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

Также на нашем сайте мы рассматривали подключение инкрементального энкодера к другим микроконтроллерам (платам):

Типы инкрементальных энкодеров

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

К наиболее популярным типам энкодеров относятся следующие:

  • инкрементальный энкодер;
  • абсолютный энкодер;
  • магнитный энкодер;
  • оптический энкодер;
  • лазерный энкодер.

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

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

Инкрементальный энкодер KY-040

Назначение контактов (распиновка) инкрементального энкодера KY-040 показаны на рисунке ниже. В нашем проекте мы его будем подключать к популярному микроконтроллеру PIC16F877A.

Первые два контакта (Ground и Vcc) используются для подачи питания на энкодер, обычно +5V. Кроме способности вращения своей оси по часовой и против часовой стрелки энкодер также содержит переключатель (в активном состоянии low), который переключается при нажатии оси энкодера внутрь. Сигнал от этого переключателя доступен на контакте 3 (SW) энкодера. На двух выходных контактах DT и CLK формируются последовательности импульсов, по которым можно определить направление вращения энкодера.

Принцип работы инкрементального энкодера

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

Инкрементальный энкодер состоит из двух основных частей. Первой из них является шестерня (Shaft Wheel), которая соединена с осью и вращается по часовой или против часовой стрелки в зависимости от вращения оси. Второй частью энкодера является база (основание) со всеми электрическими соединениями энкодера. База имеет точки (порты), которые соединены с контактами DT и CLK энкодера таким образом, что когда шестерня вращается, она подключается к точкам базы и формирует прямоугольную волну на контактах DT и CLK. Внешний вид данных прямоугольных волн показан на следующем рисунке.

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

Необходимые компоненты

  1. Микроконтроллер PIC16F877A (купить на AliExpress).
  2. Инкрементальный энкодер (купить на AliExpress).
  3. Программатор PICkit 3 (купить на AliExpress).
  4. ЖК дисплей 16х2 (купить на AliExpress).
  5. Кварцевый генератор 20 МГц (купить на AliExpress).
  6. Конденсаторы 33 пФ (2шт.) (купить на AliExpress).
  7. Резисторы 1 кОм, 4,7 кОм (купить на AliExpress).
  8. Потенциометр 10 кОм (купить на AliExpress).
  9. Адаптер питания на 5V.
  10. Макетная плата.
  11. Соединительные провода.

Схема проекта

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

Внешний вид собранной конструкции проекта показан на следующем рисунке.

Внешний вид соединений проекта на макетной плате показан на следующем рисунке. В окончательной версии проекта мы вместо потенциометра для регулировки контрастности ЖК дисплея использовали резистор 1 кОм.

Объяснение программы для микроконтроллера PIC

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

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

Также необходимо сохранять позицию каждого шага – для этого мы будем использовать переменную “position”.

Дополнительно при нажатии переключателя энкодера мы будем выдавать об этом соответствующее сообщение на экран ЖК дисплея.

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

Функции для работы с ЖК дисплеем содержатся в библиотеке, располагающейся в файлах lcd.c и lcd.h.

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы

Видео, демонстрирующее работу проекта

4 ответа к “Подключение инкрементального энкодера к микроконтроллеру PIC16F877A”

Весьма плохой перевод статьи зарубежного автора. Масса неточностей, недомолвок, ошибок…

Может подскажите где вы обнаружили ошибки и опечатки? Большинству посетителей сайта нравятся мои переводы и в комментариях на сайте мне уже много раз высказывали благодарность за проделанный мной труд

Добрый день. К сожалению у меня нет кода этой программы в HEX формате

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *