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, Novembar
Anonim
Image
Image
Jednostavan rotacijski dekoder
Jednostavan rotacijski dekoder

Ova instrukcija 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 sa prekidom i bez prekida.

Prekidna verzija koda zahtijeva samo jedan pin prekida.

Slike:

  • Prva fotografija prikazuje sklopljeni enkoder.
  • Snimak ekrana prikazuje kôd za verziju prekida i broj kada se vratilo kodera rotira u smjeru kazaljke na satu.
  • Video prikazuje brojanje tokom brze rotacije.

Korak 1: Dijagram kola

Dijagram kola
Dijagram kola

Shema ožičenja kodera prikazana je na slici 1.

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

Zamijenite dvije plave žice ako je smjer brojanja obrnut.

Korak 2: Lista dijelova

Sljedeći dijelovi su nabavljeni sa

  • 1 samo Arduino UNO R3 sa USB kablom.
  • 1 samo sekvencijalni rotacijski davač (EC11 ili ekvivalent) sa prekidačem.
  • 1 samo dugme za prilagođavanje vratilu.
  • 3 samo Arduino spojne žice muško-muški.

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
  • tabele za traženje uzoraka

Ovaj projekt koristi softversku metodu za koju nisu potrebne tabele 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) Count--; LastStateA = CurrentStateA; }

Ova metoda nudi sljedeće prednosti:

  • tabele za traženje 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ćava da napon prekidača graciozno raste/pada.

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]

Kada 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. Efektivno 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” efektivno 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 možete 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 prilogu)

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

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

Uživajte…

Kliknite ovdje za pregled ostalih instrukcija.

Preporučuje se: