Sisällysluettelo:
Video: Yksinkertainen pyörivä dekooderi: 4 vaihetta
2025 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2025-01-13 06:57
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
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
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.