Sadržaj:

Jednostavan rotacijski dekoder: 4 koraka
Jednostavan rotacijski dekoder: 4 koraka

Video: Jednostavan rotacijski dekoder: 4 koraka

Video: Jednostavan rotacijski dekoder: 4 koraka
Video: Самая мощная антенна в мире! Подключи телевизор и смотри все каналы МИРА 2024, Srpanj
Anonim
Image
Image
Jednostavan rotacijski dekoder
Jednostavan rotacijski dekoder

Ova uputa opisuje jednostavnu metodu dekodiranja sekvencijalnog rotacijskog kodera pomoću Arduino Uno R3.

Kompaktne softverske rutine koriste se za brojanje broja prijelaza, uklanjanje odbijanja kontakta i određivanje smjera rotacije. Dodatne komponente i tablice za pretraživanje nisu potrebne.

Dostupne su verzije koda s prekidom i bez prekida.

Verzija koda za prekid zahtijeva samo jedan pin prekida.

Slike:

  • Fotografija na početku prikazuje sklopljeni enkoder.
  • Snimka zaslona prikazuje kôd za verziju prekida i broj kada se vratilo davača okreće u smjeru kazaljke na satu i u suprotnom smjeru.
  • Videozapis prikazuje brojanje tijekom brze rotacije.

Korak 1: Dijagram kruga

Kružni dijagram
Kružni dijagram

Shema ožičenja davača prikazana je na sl.1.

Žice kratkospojnika lemljene su izravno na pinove davača.

Zamijenite dvije plave žice ako je smjer brojanja obrnut.

Korak 2: Popis dijelova

Sljedeći dijelovi su nabavljeni sa

  • 1 samo Arduino UNO R3 s USB kabelom.
  • 1 samo sekvencijalni rotacijski davač (EC11 ili ekvivalent) s prekidačem.
  • 1 samo gumb za prilagođavanje osovine.
  • 3 samo Arduino spojne žice za muškarce.

Korak 3: Teorija

Teorija
Teorija

Sekvencijalni rotacijski enkoderi generiraju dva kvadratna vala od kojih je svaki pomaknut za 90 stupnjeva kako je prikazano na slici 1.

Logički obrasci na kontaktu A i kontaktu B različiti su kada se vratilo okreće u smjeru kazaljke na satu (CW) i suprotno od smjera kazaljke na satu (CCW) kroz položaje 1 do 6.

Uobičajene metode određivanja smjera rotacije uključuju:

  • hardver
  • blizanac prekida
  • tablice za traženje uzoraka

Ovaj projekt koristi softversku metodu koja ne zahtijeva tablice za pretraživanje. [1]

Smjer

Umjesto da gledamo izlazne obrasce iz kontakta A i kontakta B, fokusirajmo se na kontakt A.

Ako uzorkujemo kontakt B nakon svakog prijelaza kontakta A, primjećujemo da:

  • Kontakt A i Kontakt B imaju suprotna logička stanja kada se davač okreće CW
  • Kontakt A i Kontakt B imaju isto logičko stanje kada se davač okreće CCW

Stvarni kod:

// ----- Brojanje prijelaza

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

Ova metoda nudi sljedeće prednosti:

  • tablice za pretraživanje nisu potrebne
  • potrebna je samo jedna linija prekida

Debounce

Svi mehanički enkoderi pate od "odbijanja kontakta".

Ako kontakt prekidača ne napravi/prekine čisto, njegovo logičko stanje će brzo oscilirati od VISOKOG do NISKOG dok se kontakt prekidača ne smiri. To dovodi do lažnih brojeva.

Jedna metoda za suzbijanje odbijanja kontakta je dodavanje malog kondenzatora preko svakog kontakta prekidača. Kondenzator i pripadajući pull-up otpornik tvore integrator koji učinkovito skraćuje visoke frekvencije i omogućuje drastičan rast/pad napona sklopke.

Nedostatak ovog pristupa je što se prijelazi mogu propustiti ako se vratilo davača brzo okreće.

Debouncing softvera

Ova metoda koristi dva brojača (otvorena, zatvorena) koja su postavljena na nulu. [2]

Nakon što se na kontaktu A otkrije prijelaz:

  • Stalno anketiranje Kontakt A.
  • Povećajte otvoreni brojač i resetirajte zatvoreni brojač, kad god je kontakt A VISOK.
  • Povećajte zatvoreni brojač i poništite otvoreni brojač kad god je kontakt A nizak.
  • Napustite petlju kada jedan od brojača dosegne unaprijed određeni broj. Učinkovito tražimo stacionarno razdoblje nakon svakog odbijanja kontakta.

Stvarni kod:

// ----- Debounce Contact A

while (1) {if (digitalRead (ContactA)) {// ----- ContactA je otvoren Zatvoren = 0; // Prazan suprotni integrator Open ++; // Integriraj if (Otvori> MaxCount) return HIGH; } else {// ----- ContactA je zatvoren Otvoren = 0; // Prazan suprotni integrator Zatvoren ++; // Integriraj if (Zatvoreno> MaxCount) return LOW; }}

Nema potrebe odbacivati kontakt B jer se prijelazi kontakta A i kontakta B ne podudaraju.

Brojanje

Mehaničko “zadržavanje” učinkovito udvostručuje vaš broj jer se dva broja registriraju između klikova (vidi sliku 1).

Broj "deteknata" može se odrediti korištenjem modulo 2 aritmetike kao što je prikazano u nastavku.

Stvarni kod:

// ----- Broji "detente"

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

Reference

Dodatne informacije mogu se pronaći na:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Korak 4: Softver

Ovaj projekt zahtijeva noviju verziju Ardino Uno R3 IDE (integrirano razvojno okruženje) koja je dostupna na

Preuzmite svaku od sljedeće dvije Arduino skice (u privitku)

  • rotary_encoder_1.ino (verzija za glasanje)
  • rotary_encoder_2.no (verzija s prekidom)

Dvaput kliknite na željenu verziju i slijedite upute na zaslonu.

Uživati …

Kliknite ovdje da biste vidjeli moje ostale upute.

Preporučeni: