Kazalo:

Kako razlagati smer vrtenja iz digitalnega rotacijskega stikala s PIC: 5 korakov
Kako razlagati smer vrtenja iz digitalnega rotacijskega stikala s PIC: 5 korakov

Video: Kako razlagati smer vrtenja iz digitalnega rotacijskega stikala s PIC: 5 korakov

Video: Kako razlagati smer vrtenja iz digitalnega rotacijskega stikala s PIC: 5 korakov
Video: Home Automation: Change direction of rotation of DC motor using 2 relays and Arduino - Robojax 2024, Julij
Anonim
Kako razlagati smer vrtenja iz digitalnega rotacijskega stikala s PIC
Kako razlagati smer vrtenja iz digitalnega rotacijskega stikala s PIC

Cilj tega Instructable je ponazoriti, kako povezati digitalno (kvadraturno kodirano) vrtljivo stikalo z mikrokrmilnikom. Ne skrbite, razložil vam bom, kaj za nas pomeni kvadraturno kodiranje. Ta vmesnik in spremljajoča programska oprema bo mikrokrmilniku omogočila, da prepozna smer vrtenja pri vsakem premiku od enega do drugega zapora. To vrsto stikala sem nedavno uporabil v projektu mikrokrmilnika, ki je zahteval vnos nastavljene vrednosti tlaka z gumbom s 16 namesto gumbov gor/dol. Zamisel je bila, da se uporabniku omogoči, da "pokliče" želeni pritisk. Posledično smo morali razviti programsko rutino, da bi dobili informacije o položaju iz stikala in ugotovili smer vrtenja, da bi povečali ali zmanjšali nastavljeno vrednost tlaka za glavni sistem. V tem navodilu bom obravnaval fizični vmesnik mikrokrmilniku, teoriji delovanja vrtljivega stikala, teoriji delovanja programske opreme in rutini odbitkov. Na koncu vam bom pokazal svojo uporabo rutine odbitkov. Ko bomo napredovali, bom poskušal ohraniti splošne lastnosti, da se ideja lahko uporabi na čim več platformah, vendar bom delil tudi to, kar sem naredil, da boste lahko videli določeno aplikacijo.

1. korak: Deli

Deli
Deli

Za izvedbo tega boste potrebovali: vrtljivo stikalo (kvadraturno kodirano) izvlečne upore primerno platformo mikrokrmilnika Za svoj projekt sem uporabil optični kodirnik Grayhill 61C22-01-04-02. Podatkovni list za vrtljivo stikalo zahteva vlečne upore 8,2 k ohma na dveh podatkovnih linijah, ki prihajajo iz stikala. V podatkovnem listu boste želeli preveriti kodirnik, ki ga želite uporabiti. Vrtljivo stikalo, ki sem ga uporabil, lahko naročim tudi z aksialnim stikalom. To je uporabna funkcija za oddajanje izbranih klicev itd., Vendar o njegovem vmesniku ne bom razpravljal tukaj. Na seznamu imam "primerno platformo za mikrokrmilnik", ker (mislim) je to mogoče izvesti na več platformah. Videl sem veliko ljudi, ki uporabljajo druge mikrokrmilnike za Instructables, zato želim pokazati tudi splošni pristop. Vso kodo sem napisal v PIC Basic Pro za uporabo z mikročipom PIC16F877A. Resnično, ključna stvar, ki jo potrebujete na mikrokrmilniku, je zmožnost prekinitve, ko pride do logične spremembe na enem od dveh zatičev. Na PIC16F877A se to imenuje prekinitev spremembe PORTB. Na drugih krmilnikih so lahko druga imena. Ta funkcija prekinitve mikrokrmilnika je del tega, kar naredi to izvedbo tako elegantno.

Korak: Vmesnik strojne opreme

Strojni vmesnik
Strojni vmesnik

"Preprosta" rešitev bi bila stikalo "single pole-16 throw" s 16 povezavami na mikrokrmilnik. Vsak izklopni izhod bi bil nato vezan na pin na mikrokrmilniku, tako da lahko mikrokontroler preveri vsak položaj številčnice. To je prekomerna uporaba V/I zatičev. Stvari se poslabšajo, če želimo, da nam je na stikalu na voljo več kot 16 položajev (detentov). Vsak dodatni položaj stikala bi zahteval dodaten vhod v mikrokrmilnik. To hitro postane zelo neučinkovita uporaba vhodov na mikrokrmilniku. Vnesite lepoto vrtljivega stikala. Vrtljivo stikalo ima samo dva izhoda za mikrokrmilnik, navedena kot A in B na podatkovnem listu. Te vrstice lahko sprejmejo le štiri možne logične ravni: AB = 00, 01, 10 in 11. To močno zmanjša število vhodnih linij, ki jih morate uporabiti za priključitev stikala na mikrokrmilnik. Tako smo zmanjšali število vnosnih vrstic na samo dve. Kaj pa zdaj? Zdi se, da res potrebujemo 16 različnih stanj, vendar ima to novo stikalo le štiri. Smo se ustrelili v nogo? Ne. Beri naprej. Za razlago bomo obravnavali nekaj teorije delovanja rotacijskega stikala.

3. korak: Teorija delovanja strojne opreme

Teorija delovanja strojne opreme
Teorija delovanja strojne opreme
Teorija delovanja strojne opreme
Teorija delovanja strojne opreme
Teorija delovanja strojne opreme
Teorija delovanja strojne opreme

Zaznavanje smeri vrtenja je možno s prej omenjenim stikalom "single pole-16 throw", vendar porabi veliko vhodov na mikrokrmilniku. Z uporabo vrtljivega stikala se zmanjša število vhodov v mikrokrmilnik, zdaj pa moramo interpretirati signale, ki prihajajo iz stikala, in jih prevesti v smer vrtenja. Že prej sem omenil, da je bilo stikalo kvadraturno kodirano. To je tudi eden ključnih elementov te rešitve. To pomeni, da stikalo vsebuje 2-bitno kodo, ki ustreza položaju stikala. Morda razmišljate: "Če imamo v mikrokrmilniku dvobitni vhod, kako predstavimo vseh 16 položajev?" To je dobro vprašanje. Ne predstavljamo jih vseh. Poznati moramo le relativni položaj gumba, da lahko določimo smer vrtenja. Absolutni položaj gumba ni pomemben. Za vrtenje v smeri urinega kazalca se koda, ki jo da stikalo, ponovi vsake štiri vklope in je označena s sivo barvo. Sivo kodirano pomeni, da je pri vsaki spremembi položaja samo ena bitna sprememba. Namesto da vhod AB šteje za vrtenje v smeri urinega kazalca v binarnem sistemu, kot je ta: 00, 01, 10, 11, se spremeni tako: 00, 10, 11, 01. Upoštevajte, da se pri slednjem vzorcu med enim in drugim vhodom spreminja samo en vhod. kompleti. Vrednosti vhoda AB v mikrokontroler v nasprotni smeri urinega kazalca bodo videti tako: 00, 01, 11, 10. To je preprosto obratno od vzorca v smeri urinega kazalca z AB = 00. Najprej si oglejte diagrame za bolj vizualno razlago.

4. korak: Teorija delovanja programske opreme

Teorija delovanja programske opreme
Teorija delovanja programske opreme

Rutina, ki določa smer vrtenja, je prekinjena. Izbrani mikrokrmilnik mora biti sposoben prekiniti kadar koli pride do spremembe na katerem koli (vsaj) dveh nožicah, ko je prekinitev omogočena. To se imenuje prekinitev spremembe PORTB na PIC16F877A. Vsakič, ko stikalo zavrtite, se mikrokrmilnik prekine in izvajanje programa pošlje v rutino prekinitvenih storitev (ISR). ISR bo hitro ugotovil, v katero smer je bilo stikalo zavrteno, ustrezno nastavil zastavico in se hitro vrnil v glavni program. To moramo storiti hitro, če uporabnik zelo hitro obrne stikalo. Vemo, da se sivo kodiran vzorec AB ponovi na vsake štiri položaje, tako da če delamo rutinsko za prehode med temi štirimi položaji, bo deloval tudi za vse ostale. Upoštevajte, da so v enem štirih položajih štirih robov. Naraščajoči in padajoči rob za vhod A in vhod B. Mikroprocesor se bo prekinil vsakič, ko pride do roba, kar pomeni, da se bo mikrokrmilnik prekinil vsakič, ko obrnete gumb. Posledično mora ISR ugotoviti, v katero smer je bil gumb obrnjen. Da bi lažje ugotovili, kako to storiti, se obrnemo na valovno obliko za vrtenje v smeri urinega kazalca. Upoštevajte, da kadar koli ima rob rob, je njegova nova vrednost vedno drugačna od vrednosti B. Ko gumb preide iz položaja 1 v 2, A preide iz logike-0 v logiko-1. B je za ta prehod še vedno 0 in se ne ujema z novo vrednostjo A. Ko gumb preide iz položaja 3 v 4, ima A padajoč rob, medtem ko B ostane pri logiki-1. Ponovno opazimo, da sta B in nova vrednost A različni. Trenutno lahko vidimo, da kadar koli A povzroči prekinitev med vrtenjem v smeri urinega kazalca, se njegova nova vrednost razlikuje od vrednosti B. Preverimo B, da vidimo, kaj se zgodi. B ima naraščajoč rob, ko stikalo preide iz položaja 2 v 3. Tu je nova vrednost B enaka kot A. Če pogledamo zadnji preostali rob za vrtenje v smeri urinega kazalca, ima B padajoči rob, ki se premika iz položaja 4 v 5. (Položaj 5 je enak položaju 1.) Nova vrednost B je tudi tukaj enaka A! Zdaj lahko naredimo nekaj odbitkov! Če A povzroči prekinitev in je nova vrednost A drugačna od vrednosti B, je bila rotacija v smeri urinega kazalca. Poleg tega, če B povzroči prekinitev in je nova vrednost B enaka A, je bila rotacija v smeri urinega kazalca. Na hitro preučimo primer vrtenja v nasprotni smeri urinega kazalca. Tako kot vrtenje v smeri urinega kazalca bo vrtenje v nasprotni smeri urinega kazalca povzročilo štiri prekinitve v enem ciklu: dva za vhod A in dva za vhod B. Vhod A ima naraščajoč rob, ko se gumb premakne iz položaja 4 v 3, in padajoči rob, ki se premika iz položaja 2 v 1 Ko se gumb premakne s položaja 4 na 3, je nova vrednost A enaka vrednosti B. Upoštevajte, da je nova vrednost, ko se A premakne iz položaja 2 na 1, enaka kot vrednost B. Zdaj lahko vidimo, da ko je A povzročila prekinitev in se njegova nova vrednost ujema z vrednostjo B, je bila rotacija v nasprotni smeri urinega kazalca. Hitro bomo pogledali vnos B, da vse preverimo. B bo povzročil prekinitev, ko se gumb premakne iz položaja 5 (ki je enak 1) v 4 in ko se gumb premakne iz položaja 3 v 2. V obeh primerih se nova vrednost B ne ujema z obstoječo vrednostjo od A, kar je nasprotno od primerov, ko B povzroči prekinitev za vrtenje v smeri urinega kazalca. To je dobra novica. Če povzamemo, če A povzroči prekinitev in se njegova nova vrednost ne ujema z vrednostjo B ali če B povzroči prekinitev, nova vrednost B pa se ujema z vrednostjo A, za katero vemo, da je bila rotacija v smeri urinega kazalca. Druge primere lahko v programski opremi preverimo glede vrtenja v nasprotni smeri urinega kazalca ali pa domnevamo, da je bila rotacija v nasprotni smeri urinega kazalca. Moja rutina je preprosto naredila domnevo.

5. korak: Programska oprema

Programska oprema
Programska oprema
Programska oprema
Programska oprema

V PIC Basic Pro nisem uporabljal vgrajenih prekinitev. Za poganjanje rutine sem uporabil nekaj datotek, ki sem jih vključil v kodo Darrela Taylorja. Tu Darrelu pripada velika zasluga! Datoteke so brezplačne. Obiščite njegovo spletno stran za več informacij, druge aplikacije in za prenos datotek. Ta del lahko preskočite, če ne uporabljate PIC s prekinitvami Darrel Taylor. Preprosto nastavite prekinitve na platformi, ki jo uporabljate. Če želite nastaviti prekinitve Darrel Taylor (DT), morate narediti dve stvari: 1.) V datoteko vključite datoteke DT_INTS-14.bas in ReEnterPBP.bas code.2.) Kopirajte in prilepite to v svojo kodo. makro ASMINT_LIST; IntSource, Label, Type, ResetFlag? INT_Razvajalnik RBC_INT, _ISR, PBP, da endm INT_CREATEENDASIVstavite zavihke in presledke, kot je grafika na koncu navodila, tako da si lahko v kodi ogledate stvari nekoliko lažje. Boste morali nekoliko spremeniti, da ustreza vašim potrebam. Pod oznako ISR nadomestite ISR z imenom podprograma, ki je vaš ISR. Ne pozabite na podčrtaj! Če želite, da prekinitve delujejo, morate storiti še dve stvari: 1.) Napišite ISR. To boste zapisali tako, kot ste nameravali napisati podprogram PBP, le da boste morali namesto RETURN na koncu podprograma vstaviti @ INT_RETURN. S tem boste potrdili prekinitev in vrnili izvajanje programa na mesto, kjer ste ga končali v glavni zanki. Znotraj ISR morate počistiti zastavico prekinitve, da se vaš program ne ujame v rekurzivno prekinitev. Preprosto branje PORTB je vse, kar morate storiti, da počistite zastavico prekinitve na PIC16F877A. Vsak drugačen mikrokrmilnik ima drugačen način brisanja zastavic prekinitve. 2. Preverite podatkovni list vašega mikrokrmilnika. 2.) Ko v kodi dosežete točko, ki jo želite omogočiti, uporabite to vrstico kode:@ INT_ENABLE RBC_INT Če želite prekinitev onemogočiti, preprosto uporabite:@ INT_DISABLE RBC_INT Veliko je stvari, zapakiranih v tisto, kar sem pravkar obravnaval, zato bom hitro povzel. Doslej bi moral biti vaš program videti nekako takole:; Ali je potrebna nastavitev ali kodaINCLUDE "DT_INTS-14.bas" VKLJUČI "ReEnterPBP.bas" ASMINT_LIST makro; IntSource, Label, Type, ResetFlag? INT_Razvajalnik RBC_INT, _myISR, PBP, da endm INT_CREATEENDASM; Vse druge potrebne nastavitve ali kodo@ INT_ENABLE RBC_INT; Koda, ki mora vedeti, v katero smer se gumb vrti@ INT_DISABLE RBC_INT; Druga kodaEND; Konec programamyISR:; ISR koda tukaj@ INT_RETURN (Tabela za nastavitev upravljalnika prekinitev) Mislim, da se lahko tukaj znova pridruži vsak, ki ne uporablja prekinitev PIC ali DT. Zdaj moramo dejansko napisati ISR, da mikrokontroler ve, v katero smer se gumb vrti. Spomnite se iz razdelka o teoriji programske opreme, da lahko smer vrtenja sklepamo, če poznamo vnos, ki je povzročil prekinitev, njegovo novo vrednost in vrednost drugega vhoda. Tukaj je psevdokoda: Preberite PORTB v spremenljivko praske, da počistite zastavico prekinitve Preverite, ali je A povzročil prekinitev. Če je res, primerjajte A in B. Preverite, če je drugačen, če je drugačen, ali je šlo za vrtenje v nasprotni smeri urinega kazalca. Če je res, primerjajte A in B Preverite, če sta različna, če je ista, ali je bila vrtenja v smeri urinega kazalca Druga, je bila v nasprotni smeri urinega kazalca Povrni se od prekinitve Kako vemo, ali je sprememba na A ali B povzročila prekinitev? Odkrivanje nove vrednosti spremenjenega vnosa in drugega (nespremenjenega) vnosa je preprosto, saj jih lahko preberemo znotraj ISR. Vedeti moramo, kakšno je bilo stanje vsakega od njih, preden se izvršba pošlje ISR. To se zgodi v glavni rutini. Glavna rutina sedi in čaka, da se bajtna spremenljivka, ki smo jo poimenovali CWflag, nastavi na 1 ali počisti ISR na 0. Po vsaki potrjeni spremembi gumba ali če ni aktivnosti gumba, je spremenljivka nastavljena na 5, da označi stanje mirovanja. Če zastavico nastavite ali počistite, glavna rutina takoj ustrezno poveča ali zmanjša pritisk nastavljene točke glede na vrtenje in nato nastavi spremenljivko CWflag nazaj na 5, ker je gumb zdaj spet v prostem teku. Ker je glavna rutina preverjanje zastavice CW, dokumentira tudi stanje vrtljivih stikal A in B. To je res preprosto in izgleda tako: oldA = AoldB = BTukaj res ni nič super domišljijskega. Samo vključite ti dve vrstici na začetku zanke, ki preverja vrtenje zastavice CWflag. Pravkar posodabljamo logične vrednosti vhodov z vrtljivega gumba v zanki za povečanje/zmanjšanje v glavni rutini, tako da lahko vidimo, kateri vnos je povzročil prekinitev pri izvajanju ISR. Tukaj je koda ISR: ABchange: scratch = PORTB "Preberite PORTB, da počistite zastavico prekinitve" Če A povzroči prekinitev, preverite smer B vrtenja IF oldA! = A THEN A! = B THEN GOTO CW 'V nasprotnem primeru je šlo za vrtenje v nasprotni smeri urinega kazalca ELSE GOTO CCW ENDIF ENDIF' Če B povzroči prekinitev, preverite smer A v smeri vrtenja IFBB! = B THEN 'Če sta A in B enaka, je se je vrtel v smeri urinega kazalca, če je A == B THEN GOTO CW 'V nasprotnem primeru je bil obrat v nasprotni smeri urinega kazalca ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURNI smo kodo ISR vključili v datoteko AB_ISR.bas, ker zavihki v kodi se ne prikažejo tako, kot bi morali. Zdaj, ker ima ISR stare vrednosti za vhode A in B, lahko določi, kateri vhod je povzročil prekinitev, ga primerja z drugim (nespremenjenim) vhodom in določi smer vrtenja. Glavna rutina, ki jo morate storiti, je, da preverite zastavico CW, da vidite, v katero smer se je gumb obrnil (če se je obrnil), in povečajte ali zmanjšajte števec, nastavljeno točko ali karkoli želite ali potrebujete. Upam, da to pomaga in ni bilo preveč zmedeno. Ta vrsta vmesnika je še posebej uporabna, če vaš sistem že uporablja prekinitve, saj je to le še ena prekinitev za dodajanje. Uživajte!

Priporočena: