- Codificador rotatiu i els seus tipus
- Piny i descripció del codificador rotatiu KY-040
- Com funciona el codificador rotatiu
- Components necessaris
- PIC16F877A Diagrama de circuits d’interfície del codificador rotatiu
- Explicació del codi
Un codificador rotatiu és un dispositiu d’entrada que ajuda l’usuari a interactuar amb un sistema. Sembla més aviat un radiopotòmetre, però genera un tren de pulsacions que fa que la seva aplicació sigui única. Quan es gira el comandament del codificador, gira en forma de petits passos, cosa que ajuda a utilitzar-lo per controlar el pas a pas / servomotor, navegar per una seqüència del menú i augmentar / disminuir el valor d’un nombre i molt més.
En aquest article, coneixerem els diferents tipus de codificadors rotatius i el seu funcionament. També el connectarem amb el microcontrolador PIC PIC16F877A i controlarem el valor d’un enter girant el codificador i mostrarem el seu valor en una pantalla LCD de 16 * 2. Al final d'aquest tutorial, us sentireu còmode utilitzant un codificador rotatiu per als vostres projectes. Comencem doncs…
Codificador rotatiu i els seus tipus
El codificador rotatiu sovint s’anomena codificador d’eix. És un transductor electromecànic, és a dir, converteix els moviments mecànics en polsos electrònics o, en altres paraules, converteix la posició angular o el moviment o la posició de l’eix en un senyal digital o analògic. Consisteix en un pom que quan gira es mourà pas a pas i produirà una seqüència de trens d’impulsos amb amplada predefinida per a cada pas.
Hi ha molts tipus de codificador rotatiu al mercat, el dissenyador pot triar-ne un segons la seva aplicació. A continuació s’enumeren els tipus més habituals
- Codificador incremental
- Codificador absolut
- Codificador magnètic
- Codificador òptic
- Codificador làser
Aquests codificadors es classifiquen en funció de la tecnologia de detecció i senyal de sortida, el codificador incremental i els codificadors absoluts es classifiquen en funció del senyal de sortida i el codificador magnètic, òptic i làser es basa en la tecnologia de detecció. El codificador utilitzat aquí és un codificador de tipus incremental.
El codificador absolut emmagatzema la informació de posició fins i tot després de treure l'alimentació, i la informació de posició estarà disponible quan li tornem a aplicar alimentació.
L'altre tipus bàsic, el codificador incremental, proporciona dades quan el codificador canvia la seva posició. No s'ha pogut emmagatzemar la informació de posició.
Piny i descripció del codificador rotatiu KY-040
A continuació es mostren els pinouts del codificador rotatiu de tipus incremental KY-040. En aquest projecte, relacionarem aquest codificador rotatiu amb el popular microcontrolador PIC16F877A del microxip.

Els dos primers pins (Ground i Vcc) s’utilitzen per alimentar el codificador, normalment s’utilitza una font de + 5V. A part de girar el comandament en sentit antihorari i horari, el codificador també té un interruptor (Actiu baix) que es pot prémer prement el comandament interior. El senyal d’aquest commutador s’obté a través del pin 3 (SW). Finalment, té els dos pins de sortida (DT i CLK) que produeixen les formes d'ona, com ja s'ha comentat a continuació. Anteriorment hem interfocat aquest codificador rotatiu amb Arduino.
Com funciona el codificador rotatiu
La sortida depèn completament de les coixinetes de coure internes que proporcionen la connexió amb GND i VCC amb l’eix.

Hi ha dues parts del codificador rotatiu. Roda de l’eix que es connecta amb l’eix i gira en sentit horari o antihorari en funció de la rotació de l’eix i de la base on es realitza la connexió elèctrica. La base té ports o punts connectats a DT o CLK de manera que quan gira la roda de l’eix connectarà els punts base i proporcionarà una ona quadrada tant al port DT com a CLK.
La sortida serà com quan l’eix gira-

Dos ports proporcionen l'ona quadrada, però hi ha una lleugera diferència en el moment. Per això, si acceptem la sortida com a 1 i 0, només hi pot haver quatre estats, 0 0, 1 0, 1 1, 0 1. La seqüència de la sortida binària determina el gir en sentit horari o antihorari. Igual que, per exemple, si el codificador rotatiu proporciona 1 0 en estat inactiu i proporciona 1 1 després d'això, això significa que el codificador canvia la seva posició un sol pas en sentit horari, però si proporciona 0 0 després del ralentí 0 significa que l’eix canvia les seves posicions en sentit antihorari amb un pas.
Components necessaris
És el moment d’identificar el que necessitem per a la interfície del codificador rotatiu amb el microcontrolador PIC,
- PIC16F877A
- Resistència de 4,7 k
- 1k resistència
- Olla de 10k
- Condensador de disc ceràmic de 33pF - 2 unitats
- Cristall de 20Mhz
- Pantalla de 16 x 2
- Codificador rotatiu
- Adaptador de 5 V.
- Taula de pa
- Filferros de connexió.
PIC16F877A Diagrama de circuits d’interfície del codificador rotatiu

A continuació es mostra la imatge de la configuració final després de connectar els components segons el diagrama del circuit:


Hem utilitzat una sola resistència de 1 K per al contrast de la pantalla LCD en lloc d’utilitzar un potenciòmetre. A més, consulteu el vídeo de treball complet que es dóna al final.
Explicació del codi
El codi PIC complet es dóna al final d’aquest projecte amb un vídeo de demostració, aquí expliquem algunes parts importants del codi. Si sou nou amb el microcontrolador PIC, seguiu els nostres tutorials PIC des del principi.
Com hem comentat abans, hem de comprovar la sortida i diferenciar la sortida binària tant per DT com per CLK, de manera que hem creat una part if-else per a l'operació.
if (Codificador_CLK! = posició) { if (Codificador_DT! = posició) { // lcd_com (0x01); comptador ++; // Augmenteu el comptador que s’imprimirà al lcd lcd_com (0xC0); lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, comptador); } else { // lcd_com (0x01); lcd_com (0xC0); comptador--; // disminueix el comptador lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, comptador); // lcd_puts ("Esquerra"); } }
També hem d’ emmagatzemar la posició a cada pas. Per fer-ho, hem utilitzat una "posició" variable que emmagatzema la posició actual.
posició = Codificador_CLK; // És emmagatzemar la posició del rellotge del codificador a la variable. Pot ser 0 o 1.
A part d'això, s'ofereix una opció per notificar sobre la commutació de la pantalla LCD.
if (Codificador_SW == 0) { sw_delayms (20); // retard de rebuda si (Codificador_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts ("commutador premut"); // itoa (comptador, valor, 10); // lcd_puts (valor);
La funció system_init s'utilitza per inicialitzar l'operació d'E / S del pin, la pantalla LCD i per emmagatzemar la posició del codificador rotatiu.
void system_init () { TRISB = 0x00; // PORT B com a sortida, aquest port s'utilitza per a LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // Això inicialitzarà la posició LCD = Encoder_CLK; // Sotred la posició CLK a l'inici del sistema, abans de l'inici del bucle while. }
La funció LCD s’escriu a la biblioteca lcd.c i lcd.h on es declaren lcd_puts (), lcd_cmd ().
Per a la declaració de variables, els bits de configuració i altres fragments de codi, trobeu el codi complet a continuació.
