Sadržaj:

Kako protumačiti smjer rotacije s digitalnog rotacijskog prekidača sa PIC -om: 5 koraka
Kako protumačiti smjer rotacije s digitalnog rotacijskog prekidača sa PIC -om: 5 koraka

Video: Kako protumačiti smjer rotacije s digitalnog rotacijskog prekidača sa PIC -om: 5 koraka

Video: Kako protumačiti smjer rotacije s digitalnog rotacijskog prekidača sa PIC -om: 5 koraka
Video: Is Genesis History? - Watch the Full Film 2024, Juli
Anonim
Kako tumačiti smjer rotacije s digitalnog rotacijskog prekidača sa PIC -om
Kako tumačiti smjer rotacije s digitalnog rotacijskog prekidača sa PIC -om

Cilj ovog Instructable -a je ilustrirati kako spojiti digitalni (kvadraturno kodirani) rotacijski prekidač s mikrokontrolerom. Ne brinite, objasnit ću vam šta za nas znači kvadraturno kodiranje. Ovo sučelje i prateći softver omogućit će mikrokontroleru da prepozna smjer rotacije pri svakom kretanju od jednog zadržavanja do drugog. Nedavno sam koristio ovu vrstu prekidača u projektu mikrokontrolera koji je zahtijevao unos zadane vrijednosti pritiska pomoću dugmeta sa 16 detente umjesto tipki gore/dolje. Ideja je bila omogućiti korisniku da "okrene" željeni pritisak. Kao rezultat toga, morali smo razviti softversku rutinu kako bismo dobili informacije o položaju sa prekidača i zaključili smjer rotacije kako bismo povećali ili smanjili zadanu vrijednost pritiska za glavni sistem. U ovom Instructable -u ću pokriti fizičko sučelje mikrokontroleru, teoriju rada okretnog prekidača, teoriju rada softvera, kao i rutinu odbitka. Na kraju ću vam pokazati svoju primjenu rutine odbitka. Kako napredujemo, pokušat ću držati stvari donekle generičkim kako bi se ideja mogla primijeniti na što više platformi, ali podijelit ću i ono što sam učinio kako biste vidjeli određenu aplikaciju.

Korak 1: Dijelovi

Delovi
Delovi

Da biste to implementirali, trebat će vam: Okretni prekidač (kvadraturno kodiran) Povući otpornike Odgovarajuća platforma mikrokontrolera Za svoj projekt koristio sam optički koder Grayhill 61C22-01-04-02. Tehnički list za okretni prekidač zahtijeva otpornike za podizanje od 8,2 k ohma na dvije podatkovne linije koje dolaze sa prekidača. Morat ćete provjeriti tehnički list za koder koji ste odlučili koristiti. Rotacijski prekidač koji sam koristio može se naručiti i pomoću aksijalnog prekidača. To je korisna funkcija za odabir odabranih brojeva itd., Ali ovdje neću raspravljati o njegovom sučelju. Imam "odgovarajuću platformu za mikrokontroler" na popisu jer se (mislim) ovo može implementirati na više platformi. Vidio sam mnogo ljudi koji koriste druge mikrokontrolere za Instructables pa želim pokazati i opći pristup. Napisao sam sav kod u PIC Basic Pro za upotrebu sa mikročipom PIC16F877A. Zaista, ključna stvar koja vam je potrebna na mikrokontroleru je mogućnost prekida ako dođe do logičke promjene na bilo kojem od dva pina. Na PIC16F877A to se naziva prekidom promjene PORTB -a. Možda postoje drugi nazivi za to na drugim kontrolerima. Ova funkcija prekida mikrokontrolera dio je onoga što ovu implementaciju čini tako elegantnom.

Korak 2: Hardversko sučelje

Hardversko sučelje
Hardversko sučelje

"Jednostavno" rješenje bilo bi imati prekidač "single pole-16 throw" sa 16 veza na mikrokontroler. Svaki izlaz prekidača bi tada bio vezan za pin na mikrokontroleru tako da mikrokontroler može provjeriti svaki položaj biranja. Ovo je pretjerana upotreba I/O pinova. Stvari postaju još gore ako želimo da nam na prekidaču bude dostupno više od 16 položaja (detektora). Svaki dodatni položaj prekidača zahtijeva dodatni ulaz za mikrokontroler. Ovo brzo postaje vrlo neučinkovita upotreba ulaza na mikrokontroleru. Unesite ljepotu okretnog prekidača. Rotacijski prekidač ima samo dva izlaza na mikrokontroler naveden kao A i B u tehničkom listu. Postoje samo četiri moguće logičke razine koje ove linije mogu poprimiti: AB = 00, 01, 10 i 11. Ovo uvelike smanjuje broj ulaznih linija koje morate koristiti za povezivanje prekidača na mikrokontroler. Dakle, smanjili smo broj ulaznih linija na samo dvije. Šta sad? Čini se da nam zaista treba 16 različitih stanja, ali ovaj novi prekidač ima samo četiri. Jesmo li sebi pucali u nogu? Ne. Čitajte dalje. Objasnit ćemo malo teorije koja stoji iza operacije okretnog prekidača kako bismo je objasnili.

Korak 3: Teorija rada hardvera

Teorija rada hardvera
Teorija rada hardvera
Teorija rada hardvera
Teorija rada hardvera
Teorija rada hardvera
Teorija rada hardvera

Prepoznavanje smjera rotacije moguće je pomoću gore spomenutog prekidača "single pole-16 throw", ali koristi mnogo ulaza na mikrokontroleru. Korištenje okretnog prekidača smanjuje broj ulaza u mikrokontroler, ali sada moramo interpretirati signale koji dolaze sa prekidača i prevesti ih u smjer rotacije. Ranije sam spomenuo da je prekidač bio kvadraturno kodiran. Ovo je također jedan od ključnih elemenata ovog rješenja. To znači da postoji 2-bitni kod koji prekidač daje i koji odgovara položaju prekidača. Možda mislite: "Ako postoji dvobitni ulaz za mikrokontroler, kako ćemo predstaviti svih 16 pozicija?" To je dobro pitanje. Ne predstavljamo ih sve. Samo moramo znati relativne položaje gumba kako bismo mogli odrediti smjer rotacije. Apsolutni položaj dugmeta nije bitan. Za rotaciju u smjeru kazaljke na satu, kod koji prekidač daje ponavlja se svaka četiri detenta i sivo je kodiran. Sivo kodirano znači da postoji samo jedna bitna promjena za svaku promjenu položaja. Umjesto da AB ulaz broji za rotaciju u smjeru kazaljke na satu u binarnom obliku ovako: 00, 01, 10, 11, mijenja se ovako: 00, 10, 11, 01. Primijetite da se za ovaj drugi uzorak mijenja samo jedan ulaz između setovi. Vrijednosti AB ulaza u mikrokontroler u smjeru suprotnom od kazaljke na satu izgledat će ovako: 00, 01, 11, 10. Ovo je jednostavno obrnuto od uzorka u smjeru kazaljke na satu s AB = 00 koji je prvi naveden. Pogledajte dijagrame za vizualnije objašnjenje.

Korak 4: Softverska teorija rada

Softverska teorija rada
Softverska teorija rada

Rutina koja izvodi smjer rotacije upravlja se prekidom. Mikrokontroler koji odaberete mora biti u mogućnosti prekinuti svaki put kada dođe do promjene na jednom od (najmanje) dva pina kada je prekid omogućen. To se naziva PORTB prekid promjene na PIC16F877A. Svaki put kada se prekidač okrene, mikrokontroler će biti prekinut i izvršenje programa će biti poslano u rutinu prekida usluga (ISR). ISR će brzo shvatiti na koji način je prekidač rotiran, postaviti odgovarajuću zastavicu i brzo se vratiti u glavni program. To nam se mora dogoditi brzo u slučaju da korisnik rotira prekidač vrlo brzo. Znamo da se sivi kodirani AB uzorak ponavlja na svaka četiri položaja pa ako rutinski radimo na prijelazima između ta četiri položaja, funkcionirat će i na svim ostalim. Uočite da u jednom ciklusu s četiri pozicije postoje četiri ruba. Rastuća i opadajuća ivica za A ulaz kao i B ulaz. Mikroprocesor će se prekidati svaki put kada se pojavi ivica, što znači da će se mikrokontroler prekinuti svaki put kada okrenete gumb. Kao rezultat toga, ISR mora otkriti na koji način je gumb okrenut. Kako bismo lakše shvatili kako to učiniti, okrećemo se valnom obliku za rotaciju u smjeru kazaljke na satu. Primijetite da svaki put kada A ima ivicu, njegova nova vrijednost uvijek se razlikuje od vrijednosti B. Kad gumb pređe iz položaja 1 u 2, A prelazi iz logike-0 u logiku-1. B je za ovaj prijelaz još uvijek 0 i ne podudara se s novom vrijednošću A. Kad gumb pređe iz položaja 3 u 4, A ima opadajuću ivicu, dok B ostaje na logici-1. Opet primijetite da su B i nova vrijednost A različite. Trenutno možemo vidjeti da svaki put kada A uzrokuje prekid tokom rotacije u smjeru kazaljke na satu, njegova nova vrijednost se razlikuje od vrijednosti B. Provjerimo B da vidimo šta se događa. B ima rastuću ivicu kada se prekidač prebaci iz položaja 2 u 3. Ovdje je nova vrijednost B ista kao A. Gledajući posljednju preostalu ivicu za rotaciju u smjeru kazaljke na satu, B ima opadajuću ivicu koja se pomiče iz položaja 4 u 5. (Pozicija 5 je ista kao pozicija 1.) Nova vrijednost B je ista kao A i ovdje! Sada možemo napraviti neke odbitke! Ako A uzrokuje prekid i nova vrijednost A se razlikuje od vrijednosti B, rotacija je bila u smjeru kazaljke na satu. Osim toga, ako B uzrokuje prekid i nova vrijednost B je ista kao A, tada je rotacija bila u smjeru kazaljke na satu. Hajdemo brzo ispitati slučaj rotacije u smjeru suprotnom od kazaljke na satu. Baš kao i rotacija u smjeru kazaljke na satu, rotacija u smjeru suprotnom od kazaljke na satu uzrokovat će četiri prekida u jednom ciklusu: dva za ulaz A i dva za ulaz B. Ulaz A ima rastuću ivicu kada se gumb pomakne iz položaja 4 u 3 i padajući rub koji se pomiče iz položaja 2 u 1 Kada se dugme pomera sa položaja 4 na 3, nova vrednost A je ista kao vrednost B. Uočite da je kada se A pomeri sa položaja 2 na 1 njegova nova vrednost ista kao i vrednost B. Sada možemo vidjeti da je, kada A uzrokuje prekid i njegova nova vrijednost odgovara vrijednosti B, rotacija bila suprotna od kazaljke na satu. Brzo ćemo pogledati ulaz B kako bismo sve provjerili. B će uzrokovati prekid kada se gumb pomakne s položaja 5 (što je isto kao 1) na 4 i kada se gumb pomakne s položaja 3 na 2. U oba ova slučaja, nova vrijednost B ne odgovara postojećoj vrijednosti od A što je suprotno od slučajeva kada B uzrokuje prekid za rotaciju u smjeru kazaljke na satu. Ovo je dobra vijest. Sve se provjerava kako bi trebalo. Ukratko, ako A uzrokuje prekid i njegova nova vrijednost ne odgovara vrijednosti B ili ako B uzrokuje prekid, a nova vrijednost B odgovara vrijednosti A znamo da je došlo do rotacije u smjeru kazaljke na satu. U ostalim slučajevima možemo provjeriti ima li rotacija u smjeru suprotnom od kazaljke na satu u softveru ili možemo pretpostaviti da to nije rotacija u smjeru kazaljke na satu, već u suprotnom smjeru. Moja rutina je jednostavno napravila pretpostavku.

Korak 5: Softver

Softver
Softver
Softver
Softver

Nisam koristio ugrađene prekide u PIC Basic Pro. Koristio sam nekoliko datoteka koje sam uključio u svoj kod od Darrel Taylor za pokretanje rutine. Ovdje Darrelu pripada velika zasluga! Datoteke su besplatne. Samo posjetite njegovu web stranicu za više informacija, druge aplikacije i preuzimanje datoteka. Ovaj dio možete preskočiti ako ne koristite PIC sa Darrel Taylor prekidima. Samo postavite prekide prema potrebi na platformi koju koristite. Da biste postavili Darrel Taylor (DT) prekide, morate učiniti dvije stvari: 1.) Uključite datoteke DT_INTS-14.bas i ReEnterPBP.bas u svoje code.2.) Kopirajte i zalijepite ovo u svoj kod. ASMINT_LIST makro; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, da endm INT_CREATEENDASMIUmetnite kartice i razmake poput grafike na kraju Instructable -a, tako da možete vidjeti stvari malo lakše u svom kodu. Morat ćete ga malo izmijeniti kako bi odgovarao vašim potrebama. U odjeljku Oznaka zamijenite ISR imenom potprograma koji je vaš ISR. Ne zaboravite donju crtu! Trebate! Da bi prekidi funkcionirali, morate učiniti još dvije stvari: 1.) Napišite ISR. Ovo ćete napisati baš kao da ste namjeravali napisati PBP potprogram, osim što ćete morati umetnuti @ INT_RETURN na kraj potprograma umjesto RETURN. Ovo će potvrditi prekid i vratiti izvršenje programa na mjesto gdje je stalo u glavnoj petlji. Unutar ISR -a morate očistiti zastavicu prekida kako se vaš program ne bi uhvatio u rekurzivni prekid. Jednostavno čitanje PORTB -a je sve što je potrebno učiniti da biste obrisali zastavicu prekida na PIC16F877A. Svaki različiti mikrokontroler ima drugačiji način brisanja zastavica prekida. Provjerite tehnički list vašeg mikrokontrolera.2.) Kada dođete do točke u kodu u kojoj želite omogućiti prekid, upotrijebite ovaj red koda:@ INT_ENABLE RBC_INTKada želite onemogućiti prekid, jednostavno upotrijebite:@ INT_DISABLE RBC_INTIma mnogo toga stvari upakovane u ono što sam upravo opisao pa ću ih brzo sažeti. Do sada bi vaš program trebao izgledati otprilike ovako:; Bilo koje potrebno postavljanje ili kodINCLUDE "DT_INTS-14.bas" UKLJUČUJE "ReEnterPBP.bas" ASMINT_LIST makro; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, da endm INT_CREATEENDASM; Bilo koje drugo potrebno postavljanje ili kôd@ INT_ENABLE RBC_INT; Kôd koji mora znati na koji način se dugme okreće@ INT_DISABLE RBC_INT; Ostali kodEND; Kraj programamyISR:; ISR kôd ovdje@ INT_RETURN (Tablica za postavljanje rukovatelja prekida) Mislim da se ovdje mogu ponovo pridružiti svi koji ne koriste PIC ili DT prekide. Sada moramo zapravo napisati ISR kako bi mikrokontroler znao u kojem smjeru se gumb okreće. Podsjetimo se iz odjeljka teorije softvera da možemo zaključiti smjer rotacije ako znamo ulaz koji je izazvao prekid, njegovu novu vrijednost i vrijednost drugog ulaza. Evo pseudokoda: Pročitajte PORTB u varijablu grebanja da biste očistili zastavicu prekida. Provjerite je li A izazvao prekid. Ako je tačno, uporedite A i B. Proverite da li je različito, ako je drugačije, da li je to bila rotacija u suprotnom smeru kazaljke na satu, ili EndifCheck suprotno od kazaljke na satu ako je B izazvao prekid. Ako je tačno, uporedite A i B Proverite da li je različito, ako je isto, da li je to bila rotacija u smeru kazaljke na satu, bilo je obrnuto od kazaljke na satu Povratak iz prekida Kako znamo da li je promena na A ili B izazvala prekid? Otkrivanje nove vrijednosti promijenjenog unosa i drugog (nepromijenjenog) unosa je jednostavno jer ih možemo pročitati unutar ISR -a. Moramo znati kakvo je bilo stanje prije slanja izvršenja na ISR. To se događa u glavnoj rutini. Glavna rutina sjedi i čeka da se varijabla bajta koju smo nazvali CWflag postavi na 1 ili očisti na 0 pomoću ISR -a. Nakon svake potvrđene promjene gumba ili ako nema aktivnosti gumba, varijabla se postavlja na 5 kako bi označila stanje mirovanja. Ako se zastavica postavi ili se obriše, glavna rutina odmah povećava ili smanjuje odgovarajući pritisak pritiska na osnovu rotacije, a zatim postavlja varijablu CWflag natrag na 5 jer je dugme ponovo u stanju mirovanja. Kako je glavna rutina provjera CWflag -a, on također dokumentira stanje vrijednosti A i B okretnog prekidača. Ovo je zaista jednostavno i izgleda ovako: oldA = AoldB = BZaista ovdje nema ništa super otmjeno. Samo uključite te dvije linije na početak petlje koje provjeravaju rotaciju CWflag -a. Samo ažuriramo logičke vrijednosti ulaza s okretnog gumba unutar petlje povećanja/smanjivanja u glavnoj rutini kako bismo mogli vidjeti koji je ulaz uzrokovao prekid prilikom izvršavanja ISR -a. Evo ISR koda: ABchange: scratch = PORTB 'Pročitajte PORTB da biste obrisali zastavicu prekida' Ako A uzrokuje prekid, provjerite smjer okretanja B ako je stariA! = A ONDA 'Ako su A i B različiti, radilo se o rotaciji u smjeru kazaljke na satu IF A! = B THEN GOTO CW 'U suprotnom, radilo se o rotaciji u smjeru suprotnom od kazaljke na satu. ELSE GOTO CCW ENDIF ENDIF' Ako B uzrokuje prekid, provjerite A za smjer rotacije IF oldB! = B THEN 'Ako su A i B isti, je bila rotacija u smjeru kazaljke na satu A A == B THEN GOTO CW 'Inače je to bila rotacija u smjeru kazaljke na satu ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURNI uključili smo ISR kod u datoteku AB_ISR.bas jer kartice u kodu se ne prikazuju onako kako bi trebale. Sada, jer ISR ima stare vrijednosti za ulaze A i B, može odrediti koji je ulaz uzrokovao prekid, usporediti ga s drugim (nepromijenjenim) ulazom i odrediti smjer rotacije. Sve što glavna rutina mora učiniti je provjeriti CWflag da vidi u kojem je smjeru gumb okrenut (ako jeste) i povećao ili smanjio brojač, zadanu vrijednost ili što god želite ili trebate. Nadam se da je ovo pomoglo, ali nije bilo previše zbunjujuće. Ova vrsta sučelja je posebno korisna ako vaš sistem već koristi prekide jer je ovo samo još jedan prekid za dodavanje. Uživajte!

Preporučuje se: