Innholdsfortegnelse:

Enkel roterende dekoder: 4 trinn
Enkel roterende dekoder: 4 trinn

Video: Enkel roterende dekoder: 4 trinn

Video: Enkel roterende dekoder: 4 trinn
Video: Schienenzeppelin alles was Du wissen kannst zum Märklin Modell des Schienenzeppelin 39777 in H0. 2024, Juli
Anonim
Image
Image
Enkel roterende dekoder
Enkel roterende dekoder

Denne instruksen beskriver en enkel metode for å dekode en sekvensiell roterende encoder ved hjelp av en Arduino Uno R3.

Kompakte programvarerutiner brukes til å telle antall overganger, eliminere kontaktstopp og bestemme rotasjonsretningen. Ytterligere komponenter og oppslagstabeller er ikke nødvendig.

Avbrudds- og ikke-avbruddsversjoner av koden er gitt.

Avbruddsversjonen av koden krever bare en enkelt avbruddsnål.

Bilder:

  • Åpningsbildet viser den monterte encoderen.
  • Skjermbildet viser koden for interrupt -versjonen og tellingen når encoder -akselen roteres med og mot klokken.
  • Videoen viser tellingen under rask rotasjon.

Trinn 1: Kretsdiagram

Kretsdiagram
Kretsdiagram

Koderens koblingsskjema er vist i fig.1.

Hoppetrådene er loddet direkte til koderne.

Bytt ut de to blå ledningene hvis telleretningen er omvendt.

Trinn 2: Deleliste

Følgende deler ble hentet fra

  • 1 bare Arduino UNO R3 med USB -kabel.
  • 1 bare sekvensiell roterende encoder (EC11 eller tilsvarende) med bryter.
  • 1 eneste ratt som passer til akselen.
  • 3 bare Arduino mann-til-mann-jumperledninger.

Trinn 3: Teori

Teori
Teori

Sekvensielle roterende kodere genererer to kvadratbølger som hver er forskjøvet 90 grader som vist på figur 1.

Logikkmønstrene ved kontakt A og kontakt B er forskjellige når akselen roteres med klokken (CW) og mot klokken (CCW) gjennom posisjonene 1 til 6.

Vanlige metoder for å bestemme rotasjonsretningen inkluderer:

  • maskinvare
  • tvilling avbryter
  • mønsteroppslagstabeller

Dette prosjektet bruker en programvaremetode som ikke krever oppslagstabeller. [1]

Retning

I stedet for å se på utskriftsmønstrene fra kontakt A og kontakt B, la oss fokusere på kontakt A.

Hvis vi prøver kontakt B etter hver kontakt A -overgang, merker vi at:

  • Kontakt A og kontakt B har motsatte logiske tilstander når koderen roteres CW
  • Kontakt A og kontakt B har samme logiske tilstand når koderen roteres motsatt

Faktisk kode:

// ----- Telle overganger

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

Denne metoden gir følgende fordeler:

  • oppslagstabeller er ikke nødvendig
  • bare en enkelt avbruddslinje kreves

Debounce

Alle mekaniske kodere lider av "kontaktstopp".

Hvis en bryterkontakt ikke gjør/bryter rent, vil dens logiske tilstand svinge raskt fra HØY til LAV til bryterkontakten setter seg. Dette resulterer i falske tellinger.

En metode for å undertrykke kontaktstopp er å legge til en liten kondensator på tvers av hver bryterkontakt. Kondensatoren og tilhørende pull-up-motstand danner en integrator som effektivt kortslutter høye frekvenser og lar bryterspenningen stige/falle grasiøst.

Ulempen med denne tilnærmingen er at overganger kan gå glipp av hvis koderakselen roteres raskt.

Debonnering av programvare

Denne metoden bruker to tellere (åpen, lukket) som er satt til null. [2]

Når en overgang er oppdaget på kontakt A:

  • Kontinuerlig avstemning Kontakt A.
  • Øk den åpne telleren, og tilbakestill den lukkede telleren når kontakt A er HØY.
  • Øk den lukkede telleren, og tilbakestill den åpne telleren når kontakt A er lav.
  • Gå ut av sløyfen når en av tellerne når et forhåndsbestemt antall. Vi leter effektivt etter steady state -perioden etter kontaktstopp.

Faktisk kode:

// ----- Avslutt kontakt A

mens (1) {if (digitalRead (ContactA)) {// ----- ContactA is Open Closed = 0; // Tom motsatt integrator Open ++; // Integrer hvis (Open> MaxCount) returnerer HIGH; } annet {// ----- ContactA is Closed Open = 0; // Tom motsatt integrator Closed ++; // Integrer hvis (Closed> MaxCount) returnerer LOW; }}

Det er ikke nødvendig å avbryte kontakt B, ettersom kontakt A- og kontakt B -overgangene ikke er sammenfallende.

Teller

En mekanisk "sperring" dobler effektivt tellingen din da to tellinger registreres mellom klikk (se fig 1).

Antall "sperrer" kan bestemmes ved bruk av modulo 2 -aritmetikk som vist nedenfor.

Faktisk kode:

// ----- Count "detents"

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

Referanser

Mer informasjon finner du på:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Trinn 4: Programvare

Dette prosjektet krever en ny versjon av Ardino Uno R3 IDE (integrert utviklingsmiljø) som er tilgjengelig fra

Last ned hver av de to følgende Arduino -skissene (vedlagt)

  • rotary_encoder_1.ino (avstemningsversjon)
  • rotary_encoder_2.no (avbryt versjon)

Dobbeltklikk på din foretrukne versjon og følg instruksjonene på skjermen.

Nyt …

Klikk her for å se mine andre instrukser.

Anbefalt: