Cuprins:

Decodor rotativ simplu: 4 pași
Decodor rotativ simplu: 4 pași

Video: Decodor rotativ simplu: 4 pași

Video: Decodor rotativ simplu: 4 pași
Video: Ce setări să faci la ROUTER WiFi sau 4G/5G - Cavaleria.ro 2024, Iulie
Anonim
Image
Image
Decodor rotativ simplu
Decodor rotativ simplu

Această instrucțiune descrie o metodă simplă de decodare a unui codificator rotativ secvențial folosind un Arduino Uno R3.

Rutinele software compacte sunt utilizate pentru a număra numărul de tranziții, a elimina săriturile de contact și a determina direcția de rotație. Nu sunt necesare componente suplimentare și tabele de căutare.

Sunt furnizate versiuni de întrerupere și fără întrerupere ale codului.

Versiunea de întrerupere a codului necesită doar un singur pin de întrerupere.

Imagini:

  • Fotografia de deschidere prezintă codificatorul asamblat.
  • Captura de ecran arată codul pentru versiunea de întrerupere și numărul când arborele codificatorului este rotit în sensul acelor de ceasornic și în sens invers acelor de ceasornic.
  • Videoclipul arată numărul în timpul rotației rapide.

Pasul 1: Diagrama circuitului

Diagrama circuitului
Diagrama circuitului

Schema de conectare a codificatorului este prezentată în fig.1.

Firele jumper sunt lipite direct la pinii codificatorului.

Schimbați cele două fire albastre dacă direcția de numărare este inversată.

Pasul 2: Lista pieselor

Următoarele părți au fost obținute de la

  • 1 numai Arduino UNO R3 cu cablu USB.
  • 1 numai codificator rotativ secvențial (EC11 sau echivalent) cu comutator.
  • 1 buton numai pentru a se potrivi arborelui.
  • 3 numai fire jumper Arduino de la bărbat la bărbat.

Pasul 3: Teorie

Teorie
Teorie

Codificatoarele rotative secvențiale generează două unde pătrate, fiecare dintre ele fiind deplasate cu 90 de grade, așa cum se arată în Fig.1.

Modelele logice la contactul A și contactul B sunt diferite atunci când arborele este rotit în sensul acelor de ceasornic (CW) și în sens invers acelor de ceasornic (CCW) prin pozițiile de la 1 la 6.

Metodele comune de determinare a direcției de rotație includ:

  • hardware
  • gemene întrerupe
  • tabele de căutare a modelelor

Acest proiect utilizează o metodă software care nu necesită tabele de căutare. [1]

Direcţie

În loc să ne uităm la modelele de ieșire de la contactul A și contactul B, să ne concentrăm asupra contactului A.

Dacă eșantionăm contactul B după fiecare tranziție a contactului A, observăm că:

  • Contactul A și Contactul B au stări logice opuse atunci când codificatorul este rotit CW
  • Contactul A și Contactul B au aceeași stare logică atunci când codificatorul este rotit CCW

Codul actual:

// ----- Numărați tranzițiile

CurrentStateA = stateContactA (); if (CurrentStateA! = LastStateA) {CurrentStateB = digitalRead (ContactB); if (CurrentStateA == CurrentStateB) Count ++; if (CurrentStateA! = CurrentStateB) Count--; LastStateA = CurrentStateA; }

Această metodă oferă următoarele avantaje:

  • tabelele de căutare nu sunt necesare
  • este necesară doar o singură linie de întrerupere

Debounce

Toate codificatoarele mecanice suferă de „sărituri de contact”.

Dacă un contact de comutare nu face / rupe curat starea sa logică va oscila rapid de la HIGH la LOW până când contactul switch-ului se instalează. Acest lucru duce la numărări false.

O metodă de suprimare a săriturilor de contact este să adăugați un condensator mic la fiecare contact de comutare. Condensatorul și rezistorul de tracțiune asociat formează un integrator care scurtcircuită în mod eficient frecvențele înalte și permite ca tensiunea comutatorului să crească / să cadă grațios.

Dezavantajul acestei abordări este că tranzițiile pot fi ratate dacă arborele codificatorului este rotit rapid.

Software Debouncing

Această metodă utilizează două contoare (Deschis, Închis) care au fost setate la zero. [2]

După detectarea unei tranziții la contactul A:

  • Sondaj continuu Contactați A.
  • Măriți contorul Deschis și resetați contorul Închis, ori de câte ori Contactul A este ÎNALT.
  • Măriți contorul Închis și resetați Contorul Deschis, ori de câte ori Contactul A este LOW.
  • Ieșiți din buclă când unul dintre contoare atinge un număr predeterminat. Căutăm efectiv perioada de echilibru care urmează oricărui salt de contact.

Codul real:

// ----- Contact de retragere A

while (1) {if (digitalRead (ContactA)) {// ----- ContactA este deschis închis = 0; // Integrator opus gol Open ++; // Integrare dacă (Open> MaxCount) returnează HIGH; } else {// ----- ContactA este închis deschis = 0; // Integrator opus gol Închis ++; // Integrare dacă (Închis> MaxCount) revine LOW; }}

Nu este nevoie să renunțați la contactul B, deoarece tranzițiile contactului A și contactului B nu coincid.

Socoteală

O „reținere” mecanică vă dublează efectiv numărul, deoarece se înregistrează două numărări între clicuri (vezi fig. 1).

Numărul de „rețele” poate fi determinat folosind modul aritmetic 2 așa cum se arată mai jos.

Codul real:

// ----- Numărați „rețelele”

if (Count% 2 == 0) {Serial.print ("Count:"); Serial.println (Count / 2); }

Referințe

Informații suplimentare pot fi găsite la:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Pasul 4: Software

Acest proiect necesită o versiune recentă a Ardino Uno R3 IDE (mediu de dezvoltare integrat) care este disponibil de la

Descărcați fiecare dintre următoarele două schițe Arduino (atașate)

  • rotary_encoder_1.ino (versiunea de votare)
  • rotary_encoder_2.no (versiune de întrerupere)

Faceți dublu clic pe versiunea preferată și urmați instrucțiunile de pe ecran.

Bucurați-vă de …

Faceți clic aici pentru a vedea celelalte instructabile ale mele.

Recomandat: