- Ротационен енкодер и неговите типове
- KY-040 Ротационен енкодер Pinout и описание
- Как работи въртящият се енкодер
- Необходими компоненти
- PIC16F877A Диаграма на взаимодействащия ротационен енкодер
- Обяснение на кода
А Ротари енкодер е входно устройство, което помага на потребителя да взаимодейства със системата. По-скоро прилича на радио потенциометър, но извежда последователност от импулси, което прави приложението му уникално. Когато копчето на енкодера се завърти, той се върти под формата на малки стъпки, което му помага да се използва за управление на стъпков / серво мотор, навигация през последователност от менюто и увеличаване / намаляване на стойността на число и много други.
В тази статия ще научим за различните видове ротационни енкодери и как тя работи. Също така ще го свържем с PIC микроконтролер PIC16F877A и ще контролираме стойността на едно цяло число, като завъртим енкодера и ще покажем неговата стойност на 16 * 2 LCD екран. В края на този урок ще ви е удобно да използвате ротационен кодер за вашите проекти. Така че нека да започнем…
Ротационен енкодер и неговите типове
Ротационен енкодер често се нарича валов енкодер. Това е електромеханичен преобразувател, което означава, че преобразува механичните движения в електронни импулси или с други думи преобразува ъгловото положение или движението или положението на вала в цифров или аналогов сигнал. Състои се от копче, което при завъртане ще се движи стъпка по стъпка и ще създаде последователност от импулсни влакове с предварително определена ширина за всяка стъпка.
На пазара има много видове ротационни енкодери, които дизайнерът може да избере според приложението си. Най-често срещаните видове са изброени по-долу
- Инкрементален енкодер
- Абсолютен кодер
- Магнитен енкодер
- Оптичен енкодер
- Лазерен кодер
Тези енкодери са класифицирани въз основа на изходния сигнал и сензорната технология, инкременталният енкодер и абсолютните енкодери са класифицирани въз основа на изходния сигнал, а магнитният, оптичният и лазерният енкодер са класифицирани въз основа на сензорната технология. Най- кодер използва тук е тип инкрементален енкодер.
Абсолютният енкодер съхранява информацията за позицията дори след като захранването е премахнато и информацията за позицията ще бъде достъпна, когато отново приложим захранването към нея.
Другият основен тип, инкрементален енкодер, предоставя данни, когато енкодерът промени позицията си. Не може да съхранява информация за позицията.
KY-040 Ротационен енкодер Pinout и описание
Пиновете на ротационния енкодер KY-040 Incremental са показани по-долу. В този проект ще свържем този ротационен енкодер с популярния микроконтролер PIC16F877A от микрочип.
Първите два щифта (Ground и Vcc) се използват за захранване на енкодера, обикновено се използва захранване + 5V. Освен че върти копчето по посока на часовниковата стрелка и обратно на часовниковата стрелка, енкодерът има и превключвател (Active low), който може да се натисне чрез натискане на копчето вътре. Сигналът от този превключвател се получава през щифта 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.7k резистор
- 1k резистор
- 10к пот
- 33pF керамичен дисков кондензатор - 2бр
- 20Mhz кристал
- 16x2 дисплей
- Ротационен енкодер
- 5V адаптер.
- Дъска за хляб
- Свързващи проводници.
PIC16F877A Диаграма на взаимодействащия ротационен енкодер
По-долу е картинката на окончателната настройка след свързване на компонентите съгласно схемата:
Използвахме един резистор 1K за контраста на LCD, вместо да използваме потенциометър. Също така проверете пълния работен видеоклип, даден в края.
Обяснение на кода
Пълният PIC код е даден в края на този проект с демонстрационно видео, тук обясняваме няколко важни части от кода. Ако сте нов с PIC Microcontroller, следвайте нашите уроци за PIC от самото начало.
Както обсъждахме по-рано, трябва да проверим изхода и да разграничим двоичния изход както за DT, така и за CLK, затова създадохме част -ако за операцията.
if (Encoder_CLK! = позиция) { if (Encoder_DT! = позиция) { // lcd_com (0x01); брояч ++; // Увеличете брояча, който ще се отпечатва на lcd 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 ("Вляво"); } }
Също така трябва да съхраняваме позицията на всяка стъпка. За целта използвахме променлива „позиция“, която съхранява текущата позиция.
позиция = Encoder_CLK; // Той е да съхранява позицията на часовника на кодера на променливата. Може да бъде 0 или 1.
Освен това се предоставя опция за уведомяване за натискане на превключвателя на LCD дисплея.
ако (Encoder_SW == 0) { sw_delayms (20); // отлагане на забавяне ако (Encoder_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts ("превключвателят е натиснат"); // itoa (брояч, стойност, 10); // lcd_puts (стойност);
В system_init функция се използва за инициализиране на пин I / O операция, LCD и за съхраняване на мястото на ротационен енкодер.
void system_init () { TRISB = 0x00; // PORT B като изход, Този порт се използва за LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // Това ще инициализира LCD позицията = Encoder_CLK; // Сотрира CLK позицията в системния инициал, преди да започне цикълът while. }
Функцията LCD се записва в библиотеката lcd.c и lcd.h, където се декларират lcd_puts (), lcd_cmd ().
За декларацията на променливите, конфигурационните битове и други кодови фрагменти, моля, намерете пълния код по-долу.