Turinys:

Kaip interpretuoti sukimosi kryptį naudojant skaitmeninį sukamąjį jungiklį su PIC: 5 žingsniai
Kaip interpretuoti sukimosi kryptį naudojant skaitmeninį sukamąjį jungiklį su PIC: 5 žingsniai

Video: Kaip interpretuoti sukimosi kryptį naudojant skaitmeninį sukamąjį jungiklį su PIC: 5 žingsniai

Video: Kaip interpretuoti sukimosi kryptį naudojant skaitmeninį sukamąjį jungiklį su PIC: 5 žingsniai
Video: 95 kodas pamoka tema 11 Krovinių Fiksavimo įtaisai ir Jų naudojimas 2024, Liepa
Anonim
Kaip interpretuoti sukimosi kryptį naudojant skaitmeninį sukamąjį jungiklį su PIC
Kaip interpretuoti sukimosi kryptį naudojant skaitmeninį sukamąjį jungiklį su PIC

Šios instrukcijos tikslas yra parodyti, kaip sujungti skaitmeninį (kvadratūra koduotą) sukamąjį jungiklį su mikrovaldikliu. Nesijaudinkite, aš paaiškinsiu, ką mums reiškia koduojama kvadratūra. Ši sąsaja ir pridedama programinė įranga leis mikrovaldikliui atpažinti sukimosi kryptį kiekvienam judesiui iš vieno fiksatoriaus į kitą. Neseniai naudoju tokio tipo jungiklį mikrovaldiklio projekte, kuriam reikėjo įvesti slėgio nustatymo tašką naudojant rankenėlę su 16 fiksuoja, o ne aukštyn/žemyn mygtukus. Idėja buvo leisti vartotojui „surinkti“norimą slėgį. Dėl to turėjome sukurti programinę įrangą, kad gautume informaciją apie padėtį iš jungiklio ir nustatytume sukimosi kryptį, kad padidintume arba sumažintume pagrindinės sistemos slėgio nustatymo tašką. Šioje instrukcijoje aptarsiu fizinę sąsają mikrovaldikliui, sukamojo jungiklio veikimo teoriją, programinės įrangos veikimo teoriją ir išskaičiavimo tvarką. Galiausiai parodysiu, kaip aš pritaikiau atskaitymą. Tobulėdami stengiuosi, kad viskas būtų šiek tiek bendro pobūdžio, kad idėją būtų galima pritaikyti kuo daugiau platformų, bet taip pat pasidalinsiu tuo, ką padariau, kad pamatytumėte konkrečią programą.

1 žingsnis: dalys

Dalys
Dalys

Norėdami tai įgyvendinti, jums reikės: rotacinio jungiklio (koduojama kvadratūra); traukti varžus; tinkama mikrovaldiklio platforma. Rotacinio jungiklio duomenų lape nurodoma, kad abiejose duomenų linijose, gaunamose iš jungiklio, yra 8,2 k ohm traukos rezistoriai. Norėsite patikrinti kodavimo įrenginio, kurį pasirinkote naudoti, duomenų lapą. Mano naudojamą sukamąjį jungiklį taip pat galima užsisakyti su ašiniu mygtuko jungikliu. Tai naudinga funkcija atliekant pasirinkimus, kurie buvo surinkti ir pan., Bet čia neaptarinėsiu jo sąsajos. Turiu „tinkamą mikrovaldiklio platformą“, nes (manau) tai galima įgyvendinti daugiau nei vienoje platformoje. Mačiau daug žmonių, naudojančių kitus „Instructables“mikrovaldiklius, todėl noriu parodyti ir bendrą požiūrį. Visą kodą parašiau programoje „PIC Basic Pro“, skirtą naudoti su mikroschema PIC16F877A. Tiesą sakant, pagrindinis dalykas, kurio jums reikia mikrovaldiklyje, yra galimybė pertraukti, kai logiškai pasikeičia bet kuris iš dviejų kaiščių. „PIC16F877A“tai vadinama PORTB pakeitimo nutraukimu. Kituose valdikliuose gali būti kitų pavadinimų. Ši mikrovaldiklio pertraukimo funkcija yra dalis to, kas daro šį įgyvendinimą tokį elegantišką.

2 žingsnis: Aparatūros sąsaja

Techninės įrangos sąsaja
Techninės įrangos sąsaja

„Paprastas“sprendimas būtų „vieno poliaus-16 metimo“jungiklis su 16 jungčių prie mikrovaldiklio. Tada kiekvienas jungiklio išėjimas būtų susietas su mikrovaldiklio kaiščiu, kad mikrovaldiklis galėtų patikrinti kiekvieną ratuko padėtį. Tai per didelis įvesties/išvesties kaiščių naudojimas. Viskas dar blogiau, jei norime, kad jungiklyje būtų daugiau nei 16 pozicijų (sulaikymų). Kiekviena papildoma jungiklio padėtis reikalauja papildomo įvesties į mikrovaldiklį. Tai greitai tampa labai neefektyviu mikrovaldiklio įvesties naudojimu. Įveskite sukamojo jungiklio grožį. Rotacinis jungiklis turi tik du išėjimus į mikrovaldiklį, išvardytus duomenų lape kaip A ir B. Yra tik keturi galimi loginiai lygiai, kuriuos gali naudoti šios eilutės: AB = 00, 01, 10 ir 11. Tai labai sumažina įvesties linijų, kurias turite naudoti jungdami jungiklį prie mikrovaldiklio, skaičių. Taigi, mes sumažinome įvesties eilučių skaičių iki dviejų. Kas dabar? Atrodo, kad mums tikrai reikia 16 skirtingų būsenų, tačiau šis naujas jungiklis turi tik keturias. Ar šovėme sau į kojas? Ne. Skaityk. Mes paaiškinsime truputį sukamojo jungiklio veikimo teorijos.

3 žingsnis: Aparatūros veikimo teorija

Techninės įrangos veikimo teorija
Techninės įrangos veikimo teorija
Techninės įrangos veikimo teorija
Techninės įrangos veikimo teorija
Techninės įrangos veikimo teorija
Techninės įrangos veikimo teorija

Sukimosi krypties jutiklis yra įmanomas naudojant aukščiau minėtą „vieno poliaus-16 metimo“jungiklį, tačiau jis naudoja daug mikrovaldiklio įėjimų. Naudojant sukamąjį jungiklį, sumažėja įėjimų į mikrovaldiklį skaičius, tačiau dabar turime interpretuoti iš jungiklio gaunamus signalus ir išversti juos į sukimosi kryptį. Anksčiau minėjau, kad jungiklis buvo koduotas kvadratūra. Tai taip pat yra viena iš pagrindinių šio sprendimo elegancijų. Tai reiškia, kad jungiklis suteikia 2 bitų kodą, atitinkantį jungiklio padėtį. Galbūt galvojate: „Jei į mikrovaldiklį įvedami dviejų bitų duomenys, kaip pavaizduoti visas 16 pozicijų?“Tai geras klausimas. Mes neatstovaujame jiems visiems. Mums tereikia žinoti santykines rankenėlės pozicijas, kad galėtume nustatyti sukimosi kryptį. Absoliuti rankenėlės padėtis neturi reikšmės. Sukant pagal laikrodžio rodyklę, jungiklio pateiktas kodas kartojasi kas keturis įkalčius ir yra pilkai užkoduotas. Pilkai koduotas reiškia, kad kiekvieną pozicijos pakeitimą galima pakeisti tik vienu bitu. Vietoj to, kad AB įvestis skaičiuotų pagal laikrodžio rodyklę dvejetainėje formoje: 00, 01, 10, 11, ji pasikeis taip: 00, 10, 11, 01. Atkreipkite dėmesį, kad pastarajam modeliui tik vienas įėjimas keičiasi tarp rinkiniai. AB įvesties į mikrovaldiklį vertės prieš laikrodžio rodyklę atrodys taip: 00, 01, 11, 10. Tai tiesiog laikrodžio rodyklės pagal laikrodžio rodyklę atvirkštinė tvarka, kai AB = 00 išvardyta pirmiausia. Pažvelkite į diagramas, kad gautumėte vizualesnį paaiškinimą.

4 žingsnis: programinės įrangos veikimo teorija

Programinės įrangos veikimo teorija
Programinės įrangos veikimo teorija

