Sunteți pe pagina 1din 5

Encoder rotatv

Un encoder rotativ este un tip de senzor de poziție care este utilizat pentru determinarea
poziției unghiulare a unui arbore rotativ. (Figura1)
Un astfel de senzor ne-a fost dat și nouă pentru a implementa un program care să afișeze
câte rotații s-au efectuat și în ce sens, iar butonul din mjloc nu face altceva decât să rezeteze
contorul care memorează numărul de rotații la 0. În continuare vom prezenta pe scurt principiul
de funcționare.

Figura.1 Encoder rotativ

Acest senzor generează un semnal electric, analog sau digital, în funcție de mișcarea de
rotație. Există multe tipuri diferite de codificatoare rotative care sunt clasificate fie prin semnalul
de ieșire, fie prin tehnologia de detectare.
In cadrul acestui proiect folosim un codificator rotativ incremental fiind este cel mai simplu
senzor de poziție folosit pentru a măsura rotația. Acest codificator rotativ este cunoscut și sub
denumirea de codificator în cvadratură sau codificator rotativ relativ, iar ieșirea sa este o serie
de impulsuri de undă pătrată.(Figura.2)
Figura.2 Iesire encoder

Modul de functionare a unui encoder rotativ

In Figura.3 este prezentat modul de generare a impulsurilor dreptunghiulare.

Figura.3 Generare impulsuri dreptunghiulare

Din Figura.3 se poate observa cum Encoderul are un disc cu zone de contact distanțate
uniform, care sunt conectate la pinul comun C și alți doi pini de contact A și B.
Când discul va începe să se rotească pas cu pas, pinii A și B vor începe să ia contact cu pinul
comun și cele două semnale de ieșire cu formă de undă pătrată vor fi generate în consecință.
Oricare dintre cele două ieșiri poate fi folosită pentru determinarea poziției rotiței dacă număram
doar impulsurile semnalului.
Cu toate acestea, dacă dorim să determinăm și direcția de rotație, trebuie să luăm în
considerare ambele semnale în același timp. Putem observa că cele două semnale de ieșire sunt
deplasate cu 90 de grade în faza una de alta. Dacă codificatorul se rotește în sensul acelor de
ceasornic, ieșirea A va fi înaintea ieșirii B.
Figura.4

Deci, dacă numărăm pașii de fiecare dată când semnalul se schimbă, de la High la Low sau de
la Low la High, putem observa la acel moment că cele două semnale de ieșire au valori opuse.
Invers, dacă codificatorul se rotește în sens orar, semnalele de ieșire au valori egale. Deci, având
în vedere acest lucru, putem programa cu ușurință controlerul nostru pentru a citi poziția
codificatorului și direcția de rotație.

Implementare practica

In carul montajului practic am folosit un modul care are cinci pini. Primul pin este ieșirea A,
al doilea pin este ieșirea B, al treilea pin este pinul Buton și desigur ceilalți doi pini sunt VCC și
pinul GND.

Explicare cod
Prima data am definit pinii la care este conectat codificatorul nostru și am definit unele
variabile necesare programului. În secțiunea de configurare trebuie să definim cei trei pini ca
intrări, să începem comunicarea serială pentru imprimarea rezultatelor pe monitorul serial, precum
și să citim valoarea inițială a ieșirii A și să introducem valoarea în variabila aLastState.
Apoi în secțiunea buclă citim din nou ieșirea A, dar acum introducem valoarea în variabila
aState. Deci, dacă rotim codificatorul și se generează un impuls, aceste două valori vor diferi și
prima afirmație „dacă” va deveni adevărată. Imediat după aceea, folosind a doua afirmație „if”, și
determinăm direcția de rotație. Dacă starea B de ieșire diferă de ieșirea A, starea contorului va fi
mărită cu una, altfel va fi redusă.
La final, după tipărirea rezultatelor pe monitorul serial, trebuie să actualizăm variabila
aLastState cu o variabilă aState. Este tot ce avem nevoie pentru acest exemplu. După ce am încărcat
codul, am porint Serial Monitor și am încput să efectuăm rotații, am obținut valorile în monitorul
serial.
CODUL SURSĂ:

/* ENCODER ROTATIV
* UTILIZAREA SEMNALELOR A SI B
*
* OLTEANU MIRELA
* DUNCA (ILIES) ALINA
* COCA OCTAVIAN
*/
#define outputA 6
#define outputB 7
#define pushButton 5
int counter = 0;
int aState;
int aLastState;
int buttonState;
void setup() {
pinMode (outputA, INPUT);
pinMode (outputB, INPUT);
pinMode (pushButton, INPUT);

Serial.begin (9600);
// Citim starea A inainte sa intram in bucla
aLastState = digitalRead(outputA);
}
void loop() {
aState = digitalRead(outputA); // Citim starea A curenta
buttonState = digitalRead(pushButton);
if (buttonState == LOW ) { // Resetam daca butonul e apasat (fara debouncing)
counter = 0;
}

// Asteptam o schimbare de stare a lui A


if (aState != aLastState) {
// Daca B != A, inseamna ca avem un pas de rotatie CW si incrementam counterul
if (digitalRead(outputB) != aState) {
counter ++;
} else {
counter --;
}
Serial.print("NR. de rotatii: ");
Serial.println(counter);
//Serial.println(buttonState);
}
aLastState = aState; /// Starea curenta devine starea anterioara pentur urmatoarea iteratie
}
MONTAJ EXPERIMENTAL

S-ar putea să vă placă și