- Rotary Encoder en zijn typen
- KY-040 Rotary Encoder Pinout en beschrijving
- Hoe Rotary Encoder werkt
- Componenten vereist
- PIC16F877A Schakelschema voor interface met roterende encoder
- Code Uitleg
Een roterende encoder is een invoerapparaat dat de gebruiker helpt om met een systeem te communiceren. Het lijkt meer op een radiopotentiometer, maar het geeft een reeks pulsen af, wat de toepassing uniek maakt. Wanneer de knop van de encoder wordt gedraaid, draait deze in de vorm van kleine stapjes, waardoor deze kan worden gebruikt voor het regelen van de stappenmotor / servomotor, het navigeren door een reeks van het menu en het verhogen / verlagen van de waarde van een getal en nog veel meer.
In dit artikel leren we over de verschillende soorten roterende encoders en hoe deze werken. We zullen het ook koppelen met PIC Microcontroller PIC16F877A en de waarde van een geheel getal regelen door de encoder te draaien en de waarde ervan weer te geven op een 16 * 2 LCD-scherm. Aan het einde van deze tutorial zult u vertrouwd zijn met het gebruik van een Rotary Encoder voor uw projecten. Dus laten we beginnen…
Rotary Encoder en zijn typen
Roterende encoder, vaak een encoder genoemd. Het is een elektromechanische transducer, wat betekent dat het mechanische bewegingen omzet in elektronische pulsen of met andere woorden, het converteert hoekpositie of beweging of aspositie naar een digitaal of analoog signaal. Het bestaat uit een knop die, wanneer hij draait, stap voor stap beweegt en een reeks pulstreinen produceert met een vooraf gedefinieerde breedte voor elke stap.
Er zijn veel soorten roterende encoders op de markt, de ontwerper kan er een kiezen op basis van zijn toepassing. De meest voorkomende soorten staan hieronder vermeld
- Incrementele encoder
- Absolute encoder
- Magnetische encoder
- Optische encoder
- Laser-encoder
Deze encoders zijn geclassificeerd op basis van het uitgangssignaal en sensortechnologie, de incrementele encoder en absolute encoders zijn geclassificeerd op basis van het uitgangssignaal en de magnetische, optische en laserencoder zijn geclassificeerd op basis van sensortechnologie. De hier gebruikte encoder is een incrementele encoder.
Absolute encoder slaat de positie-informatie op, zelfs nadat de stroom is verwijderd, en de positie-informatie is beschikbaar wanneer we er weer stroom op zetten.
Het andere basistype, incrementele encoder, levert gegevens wanneer de encoder van positie verandert. Het kon de positie-informatie niet opslaan.
KY-040 Rotary Encoder Pinout en beschrijving
De pinouts van de KY-040 incrementele roterende encoder worden hieronder weergegeven. In dit project zullen we deze Rotary Encoder koppelen aan de populaire microcontroller PIC16F877A van microchip.
De eerste twee pinnen (aarde en Vcc) worden gebruikt om de encoder van stroom te voorzien, meestal wordt + 5V-voeding gebruikt. Behalve het draaien van de knop met de klok mee en tegen de klok in, heeft de encoder ook een schakelaar (actief laag) die kan worden ingedrukt door op de knop aan de binnenkant te drukken. Het signaal van deze schakelaar wordt verkregen via de pin 3 (SW). Ten slotte heeft het de twee uitgangspennen (DT en CLK) die de golfvormen produceren zoals hieronder al besproken. We hebben deze Rotary Encoder eerder gekoppeld aan Arduino.
Hoe Rotary Encoder werkt
De output is volledig afhankelijk van de interne koperen pads die de verbinding met GND en VCC met de as verzorgen.
Er zijn twee delen van de Rotary Encoder. Aswiel dat is verbonden met de as en met de klok mee of tegen de klok in draait, afhankelijk van de rotatie van de as en de basis waar de elektrische verbinding tot stand is gebracht. De basis heeft poorten of punten die op een zodanige manier met DT of CLK zijn verbonden dat wanneer het aswiel draait, het de basispunten verbindt en een blokgolf levert op zowel de DT- als de CLK-poort.
De output zal zijn zoals wanneer de as draait-
Twee poorten zorgen voor de blokgolf, maar er is een klein verschil in de timing. Daarom, als we de uitvoer accepteren als 1 en 0, kunnen er slechts vier standen zijn, 0 0, 1 0, 1 1, 0 1. De volgorde van de binaire uitvoer bepaalt de draai met de klok mee of tegen de klok in. Zoals, bijvoorbeeld, als de Rotary Encoder 1 0 levert in inactieve toestand en daarna 1 1 geeft, betekent dit dat de encoder zijn positie een enkele stap met de klok mee verandert, maar als hij 0 0 levert na de inactieve 1 0, betekent dat de as met één stap van positie verandert in tegenwijzerzin.
Componenten vereist
Het is de tijd om te bepalen wat we nodig hebben om de Rotary Encoder te koppelen aan PIC Microcontroller,
- PIC16F877A
- 4.7k weerstand
- 1k weerstand
- 10k pot
- 33pF keramische schijfcondensator - 2st
- 20Mhz kristal
- 16x2 scherm
- Roterende encoder
- 5V adapter.
- Broodplank
- Aansluitdraden.
PIC16F877A Schakelschema voor interface met roterende encoder
Hieronder ziet u de afbeelding van de uiteindelijke installatie na het aansluiten van de componenten volgens het schakelschema:
We hebben een enkele 1K-weerstand gebruikt voor het contrast van de LCD in plaats van een potentiometer. Bekijk ook de volledige werkende video aan het einde.
Code Uitleg
De volledige PIC-code wordt aan het einde van dit project gegeven met een demonstratievideo, hier leggen we enkele belangrijke delen van de code uit. Als u nieuw bent met PIC Microcontroller, volg dan onze PIC-tutorials vanaf het begin.
Zoals we eerder hebben besproken, moeten we de uitvoer controleren en de binaire uitvoer differentiëren voor zowel DT als CLK, dus hebben we een if-else- gedeelte voor de bewerking gemaakt.
if (Encoder_CLK! = positie) { if (Encoder_DT! = positie) { // lcd_com (0x01); tegen ++; // Verhoog de teller die wordt afgedrukt op de lcd lcd_com (0xC0); lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, teller); } else { // lcd_com (0x01); lcd_com (0xC0); teller--; // verlaag de teller lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, teller); // lcd_puts ("Links"); } }
We moeten ook de positie bij elke stap opslaan. Om dit te doen, hebben we een variabele 'positie' gebruikt die de huidige positie opslaat.
position = Encoder_CLK; // Het is om de klokpositie van de encoder op de variabele op te slaan. Kan 0 of 1 zijn.
Behalve dit is er een optie om op het LCD-scherm te informeren over het indrukken van een schakelaar.
if (Encoder_SW == 0) { sw_delayms (20); // debounce vertraging if (Encoder_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts ("schakelaar ingedrukt"); // itoa (teller, waarde, 10); // lcd_puts (waarde);
De system_init- functie wordt gebruikt om de pin I / O-bediening, het LCD-scherm te initialiseren en om de positie van de Rotary Encoder op te slaan.
void system_init () { TRISB = 0x00; // POORT B als uitvoer, deze poort wordt gebruikt voor LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // Hiermee wordt de LCD- positie geïnitialiseerd = Encoder_CLK; // Sotred de CLK-positie op systeeminitialisatie, voordat de while-lus start. }
De LCD-functie is geschreven in de lcd.c en lcd.h bibliotheek waar de lcd_puts (), lcd_cmd () worden gedeclareerd.
Voor de variabele declaratie, configuratiebits en andere codefragmenten, vindt u de volledige code hieronder.