Rutina, leidžianti nustatyti sukimosi kryptį, yra pertraukiama. Pasirinktas mikrovaldiklis turi galėti nutraukti bet kuriuo metu, kai įjungus pertrauką pasikeičia vienas (bent) du kaiščiai. Tai vadinama PICB keitimo pertrauka PIC16F877A. Kiekvieną kartą pasukus jungiklį, mikrovaldiklis bus nutrauktas, o programos vykdymas bus siunčiamas į pertraukimo paslaugų tvarką (ISR). ISR greitai išsiaiškins, kokiu būdu buvo pasuktas jungiklis, tinkamai nustatys vėliavą ir greitai grįš į pagrindinę programą. Mums reikia, kad tai įvyktų greitai, jei vartotojas labai greitai pasuktų jungiklį. Mes žinome, kad pilkai koduotas AB modelis kartojasi kas keturias pozicijas, taigi, jei atliksime įprastą darbą perėjimams tarp šių keturių pozicijų, jis veiks ir visiems kitiems. Atkreipkite dėmesį, kad per vieną keturių pozicijų ciklą yra keturi kraštai. Kylantis ir krintantis kraštas A įėjimui ir B įėjimui. Mikroprocesorius bus nutrauktas kiekvieną kartą, kai yra kraštas, o tai reiškia, kad mikrovaldiklis bus nutrauktas kiekvieną kartą pasukus rankenėlę. Dėl to ISR turi išsiaiškinti, kuria kryptimi buvo pasukta rankenėlė. Kad padėtų mums išsiaiškinti, kaip tai padaryti, kreipiamės į bangos formą, kad suktųsi pagal laikrodžio rodyklę. Atkreipkite dėmesį, kad bet kuriuo metu, kai A turi kraštą, jo nauja reikšmė visada skiriasi nuo B vertės. Kai rankenėlė pereina iš 1 padėties į 2, A pereina iš logikos-0 į logiką-1. Šiam perėjimui B vis dar yra 0 ir neatitinka naujos A. Dar kartą atkreipkite dėmesį, kad B ir naujoji A reikšmė skiriasi. Šiuo metu matome, kad bet kuriuo metu, kai A sukelia pertraukimą sukantis pagal laikrodžio rodyklę, jo nauja vertė skiriasi nuo B vertės. Patikrinkime B, kad pamatytume, kas atsitiks. B turi pakylantį kraštą, kai jungiklis pereina iš 2 padėties į 3. Čia nauja B reikšmė yra tokia pati kaip A. Žvelgiant į paskutinį likusį sukimosi pagal laikrodžio rodyklę kraštą, B krintantis kraštas juda iš 4 padėties į 5. (5 pozicija yra tokia pati kaip 1 pozicija.) Naujoji B vertė čia taip pat kaip ir A! Dabar galime padaryti tam tikras išvadas! Jei A sukelia pertraukimą, o nauja A vertė skiriasi nuo B, sukimas buvo pagal laikrodžio rodyklę. Be to, jei B sukelia pertraukimą, o nauja B vertė yra tokia pati kaip A, tada sukimas buvo pagal laikrodžio rodyklę. Greitai išnagrinėsime sukimosi prieš laikrodžio rodyklę atvejį. Kaip ir sukimas pagal laikrodžio rodyklę, sukimasis prieš laikrodžio rodyklę sukels keturis pertraukimus per vieną ciklą: du įėjimui A ir du įėjimui B. Įvestis A turi kylantį kraštą, kai rankenėlė juda iš 4 padėties į 3, o krintantis kraštas juda iš 2 padėties į 1 Kai rankenėlė pasislenka iš 4 padėties į 3, nauja A vertė yra tokia pati kaip ir B reikšmė. Atkreipkite dėmesį, kad kai A juda iš 2 padėties į 1, jo nauja vertė yra tokia pati kaip ir B. Dabar matome, kad kai A sukelia pertraukimą ir jo nauja vertė sutampa su B, sukimas buvo prieš laikrodžio rodyklę. Greitai peržiūrėsime įvestį B, kad viską patikrintume. B sukels pertraukimą, kai rankenėlė juda iš 5 padėties (kuri yra tokia pati kaip 1) į 4 ir kai rankenėlė juda iš 3 padėties į 2. Abiem šiais atvejais nauja B vertė neatitinka esamos vertės iš A, o tai priešinga atvejams, kai B sukelia sukimosi pagal laikrodžio rodyklę pertrauką. Tai gera žinia. Viskas patikrinama taip, kaip turėtų. Apibendrinant galima pasakyti, kad jei A sukelia pertraukimą ir jo nauja vertė neatitinka B vertės arba jei B sukelia pertrauką, o nauja B vertė atitinka A vertę, mes žinome, kad buvo sukimasis pagal laikrodžio rodyklę. Mes galime patikrinti kitus programinės įrangos pasukimo atvejus pagal laikrodžio rodyklę arba galime manyti, kad dėl to, kad jis nebuvo sukamas pagal laikrodžio rodyklę, jis buvo prieš laikrodžio rodyklę. Mano kasdienybė tiesiog padarė prielaidą.

5 žingsnis: programinė įranga

Programinė įranga
Programinė įranga
Programinė įranga
Programinė įranga

„PIC Basic Pro“nenaudojau integruotų pertraukimų. Aš naudoju keletą failų, kuriuos įtraukiau į savo kodą iš Darrelio Tayloro, kad paskatinčiau rutiną. Čia yra didžiulis Darrelio nuopelnas! Failai yra nemokami. Tiesiog apsilankykite jo svetainėje, kad gautumėte daugiau informacijos, kitų programų ir atsisiųstumėte failus. Galite praleisti šią dalį, jei nenaudojate PIC su Darrel Taylor pertraukomis. Tiesiog nustatykite pertraukimus, jei to reikia jūsų naudojamoje platformoje. Norėdami nustatyti Darrel Taylor (DT) pertraukas, turite atlikti du veiksmus: 1.) Įtraukite failus DT_INTS-14.bas ir ReEnterPBP.bas code.2.) Nukopijuokite ir įklijuokite tai į savo kodą. ASMINT_LIST makrokomanda; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, taip endm INT_CREATEENDASMI Įdėkite skirtukus ir tarpus, pvz., Grafiką „Instructable“pabaigoje, kad galėtumėte šiek tiek lengviau matyti savo kodą. Turėsite jį šiek tiek pakeisti, kad atitiktų jūsų poreikius. Skiltyje „Etiketė“pakeiskite ISR pakeistos programos pavadinimu, kuris yra jūsų ISR. Nepamirškite pabraukimo! Jums reikia! Kad pertraukimai veiktų, reikia atlikti dar du veiksmus: 1.) Parašykite ISR. Tai rašysite taip, kaip ketinote rašyti PBP paprogramę, išskyrus tai, kad jums reikės įterpti @ INT_RETURN paprogramės pabaigoje, o ne RETURN. Tai pripažins pertraukimą ir grąžins programos vykdymą ten, kur ji buvo nutraukta pagrindinėje kilpoje. ISR viduje turite išvalyti pertraukimo vėliavą, kad jūsų programa nepatektų į rekursinį pertraukimą. Norint išvalyti pertraukimo vėliavą PIC16F877A, tereikia perskaityti PORTB. Kiekvienas skirtingas mikrovaldiklis turi skirtingą būdą išvalyti pertraukimo žymes. 2.) Kai pasieksite kodo tašką, kuriame norite įjungti pertrauką, naudokite šią kodo eilutę:@ INT_ENABLE RBC_INT Jei norite išjungti pertraukimą, tiesiog naudokite:@ INT_DISABLE RBC_INTTyra daug daiktų, supakuotų į ką tik padengtą, todėl greitai apibendrinsiu. Kol kas jūsų programa turėtų atrodyti maždaug taip:; Bet koks reikalingas nustatymas ar kodas INCLUDE "DT_INTS-14.bas" INCLUDE "ReEnterPBP.bas" ASMINT_LIST makrokomanda; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, taip endm INT_CREATEENDASM; Bet koks kitas reikalingas nustatymas arba kodas@ INT_ENABLE RBC_INT; Kodas, kuriam reikia žinoti, į kurią pusę sukasi rankenėlė@ INT_DISABLE RBC_INT; Kitas kodasEND; ProgrammyISR pabaiga:; ISR kodas čia@ INT_RETURN (pertraukimo tvarkyklės nustatymo lentelė) Manau, kad čia gali vėl prisijungti visi, kurie nenaudoja PIC ar DT pertraukimų. Dabar turime iš tikrųjų parašyti ISR, kad mikrovaldiklis žinotų, į kurią pusę sukasi rankenėlė. Prisiminkite iš programinės įrangos teorijos skyriaus, kad galime nustatyti sukimosi kryptį, jei žinome pertrauką sukėlusią įvestį, jos naują vertę ir kitos įvesties vertę. Štai pseudokodas: perskaitykite PORTB į įbrėžimo kintamąjį, kad išvalytumėte pertraukimo vėliavą Patikrinkite, ar A sukėlė pertraukimą. Jei tiesa, palyginkite A ir B. Patikrinkite, ar skiriasi, ar skiriasi, ar sukimasis pagal laikrodžio rodyklę, kitaip - prieš laikrodžio rodyklę, „EndifCheck“, ar pertraukimą sukėlė B. Jei tiesa, palyginkite A ir B Patikrinkite, ar skiriasi, jei tas pats, ar sukimasis pagal laikrodžio rodyklę, kitaip - prieš laikrodžio rodyklę EndifReturn from interrupt Atrasti naują pasikeitusios įvesties ir kitos (nepakitusios) įvesties vertę yra paprasta, nes galime jas perskaityti ISR viduje. Turime žinoti, kokia buvo kiekvieno iš jų būklė, prieš vykdant ISR siuntimą. Tai atsitinka pagrindinėje rutinoje. Pagrindinė rutina sėdi ir laukia, kol ISR nustatys baitų kintamąjį, kurį vadinome „CWflag“, arba 1. Po kiekvieno patvirtinto rankenėlės keitimo arba jei nėra rankenėlės veiklos, kintamasis nustatomas į 5, kad būtų nurodyta tuščiosios eigos būsena. Jei vėliava nustatoma arba pašalinama, pagrindinė tvarka iš karto padidina arba sumažina nustatytą slėgį, atitinkamai atsižvelgdama į sukimąsi, o tada CWflag kintamąjį grąžina į 5, nes rankenėlė vėl neveikia. Kadangi pagrindinė rutina yra CWflag tikrinimas, ji taip pat dokumentuoja A ir B sukamųjų jungiklių verčių būseną. Tai tikrai paprasta ir atrodo taip: oldA = AoldB = BTikrai čia nėra nieko įmantraus. Tiesiog įtraukite tas dvi eilutes ciklo pradžioje, kuris tikrina CWflag sukimąsi. Mes tik atnaujiname įvesties logines reikšmes iš sukamosios rankenėlės, esančios didinimo/mažinimo kilpos pagrindinėje rutinoje, kad galėtume pamatyti, kokia įvestis sukėlė pertrauką, kai vykdomas ISR. Čia yra ISR kodas: ABchange: scratch = PORTB 'Perskaitykite PORTB, kad išvalytumėte pertraukos vėliavą' Jei A sukelia pertrauką, patikrinkite B sukimosi kryptį IF oldA! = A THEN 'Jei A ir B skiriasi, tai sukimasis pagal laikrodžio rodyklę IF A! = B THOT GOTO CW 'Priešingu atveju tai buvo sukimasis prieš laikrodžio rodyklę ELSE GOTO CCW ENDIF ENDIF' Jei B sukelia pertrauką, patikrinkite A sukimosi kryptį, jei senaB! = B THEN 'Jei A ir B yra vienodi, tai buvo sukimas pagal laikrodžio rodyklę IF A == B THOT GOTO CW 'Priešingu atveju sukimasis prieš laikrodžio rodyklę ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURNĮtraukiau ISR kodą į failą AB_ISR.bas, nes kodo skirtukai nerodomi taip, kaip turėtų. Dabar, kadangi ISR turi senas įvesties A ir B reikšmes, ji gali nustatyti, kuri įvestis sukėlė pertrauką, palyginti ją su kita (nepakitusi) įvestimi ir nustatyti kryptį sukimosi. Viskas, ką reikia padaryti, yra patikrinti CWflag, kad pamatytumėte, kuria kryptimi rankenėlė pasuko (jei yra), ir padidinti arba sumažinti skaitiklį, nustatytą tašką ar bet ką, ko jums patinka ar reikia. Tikiuosi, kad tai padeda ir nebuvo per daug paini. Šio tipo sąsaja yra ypač naudinga, jei jūsų sistema jau naudoja pertraukas, nes tai tik dar viena pertrauka. Mėgautis!

Rekomenduojamas: