- Поворотный энкодер и его типы
- Распиновка и описание поворотного энкодера KY-040
- Как работает поворотный энкодер
- Необходимые компоненты
- Схема подключения поворотного энкодера PIC16F877A
- Код Пояснение
Вращающийся регулятор представляет собой устройство ввода, которое позволяет пользователю взаимодействовать с системой. Он больше похож на радиопотенциометр, но выдает последовательность импульсов, что делает его применение уникальным. Когда ручка энкодера вращается, она вращается в виде небольших шагов, что помогает использовать ее для управления шаговым / серводвигателем, навигации по последовательности меню, увеличения / уменьшения значения числа и многого другого.
В этой статье мы узнаем о различных типах поворотных энкодеров и о том, как они работают. Мы также будем сопрягать его с микроконтроллером PIC PIC16F877A и контролировать значение целого числа, вращая энкодер и отображая его значение на ЖК-экране 16 * 2. В конце этого руководства вы научитесь использовать Rotary Encoder для своих проектов. Итак, приступим…
Поворотный энкодер и его типы
Датчик вращения часто называют датчиком вала. Это электромеханический преобразователь, то есть он преобразует механические движения в электронные импульсы или, другими словами, преобразует угловое положение, движение или положение вала в цифровой или аналоговый сигнал. Он состоит из ручки, которая при вращении будет двигаться шаг за шагом и генерировать последовательность импульсных последовательностей с заранее определенной шириной для каждого шага.
На рынке существует множество типов поворотных энкодеров, и разработчик может выбрать тот, который подходит для его применения. Наиболее распространенные типы перечислены ниже.
- Инкрементальный кодировщик
- Абсолютный кодировщик
- Магнитный энкодер
- Оптический кодировщик
- Лазерный кодировщик
Эти энкодеры классифицируются на основе выходного сигнала и сенсорной технологии, инкрементные энкодеры и абсолютные энкодеры классифицируются на основе выходного сигнала, а магнитные, оптические и лазерные энкодеры классифицируются на основе сенсорной технологии. Здесь используется энкодер инкрементального типа.
Абсолютный энкодер сохраняет информацию о местоположении даже после отключения питания, и информация о местоположении будет доступна, когда мы снова подадим на него питание.
Другой базовый тип, инкрементальный энкодер, предоставляет данные, когда энкодер меняет свое положение. Не удалось сохранить информацию о местоположении.
Распиновка и описание поворотного энкодера KY-040
Распиновка энкодера инкрементального типа KY-040 показана ниже. В этом проекте мы соединим этот Rotary Encoder с популярным микроконтроллером PIC16F877A от Microchip.
Первые два контакта (земля и Vcc) используются для питания энкодера, обычно используется питание +5 В. Помимо вращения ручки по часовой стрелке и против часовой стрелки, энкодер также имеет переключатель (активный низкий уровень), который можно нажать, нажав ручку внутри. Сигнал от этого переключателя поступает через контакт 3 (SW). Наконец, у него есть два выходных контакта (DT и CLK), которые создают сигналы, как уже обсуждалось ниже. Ранее мы подключили этот поворотный энкодер к Arduino.
Как работает поворотный энкодер
Выход полностью зависит от внутренних медных площадок, которые обеспечивают соединение с GND и VCC с валом.
Поворотный энкодер состоит из двух частей. Вал Колесо, которое связано с валом и вращается по часовой стрелке или против часовой стрелки в зависимости от вращения вала и основания, на котором выполняется электрическое соединение. База имеет порты или точки, которые подключены к DT или CLK таким образом, что когда колесо вала вращается, оно соединяет базовые точки и обеспечивает прямоугольную волну как на портах DT, так и на CLK.
Выход будет как при вращении вала -
Два порта обеспечивают прямоугольную волну, но есть небольшая разница во времени. Из-за этого, если мы примем выход как 1 и 0, может быть только четыре состояния: 0 0, 1 0, 1 1, 0 1. Последовательность двоичного выхода определяет поворот по часовой стрелке или поворот против часовой стрелки. Как, например, если поворотный энкодер выдает 1 0 в состоянии покоя и дает 1 1 после этого, это означает, что энкодер меняет свое положение на один шаг в направлении по часовой стрелке, но если он выдает 0 0 после холостого хода 1 0, означает, что вал меняет свое положение против часовой стрелки с одним шагом.
Необходимые компоненты
Пришло время определить, что нам нужно для взаимодействия поворотного энкодера с микроконтроллером PIC,
- PIC16F877A
- Резистор 4,7 кОм
- Резистор 1к
- 10к банк
- Конденсатор дисковый керамический 33пФ - 2шт.
- Кристалл 20 МГц
- Дисплей 16x2
- Поворотный энкодер
- Адаптер на 5 В.
- Хлебная доска
- Монтажные провода.
Схема подключения поворотного энкодера PIC16F877A
Ниже представлено изображение окончательной настройки после подключения компонентов согласно принципиальной схеме:
Мы использовали один резистор 1 кОм для контрастности ЖК-дисплея вместо потенциометра. Также посмотрите полное рабочее видео, приведенное в конце.
Код Пояснение
Полный код PIC приведен в конце этого проекта с демонстрационным видео, здесь мы объясняем несколько важных частей кода. Если вы новичок в использовании микроконтроллера PIC, следуйте нашим руководствам по PIC с самого начала.
Как мы обсуждали ранее, нам нужно проверить вывод и дифференцировать двоичный вывод как для DT, так и для CLK, поэтому мы создали часть if-else для операции.
if (Encoder_CLK! = позиция) { if (Encoder_DT! = позиция) { // lcd_com (0x01); счетчик ++; // Увеличиваем счетчик, который будет выводиться на ЖК- дисплей lcd_com (0xC0); lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, счетчик); } else { // lcd_com (0x01); lcd_com (0xC0); счетчик--; // уменьшить счетчик lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, счетчик); // lcd_puts ("Влево"); } }
Нам также нужно сохранять позицию на каждом шаге. Для этого мы использовали переменную «position», в которой хранится текущая позиция.
позиция = Encoder_CLK; // Сохраняет положение часов энкодера в переменной. Может быть 0 или 1.
Кроме этого, предусмотрена опция уведомления о нажатии переключателя на ЖК-дисплее.
если (Encoder_SW == 0) { sw_delayms (20); // задержка устранения дребезга if (Encoder_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts («переключатель нажат»); // itoa (counter, value, 10); // lcd_puts (значение);
System_init функция используется для инициализации контактного I / O операции, LCD и сохранять позицию кругового датчика.
void system_init () { TRISB = 0x00; // ПОРТ B как выход, этот порт используется для LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // Это инициализирует положение ЖК-дисплея = Encoder_CLK; // Определение положения CLK при инициализации системы перед запуском цикла while. }
Функция LCD написана в библиотеке lcd.c и lcd.h, где объявлены lcd_puts (), lcd_cmd ().
Полный код объявления переменной, битов конфигурации и других фрагментов кода приведен ниже.