Indholdsfortegnelse:

Enkel roterende dekoder: 4 trin
Enkel roterende dekoder: 4 trin

Video: Enkel roterende dekoder: 4 trin

Video: Enkel roterende dekoder: 4 trin
Video: Необычный 4 тактный двигатель - БЕЗ КЛАПАНОВ гильза вращается Что за зверь такой ??? 2024, Juli
Anonim
Image
Image
Enkel roterende dekoder
Enkel roterende dekoder

Denne instruerbare beskriver en enkel metode til afkodning af en sekventiel roterende encoder ved hjælp af en Arduino Uno R3.

Kompakte softwarerutiner bruges til at tælle antallet af overgange, eliminere kontaktpresning og bestemme rotationsretningen. Yderligere komponenter og opslagstabeller er ikke påkrævet.

Afbrudte og ikke-afbrydende versioner af koden leveres.

Afbrydelsesversionen af koden kræver kun en enkelt afbrydelsesnål.

Billeder:

  • Åbningsfotoet viser den samlede encoder.
  • Skærmbilledet viser koden for interrupt -versionen og tællingen, når encoderakslen drejes med og mod uret.
  • Videoen viser optællingen under hurtig rotation.

Trin 1: Kredsløbsdiagram

Kredsløbsdiagram
Kredsløbsdiagram

Koderens ledningsdiagram er vist i fig.1.

Jumpertrådene er loddet direkte til encoderboltene.

Skift de to blå ledninger, hvis tælleretningen er omvendt.

Trin 2: Deleliste

Følgende dele blev hentet fra

  • 1 kun Arduino UNO R3 med USB -kabel.
  • 1 kun sekventiel roterende encoder (EC11 eller tilsvarende) med switch.
  • 1 drejeknap, der passer til akslen.
  • 3 kun Arduino han-til-han trøjer.

Trin 3: Teori

Teori
Teori

Sekventielle roterende encodere genererer to firkantbølger, der hver er forskudt 90 grader som vist i figur 1.

Logikmønstrene ved kontakt A og kontakt B er forskellige, når akslen drejes med uret (CW) og mod uret (CCW) gennem position 1 til 6.

Almindelige metoder til at bestemme rotationsretningen omfatter:

  • hardware
  • tvilling afbryder
  • opslagstabeller med mønster

Dette projekt bruger en softwaremetode, der ikke kræver opslagstabeller. [1]

Retning

I stedet for at se på outputmønstrene fra kontakt A og kontakt B lad os fokusere på kontakt A.

Hvis vi prøver kontakt B efter hver kontakt A -overgang, bemærker vi, at:

  • Kontakt A og kontakt B har modsatte logiske tilstande, når encoderen drejes CW
  • Kontakt A og kontakt B har den samme logiske tilstand, når encoderen drejes CCW

Faktisk kode:

// ----- Tæl overgange

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

Denne metode giver følgende fordele:

  • opslagstabeller er ikke påkrævet
  • kun en enkelt afbrydelseslinje er påkrævet

Afkald

Alle mekaniske encodere lider af "kontakt -bounce".

Hvis en kontaktkontakt ikke gør/bryder rent, vil dens logiske tilstand svinge hurtigt fra HIGH til LOW, indtil switchkontakten sætter sig. Dette resulterer i falske tal.

En metode til at undertrykke kontaktpresning er at tilføje en lille kondensator på tværs af hver kontaktkontakt. Kondensatoren og tilhørende pull-up-modstand danner en integrator, der effektivt kortslutter høje frekvenser og tillader switch-spændingen at stige/falde yndefuldt.

Ulempen ved denne tilgang er, at overgange kan gå glip af, hvis encoderakslen roteres hurtigt.

Software -debouncing

Denne metode anvender to tællere (åben, lukket), der er sat til nul. [2]

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

  • Kontinuerlig afstemning Kontakt A.
  • Forøg den åbne tæller, og nulstil den lukkede tæller, når kontakt A er HØJ.
  • Forøg den lukkede tæller, og nulstil den åbne tæller, når kontakt A er lav.
  • Afslut sløjfen, når en af tællerne når et forudbestemt antal. Vi leder effektivt efter steady state -perioden efter enhver kontaktpresning.

Faktisk kode:

// ----- Afbryd kontakt A

mens (1) {if (digitalRead (ContactA)) {// ----- KontaktA er åben lukket = 0; // Tom modsat integrator Open ++; // Integrer hvis (Åbn> MaxCount) returnerer HIGH; } ellers {// ----- KontaktA er lukket åben = 0; // Tom modsat integrator Lukket ++; // Integrer hvis (Closed> MaxCount) returnerer LOW; }}

Det er ikke nødvendigt at afbinde kontakt B, da kontakt A- og kontakt B -overgangene ikke falder sammen.

Tæller

En mekanisk "tilbageholdelse" fordobler effektivt din optælling, da to tællinger registreres mellem klik (se fig 1).

Antallet af "spærre" kan bestemmes ved hjælp af modulo 2 -aritmetik som vist nedenfor.

Faktisk kode:

// ----- Tæl "tilbageholdelser"

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

Referencer

Yderligere oplysninger kan findes på:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Trin 4: Software

Dette projekt kræver en nylig version af Ardino Uno R3 IDE (integreret udviklingsmiljø), som er tilgængelig fra

Download hver af de følgende to Arduino -skitser (vedhæftet)

  • rotary_encoder_1.ino (polling version)
  • rotary_encoder_2.no (afbryd version)

Dobbeltklik på din foretrukne version, og følg vejledningen på skærmen.

God fornøjelse …

Klik her for at se mine andre instruktioner.

Anbefalede: