Sadržaj:

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

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

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

Cilj ovog Instructablea je ilustrirati kako spojiti digitalni (kvadraturno kodirani) okretni prekidač s mikrokontrolerom. Ne brinite, objasnit ću vam što za nas znači kvadraturno kodiranje. Ovo sučelje i prateći softver omogućit će mikrokontroleru da prepozna smjer rotacije za svaki pomak od jednog zadržavanja do drugog. Nedavno sam koristio ovu vrstu prekidača u projektu mikrokontrolera koji je zahtijevao unos zadane vrijednosti tlaka pomoću gumba sa 16 detents umjesto gumba za gore/dolje. Ideja je bila omogućiti korisniku da "okrene" željeni pritisak. Kao rezultat toga, morali smo razviti softversku rutinu za dobivanje informacija o položaju sa prekidača i zaključivanje smjera rotacije kako bi se povećala ili smanjila zadana vrijednost tlaka za glavni sustav. U ovom Instructableu pokriti ću fizičko sučelje mikrokontroleru, teoriju rada rotacijskog 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 ću i podijeliti ono što sam učinio kako biste mogli vidjeti određenu aplikaciju.

Korak 1: Dijelovi

Dijelovi
Dijelovi

Da biste to proveli, trebat će vam: Okretni prekidač (kvadraturno kodiran) Povucite 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 8,2 k ohmske otpornike na dvije podatkovne linije koje dolaze iz prekidača. Morat ćete provjeriti podatkovni list za koder koji ste odlučili koristiti. Okretni prekidač koji sam koristio može se naručiti i pomoću aksijalnog prekidača. To je korisna značajka za odabir odabranih brojeva itd., Ali ovdje neću raspravljati o njegovom sučelju. Na popisu imam "prikladnu platformu za mikrokontroler" jer se (mislim) to 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 kôd u PIC Basic Pro za upotrebu s 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 prekid promjene PORTB. Na drugim kontrolerima mogu postojati drugi nazivi za to. Ova značajka 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 priključaka na mikrokontroler. Svaki izlaz prekidača tada bi bio vezan za pin na mikrokontroleru tako da mikrokontroler može provjeriti svaki položaj biranja. Ovo je pretjerano korištenje I/O pinova. Stvari postaju još gore ako želimo da nam na prekidaču bude dostupno više od 16 pozicija (detenta). Svaki dodatni položaj prekidača zahtijeva dodatni ulaz u mikrokontroler. Ovo brzo postaje vrlo neučinkovito korištenje ulaza na mikrokontroleru. Unesite ljepotu okretnog prekidača. Okretni prekidač ima samo dva izlaza za mikrokontroler naveden kao A i B na podatkovnom listu. Postoje samo četiri moguće logičke razine koje ove linije mogu poprimiti: AB = 00, 01, 10 i 11. To uvelike smanjuje broj ulaznih linija koje morate koristiti za spajanje sklopke na mikrokontroler. Dakle, smanjili smo broj ulaznih linija na samo dvije. Što sad? Čini se da nam stvarno treba 16 različitih stanja, ali ovaj novi prekidač ima samo četiri. Jesmo li sebi pucali u nogu? Ne. Nastavi čitati. Pojasnit ćemo malo teorije iza operacije okretnog prekidača kako bismo je objasnili.

Korak 3: Hardverska teorija rada

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 spomenute sklopke "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 iz prekidača i prevesti ih u smjer rotacije. Ranije sam spomenuo da je sklopka kvadratno kodirana. Ovo je također jedan od ključnih elemenata ovog rješenja. To znači da prekidač daje 2-bitni kod koji odgovara položaju prekidača. Možda mislite: "Ako mikrokontroler ima dvobitni ulaz, kako predstavljamo 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 gumba nije bitan. Kod rotacije u smjeru kazaljke na satu, kôd 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 potonji uzorak mijenja samo jedan ulaz između skupove. 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 prekid promjene PORTB -a na PIC16F877A. Svaki put kad se prekidač okrene, mikrokontroler će biti prekinut, a izvršenje programa poslano u rutinu usluge prekida (ISR). ISR će brzo shvatiti na koji je način prekidač zakrenut, na odgovarajući način postaviti 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 položaja postoje četiri ruba. Rastuća i opadajuća ivica za A ulaz, kao i B ulaz. Mikroprocesor će biti prekinut svaki put kad se pojavi rub, što znači da će se mikrokontroler prekinuti svaki put kad okrenete gumb. Zbog toga ISR mora otkriti na koji je način gumb okrenut. Kako bismo lakše shvatili kako to učiniti, okrećemo se valnom obliku za rotaciju u smjeru kazaljke na satu. Uočite da svaki put kada A ima rub, 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 padajući rub, dok B ostaje na logici-1. Opet primijetimo da su B i nova vrijednost A različiti. Trenutno možemo vidjeti da svaki put kada A uzrokuje prekid tijekom rotacije u smjeru kazaljke na satu, njegova nova vrijednost se razlikuje od vrijednosti B. Provjerimo B da vidimo što se događa. B ima rastući rub pri prelasku prekidača iz položaja 2 u 3. Ovdje je nova vrijednost B ista kao A. Gledajući posljednji preostali rub za rotaciju u smjeru kazaljke na satu, B ima padajući rub koji se pomiče iz položaja 4 u 5. (Pozicija 5 je ista kao pozicija 1.) Nova vrijednost B jednaka je 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ći rub kada se gumb pomakne iz položaja 4 u 3 i padajući rub koji se pomiče iz položaja 2 u 1. Kad se gumb pomakne s položaja 4 na 3, nova vrijednost A ista je kao vrijednost B. Primijetite da kada se A pomakne s položaja 2 na 1 njegova nova vrijednost je ista kao i vrijednost B. Sada možemo vidjeti da je, kada A uzrokuje prekid i njegova nova vrijednost odgovara vrijednosti B, rotacija bila u smjeru suprotnom od kazaljke na satu. Brzo ćemo pogledati ulaz B kako bismo sve provjerili. B će uzrokovati prekid kad 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 slučajevima 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, nego suprotno od kazaljke na satu. Moja rutina jednostavno je pretpostavila.

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 Darrela Taylora za pokretanje rutine. Ovdje Darrelu pripada velika zasluga! Datoteke su besplatne. Samo posjetite njegovu web stranicu za više informacija, druge aplikacije i za 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 svoj code.2.) Kopirajte i zalijepite ovo u svoj code. ASMINT_LIST makronaredba; 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 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! Kako bi prekidi funkcionirali, morate učiniti još dvije stvari: 1.) Napišite ISR. Napisat ćete ovo baš kao što ste htjeli napisati PBP potprogram, osim što ćete morati umetnuti @ INT_RETURN na kraju potprograma umjesto RETURN. Ovo će potvrditi prekid i vratiti izvršavanje 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 podatkovni list za svoj mikrokontroler.2.) Kad u svom kodu dođete do točke u kojoj želite omogućiti prekid, upotrijebite ovaj redak koda:@ INT_ENABLE RBC_INTKada želite onemogućiti prekid, jednostavno upotrijebite:@ INT_DISABLE RBC_INTIma mnogo toga stvari upakirane u ono što sam upravo obrađivao pa ću 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 makronaredbu; 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 se način gumb okreće@ INT_DISABLE RBC_INT; Drugi kodEND; Kraj programamyISR:; ISR kôd ovdje@ INT_RETURN (Tablica za postavljanje rukovatelja prekida) Mislim da se ovdje mogu ponovno 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 uzrokovao prekid, njegovu novu vrijednost i vrijednost drugog ulaza. Evo pseudokoda: Pročitajte PORTB u varijablu grebanja da biste očistili flagCheck ako je A uzrokovao prekid. Ako je točno, usporedite A i B. Provjerite je li različito, ako je drugačije, je li to bila rotacija u smjeru kazaljke na satu, bilo je suprotno od kazaljke na satu, provjerite je li B uzrokovao prekid. Ako je točno, Usporedite A i B Provjerite je li drugačije, ako je isto, To je bila rotacija u smjeru kazaljke na satu Ostalo, Bilo je suprotno od kazaljke na satu Povratak iz prekida Kako možemo znati je li promjena na A ili B uzrokovala prekid? Otkrivanje nove vrijednosti promijenjenog unosa i drugog (nepromijenjenog) unosa jednostavno je jer ih možemo pročitati unutar ISR -a. Moramo znati kakvo je bilo stanje prije nego što se izvršenje pošalje ISR -u. 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 briše, glavna rutina odmah povećava ili smanjuje odgovarajući pritisak tlaka na temelju rotacije, a zatim postavlja varijablu CWflag natrag na 5 jer je gumb sada ponovno u stanju mirovanja. Kako je glavna rutina provjera CWflag -a, ona također dokumentira stanje vrijednosti rotacijskih prekidača A i B. Ovo je stvarno jednostavno i izgleda ovako: oldA = AoldB = BZaista ovdje nema ničeg super maštovitog. Samo uključite ta dva retka na početak petlje koja provjerava rotaciju CWflag -a. Upravo 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 za brisanje zastavice 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 'Inače, 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 kôd u datoteku AB_ISR.bas jer kartice u kodu ne prikazuju se 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 ručica okrenuta (ako jest) i povećala ili smanjila brojač, zadanu točku ili što god želite ili trebate. Nadam se da je ovo pomoglo, ali nije bilo previše zbunjujuće. Ova vrsta sučelja posebno je korisna ako vaš sustav već koristi prekide jer je ovo samo još jedan prekid za dodavanje. Uživati!

Preporučeni: