Sommario:

Decodificatore rotativo semplice: 4 passaggi
Decodificatore rotativo semplice: 4 passaggi

Video: Decodificatore rotativo semplice: 4 passaggi

Video: Decodificatore rotativo semplice: 4 passaggi
Video: Utilizzare un encoder rotativo con Arduino #89 2024, Dicembre
Anonim
Image
Image
Decodificatore rotativo semplice
Decodificatore rotativo semplice

Questa istruzione descrive un metodo semplice per decodificare un encoder rotativo sequenziale utilizzando un Arduino Uno R3.

Le routine software compatte vengono utilizzate per contare il numero di transizioni, eliminare il rimbalzo dei contatti e determinare la direzione di rotazione. Non sono necessari componenti aggiuntivi e tabelle di ricerca.

Vengono fornite versioni con e senza interruzioni del codice.

La versione di interruzione del codice richiede solo un singolo pin di interruzione.

Immagini:

  • La foto di apertura mostra l'encoder assemblato.
  • La schermata mostra il codice per la versione di interrupt e il conteggio quando l'albero dell'encoder viene ruotato in senso orario e antiorario.
  • Il video mostra il conteggio durante la rotazione rapida.

Passaggio 1: Schema del circuito

Schema elettrico
Schema elettrico

Lo schema elettrico dell'encoder è mostrato in fig.1.

I fili dei ponticelli sono saldati direttamente ai pin dell'encoder.

Scambiare i due fili blu se la direzione di conteggio è invertita.

Passaggio 2: elenco delle parti

Le seguenti parti sono state ottenute da

  • 1 solo Arduino UNO R3 con cavo USB.
  • 1 solo encoder rotativo sequenziale (EC11 o equivalente) con interruttore.
  • 1 unica manopola per adattarsi all'albero.
  • 3 soli ponticelli Arduino maschio-maschio.

Passaggio 3: teoria

Teoria
Teoria

Gli encoder rotativi sequenziali generano due onde quadre ciascuna delle quali è spostata di 90 gradi come mostrato in Fig.1.

Gli schemi logici al contatto A e al contatto B sono diversi quando l'albero viene ruotato in senso orario (CW) e antiorario (CCW) attraverso le posizioni da 1 a 6.

I metodi comuni per determinare la direzione di rotazione includono:

  • hardware
  • interruzioni gemelle
  • tabelle di ricerca dei modelli

Questo progetto utilizza un metodo software che non richiede tabelle di ricerca. [1]

Direzione

Invece di esaminare i modelli di output del contatto A e del contatto B, concentriamoci sul contatto A.

Se campioniamo il contatto B dopo ogni transizione del contatto A, notiamo che:

  • Il contatto A e il contatto B hanno stati logici opposti quando l'encoder viene ruotato in senso orario
  • Il contatto A e il contatto B hanno lo stesso stato logico quando l'encoder viene ruotato in senso antiorario

Codice effettivo:

// ----- Conta le transizioni

StatoCorrenteA = statoContattoA(); if (CurrentStateA != LastStateA) { CurrentStateB = digitalRead(ContactB); if (StatoCorrenteA ==StatoCorrenteB) Conteggio++; if (CurrentStateA != CurrentStateB) Conteggio--; LastStateA = CurrentStateA; }

Questo metodo offre i seguenti vantaggi:

  • le tabelle di ricerca non sono necessarie
  • è necessaria solo una singola linea di interruzione

antirimbalzo

Tutti gli encoder meccanici soffrono di "rimbalzo del contatto".

Se un contatto dell'interruttore non si chiude/si interrompe in modo pulito, il suo stato logico oscillerà rapidamente da ALTO a BASSO finché il contatto dell'interruttore non si stabilizza. Ciò si traduce in conteggi falsi.

Un metodo per sopprimere il rimbalzo dei contatti consiste nell'aggiungere un piccolo condensatore su ciascun contatto dell'interruttore. Il condensatore e il resistore di pull-up associato formano un integratore che cortocircuita efficacemente le alte frequenze e consente alla tensione dell'interruttore di salire/scendere con grazia.

Lo svantaggio di questo approccio è che le transizioni possono essere perse se l'albero dell'encoder viene ruotato rapidamente.

Software antirimbalzo

Questo metodo utilizza due contatori (Aperto, Chiuso) che sono stati impostati a zero. [2]

Una volta rilevata una transizione sul contatto A:

  • Sondaggio continuo Contattare A.
  • Incrementa il contatore Aperto e resetta il contatore Chiuso, ogni volta che il Contatto A è ALTO.
  • Incrementa il contatore Chiuso e resetta il contatore Aperto, ogni volta che il Contatto A è BASSO.
  • Uscire dal ciclo quando uno dei contatori raggiunge un conteggio predeterminato. Stiamo effettivamente cercando il periodo di stato stazionario successivo a qualsiasi rimbalzo dei contatti.

Codice effettivo:

// ----- Antirimbalzo Contatto A

while (1) { if (digitalRead(ContactA)) { // ----- ContactA è Aperto Chiuso = 0; // Integratore opposto vuoto Open++; // Integra if (Open > MaxCount) return HIGH; } else { // ----- ContactA è Chiuso Aperto = 0; // Integratore opposto vuoto Closed++; // Integra if (Closed > MaxCount) return LOW; } }

Non è necessario eseguire l'antirimbalzo del contatto B poiché le transizioni del contatto A e del contatto B non coincidono.

Conteggio

Un "arresto" meccanico raddoppia efficacemente il conteggio poiché vengono registrati due conteggi tra i clic (vedi figura 1).

Il numero di "fermi" può essere determinato utilizzando l'aritmetica modulo 2 come mostrato di seguito.

Codice effettivo:

// ----- Conta i "fermi"

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

Riferimenti

Ulteriori informazioni possono essere trovate su:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Passaggio 4: software

Questo progetto richiede una versione recente dell'IDE Ardino Uno R3 (ambiente di sviluppo integrato) disponibile su

Scarica ciascuno dei seguenti due sketch Arduino (in allegato)

  • codificatore_rotativo_1.ino (versione polling)
  • rotary_encoder_2.no (versione con interrupt)

Fare doppio clic sulla versione preferita e seguire le istruzioni sullo schermo.

Godere …

Fai clic qui per visualizzare gli altri miei istruttori.

Consigliato: