- Rotary Encoder og dens typer
- KY-040 Rotary Encoder Pinout og beskrivelse
- Sådan fungerer Rotary Encoder
- Komponenter, der kræves
- PIC16F877A Diagram over grænseflader til roterende indkoder
- Kode Forklaring
En Rotary encoder er en inputenhed, der hjælper brugeren til at interagere med et system. Det ligner mere et radiopotentiometer, men det udsender et pulstog, der gør applikationen unik. Når knappen til koderen drejes, drejer den i form af små trin, som hjælper den med at blive brugt til styring af stepper / servomotor, navigering gennem en sekvens i menuen og forøgelse / formindskelse af et tal og meget mere.
I denne artikel lærer vi om de forskellige typer Rotary Encoders, og hvordan det fungerer. Vi vil også interface det med PIC Microcontroller PIC16F877A og styre værdien af et heltal ved at dreje koderen og vise dens værdi på en 16 * 2 LCD-skærm. I slutningen af denne tutorial vil du være fortrolig med at bruge en Rotary Encoder til dine projekter. Så lad os komme i gang…
Rotary Encoder og dens typer
Rotary encoder kaldes ofte en aksel encoder. Det er en elektromekanisk transducer, hvilket betyder at den konverterer mekaniske bevægelser til elektroniske impulser eller med andre ord konverterer den vinkelposition eller bevægelse eller akselposition til et digitalt eller analogt signal. Den består af en knap, der, når den drejer, bevæger sig trin for trin og producerer en sekvens af pulstog med foruddefineret bredde for hvert trin.
Der er mange typer drejekodere på markedet, som designeren kan vælge en ifølge hans applikation. De mest almindelige typer er anført nedenfor
- Incremental Encoder
- Absolut kode
- Magnetisk koder
- Optisk koder
- Laserkoder
Disse kodere klassificeres baseret på udgangssignalet og sensorteknologien, Incremental Encoder og Absolute Encoders er klassificeret baseret på Output signal, og den magnetiske, optiske og laserkoderen er klassificeret ud fra Sensing Technology. Den Encoder bruges her er en trinvis typen Encoder.
Absolut encoder gemmer positionsoplysningerne, selv efter strømmen er fjernet, og positionsoplysningerne vil være tilgængelige, når vi igen anvender strøm til den.
Den anden basistype, Incremental encoder, giver data, når encoderen ændrer sin position. Det kunne ikke gemme positionsoplysningerne.
KY-040 Rotary Encoder Pinout og beskrivelse
Pinouterne på KY-040 roterende encoder af inkrementel type er vist nedenfor. I dette projekt vil vi interface denne Rotary Encoder med den populære mikrocontroller PIC16F877A fra mikrochip.
De første to ben (Jord og Vcc) bruges til at drive encoderen, typisk bruges + 5V forsyning. Bortset fra at dreje knappen i retning med uret og mod uret, har koderen også en kontakt (Aktiv lav), som kan trykkes ved at trykke på knappen inde. Signalet fra denne switch opnås gennem pin 3 (SW). Endelig har den de to outputstifter (DT og CLK), der producerer bølgeformer som allerede beskrevet nedenfor. Vi har tidligere interfacet denne Rotary Encoder med Arduino.
Sådan fungerer Rotary Encoder
Outputtet afhænger helt af de interne kobberpuder, der giver forbindelsen til GND og VCC med akslen.
Der er to dele af Rotary Encoder. Akselhjul, der er forbundet med akslen og roterer med eller mod uret afhængigt af akselens rotation og basen, hvor den elektriske forbindelse er udført. Basen har porte eller punkter, der er forbundet til DT eller CLK på en sådan måde, at når akselhjulet roterer, vil det forbinde basispunkterne og give firkantbølge på både DT- og CLK-porten.
Outputtet vil være som når akslen roterer-
To porte giver den firkantede bølge, men der er en lille forskel i timingen. På grund af dette, hvis vi accepterer output som 1 og 0, kan der kun være fire tilstand, 0 0, 1 0, 1 1, 0 1. Sekvensen for den binære output bestemmer drejningen med uret eller mod uret. Som for eksempel, hvis Rotary Encoder giver 1 0 i inaktiv tilstand og giver 1 1 efter det, betyder det, at encoderen ændrer sin position et enkelt trin med urets retning, men hvis den giver 0 0 efter tomgang 1 0, betyder skaftet skifter positioner mod urets retning med et trin.
Komponenter, der kræves
Det er på tide at identificere, hvad vi har brug for til at interface Rotary Encoder med PIC Microcontroller,
- PIC16F877A
- 4,7 k modstand
- 1k modstand
- 10 k gryde
- 33pF keramisk skivekondensator - 2stk
- 20Mhz krystal
- 16x2 skærm
- Rotary Encoder
- 5V adapter.
- Brødbræt
- Tilslutningsledninger.
PIC16F877A Diagram over grænseflader til roterende indkoder
Nedenfor er billedet af den endelige opsætning efter tilslutning af komponenterne i henhold til kredsløbsdiagram:
Vi har brugt en enkelt 1K modstand til LCD-kontrasten i stedet for at bruge et potentiometer. Tjek også den fulde arbejdsvideo, der er givet i slutningen.
Kode Forklaring
Komplet PIC-kode gives i slutningen af dette projekt med en demonstrationsvideo, her forklarer vi et par vigtige dele af koden. Hvis du er ny med PIC Microcontroller, skal du følge vores PIC-tutorials fra starten.
Som vi diskuterede før, er vi nødt til at kontrollere output og differentiere det binære output for både DT og CLK, så vi oprettede en if-else- del til operationen.
hvis (Encoder_CLK! = position) { if (Encoder_DT! = position) { // lcd_com (0x01); tæller ++; // Forøg tælleren, der vil blive udskrevet på lcd lcd_com (0xC0); lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, tæller); } andet { // lcd_com (0x01); lcd_com (0xC0); mod--; // formindske tælleren lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, tæller); // lcd_puts ("Venstre"); } }
Vi har også brug for at gemme positionen på hvert trin. For at gøre dette brugte vi en variabel "position", der gemmer den aktuelle position.
position = Encoder_CLK; // Det er at gemme encoderurets position på variablen. Kan være 0 eller 1.
Bortset fra dette er der mulighed for at give besked om kontakttryk på LCD-skærmen.
hvis (Encoder_SW == 0) { sw_delayms (20); // afvisningsforsinkelse, hvis (Encoder_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts ("afbryder nede"); // itoa (tæller, værdi, 10); // lcd_puts (værdi);
Den system_init funktionen bruges til at initialisere pin I / O-operation, LCD og til at lagre Rotary Encoder position.
ugyldigt system_init () { TRISB = 0x00; // PORT B som output. Denne port bruges til LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // Dette initialiserer LCD- positionen = Encoder_CLK; // Sotrerede CLK-positionen ved systeminit, inden mens loop start. }
LCD-funktionen er skrevet på lcd.c og lcd.h biblioteket, hvor lcd_puts (), lcd_cmd () er erklæret.
For den fulde kode, variabeldeklaration, konfigurationsbits og andre kodestykker, se nedenstående kode.