Taula de continguts:

Descodificador rotatiu simple: 4 passos
Descodificador rotatiu simple: 4 passos

Vídeo: Descodificador rotatiu simple: 4 passos

Vídeo: Descodificador rotatiu simple: 4 passos
Vídeo: ТЫ СЕРЬЁЗНО СДЕЛАЛ ЭТО САМ? Да, без станков, только болгаркой и дрелью! 2024, De novembre
Anonim
Image
Image
Descodificador rotatiu senzill
Descodificador rotatiu senzill

Aquesta instrucció descriu un mètode senzill de descodificació d’un codificador rotatiu seqüencial mitjançant un Arduino Uno R3.

Les rutines de programari compactes s’utilitzen per comptar el nombre de transicions, eliminar el rebot de contacte i determinar el sentit de rotació. No es requereixen components addicionals ni taules de cerca.

Es proporcionen versions d'interrupció i sense interrupció del codi.

La versió d'interrupció del codi només requereix un sol pin d'interrupció.

Imatges:

  • La foto inicial mostra el codificador muntat.
  • La captura de pantalla mostra el codi de la versió d’interrupció i el recompte quan l’eix del codificador gira en sentit horari i contrari.
  • El vídeo mostra el recompte durant la rotació ràpida.

Pas 1: diagrama del circuit

Esquema de connexions
Esquema de connexions

El diagrama de cablejat del codificador es mostra a la figura 1.

Els cables del pont es solden directament als pins del codificador.

Intercanvieu els dos cables blaus si s’inverteix la direcció del recompte.

Pas 2: llista de peces

Les següents parts es van obtenir a

  • 1 només Arduino UNO R3 amb cable USB.
  • 1 només codificador rotatiu seqüencial (EC11 o equivalent) amb commutador.
  • 1 únic pom per adaptar-se a l'eix.
  • 3 només cables jumper Arduino entre homes.

Pas 3: teoria

Teoria
Teoria

Els codificadors rotatius seqüencials generen dues ones quadrades cada una de les quals es desplacen 90 graus, tal com es mostra a la figura 1.

Els patrons lògics del contacte A i el contacte B són diferents quan l’eix es gira en sentit horari (CW) i en sentit antihorari (CCW) a través de les posicions 1 a 6.

Els mètodes habituals per determinar el sentit de gir inclouen:

  • maquinari
  • bessons interromp
  • taules de cerca de patrons

Aquest projecte utilitza un mètode de programari que no requereix taules de cerca. [1]

Direcció

En lloc de mirar els patrons de sortida del contacte A i del contacte B, centrem-nos en el contacte A.

Si mostrem el contacte B després de cada transició del contacte A, observem que:

  • El contacte A i el contacte B tenen estats lògics oposats quan el codificador gira CW
  • El contacte A i el contacte B tenen el mateix estat lògic quan es gira el codificador CCW

Codi real:

// ----- Compta les transicions

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

Aquest mètode ofereix els següents avantatges:

  • les taules de cerca no són necessàries
  • només es requereix una única línia d’interrupció

Rebounce

Tots els codificadors mecànics pateixen "rebots de contacte".

Si un contacte de commutador no fa / es trenca netament, el seu estat lògic oscil·larà ràpidament de HIGH a LOW fins que el contacte de commutador es resolgui. Això es tradueix en recompte fals.

Un mètode per suprimir el rebot de contacte és afegir un condensador petit a cada contacte de commutació. El condensador i la resistència de tracció associada formen un integrador que eficaçment fa curtes freqüències i permet que la tensió del commutador pugi / baixi amb gràcia.

L’inconvenient d’aquest enfocament és que es poden perdre transicions si l’eix del codificador gira ràpidament.

Desinformació de programari

Aquest mètode utilitza dos comptadors (oberts, tancats) que s'han establert a zero. [2]

Un cop detectada una transició al contacte A:

  • Enquesta contínua Contacte amb A.
  • Incrementeu el comptador obert i restabliu el comptador tancat sempre que el contacte A sigui ALT.
  • Incrementeu el comptador tancat i restabliu el comptador obert sempre que el contacte A sigui BAIX.
  • Sortiu del bucle quan un dels comptadors arriba a un recompte predeterminat. Estem buscant efectivament el període d’equilibri després de qualsevol rebot de contacte.

Codi real:

// ----- Debounce Contact A

while (1) {if (digitalRead (ContactA)) {// ----- ContactA està obert tancat = 0; // Integrador buit oposat Open ++; // Integrar si (Obre> Nombre màxim) retorna ALTA; } else {// ----- ContactA està tancat obert = 0; // Integrador oposat buit Tancat ++; // Integrar si (Tancat> Nombre màxim) torna BAIX; }}

No cal rebutjar el contacte B, ja que les transicions del contacte A i del contacte B no coincideixen.

Comptant

Una “retenció” mecànica duplica efectivament el recompte ja que es registren dos recompte entre clics (vegeu la figura 1).

El nombre de "retencions" es pot determinar mitjançant l'aritmètica del mòdul 2, tal com es mostra a continuació.

Codi real:

// ----- Compta les "retencions"

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

Referències

Podeu trobar més informació a:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Pas 4: programari

Aquest projecte requereix una versió recent de l’Ardino Uno R3 IDE (entorn de desenvolupament integrat) que està disponible a

Descarregueu cadascun dels dos esbossos Arduino següents (adjunt)

  • rotary_encoder_1.ino (versió de votació)
  • rotary_encoder_2.no (versió d'interrupció)

Feu doble clic a la versió que preferiu i seguiu les instruccions que apareixen a la pantalla.

Gaudeix …

Feu clic aquí per veure les meves altres instruccions.

Recomanat: