Sisukord:

Pöörlemissuuna tõlgendamine digitaalse pöördlüliti abil PIC -iga: 5 sammu
Pöörlemissuuna tõlgendamine digitaalse pöördlüliti abil PIC -iga: 5 sammu

Video: Pöörlemissuuna tõlgendamine digitaalse pöördlüliti abil PIC -iga: 5 sammu

Video: Pöörlemissuuna tõlgendamine digitaalse pöördlüliti abil PIC -iga: 5 sammu
Video: Kuidas aju lahendab ebamääraseid olukordi? Psühhobuss selgitab. 2024, November
Anonim
Pöörlemissuuna tõlgendamine digitaalse pöördlüliti abil PIC -iga
Pöörlemissuuna tõlgendamine digitaalse pöördlüliti abil PIC -iga

Selle juhendi eesmärk on illustreerida digitaalse (kvadratuuriga kodeeritud) pöördlüliti ühendamist mikrokontrolleriga. Ärge muretsege, ma selgitan, mida kodeeritud kvadratuur meie jaoks tähendab. See liides ja kaasasolev tarkvara võimaldavad mikrokontrolleril tuvastada pöörlemissuunda iga liigutuse eest ühelt kinnituselt teisele. Hiljuti kasutasin seda tüüpi lülitit mikrokontrolleri projektis, mis nõudis rõhu seadepunkti sisestamist 16 nupuga kinnitusnupud üles/alla nuppude asemel. Idee oli võimaldada kasutajal soovitud rõhk "sisse helistada". Selle tulemusena pidime välja töötama tarkvara rutiini, et saada lülitilt asenditeave ja tuletada pöörlemissuund, et suurendada või vähendada põhisüsteemi rõhu seadepunkti. Selles juhendis käsitlen füüsilist liidest mikrokontrollerile, pöördlüliti tööteooria, tarkvara tööteooria ja ka mahaarvamisrutiin. Lõpuks näitan teile oma mahaarvamisrutiini rakendamist. Edasimineku ajal püüan hoida asjad mõnevõrra üldistena, et ideed saaks rakendada võimalikult paljudel platvormidel, kuid jagan ka seda, mida tegin, et näeksite konkreetset rakendust.

Samm: osad

Osad
Osad

Selle rakendamiseks vajate: Pöördlülitit (kvadratuuriga kodeeritud) Tõmba takistid üles Sobiv mikrokontrolleri platvorm Oma projekti jaoks kasutasin optilist kodeerijat Grayhill 61C22-01-04-02. Pöördlüliti andmeleht nõuab kahelt lülitilt tuleva andmeliini jaoks 8,2 kΩ tõmbe takistit. Soovite kontrollida kasutatava kodeerija andmelehte. Minu kasutatavat pöördlülitit saab tellida ka aksiaalse vajutusnupuga. See on kasulik funktsioon valikute tegemiseks, mis on valitud jne, kuid ma ei aruta siin selle liidest. Mul on loetletud "sobiv mikrokontrollerite platvorm", sest (ma arvan) saab seda rakendada rohkem kui ühel platvormil. Olen näinud palju inimesi, kes kasutavad Instructablesi jaoks muid mikrokontrollereid, nii et tahan näidata ka üldist lähenemist. Kirjutasin kogu koodi PIC Basic Pro -s kasutamiseks mikrokiibiga PIC16F877A. Tõepoolest, peamine asi, mida vajate mikrokontrolleril, on võime katkestada, kui mõlemal tihvtil on loogika muutus. Seadmel PIC16F877A nimetatakse seda PORTB muutmise katkestuseks. Teistel kontrolleritel võib sellele olla ka teisi nimesid. See mikrokontrolleri katkestamise funktsioon on osa sellest, mis muudab selle rakenduse nii elegantseks.

2. samm: riistvaraliides

Riistvara liides
Riistvara liides

"Lihtne" lahendus oleks "ühepooluseline 16" lüliti, millel on 16 ühendust mikrokontrolleriga. Seejärel seotakse iga lüliti väljund mikrokontrolleri tihvtiga, nii et mikrokontroller saab kontrollida iga valimisasendit. See on I/O kontaktide liigne kasutamine. Asjad lähevad veelgi hullemaks, kui tahame, et lülitil oleks rohkem kui 16 positsiooni (kinnipidamist). Iga lüliti lisapositsioon nõuaks mikrokontrollerile täiendavat sisendit. See muutub kiiresti mikrokontrolleri sisendite väga ebaefektiivseks kasutamiseks. Sisestage pöördlüliti ilu. Pöördlülitil on ainult kaks väljundit mikrokontrollerile, mis on andmelehel märgitud A ja B. Nendel liinidel on ainult neli võimalikku loogikataset: AB = 00, 01, 10 ja 11. See vähendab oluliselt sisendliinide arvu, mida peate lüliti ühendamiseks mikrokontrolleriga kasutama. Niisiis oleme vähendanud sisendliinide arvu vaid kaheni. Mis nüüd? Tundub, et meil on tõesti vaja 16 erinevat olekut, kuid sellel uuel lülitil on ainult neli. Kas oleme endale jalga lasknud? Ei. Loe edasi. Selgituseks käsitleme natuke pöördlüliti toimimise teooriat.

3. samm: riistvarateooria

Riistvara tööteooria
Riistvara tööteooria
Riistvara tööteooria
Riistvara tööteooria
Riistvara tööteooria
Riistvara tööteooria

Pöörlemissuuna tuvastamine on võimalik, kasutades ülalnimetatud "ühepooluselist 16" lülitit, kuid see kasutab palju mikrokontrolleri sisendeid. Pöördlüliti kasutamine vähendab mikrokontrolleri sisendite arvu, kuid nüüd peame tõlgendama lülitist tulevaid signaale ja teisendama need pöörlemissuunda. Varem mainisin, et lüliti oli kvadratuuriga kodeeritud. See on ka selle lahenduse üks peamisi elegantseid. See tähendab, et lüliti annab 2-bitise koodi, mis vastab lüliti asendile. Võib -olla mõtlete: "Kui mikrokontrollerile on kahebitine sisend, siis kuidas me esindame kõiki 16 positsiooni?" See on hea küsimus. Me ei esinda neid kõiki. Peame lihtsalt teadma nupu suhtelisi positsioone, et saaksime määrata pöörlemissuuna. Nupu absoluutne asend ei oma tähtsust. Päripäeva pöörlemise korral kordub lüliti antud kood iga nelja kinnituskohaga ja see on halli kodeeritud. Halliga kodeeritud tähendab, et iga positsiooni muutmise korral on ainult üks bitimuutus. Selle asemel, et AB sisend loeks päripäeva pöörlemiseks binaarselt järgmiselt: 00, 01, 10, 11, muutub see järgmiselt: 00, 10, 11, 01. Pange tähele, et viimase mustri puhul muutub ainult üks sisend komplektid. Mikrokontrolleri AB sisendi vastupäeva väärtused näevad välja sellised: 00, 01, 11, 10. See on lihtsalt päripäeva mustri tagurpidi, esmalt loetletud AB = 00. Visuaalsema selgituse saamiseks vaadake diagramme.

4. samm: tarkvara toimimise teooria

Tarkvara tööteooria
Tarkvara tööteooria

Pöörlemissuuna tuletav rutiin on katkestatud. Teie valitud mikrokontroller peab suutma katkestada igal ajal, kui katkestamise lubamisel on kumbki (vähemalt) kaks tihvti muutunud. Seda nimetatakse PIC16F877A PORTB muutmise katkestuseks. Iga kord, kui lülitit pööratakse, katkestatakse mikrokontroller ja programmi täitmine saadetakse teenuse Interrupt Service Rutin (ISR) katkestusteenusele. ISR selgitab kiiresti välja, mis suunas lüliti pöörati, määrab lipu asjakohaselt ja naaseb kiiresti põhiprogrammi. Peame seda kiiresti juhtuma, kui kasutaja pöörab lülitit väga kiiresti. Me teame, et halli kodeeritud AB -muster kordub iga nelja positsiooni järel, nii et kui me teeme nende nelja positsiooni vaheliste üleminekute rutiinset tööd, töötab see kõigi teiste jaoks. Pange tähele, et ühes nelja positsiooni tsüklis on neli serva. Tõusev ja langev serv nii A sisendi kui ka B sisendi jaoks. Mikroprotsessor katkeb iga kord, kui on serv, mis tähendab, et mikrokontroller katkestatakse iga kord, kui nuppu keeratakse. Selle tulemusena peab ISR välja selgitama, mis suunas nuppu keerati. Et aidata meil aru saada, kuidas seda teha, pöördume päripäeva pöörlemise lainekuju poole. Pange tähele, et igal ajal, kui A-l on serv, erineb selle uus väärtus alati väärtusest B. Kui nupp liigub asendist 1 asendisse 2, läheb A üle loogikast-0 loogikasse 1. B on selle ülemineku korral endiselt 0 ja ei vasta uuele väärtusele A. Kui nupp liigub asendist 3 asendisse 4, on A langeva servaga ja B jääb loogika-1 juurde. Pange uuesti tähele, et B ja A uus väärtus on erinevad. Praegu näeme, et igal ajal A põhjustab päripäeva pöörlemise ajal katkestuse, selle uus väärtus erineb B väärtusest. Vaatame, mis juhtub. B -l on tõusev serv, kui lüliti liigub asendist 2 asendisse 3. Siin on B uus väärtus sama mis A. Vaadates päripäeva pöörlemise viimast järelejäänud serva, on B -l langev serv, mis liigub asendist 4 asendisse 5. (Positsioon 5 on sama mis positsioon 1.) Ka siin on B uus väärtus sama mis A! Nüüd saame teha mõned mahaarvamised! Kui A põhjustab katkestuse ja A uus väärtus erineb B väärtusest, toimus pöörlemine päripäeva. Lisaks, kui B põhjustab katkestuse ja B uus väärtus on sama mis A, siis pöörlemine toimus päripäeva. Uurime kiiresti vastupäeva pöörlemise juhtumit. Nii nagu päripäeva pööramine, põhjustab ka vastupäeva pööramine ühe tsükli jooksul neli katkestust: kaks sisendi A ja kaks sisendi B puhul. Sisendil A on tõusvas serv, kui nupp liigub asendist 4 asendisse 3 ja langev serv asendist 2 asendisse 1 Kui nupp liigub asendist 4 asendisse 3, on A uus väärtus sama, mis väärtusel B. Pange tähele, et kui A liigub asendist 2 asendisse 1, on selle uus väärtus sama mis ka B väärtusel. Nüüd näeme, et kui A põhjustab katkestuse ja selle uus väärtus vastab B väärtusele, toimus pöörlemine vastupäeva. Kiiresti vaatame sisendit B, et kõike kontrollida. B põhjustab katkestuse, kui nupp liigub asendist 5 (mis on sama kui 1) 4 ja kui nupp liigub asendist 3 asendisse 2. Mõlemal juhul ei ühti B uus väärtus olemasoleva väärtusega A, mis on vastupidine juhtudele, kui B põhjustab päripäeva pöörlemise katkestuse. See on hea uudis. Kõik kontrollib nii nagu peaks. Kokkuvõtteks võib öelda, et kui A põhjustab katkestuse ja selle uus väärtus ei ühti väärtusega B või kui B põhjustab katkestuse ja B uus väärtus vastab väärtusele A, teame, et pöörlemine toimus päripäeva. Võime kontrollida teisi juhtumeid tarkvara vastupäeva pöörlemise suhtes või eeldada, et kuna see ei pööranud päripäeva, oli see vastupäeva. Minu rutiin tegi lihtsalt oletuse.

Samm: tarkvara

Tarkvara
Tarkvara
Tarkvara
Tarkvara

Ma ei kasutanud PIC Basic Pro sisseehitatud katkestusi. Kasutasin rutiini juhtimiseks paari faili, mille Darrel Taylorilt oma koodi lisasin. See on koht, kus Darrelile suur au kuulub! Failid on tasuta. Lisateabe, muude rakenduste ja failide allalaadimiseks külastage lihtsalt tema veebisaiti. Selle osa saate vahele jätta, kui te ei kasuta PIC -i koos Darrel Taylori katkestustega. Seadistage katkestused lihtsalt vajalikul platvormil, mida kasutate. Darrel Taylori (DT) katkestuste seadistamiseks tuleb teha kahte asja: 1.) Lisage oma failid DT_INTS-14.bas ja ReEnterPBP.bas code.2.) Kopeerige ja kleepige see oma koodi. ASMINT_LIST makro; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, jah endm INT_CREATEENDASMI Sisestage vahelehed ja tühikud, näiteks graafika Instructable'i lõppu, nii et näete oma koodis asju pisut lihtsamini. Peate seda oma vajadustele vastavaks pisut muutma. Asendage jaotises Silt ISR selle alamprogrammi nimega, mis on teie ISR. Ära unusta alajoont! Teil on seda vaja! Katkestuste toimimiseks tuleb teha veel kaks asja: 1.) Kirjutage ISR. Kirjutate selle täpselt nii, nagu kavatsesite kirjutada PBP alamprogrammi, välja arvatud see, et alamprogrammi lõppu tuleb sisestada @ INT_RETURN, mitte RETURN. See tunnistab katkestust ja tagastab programmi käivitamise sinna, kus see põhiahelas pooleli jäi. ISR -i sees peate tühistama katkestuse lipu, et teie programm ei jääks rekursiivse katkestuse juurde. Lihtsalt PORTB lugemine on kõik, mida tuleb teha, et kustutada katkestuslipp PIC16F877A -lt. Igal erineval mikrokontrolleril on katkestuslippide kustutamiseks erinev viis. 2.) Kui jõuate oma koodi punkti, mille soovite katkestuse lubada, kasutage seda koodirida:@ INT_ENABLE RBC_INTKui soovite katkestuse keelata, kasutage lihtsalt:@ INT_DISABLE RBC_INT Seal on palju pakitud asjadesse, mida ma just katsin, nii et teen kiiresti kokkuvõtte. Siiani peaks teie programm välja nägema umbes selline:; Kõik vajalikud seadistused või koodINCLUDE "DT_INTS-14.bas" INCLUDE "ReEnterPBP.bas" ASMINT_LIST makro; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, jah endm INT_CREATEENDASM; Kõik muud vajalikud seadistused või koodid@ INT_ENABLE RBC_INT; Kood, mis peab teadma, mis suunas nupp pöörleb@ INT_DISABLE RBC_INT; Muu koodEND; ProgrammyISR lõpp:; ISR -kood siin@ INT_RETURN (katkestuste töötleja seadistustabel) Ma arvan, et siin saavad uuesti liituda kõik, kes ei kasuta PIC- või DT -katkestusi. Nüüd peame tegelikult ISR -i kirjutama, et mikrokontroller teaks, mis suunas nupp pöörleb. Tuletame tarkvarateooria jaotisest meelde, et saame tuletada pöörlemissuuna, kui teame katkestuse põhjustanud sisendi, selle uue väärtuse ja muu sisendi väärtuse. Siin on pseudokood: lugege katkestuslipu kustutamiseks PORTB kriimustusmuutijasse Kontrollige, kas A põhjustas katkestuse. Kui see on tõene, võrrelge A ja B. Kontrollige, kas need on erinevad, kui erinevad, see oli päripäeva pööramine Muidu, see oli vastupäeva EndifCheck, kas B põhjustas katkestuse. Kui see on tõene, võrrelge A ja B Kontrollige, kas see erineb, kui see on sama, see oli päripäeva pöörlemine Muidu, see oli vastupäeva EndifReturn from interruptKuidas me teame, kas A või B muutus põhjustas katkestuse? Muudetud sisendi ja muu (muutmata) sisendi uue väärtuse avastamine on lihtne, sest saame neid lugeda ISR -i sees. Enne hukkamise ISR -ile saatmist peame teadma, milline oli igaühe olukord. See juhtub põhirutiinis. Põhirutiin istub ja ootab, kuni baasmuutuja, mille nimetasime CWflagiks, seatakse väärtuseks 1 või kustutatakse ISR -iga 0. Pärast iga kinnitatud nupuvahetust või kui nupu tegevust ei toimu, seatakse muutuja väärtuseks 5, et näidata jõudeolekut. Kui lipp määratakse või tühjendatakse, suurendab põhirutiin viivitamatult seadistuspunkti rõhku vastavalt pöörlemisele ja seab CWflag muutuja tagasi väärtusele 5, kuna nupp on nüüd taas tühikäigul. Kuna peamine rutiin on CWflag'i kontrollimine, dokumenteerib see ka A ja B pöördlüliti väärtuste olekut. See on tõesti lihtne ja näeb välja selline: oldA = AoldB = B Siin pole tõesti midagi ülimalt uhket. Lihtsalt lisage need kaks rida tsükli algusesse, mis kontrollib CW -lipu pöörlemist. Värskendame lihtsalt põhirutiini juurdekasvu/vähendamise ahela sees oleva pöördnupu sisendite loogilisi väärtusi, et näha, milline sisend põhjustas katkestuse ISR -i käivitamisel. Siin on ISR -kood: ABchange: scratch = PORTB 'Katkestuslipu kustutamiseks lugege PORTB -d' Kui A põhjustab katkestuse, kontrollige B pöörlemissuunda IF oldA! = A THEN 'Kui A ja B on erinevad, oli see päripäeva pööramine IF A! = B THEN GOTO CW 'Vastasel korral oli see vastupäeva pöörlemine ELSE GOTO CCW ENDIF ENDIF' Kui B põhjustab katkestuse, kontrollige A pöörlemissuunda IF oldB! = B THEN 'Kui A ja B on samad, oli päripäeva pööramine IF A == B THEN GOTO CW 'Vastasel korral oli see vastupäeva pööramine ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURNI olen ISR koodi AB_ISR.bas faili lisanud, sest koodi vahekaarte ei kuvata nii, nagu peaks. Nüüd, kuna ISR -il on sisendite A ja B vanad väärtused, saab see kindlaks teha, milline sisend katkestuse põhjustas, võrrelda seda teise (muutmata) sisendiga ja määrata suund pöörlemisest. Kõik peamine rutiin peab tegema, on kontrollida CWflagit, et näha, mis suunas nupp on pööranud (kui on) ja suurendada või vähendada loendurit, seadistuspunkti või mida iganes soovite või vajate. Loodan, et see aitab ja pole olnud liiga segane. Seda tüüpi liides on eriti kasulik, kui teie süsteem juba kasutab katkestusi, kuna see on ainult üks katkestus, mida lisada. Nautige!

Soovitan: