Sisällysluettelo:

Yksinkertainen pyörivä dekooderi: 4 vaihetta
Yksinkertainen pyörivä dekooderi: 4 vaihetta

Video: Yksinkertainen pyörivä dekooderi: 4 vaihetta

Video: Yksinkertainen pyörivä dekooderi: 4 vaihetta
Video: HUGE Model Train Unboxing (Thank You @mmwanderings3147 ) 2024, Heinäkuu
Anonim
Image
Image
Yksinkertainen pyörivä dekooderi
Yksinkertainen pyörivä dekooderi

Tässä ohjeessa kuvataan yksinkertainen menetelmä peräkkäisen pyörivän kooderin dekoodaamiseksi Arduino Uno R3: lla.

Pieniä ohjelmistorutiineja käytetään siirtymien lukumäärän laskemiseen, kosketuksen poistumisen poistamiseen ja pyörimissuunnan määrittämiseen. Lisäkomponentteja ja hakutaulukoita ei tarvita.

Koodista on saatavana keskeytys- ja keskeytymättömät versiot.

Koodin keskeytysversio vaatii vain yhden keskeytysnastan.

Kuvat:

  • Avauskuvassa näkyy koottu anturi.
  • Kuvakaappaus näyttää keskeytysversion koodin ja laskurin, kun anturin akselia pyöritetään myötä- ja vastapäivään.
  • Videossa näkyy lasku nopean pyörimisen aikana.

Vaihe 1: Piirikaavio

Piirikaavio
Piirikaavio

Anturin kytkentäkaavio on esitetty kuvassa 1.

Hyppyjohdot on juotettu suoraan anturin nastoihin.

Vaihda kaksi sinistä johtoa, jos laskusuunta on päinvastainen.

Vaihe 2: Osaluettelo

Seuraavat osat on hankittu osoitteesta

  • 1 vain Arduino UNO R3 USB -kaapelilla.
  • 1 vain peräkkäinen pyörivä anturi (EC11 tai vastaava) kytkimellä.
  • 1 vain akselille sopiva nuppi.
  • 3 vain Arduinon uros-uros-hyppyjohdinta.

Vaihe 3: Teoria

Teoria
Teoria

Peräkkäiset pyörivät enkooderit tuottavat kaksi neliöaaltoa, joista kukin siirtyy 90 astetta, kuten kuvassa 1 on esitetty.

Logiikkamallit koskettimessa A ja koskettimessa B ovat erilaisia, kun akselia pyöritetään myötäpäivään (CW) ja vastapäivään (CCW) asentojen 1-6 kautta.

Yleisiä menetelmiä pyörimissuunnan määrittämiseksi ovat:

  • laitteisto
  • kaksois keskeyttää
  • kuvion hakutaulukot

Tämä projekti käyttää ohjelmistomenetelmää, joka ei vaadi hakutaulukoita. [1]

Suunta

Sen sijaan, että katsot kontaktin A ja kontaktin B tulostusmalleja, keskitytään yhteystietoon A.

Jos otamme kontaktin B näytteen jokaisen A -kontaktin siirtymisen jälkeen, huomaamme, että:

  • Koskettimella A ja koskettimella B on päinvastaiset logiikkatilat, kun anturia käännetään CW
  • Koskettimella A ja koskettimella B on sama logiikkatila, kun anturia käännetään CCW

Todellinen koodi:

// ----- Laske siirtymät

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

Tällä menetelmällä on seuraavat edut:

  • hakutaulukoita ei tarvita
  • tarvitaan vain yksi keskeytyslinja

Pudota

Kaikki mekaaniset enkooderit kärsivät "kosketuksen pomppimisesta".

Jos kytkinkosketin ei tee/rikkoudu puhtaasti, sen logiikkatila värähtelee nopeasti HIGH: sta LOW: iin, kunnes kytkinkosketin asettuu. Tämä johtaa vääriin laskelmiin.

Yksi tapa estää kontaktin pomppiminen on lisätä pieni kondensaattori jokaisen kytkinkoskettimen väliin. Kondensaattori ja siihen liittyvä vetovastus muodostavat integraattorin, joka oikosulkee tehokkaasti korkeat taajuudet ja mahdollistaa kytkimen jännitteen nousun/laskun.

Tämän lähestymistavan haittapuoli on, että siirtymät voivat jäädä väliin, jos anturin akselia pyöritetään nopeasti.

Ohjelmiston purkaminen

Tämä menetelmä käyttää kahta laskuria (avoin, suljettu), jotka on asetettu nollaan. [2]

Kun yhteys A on havainnut siirtymän:

  • Jatkuva kysely Ota yhteyttä A.
  • Nosta auki -laskuria ja nollaa suljettu laskuri aina, kun kosketin A on KORKEA.
  • Suurenna Suljettu -laskuria ja nollaa Avaa -laskuri aina, kun kosketin A on MATALA.
  • Poistu silmukasta, kun yksi laskureista saavuttaa ennalta määrätyn määrän. Etsimme tehokkaasti vakaan tilan ajanjaksoa kontaktien poistumisen jälkeen.

Todellinen koodi:

// ----- Kytkentäyhteys A

while (1) {if (digitalRead (ContactA)) {// ----- ContactA is Open Closed = 0; // Tyhjä vastakkainen integraattori Open ++; // Integroi, jos (Avaa> MaxCount) palaa HIGH; } else {// ----- ContactA is Closed Open = 0; // Tyhjä vastakkainen integraattori Suljettu ++; // Integroi, jos (Suljettu> MaxCount) palaa LOW; }}

Ei tarvitse purkaa kontaktia B, koska yhteydet A ja B siirtyvät toisiinsa.

Laskenta

Mekaaninen "pidätin" kaksinkertaistaa laskusi, koska napsautusten väliin rekisteröidään kaksi lukua (katso kuva 1).

”Pysäytysten” määrä voidaan määrittää käyttämällä modulo 2: n aritmeettista menetelmää, kuten alla on esitetty.

Todellinen koodi:

// ----- Laske "pidätykset"

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

Viitteet

Lisätietoja löytyy osoitteesta:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Vaihe 4: Ohjelmisto

Tämä projekti vaatii viimeisimmän version Ardino Uno R3 IDE: stä (integroitu kehitysympäristö), joka on saatavilla osoitteesta

Lataa seuraavat kaksi Arduino -luonnosta (liitteenä)

  • rotary_encoder_1.ino (äänestysversio)
  • rotary_encoder_2.no (keskeytysversio)

Kaksoisnapsauta haluamaasi versiota ja noudata näytön ohjeita.

Nauttia …

Napsauta tätä nähdäksesi muut ohjeeni.

Suositeltava: