Kako podesiti pametne telefone i računare. Informativni portal

Dijagram inkrementalnih enkodera. Obuka

U ovom demo projektu ćemo pogledati zadatak uparivanja kontrole koja se zove enkoder sa PIC mikrokontrolerom.

Za implementaciju demo projekta potrebno nam je:

  • 24-pozicijski koder;
  • 16 LED dioda (3mm);
  • LED drajver;
  • mikrokontroler.

Enkoder je moderan i originalan upravljački element za digitalne uređaje, a po izgledu je sličan promjenljivom otporniku (vidi sliku ispod). Drugi naziv za ovu kontrolu je senzor ugla, senzor rotacije. Rotacija osovine je praćena klikovima, na primjer 24 klika po okretu. Enkoder ima 3 izlaza - A, B, C i služi za brzi unos podataka u digitalne uređaje. Neki modeli imaju ugrađeno dugme koje se aktivira pritiskom na osovinu enkodera (dodat je još jedan izlaz).

Princip rada enkodera

Prilikom okretanja jednog klika, na primjer, udesno, prvo se zatvara kontakt A + C, a zatim B + C. Kada se osovina okrene u ovom kliku, kontakti se otvaraju istim redoslijedom. Kada se vratilo okrene u drugom smjeru, redoslijed zatvaranja sa kontaktom C se mijenja, tj. pri skretanju ulijevo prvo se zatvara B + C, zatim A + C.

Korištenjem enkodera u projektima mikrokontrolera, možda korištenjem istog enkodera, implementira se nekoliko različitih tipova unosa podataka, međutim, to zahtijeva određenu povratnu informaciju i vizualizaciju kako bi korisnik znao koje informacije unosi i u kojoj poziciji se enkoder nalazi.


Šematski dijagram: povezivanje enkodera sa PIC mikrokontrolerom (kliknite za povećanje)

Pinovi enkodera A i B su povezani na portove mikrokontrolera RB4 i RB5, pin enkodera C je spojen na masu. Vrijedi napomenuti da otpornici za povlačenje moraju biti spojeni na signalne linije pinova A i B. Koder nije slučajno povezan sa navedenim I/O linijama mikrokontrolera: prvo, port B ima ugrađene pull-up otpornike i ne moramo da povezujemo eksterne, a drugo, port B mikrokontrolera ima veoma korisna funkcija - "interrupt-on-change" promjena nivoa, koja će nam omogućiti praćenje statusa enkodera.

16 konvencionalnih LED dioda od 3 mm koristi se za vizualizaciju ulaznih podataka i nalazi se na PCB-u oko instaliranog enkodera. LED diode su povezane na A6276 čip.

Mikrokolo je LED drajver sa 16-bitnim serijskim ulazom informacija. Drajver sadrži 16-bitni CMOS pomakni registar, pripadajuće brave i drajvere za pokretanje LED dioda i može pokretati više LED dioda nego što mikrokontroler dozvoljava. Dodatno, drajverom se može upravljati preko SPI interfejsa, što dodatno smanjuje broj korištenih I/O linija i čini projekat skalabilnim.

Softver mikrokontrolera za rješavanje našeg problema je relativno jednostavan. Postoje 3 načina rada (unos informacija) i povratne informacije:

  • Način pozicioniranja od 360° - u ovom načinu rada LED diode pokazuju trenutni "položaj" enkodera, korisnik može okretati osovinu enkodera ulijevo i udesno pod bilo kojim uglom;
  • "Volume / Level" mod - u ovom modu LED diode pokazuju trenutnu vrijednost između minimalnog i maksimalnog nivoa ulaznog opsega (kao nivo jačine zvuka u audio uređajima);
  • 3-Position Rotary Toggle Mode - U ovom načinu rada postoje samo tri selektovana položaja koje korisnik bira okretanjem osovine enkodera lijevo/desno.

Demonstracija projekta

Enkoder za frekventni pretvarač je po izgledu sličan promjenljivom otporniku ili potenciometru. Iste tri igle, isto kućište panela. Tu se sličnosti završavaju. Unutar ima dva prekidača, koji imaju zajednički izlaz kontrolnih zadataka i dva svoja.

Da bi enkoder radio, srednji pin mora biti spojen na masu, a druga dva preko otpornika na napajanje. Kontrolni signal se mora ukloniti direktno sa terminala panela enkodera.

Sada zamislimo da je enkoder idealan i da njegovi kontakti ne pate od odbijanja. Spojite osciloskop na pinove enkodera i počnite okretati dugme enkodera. Impulsi će se pomjeriti jedan u odnosu na drugi za 90 stepeni. Ako okrenemo dugme za napajanje (kW) udesno, levo ili nazad, imaćemo sekvence kontrolne table:

Ako su oscilogrami kao primjena niza zadataka logičkih nula i jedinica, tada će izgledati ovako:

Uzmimo konvencionalni enkoder koji ima odbijanje kontakta. Zona odbijanja:

Odskakanje se događa kada se prebacuje sa logičke jedan na logičku nulu. Odbijanje se može riješiti na dva načina: hardverski i softverski.

Hardverska metoda je povezivanje niza kondenzatora frekventnog pretvarača, Schmitt trigera, kao što je prikazano na dijagramu kontrolne ploče:

Preporučuje se korištenje softverske metode rješavanja odskakanja. Takav metod je opisan u biblioteci Rothery. Ova biblioteka sadrži nekoliko funkcija koje su potrebne za podešavanje pinova vektorskog kontrolera na ulaz i za povezivanje otpornika za povlačenje snage (kW). U biblioteci morate navesti odgovarajuće naredbe i zadatke. Ova komanda uključuje otpornik za povlačenje unutra.

Funkcija Get position vfd serije vraća vrijednost kodera. Ova funkcija je potrebna za dobivanje broja impulsa koje je koder brojao. Postavljena funkcija Position vfd potrebna je za učitavanje vrijednosti od koje će koder početi brojati.

Funkciju kvačica treba detaljnije obraditi. Varijable sig1 i sig2 ove funkcije bilježe stanje vektorskog pina na koji je enkoder povezan. Zatim se ovi pinovi upisuju u varijablu thisState vfd, koja je trenutno stanje kodera. Ako trenutno stanje enkodera nije jednako prethodnom, tada se izračunavaju novi smjerovi brojanja i broj impulsa snage se pohranjuje u varijablu Položaj. Kada se enkoder vrati na svoju početnu vektorsku poziciju, pomaknut će se udesno za dva bita, a nova kontrolna vrijednost mora biti upisana u varijablu PositionExt. Ova varijabla je potrebna za pohranjivanje niza rezultata zadataka koji će se koristiti u glavnom programu.

Provjeri

Nakon analize stanja enkodera pri rotiranju lijevo i desno, sastavljamo tabelu:

Njegova startna pozicija je 1-1. Prilikom skretanja udesno, čuo se škljocaj, jedan je postao logična nula. Nova vrijednost ove vfd stanja je 01. Prema naredbi, ovaj rezultat se sumira sa vrijednošću varijable Position.

Zbog odskoka, pozicija je postala 11, nakon ponovnog izračuna, serijski broj je postao 7. Nakon što je odskakanje završeno, potrebno je popraviti novu poziciju 01 i jedinica se dodaje na prethodnu nulu. Kada je enkoder okrenut, dogodio se jedan klik, a vrijednost varijable Position postala je jedan.

Do drugog klika dolazi kada se enkoder okrene udesno, a umjesto pozicije 01 imamo poziciju 00. Nakon završetka svih odbijanja, kontrolni izlaz također ima vrijednost jedan. Na četvrtom kliku, kada pozicija od 10 postane 11, imamo vrijednost 6. Nakon završetka čavrljanja, ostaje 6.

Neki enkoderi imaju aplikaciju za dugme na ploči. Kada ga pritisnete i otpustite, doći će i do odbijanja kontakata, potrebno je da koristite Bounce biblioteku. Funkcije ove biblioteke potrebne su za postavljanje pina na koji će dugme biti povezano, zadaci vremena kašnjenja u milisekundama. Ako se pritisne dugme, funkcija snage (kW) vraća vektorsku vrijednost true, ako nije, onda false vfd.

Šematski dijagram povezivanja enkodera na frekventni pretvarač

U konstrukciji alatnih mašina, koderi se široko koriste za frekventne pretvarače asinhronih motora. Montirani su kao senzori povratne informacije o brzini. Takvi koderi imaju visoku rezoluciju od 100 impulsa po obrtaju do 1 milion impulsa po obrtaju. Ovaj brend ima diskretnost od 500 imp. obrnuto.

Koderi su klasifikovani u tipove zadataka prema. One mogu biti apsolutne i inkrementalne. Naš enkoder obavlja uobičajenu funkciju - daje signal diferencijacije kada se napajanje isključi, a zatim se ponovo primjenjuje. Rano stanje nije sačuvano.

Apsolutni koderi imaju internu memoriju koja pamti posljednje pozicije. Zašto vam je potrebna memorija i zašto čuvati ove podatke? U fabričkim uslovima industrije alatnih mašina, pre pomeranja određenog uređaja, prvo se označava nulta tačka. Ovaj proces se zove sumarizacija, odnosno odlazak na nulu.

Upotreba senzora apsolutnog pogleda omogućava da se ovaj postupak izbjegne drugi put, da se skrati vrijeme, pod uslovom da sistem ima ograničenja za kretanje.

Razmotrite sinusne i kosinusne enkodere. Oni daju kosinusni ili sinusni izlazni signal. Nadalje, uz pomoć uređaja interpolatora snage, od njih se formiraju impulsi. Signali ove vrste mogu se mijenjati. Enkoder se napaja od napona od 5 volti.

Signal "A" je impulsni signal direktnog tipa. Broj impulsa iz ovog signala dolazi pri svakoj revoluciji. Jednaka je 500 (rezolucija senzora).

Signal "B" je također direktni impulsni signal. Od njega se pri svakom obrtaju prima broj impulsa prema diskretnosti senzora, koji je odmaknut od kanala "A" za 90 stepeni (500).

Signal "R" je signal nulte oznake. Jedan impuls se dobija iz jednog obrtaja senzora.

U industrijskim enkoderima, signal diferencijacije se koristi za rad sa frekventnim pretvaračem (frekventnim pretvaračem). Ime mu je složeno, ali u stvarnosti je sve jednostavno. Svi kanali se zasebno kopiraju njihovom inverzijom. Ovo je neophodno za prijenos signala na velike udaljenosti. Izlazni kanal enkodera povezan je sa prijemnikom posebne namjene napravljenim na operacionim pojačalima. Impuls je konačno određen kombinacijom dva signala.

Veza

Povezivanje je jednostavno. Na izlaze enkodera povezujemo napon od 5 volti. Imamo raspored: smeđa žica - 0 V, bijela žica - +5 V, roza, zelena i crvena - A, B, R.

Program povezivanja kodera zasniva se na prekidima na kanalima A i B. Prekidi se aktiviraju na rastućoj ivici. Ispada situacija kada enkoder usporava u trenutku ukrštanja rastera i izlazni signal kanala uvijek ostaje pozitivan. Brojač kontinuirano broji impulse.

U našem slučaju nećemo koristiti prekide, jer radimo sa 4 senzora, oni rade istovremeno. Ako koristite shemu prekida, vjerovatno će doći do situacije gubitka impulsa. Ovaj problem smo riješili uspostavljanjem ikone prisutnosti pokreta. Razmotrili smo rad industrijskih kodera.

Rad brojača impulsa na bazi modula enkodera

Brojač radi u sprezi sa sedmocifrenim indikatorskim modulom, koji će prikazati broj impulsa koje je namotao enkoder. Kada je omogućeno, vrijednost brojača je nula.

Okrenite dugme enkodera u smeru kazaljke na satu. Vrijednost brojača se povećava za jedan svaki put kada se klikne na koder. Najveći broj koji možete dobiti je 999999999. Ovaj broj bi trebao ispuniti sve cifre našeg indikatora od sedam segmenata. Ako dodatno okrenete dugme, brojač će se resetovati na nulu i ponovo početi da broji od nule.

Na primjer, namotajmo 120 impulsa. Sada ga okrećemo nazad rotirajući ručku u smjeru suprotnom od kazaljke na satu. Centralna os enkodera radi kao dugme. Briše slobodne bitove indikatora od nula. Dugme ima blagi odskakivanje kontakata, tako da isključivanje i uključivanje ne dolazi odmah. Softverom se eliminiše odbijanje. Ovo je osnova za rad sa modulom enkodera.

Odavno sam želio prilagoditi kontrolu jačine zvuka enkoder... Morat ćete ovaj regulator spojiti na USB kako bi sve bilo "naraslo" (i ne postoji drugi način da povežete eksterni uređaj na laptop). Okrenite enkoder ulijevo - glasnoća bi se trebala smanjiti, udesno - trebala bi se povećati. Pritisnite dugme enkodera - pokrenite neki koristan program ili pređite na kontrolu tona.

Za one koji ne znaju šta je enkoder, ovo je neka vrsta dugmeta, poput dugmeta za jačinu zvuka zasnovanog na konvencionalnom otporniku, samo što ovo dugme nema granične pozicije - okreći se koliko god može u bilo kom pravcu. Enkoder se vrti uz prijatne meke klikove i izgleda kao običan varijabilni otpornik.

Takvi uređaji nisu neuobičajeni u modernim auto-radijima i svim kućanskim uređajima, čije korisničko sučelje obrađuje mikrokontroler (a ovo je gotovo svaki kućanski aparat), i gdje je potrebno glatko podešavanje ili podešavanje. Treći kontakt je često ugrađen u enkoder, koji radi kao dugme na ručki - kada pritisnemo ručku enkodera prema dole (duž ose), ovo dugme se aktivira. Umnogome obogaćuje mogućnosti interfejsa sa korisnikom - na jednom enkoderu je moguće izgraditi ceo sistem upravljanja elektronskog uređaja (ali programatoru dodaje hemoroide, ali to su sitnice). Upravo sam imao takav enkoder.

Princip rada enkodera je prilično jednostavan - ima samo dva kontakta (dugme na ručki se ne računa) koji se počinju zatvarati čim korisnik počne okretati ručku enkodera. Kontakti su spojeni na dva kraka mikrokontrolera (koji rade kao digitalni ulazi), a pri rotiranju dugmeta enkodera na tim nogama se pojavljuju impulsi prema čijoj fazi i broju mikrokontroler određuje smjer rotacije i ugao rotacija dugmeta enkodera.

Da bi kontrola glasnoće funkcionirala, morate riješiti najmanje tri inženjerska problema:

Korak 1... Kreira USB uređaj male brzine iz matične ploče.
Korak 2... Povežite enkoder na ovaj USB uređaj, učinite da mikrokontroler radi na njemu i prenesite informaciju o rotaciji enkodera na računar.
Korak 3... Shvatite kako možete programski kontrolirati kontrolu jačine zvuka. Sigurno postoji neka vrsta multimedijalnog API-ja koji vam to omogućava. Minimalni program - potrebno je da napišete program koji će primati signale sa USB uređaja i kontrolirati jačinu zvuka. Bilo bi lijepo, naravno, napisati vozača, ali je strašno preduzeti ovo. Bolje da to ostavimo za kasnije.

Dakle, opisaću proces kreiranja regulatora u koracima. Izostavljam detalje, inače će biti previše dosadno. Za sve zainteresovane, pogledajte izvore i dokumentaciju na linkovima.

[Korak 1: Kreirajte USB uređaj male brzine na matičnoj ploči]

Ovaj korak je prošao a da nije ni započeo - nekako previše jednostavan i banalan. Glupo preuzeo primjer projekta sa linka. Ispravljen fajl usbconfig.h - za razmetanje pod nazivom moj uređaj DEMO ENCODER, za više mašte nije bilo dovoljno. Provjerio sam u Makefile-u tip procesora (ATmega16), frekvenciju kristala (16 MHz) - da odgovara mom AVR-USB-MEGA16 rasporedu. Sastavio sam projekat u AVRStudio, flešovao matičnu ploču, spojio na kompjuter - sve je počelo sa pola okreta, moj USB uređaj je radio kako treba kao virtuelni COM port - sve je tačno kako piše u članku.

[Korak 2. Povežite enkoder sa USB uređajem]

Ovaj korak izazvao je moje najveće strahove da će sve funkcionirati kako treba. Nisam sumnjao da ću spojiti enkoder i moći da ga pročitam. Postojale su sumnje da bih mogao efikasno da ga čitam kada obrada USB protokola takođe radi u pozadini - uostalom, ovo nije lak zadatak za mikrokontroler (kako se kasnije ispostavilo, uzalud sam se zabrinuo).

Kao i obično, počeo sam kopati po internetu u potrazi za gotovim rutinama za čitanje kodera. Vrlo brzo sam pronašao ono što mi je trebalo - posebno za AVR, vrlo jednostavan C kod, encoder.c i encoder.h datoteke. Recite šta želite, ali open source je cool.

Priložene su dvije indikacijske LED diode - ZELENA i ŽUTA - za označavanje smjera rotacije enkodera. Radi praktičnosti, spojio sam enkoder direktno na ISP konektor, koristeći činjenicu da su MOSI, MISO i SCK signali samo noge PB5, PB6 i PB7 mikrokontrolera ATmega16 (tamo sam povezao faze A i B, kao i dugme enkodera).

Ispravljene definicije nogu, dodat inicijalizacijski kod. Priložio modul encoder.c na projekat. Dodata kontrola zelenih i žutih LED dioda glavnoj petlji kada infa dolazi iz enkodera. CRVENA LED dioda je pričvršćena na tipku enkodera - kada je pritisnete, crvena LED dioda svijetli, kada je pustite, gasi se. Sastavljeno, flešovano - radi. Okrenem dugme ulevo, i uz klikove enkodera treperi zelena LED dioda. Okrenem dugme udesno - žuta LED lampica treperi. Uprkos činjenici da se enkoder čita metodom anketiranja, zahvaljujući efektivnom kodu za čitanje enkodera, NEMA pritužbi čak ni kada se istovremeno radi sa V-USB bibliotekom (poštovanje, Pashgan!). Dodan izlaz informacija iz enkodera u virtuelni COM port (okrenite enkoder ulijevo, unosim znak minus "-" na konzolu, okrećem ga udesno, ispisujem znak plus "+" na konzolu ). Po tajmeru, svakih 10 ms prikazujem stanje tipke enkodera i označavam ga crvenom LED diodom (tipka je pritisnuta - prenosim znak "1", otpuštena - "0"). Sve radi. Dosada.

U zaključku, izbacio sam module cmd.c, crc16.c, eepromutil.c, strval.c. Veličina koda je pala na 3 kilobajta - odlično, sada će stati u ATtiny45 memoriju (možete koristiti AVR-USB-TINY45 prototip u budućnosti, manji je i jeftiniji).

[Korak 3. Shvatite kako možete programski kontrolirati kontrolu jačine zvuka]

Kao i obično, proguglao sam pitanje. Prosijao sam gomilu smeća i na kraju izvukao biser -. Dalje stvar tehnologije. Izvadim svoj omiljeni dječji dizajner - Visual Studio. Ne razmišljajući ni o čemu, čarobnjak generiše aplikaciju zasnovanu na dijalogu. Spustim klizač za kontrolu jačine zvuka na panel, vežem varijablu na njega, dodam rukovalac za poziciju klizača. Na početku aplikacije, postavio sam motor na minimalno 0 i maksimalno 65535 (da odgovara granicama vrijednosti volumena kojima manipuliraju biblioteke kontrole miksera). Čitam po funkciji mixerGetControlDetails trenutnu vrijednost jačine zvuka i postavite klizač u odgovarajući položaj. U kontroloru položaja motora je obrnuto - čitam poziciju motora i funkciju mixerSetControlDetails podesite željenu jačinu zvuka. Kontrolu jačine zvuka radim tačno onako kako je napisano u članku. Provjerio sam - radi.

Sada je ostalo malo toga da se uradi - da pročitamo šta dolazi sa virtuelnog COM porta (imamo sveže pečeni USB uređaj sa enkoderom na njemu). Ako je došao znak minus (-), onda pomaknite klizač ulijevo (smanjite jačinu), znak plus (+), a zatim pomerite klizač udesno (pojačajte jačinu zvuka). Ako dođu znakovi 0 i 1, tada kontroliramo stanje checkbox-a (samo da označimo da li je tipka enkodera pritisnuta ili ne). Sa COM portom možete raditi kao sa običnom datotekom (pogledajte). Inicijaliziramo vezu sa COM portom kao otvaranje datoteke (pozivanjem :: CreateFile) u načinu blokiranja. Pokrećemo zasebnu nit, dodamo pročitanu datoteku u beskrajnu petlju (uz blokirajući poziv :: ReadFile) jedan po jedan znak, a mi analiziramo ovaj znak. Prema tome koji je simbol došao, okrenite klizač u željenom smjeru (glasnoću će kontrolirati rukovalac klizača) ili ažurirajte stanje potvrdnog okvira. Provjerio sam - radi.

To je sve, zapravo. Tada se možete baviti beskrajnim (i, vjerovatno, beskorisnim) poboljšanjima. Napravite automatsku pretragu potrebnog virtuelnog COM porta (sada, radi jednostavnosti, ime COM porta se prenosi kroz komandnu liniju). Ponovo napravite USB uređaj sa CDC-Nastavak HID- može pojednostaviti kodiranje USB uređaja, a također olakšati programsko pronalaženje i otvaranje uređaja na računaru pomoću VID-a i HID-a. Ili napišite servis umjesto programa (tako da ne morate pokretati poseban program). Ili čak vozač. Vrlo je zanimljivo, ali ne znam kako (možda će neko iz Khabravchana podučavati mudrost? ..). Pričvrstite neku radnju na dugme enkodera. I tako u nedogled.

Nadam se da će nekome moje istraživanje biti korisno u svom razvoju. Ako sam nešto propustio, bit će mi drago čuti komentare u komentarima.

[UPD120803]

Jedna pismena osoba prikupljena na AVR mikrokontroleru

Inkrementalni enkoder izgleda kao potenciometar, ali za razliku od potenciometra, nema krajnje pozicije, može se rotirati u oba smjera neograničen broj okretaja. Također treba napomenuti da se inkrementalni enkoder ne rotira tako glatko kao potenciometar, već u koracima. Može se videti na auto radiju, osciloskop, muzički centar, mašina za veš i druga oprema, gde se podešavanje parametra vrši u širokim granicama. Naravno, parametri se mogu menjati i pomoću dugmadi, na primer, da bi muzika bila 20 vrednosti glasnija, kada kontrolišete dugme, morate ga pritisnuti 20 puta, a kada upravljate enkoderom, okrenite ga na određenog ugla, zavisno od algoritma obrade.

Inkrementalni enkoder predstavlja dva kontakta, čiji red zatvaranja zavisi od smera rotacije.


Zapravo inkrementalni enkoder pretvara rotaciju osovine u električne impulse koji sadrži informacije o smjeru rotacije.

Napravimo testno kolo prikazano na gornjoj slici i spojimo ga na pinove A i B osciloskop, pull-up otpornici - 4.7K.
Okrenimo enkoder u smjeru kazaljke na satu.


Sada suprotno od kazaljke na satu.


Oscilogrami pokazuju da se u zavisnosti od smera rotacije menja red zatvaranja kontakta. Ali prednji dio ne ispadne uvijek tako lijep.


Budući da su kontakti mehanički, skloni su odbijanju, odnosno pri zatvaranju zbog elastičnosti materijala dolazi do višestrukih nekontrolisanih kratkih spojeva i otvaranja, što se vidi na oscilogramu iznad.

Postoje dva načina da se nosite sa odbijanjem, prvo sastoji se u dodavanju kondenzatora i otpornika kao što je prikazano na slici ispod.


Pošto je odbijanje kratkotrajna pojava, lako se gasi kondenzatorom.


Oscilogram pokazuje da su nakon ugradnje kondenzatora prednje strane postale manje strme, a odskok je nestao.

Drugi način- softver i sve zavisi od implementacije prozivanja izlaza enkodera. Ako status enkodera nadgledan eksternim prekidima, tada je nakon aktiviranja prekida potrebno napraviti odgodu od 20-30 milisekundi, tokom kojih MC neće reagirati na promjenu stanja izlaza, odnosno neće osjetiti odbijanje. Ako Prozivanje pinova kodera je implementirano na tajmeru, tada bi interval između anketa trebao biti duži od trajanja odbijanja, istih 20-30 milisekundi.

hajde da razmotrimo metode obrade podataka koji dolaze iz enkodera.
Prva metoda je da povežemo jednu od nogu enkodera na izlaz eksternih prekida i postavimo ga za prekid na padajućoj ivici. U prekidu provjeravamo stanje druge noge, a ako je nula, onda se rotacija događa u jednom smjeru, inače u drugom. Ispod je kod koji implementira ovu metodu za AVR.
#include ISR (INT2_vect) (ako (PINB & 0X02) (PORTB | = (1<<0); } else { PORTB &= ~(1<<0); } //антидребезг _delay_ms(20); //сбрасываем флаг прерывания вызванный дребезгом GIFR = (1<Kada se enkoder okrene na jednu stranu, LED svijetli, kada se enkoder okrene na drugu stranu, gasi se.

Druga metoda je poredeći trenutno stanje i prethodno stanje... Izrazimo logičke nivoe niza impulsa kao nule i jedinice.


Tada dobijamo konačan broj stanja kodera. Prva cifra je logička razina prvog pina enkodera, druga je logička razina drugog pina.

Pretpostavimo da je posljednje stanje u kojem se nalazio koder jednako tri, ako je sljedeće stanje jednako jednom, onda se rotira u jednom smjeru, ako dva, onda u drugom. Ispostavilo se da možete popraviti prijelaz iz jednog stanja u drugo i odrediti smjer rotacije, ali najjednostavnija implementacija je kada pređete sa 11 na 01 i 10. Ispod je kod koji implementira opisani algoritam za AVR,
#define F_CPU 8000000UL #include #include uint8_t zadnje_stanje = 0; ISR (TIMER0_COMP_vect) (// oba pina enkodera su povezana na pinove 2 i 3 porta B // čitanje njihovog stanja uint8_t current_state = (PINB & 0x06) >> 1; // uzeti u obzir prijelaz samo ako je prethodno stanje 11 // i ako nije jednako novom if ((last_state == 3) && (last_state! = current_state)) (// ako je novo stanje 01 - upalite LED ako (current_state == 1) (PORTB | = 0x01;) // ako je novo stanje 10 - ugasi LED ako (trenutno_state == 2) (PORTB & = ~ 0x01;)) // kada izađemo iz prekida, trenutno stanje postaje prethodno posljednje_state = current_state;) int main (void) (// dva ulaza za povezivanje DDRB enkodera & = ~ 0x06; // povući ulaze za napajanje PORTB | = 0x06; // izlaz za povezivanje DDRB LED | = 0x01 ; // postaviti tajmer da se resetuje slučajno TCCR0 = (1<To je sve.
Encoder kupljen

Enkoder je stvar koja izgleda kao promjenjivi otpornik, ali, za razliku od potonjeg, nema limitera i može se beskonačno rotirati u bilo kojem smjeru. Uz pomoć enkodera vrlo je zgodno organizovati sve vrste menija na ekranu, generalno, jedan "push-button" enkoder (tj. ako može da radi i kao dugme) je idealan za organizovanje jednodimenzionalnih cikličnih meniji.

Postoje dvije vrste enkodera: apsolutni - odmah daje kod ugla rotacije i inkrementalni - daje impulse tokom rotacije. Za potonje, mikrokontroler bi trebao biti uključen u brojanje impulsa i njihovo pretvaranje u ugao rotacije.

Sa stanovišta dizajna, enkoderi su mehanički i optički, u prvom se impulsi tokom rotacije generišu na paru kontakata kada su zatvoreni kliznim kontaktom osovine, drugo, fotodiode igraju ulogu kontakata, a LED koji sija kroz disk sa utorima (zdravo mišu) igra ulogu kontaktora. ...

Iako postoji puno informacija o programiranju kodera na mreži, kao i gotovih biblioteka za to, sve su one nekako nepotrebno glomazne (IMHO) - državno ispitivanje se u pravilu provodi u obliku stanja mašina u obliku bloka prekidača sa ugniježđenim ifs, što izgleda pomalo komplicirano (posebno kada je napisano u asembleru). Implementacija bi ipak mogla biti jednostavnija.

Najpopularniji u nacionalnoj ekonomiji su jeftini mehanički inkrementalni koderi, a mi ćemo ih razmotriti. Proces rotacije osovine enkodera je shematski prikazan na slici (gore - rotacija u smjeru kazaljke na satu, dolje - u smjeru suprotnom od kazaljke na satu):


Ovdje su A i B sami kontakti, nivoi na kojima mikrokontroler mora obraditi. Pokretni kontakt ih zatvara za tlo ako ne upadnu u njegove rupe. Imajte na umu da su samo četiri rupe prikazane na slici radi jednostavnosti. U stvari, ovih rupa je mnogo više (opet, sjetite se miša s kuglom i kako izgleda njegov optički točak za sjeckanje). Pinovi A i B su povučeni otpornicima na napon napajanja. Kao rezultat toga, kada se rotiraju, dobijaju se dijagrami prikazani na gornjoj slici.

Pretpostavimo da u početku oba kontakta padnu u rupu, a zatim će na njima doći do visokog napona (takođe se povlače do napajanja). Dalje, kada se okrene u smjeru kazaljke na satu, kontakt A će se prvi zatvoriti uzemljenje, zatim će mu se pridružiti i kontakt B. Dalje, kada dođe do sljedeće rupe na disku, kontakt A će se otvoriti i dobiti visok nivo, nakon čega će kontakt B Nadoknaditi ove pomake, kontakti se vraćaju u prvobitno stanje, a daljnjom rotacijom ovaj dijagram će se ciklički ponavljati.

Tako se ispostavlja da je trenutno stanje kodera opisano dvobitnom vrijednošću. Ali samo trenutno stanje nosi malo korisnih informacija, a za analizu rotacije mora se uzeti u obzir u vezi sa vrijednošću prethodnog stanja. I ovaj par već jedinstveno određuje smjer rotacije ručke. Radi praktičnosti, uzmimo četverobitni broj, čija dva najznačajnija bajta sadrže prethodna stanja kontakata A i B, a dva najmanje značajna - trenutna.

I kada se okreće suprotno od kazaljke na satu

Binarno Decimala
1110 14
0001 1
0010 2
0111 7

Sada algoritam za određivanje smjera rotacije enkodera izgleda vrlo jednostavno: dobijemo vrijednost i uporedimo da li ona spada u jedan od skupova (2, 4, 11, 13) i (1, 7, 8, 14). Ako je tako, onda imamo skretanje u odgovarajućem smjeru. Inače, osovina se ili nije uopće rotirala, ili se rotirala tako brzo da je prošla kroz nekoliko stanja (ako se to često događa, onda biste trebali razmisliti o povećanju stope biranja stanja), ili je došlo do "odbijanja" kontakata. Bez udubljivanja u razlog, sve ostale vrijednosti mogu se sigurno zanemariti.

Kao primjer, razmotrite rad enkodera u kombinaciji s AVR mikrokontrolerom:


Ovdje se za povezivanje koriste dva donja pina PB porta mikrokontrolera ATMega8. Par otpornika povlači ove vodove do napona napajanja (pošto unutrašnji otpornici atmega ovdje možda neće biti dovoljni za stabilan rad), instaliran je par kondenzatora za suzbijanje impulsnog šuma.

Za takvu šemu povezivanja možete skicirati sljedeću implementaciju u jeziku C:

Statički uint8_t encoderGetVal () (povrat PINB & 3;) statički uint8_t encoderGetCode () (statički uint8_t prev; uint8_t val = encoderGetVal (); uint8_t kod = (pret.<< 2) | val; prev = val; return code; } static void encoderInit() { DDRB &= ~0b11; PORTB |= 0b11; encoderGetCode(); } void onEncoderEvent(bool direction); void encoderCheck() { uint8_t code = encoderGetCode(); if (code == 1 || code == 7 || code == 8 || code == 14) { onEncoderEvent(true); } else if (code == 2 || code == 4 || code == 11 || code == 13) { onEncoderEvent(false); } }

Kod je nečuveno jednostavan - nekoliko if-ova i bez državnih mašina. Funkcija encoderInit () se poziva na početku da inicijalizira port i zapamti početnu vrijednost. Funkcija encoderCheck () se poziva u petlji događaja (unutar glavnog () ili pomoću tajmera). OnEncoderEvent (bool) rukovalac će biti pozvan kad god se enkoder rotira i primiće oznaku smjera rotacije.

Ali postoji jedna važna stvar: koder je osjetljiva stvar i ako pokušate obraditi, na primjer, događaje navigacije menijem na ovaj način, onda će čak i mali okret gumba enkodera više puta pozvati onEncoderEvent () rukovalac, kao rezultat čega će kursor izbornika umjesto pomjeranja na sljedeći/prethodni element odmah odletjeti na kraj/početak liste. Možete podesiti osjetljivost enkodera promjenom frekvencije poziva encoderCheck () (obično je optimalna frekvencija ~ 10 Hz). U ovom slučaju, metodu encoderGetCode () treba pozivati ​​što je češće moguće kako bi uvijek imala stvarnu vrijednost posljednjeg stanja kontakata (sa frekvencijom od negdje ~ 100 Hz).

U asembleru ovaj kod može izgledati ovako:

EQU encoder_port PORTB .EQU encoder_pin PINB .EQU encoder_ddr DDRB .DSEG .ORG SRAM_START sEncoderPrev: .BYTE 1 ... .CSEG .ORG $ 0000 ... Encoder_init: cbi encoder_ddr, encoder scoder_ddr, encoder 0 in coder_0 andi r0, 3 ss sEncoderPrev, r0 ... Encoder_check lds ZL, sEncoderPrev lsl ZL lsl ZL u r0, encoder_pin andi r0, 3 ss sEncoderPrev, r0 ili ZL, r0; 1 7 8 14 -> u smjeru kazaljke na satu cpi ZL, 1 breq Encoder_clockwise cpi ZL, 7 breq Encoder_clockwise cpi ZL, 8 breq Encoder_clockwise cpi ZL, 14 breq Encoder_clockwise cpi ZL; 2 4 11 13 -> suprotno od kazaljke na satu cpi ZL, 2 breq Encoder_u suprotnom smjeru kazaljke na satu cpi ZL, 4 breq Encoder_u smjeru kazaljke na satu cpi ZL, 11 breq Encoder_u suprotnom smjeru od kazaljke na satu cpi ZL, 13 breq Encoder_u suprotnom od kazaljke na satu rjmp Encoder_done: Encoder_done ; ovdje je kod za rukovalac rotacije u smjeru kazaljke na satu; Encoder_counterwise:; ; ovdje je kod za rukovanje rotacijom u smjeru suprotnom od kazaljke na satu; Interval_enc_done.

Top srodni članci