- Rotary Encoder och dess typer
- KY-040 Rotary Encoder Pinout och beskrivning
- Hur roterande kodare fungerar
- Komponenter krävs
- PIC16F877A Roterande kodningsgränssnittsdiagram
- Kodförklaring
En roterande kodare är en inmatningsenhet som hjälper användaren att interagera med ett system. Det ser mer ut som en radiopotentiometer men den matar ut ett pulståg som gör dess applikation unik. När vredet på kodaren vrids roterar den i form av små steg som hjälper den att användas för steg- / servomotorstyrning, navigera genom en sekvens i menyn och öka / minska värdet på ett nummer och mycket mer.
I den här artikeln lär vi oss om de olika typerna av roterande kodare och hur det fungerar. Vi kommer också att ansluta den till PIC Microcontroller PIC16F877A och styra värdet på ett heltal genom att vrida kodaren och visa dess värde på en 16 * 2 LCD-skärm. I slutet av denna handledning kommer du att vara bekväm med att använda en Rotary Encoder för dina projekt. Så låt oss komma igång…
Rotary Encoder och dess typer
Roterande kodare kallas ofta en axelkodare. Det är en elektromekanisk omvandlare, vilket innebär att den omvandlar mekaniska rörelser till elektroniska pulser eller med andra ord omvandlar vinkelposition eller rörelse eller axelposition till en digital eller analog signal. Den består av en ratt som när den roterar rör sig steg för steg och producerar en sekvens av pulståg med fördefinierad bredd för varje steg.
Det finns många typer av roterande kodare på marknaden som designern kan välja en enligt sin applikation. De vanligaste typerna listas nedan
- Inkrementell kodare
- Absolut kodare
- Magnetisk kodare
- Optisk kodare
- Laserkodare
Dessa kodare klassificeras baserat på utsignalen och avkänningstekniken, Incremental Encoder och Absolute Encoders klassificeras baserat på utgångssignalen och magnetisk, optisk och laserkodare klassificeras baserat på Sensing Technology. Den Encoder används här är en typ Encoder inkrementell.
Absolut kodare lagrar positionsinformation även efter att strömmen har tagits bort, och positionsinformationen kommer att finnas tillgänglig när vi åter använder ström till den.
Den andra grundtypen, inkrementell kodare tillhandahåller data när kodaren ändrar sin position. Det kunde inte lagra positionsinformation.
KY-040 Rotary Encoder Pinout och beskrivning
Uttag för KY-040 roterande kodare för inkrementell typ visas nedan. I det här projektet kommer vi att ansluta denna Rotary Encoder till den populära mikrokontrollern PIC16F877A från mikrochip.
De första två stiften (jord och Vcc) används för att driva kodaren, vanligtvis används + 5V-matning. Förutom att vrida ratten medurs och moturs har kodaren också en brytare (Aktiv låg) som kan tryckas genom att trycka på ratten inuti. Signalen från denna omkopplare erhålls via stift 3 (SW). Slutligen har den två utgångsstift (DT och CLK) som producerar vågformerna som redan diskuterats nedan. Vi har kopplat denna Rotary Encoder tidigare med Arduino.
Hur roterande kodare fungerar
Utgången beror helt på de interna kopparkuddarna som ger anslutningen till GND och VCC med axeln.
Det finns två delar av Rotary Encoder. Axelhjul som är anslutet till axeln och roterar medurs eller moturs beroende på axelns rotation och basen där den elektriska anslutningen görs. Basen har portar eller punkter som är anslutna till DT eller CLK på ett sådant sätt att när axelhjulet roterar kommer det att ansluta baspunkterna och ge fyrkantig våg på både DT- och CLK-porten.
Utgången kommer att vara som när axeln roterar-
Två portar ger fyrkantvåg men det är liten skillnad i tidpunkten. På grund av detta, om vi accepterar utgången som 1 och 0, kan det bara finnas fyra tillstånd, 0 0, 1 0, 1 1, 0 1. Sekvensen för den binära utgången bestämmer medurs eller moturs varv. Liksom till exempel, om Rotary Encoder tillhandahåller 1 0 i viloläge och tillhandahåller 1 1 efter det, betyder det att kodaren ändrar sin position ett enda steg moturs, men om den ger 0 0 efter tomgång 1 0, betyder att skaftet ändras i riktning moturs med ett steg.
Komponenter krävs
Det är dags att identifiera vad vi behöver för att ansluta Rotary Encoder till PIC Microcontroller,
- PIC16F877A
- 4,7 k motstånd
- 1k motstånd
- 10k kruka
- 33pF keramisk skivkondensator - 2st
- 20Mhz kristall
- 16x2 skärm
- Rotary Encoder
- 5V-adapter.
- Brödbräda
- Anslutningskablar.
PIC16F877A Roterande kodningsgränssnittsdiagram
Nedan är bilden av den slutliga installationen efter anslutning av komponenterna enligt kretsschemat:
Vi har använt ett enda 1K-motstånd för LCD-kontrasten istället för att använda en potentiometer. Kontrollera också hela arbetsvideon som ges i slutet.
Kodförklaring
Komplett PIC-kod ges i slutet av detta projekt med en demonstrationsvideo, här förklarar vi några viktiga delar av koden. Om du är ny med PIC Microcontroller, följ våra PIC-handledning från början.
Som vi diskuterade tidigare måste vi kontrollera utdata och differentiera den binära utgången för både DT och CLK, så vi skapade en if-else- del för operationen.
if (Encoder_CLK! = position) { if (Encoder_DT! = position) { // lcd_com (0x01); räknare ++; // Öka räknaren som kommer att skrivas ut på lcd lcd_com (0xC0); lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, räknare); } annat { // lcd_com (0x01); lcd_com (0xC0); disken--; // minska räknaren lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, räknare); // lcd_puts ("Left"); } }
Vi måste också lagra positionen i varje steg. För att göra detta använde vi en variabel "position" som lagrar den aktuella positionen.
position = Encoder_CLK; // Det är att lagra kodarens klockposition på variabeln. Kan vara 0 eller 1.
Utöver detta finns ett alternativ för att meddela om omkopplingstryck på LCD-skärmen.
om (Encoder_SW == 0) { sw_delayms (20); // avstängningsfördröjning om (Encoder_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts ("omkopplare tryckt"); // itoa (räknare, värde, 10); // lcd_puts (värde);
Den system_init funktionen används för att initiera stiftet / ut-operation, LCD och att lagra rotationskodaren positionen.
ogiltigt system_init () { TRISB = 0x00; // PORT B som utgång. Denna port används för LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // Detta initierar LCD- positionen = Encoder_CLK; // Sotred CLK-positionen vid systeminit, innan stundslingan startar. }
LCD-funktionen är skriven i biblioteket lcd.c och lcd.h där lcd_puts (), lcd_cmd () deklareras.
För fullständig deklaration, konfigurationsbitar och andra kodavsnitt, se hela koden nedan.