Obsah:

Ako interpretovať smer otáčania z digitálneho otočného prepínača s obrázkom: 5 krokov
Ako interpretovať smer otáčania z digitálneho otočného prepínača s obrázkom: 5 krokov

Video: Ako interpretovať smer otáčania z digitálneho otočného prepínača s obrázkom: 5 krokov

Video: Ako interpretovať smer otáčania z digitálneho otočného prepínača s obrázkom: 5 krokov
Video: Кто же такие Венецианцы на самом деле и откуда у них взялся сильнейший флот средневековья? 2024, Júl
Anonim
Ako interpretovať smer otáčania z digitálneho otočného prepínača pomocou PIC
Ako interpretovať smer otáčania z digitálneho otočného prepínača pomocou PIC

Cieľom tohto Instructable je ilustrovať, ako prepojiť digitálny (kvadratúrne kódovaný) otočný spínač s mikrokontrolérom. Nebojte sa, vysvetlím, čo pre nás znamená kvadratúrny kód. Toto rozhranie a sprievodný softvér umožní mikrokontroléru rozpoznať smer otáčania pri každom pohybe z jednej zarážky do druhej. Nedávno som použil tento typ prepínača v projekte mikrokontroléra, ktorý vyžadoval zadanie nastavenej hodnoty tlaku pomocou gombíka so 16 zarážky namiesto tlačidiel hore/dole. Cieľom bolo umožniť používateľovi „vytočiť“požadovaný tlak. V dôsledku toho sme museli vyvinúť softvérovú rutinu na získanie informácií o polohe z prepínača a odvodenie smeru otáčania, aby sme zvýšili alebo znížili nastavenú hodnotu tlaku pre hlavný systém. V tomto návode sa budem zaoberať fyzickým rozhraním k mikrokontroléru, teória činnosti otočného prepínača, teória činnosti pre softvér a rutina odpočtu. Nakoniec vám ukážem svoju aplikáciu rutiny odpočtu. Ako postupujeme, pokúsim sa udržať veci trochu všeobecné, aby sa myšlienka dala uplatniť na čo najväčšom počte platforiem, ale tiež sa podelím o to, čo som urobil, aby ste videli konkrétnu aplikáciu.

Krok 1: Diely

Časti
Časti

Na to, aby ste to mohli implementovať, budete potrebovať: otočný prepínač (kódovaný kvadratúrou) vytiahnutie rezistorov vhodnú platformu mikrokontroléra Na svoj projekt som použil optický kodér Grayhill 61C22-01-04-02. Dátový list pre otočný prepínač vyžaduje 8,2 kOhm pull -up rezistory na dvoch dátových linkách prichádzajúcich z prepínača. Budete chcieť skontrolovať list s údajmi o kodéri, ktorý sa rozhodnete použiť. Otočný spínač, ktorý som použil, je možné objednať aj s axiálnym spínačom. Je to užitočná funkcia na uskutočnenie volieb, ktoré boli vytočené atď., Ale nebudem tu rozoberať jeho rozhranie. Mám uvedenú „vhodnú platformu mikrokontrolérov“, pretože (myslím), že túto možno implementovať na viac ako jednej platforme. Videl som veľa ľudí, ktorí používajú iné mikrokontroléry pre Instructables, takže chcem ukázať aj všeobecný prístup. Napísal som celý kód v PIC Basic Pro na použitie s mikročipom PIC16F877A. Kľúčovou vecou, ktorú na mikrokontroléri potrebujete, je schopnosť prerušiť, keď dôjde k zmene logiky na jednom z dvoch pinov. Na PIC16F877A sa tomu hovorí prerušenie zmeny PORTB. Na iných ovládačoch to môže mať aj iné názvy. Táto funkcia prerušenia mikrokontroléra je súčasťou toho, čo robí túto implementáciu tak elegantnou.

Krok 2: Hardvérové rozhranie

Hardvérové rozhranie
Hardvérové rozhranie

„Jednoduché“riešenie by bolo mať prepínač „s jedným pólom so 16 hodmi“so 16 pripojeniami k mikrokontroléru. Každý výstup prepínača by potom bol viazaný na kolík na mikrokontroléri, aby mikrokontrolér mohol kontrolovať každú polohu vytáčania. Toto je nadmerné používanie I/O pinov. Veci sa ešte zhoršujú, ak chceme, aby nám bolo na prepínači k dispozícii viac ako 16 polôh (zarážok). Každá ďalšia poloha na prepínači by vyžadovala ďalší vstup do mikrokontroléra. Toto sa rýchlo stáva veľmi neefektívnym využívaním vstupov na mikrokontroléri. Zadajte krásu otočného prepínača. Otočný spínač má iba dva výstupy na mikrokontrolér uvedené v dátovom liste ako A a B. Existujú iba štyri možné logické úrovne, ktoré môžu tieto riadky trvať: AB = 00, 01, 10 a 11. To výrazne znižuje počet vstupných riadkov, ktoré musíte použiť pri pripájaní prepínača k mikrokontroléru. Zredukovali sme teda počet vstupných riadkov iba na dva. Teraz čo? Zdá sa, že skutočne potrebujeme 16 rôznych stavov, ale tento nový prepínač má iba štyri. Postrelili sme sa do nohy? Nie. Pokračuj v čítaní. Vysvetlíme si trochu teórie za operáciou otočného spínača.

Krok 3: Hardvérová teória prevádzky

Hardvérová teória prevádzky
Hardvérová teória prevádzky
Hardvérová teória prevádzky
Hardvérová teória prevádzky
Hardvérová teória prevádzky
Hardvérová teória prevádzky

Snímanie smeru otáčania je možné pomocou vyššie uvedeného prepínača „jednopólový-16 hod“, ale využíva veľa vstupov na mikrokontroléri. Použitie otočného prepínača znižuje počet vstupov do mikrokontroléra, ale teraz musíme interpretovať signály prichádzajúce z prepínača a preložiť ich do smeru otáčania. Už som spomenul, že prepínač bol kódovaný kvadratúrne. Toto je tiež jeden z kľúčových prvkov tohto riešenia. To znamená, že existuje 2-bitový kód, ktorý prepínač poskytuje, ktorý zodpovedá polohe prepínača. Môžete si myslieť: „Ak je do mikrokontroléra vstup s dvoma bitmi, ako reprezentujeme všetkých 16 pozícií?“To je dobrá otázka. Nezastupujeme všetkých. Potrebujeme poznať relatívne polohy gombíka, aby sme mohli určiť smer otáčania. Absolútna poloha gombíka je irelevantná. Pri otáčaní v smere hodinových ručičiek sa kód, ktorý prepínač dáva, opakuje každé štyri zarážky a je sivým kódom. Šedo kódované znamená, že pre každú zmenu polohy existuje iba jedna bitová zmena. Namiesto toho, aby sa vstup AB odpočítaval pre otáčanie v smere hodinových ručičiek v binárnom formáte takto: 00, 01, 10, 11, mení sa takto: 00, 10, 11, 01. Všimnite si, že pre posledný vzorec existuje iba jeden vstup, ktorý sa mení medzi sady. Hodnoty proti smeru hodinových ručičiek pre vstup AB do mikrokontroléra budú vyzerať takto: 00, 01, 11, 10. Toto je jednoducho obrátený vzorec v smere hodinových ručičiek, pričom AB = 00 je uvedené ako prvé. Vizuálnejšie vysvetlenie nájdete v diagramoch.

Krok 4: Softvérová teória prevádzky

Softvérová teória prevádzky
Softvérová teória prevádzky

Rutina, ktorá odvodzuje smer otáčania, je poháňaná prerušovaním. Mikrokontrolér, ktorý vyberiete, musí byť schopný prerušiť vždy, keď dôjde k zmene na (najmenej) dvoch kolíkoch, keď je prerušenie povolené. Toto sa nazýva prerušenie zmeny PORTB na PIC16F877A. Pri každom otočení prepínača sa mikrokontrolér preruší a spustenie programu sa odošle do rutiny prerušenia služby (ISR). ISR rýchlo zistí, akým spôsobom bol spínač otočený, vhodne nastaví vlajku a rýchlo sa vráti do hlavného programu. Potrebujeme, aby sa to stalo rýchlo v prípade, že používateľ otočí prepínač veľmi rýchlo. Vieme, že sivý kód AB sa opakuje každé štyri polohy, takže ak rutinne pracujeme na prechodoch medzi týmito štyrmi polohami, bude to fungovať pre všetky ostatné. Všimnite si, že v jednom štvorpolohovom cykle sú štyri hrany. Stúpajúca hrana a klesajúca hrana pre vstup A aj pre vstup B. Mikroprocesor sa preruší vždy, keď sa objaví hrana, čo znamená, že mikrokontrolér sa preruší pri každom otočení gombíka. Výsledkom je, že ISR musí zistiť, akým spôsobom bol gombík otočený. Aby sme pomohli zistiť, ako to urobiť, obrátime sa na priebeh vlny v smere hodinových ručičiek. Všimnite si, že kedykoľvek má A hranu, jej nová hodnota je vždy odlišná od hodnoty B. Keď gombík prejde z polohy 1 do 2, A prejde z logiky-0 do logiky-1. B je pre tento prechod stále 0 a nezhoduje sa s novou hodnotou A. Keď gombík prejde z polohy 3 do 4, A má klesajúcu hranu, zatiaľ čo B zostáva na logickej-1. Znovu si všimnite, že B a nová hodnota A sú odlišné. Práve teraz vidíme, že kedykoľvek A spôsobí prerušenie počas otáčania v smere hodinových ručičiek, jeho nová hodnota sa líši od hodnoty B. Pozrime sa na B, aby sme zistili, čo sa stane. B má stúpajúcu hranu, keď sa prepínač prepne z polohy 2 do 3. Tu je nová hodnota B rovnaká ako A. Pri pohľade na poslednú zostávajúcu hranu na otáčanie v smere hodinových ručičiek má B klesajúcu hranu pohybujúcu sa z polohy 4 do 5. (Pozícia 5 je rovnaká ako pozícia 1.) Nová hodnota B je rovnaká ako A aj tu! Teraz môžeme urobiť niekoľko odpočtov! Ak A spôsobí prerušenie a nová hodnota A je odlišná od hodnoty B, rotácia bola v smere hodinových ručičiek. Okrem toho, ak B spôsobuje prerušenie a nová hodnota B je rovnaká ako A, potom bolo otočenie v smere hodinových ručičiek. Pozrime sa rýchlo na prípad otáčania proti smeru hodinových ručičiek. Rovnako ako otáčanie v smere hodinových ručičiek, otáčanie proti smeru hodinových ručičiek spôsobí štyri prerušenia v jednom cykle: dva pre vstup A a dva pre vstup B. Vstup A má stúpajúcu hranu, keď sa gombík pohybuje z polohy 4 do 3 a klesajúcu hranu sa pohybuje z polohy 2 do 1 Keď sa gombík pohybuje z polohy 4 do 3, nová hodnota A je rovnaká ako hodnota B. Všimnite si, že keď sa A pohybuje z polohy 2 do 1, jej nová hodnota je rovnaká ako hodnota B. Teraz vidíme, že keď A spôsobí prerušenie a jeho nová hodnota sa zhoduje s hodnotou B, otočenie bolo proti smeru hodinových ručičiek. Rýchlo sa pozrieme na vstup B, aby sme všetko overili. B spôsobí prerušenie, keď sa gombík pohybuje z polohy 5 (ktorá je rovnaká ako 1) do 4 a keď sa gombík pohybuje z polohy 3 do 2. V oboch týchto prípadoch sa nová hodnota B nezhoduje s existujúcou hodnotou z A, čo je opak prípadov, keď B spôsobí prerušenie otáčania v smere hodinových ručičiek. To je dobrá správa. Všetko sa kontroluje tak, ako by malo. Ak to zhrnieme, ak A spôsobí prerušenie a jeho nová hodnota sa nezhoduje s hodnotou B alebo ak B spôsobí prerušenie a nová hodnota B sa zhoduje s hodnotou A, vieme, že došlo k otáčaniu v smere hodinových ručičiek. V ostatných prípadoch môžeme v softvéri skontrolovať otáčanie proti smeru hodinových ručičiek alebo môžeme predpokladať, že pretože nešlo o otáčanie v smere hodinových ručičiek, bolo to proti smeru hodinových ručičiek. Moja rutina jednoducho urobila predpoklad.

Krok 5: Softvér

Softvér
Softvér
Softvér
Softvér

V PIC Basic Pro som nepoužil vstavané prerušenia. Na riadenie rutiny som použil niekoľko súborov, ktoré som zaradil do svojho kódu od Darrela Taylora. Tu patrí obrovský kredit Darrelovi! Súbory sú zadarmo. Navštívte jeho webovú stránku, kde nájdete ďalšie informácie, ďalšie aplikácie a súbory si môžete stiahnuť. Túto časť môžete preskočiť, ak nepoužívate PIC s prerušeniami Darrel Taylor. Stačí nastaviť prerušenia podľa potreby na platforme, ktorú používate. Ak chcete nastaviť prerušenia Darrel Taylor (DT), musíte urobiť dve veci: 1.) Zahrňte súbory DT_INTS-14.bas a ReEnterPBP.bas do svojho code.2.) Skopírujte to a prilepte to do svojho kódu. ASMINT_LIST makro; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, yes endm INT_CREATEENDASMIVložte karty a medzery ako grafiku na koniec inštrukcie, aby ste vo svojom kóde videli veci trochu jednoduchšie. Budete ho musieť mierne upraviť, aby vyhovoval vašim potrebám. V časti Štítok nahraďte ISR názvom podprogramu, ktorý je vašim ISR. Nezabudnite na podčiarknutie! Potrebujete to! Aby prerušenia fungovali, musíte urobiť ešte dve veci: 1.) Napíšte ISR. Napíšete to rovnako, ako by ste chceli napísať podprogram PBP, okrem toho, že na koniec podprogramu budete musieť vložiť @ INT_RETURN namiesto RETURN. Toto potvrdí prerušenie a vráti vykonanie programu tam, kde skončilo v hlavnej slučke. Vnútri ISR musíte vymazať príznak prerušenia, aby sa váš program nezachytil pri rekurzívnom prerušení. Na vyčistenie príznaku prerušenia na PIC16F877A je potrebné iba prečítať PORTB. Každý iný mikrokontrolér má iný spôsob vymazávania príznakov prerušenia. 2) Keď dosiahnete bod v kóde, v ktorom chcete povoliť prerušenie, použite tento riadok kódu:@ INT_ENABLE RBC_INT Ak chcete prerušenie vypnúť, jednoducho použite:@ INT_DISABLE RBC_INTExistuje veľa vecí zabalených do toho, čo som práve pokryl, takže to rýchlo zhrniem. Váš program by mal zatiaľ vyzerať asi takto:; Akékoľvek potrebné nastavenie alebo kód INCLUDE „DT_INTS-14.bas“INCLUDE „ReEnterPBP.bas“makro ASMINT_LIST; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, yes endm INT_CREATEENDASM; Akékoľvek ďalšie potrebné nastavenia alebo kód@ INT_ENABLE RBC_INT; Kód, ktorý potrebuje vedieť, akým spôsobom sa gombík otáča@ INT_DISABLE RBC_INT; Iný kódEND; Koniec programumyISR:; Kód ISR tu@ INT_RETURN (tabuľka nastavenia obsluhy prerušenia) Myslím si, že práve tu sa môže znova pripojiť ktokoľvek, kto nepoužíva prerušenia PIC alebo DT. Teraz musíme skutočne napísať ISR, aby mikrokontrolér vedel, akým spôsobom sa gombík otáča. Pripomeňme si v sekcii teórie softvéru, že smer rotácie môžeme odvodiť, ak poznáme vstup, ktorý spôsobil prerušenie, jeho novú hodnotu a hodnotu druhého vstupu. Tu je pseudokód: Prečítajte PORTB do premennej scratch, aby ste vymazali príznak prerušenia. Skontrolujte, či prerušenie spôsobil A. Ak je to pravda, porovnajte A a B. Skontrolujte, či sú odlišné, ak sú odlišné. Bola to rotácia v smere hodinových ručičiek. Inak, bolo to proti smeru hodinových ručičiek EndifCheck. Skontrolujte, či B spôsobilo prerušenie. Ak je to pravda, porovnajte A a B Skontrolujte, či sú odlišné, ak sú rovnaké. Bola to rotácia v smere hodinových ručičiek. Inak, bola proti smeru hodinových ručičiek. EndifReturn from interrupt Objavenie novej hodnoty zmeneného vstupu a druhého (nezmeneného) vstupu je jednoduché, pretože ich môžeme prečítať v ISR. Pred odoslaním popravy do ISR musíme vedieť, v akom stave bol každý z nich. To sa deje v hlavnej rutine. Hlavná rutina sedí a čaká, kým bajtovú premennú, ktorú sme nazvali CWflag, nastaví na 1 alebo ju ISR vynuluje na 0. Po každej potvrdenej zmene gombíka alebo v prípade, že nie je žiadna aktivita gombíka, je premenná nastavená na 5, aby indikovala pokojový stav. Ak sa príznak nastaví alebo sa zruší, hlavná rutina okamžite zvýši alebo zníži tlak nastavenej hodnoty podľa otáčania a potom nastaví premennú CWflag späť na 5, pretože gombík je teraz opäť nečinný. Pretože hlavnou rutinou je kontrola CWflag, dokumentuje tiež stav hodnôt otočného spínača A a B. Je to skutočne jednoduché a vyzerá to takto: oldA = AoldB = B V skutočnosti tu nie je nič super vymyslené. Stačí zahrnúť tieto dva riadky na začiatok slučky, ktorá kontroluje rotáciu CWflag. Práve aktualizujeme logické hodnoty vstupov z otočného gombíka vo vnútri slučky inkrementácie/dekrementácie v hlavnej rutine, aby sme videli, ktorý vstup spôsobil prerušenie pri vykonaní ISR. Tu je kód ISR: ABchange: scratch = PORTB „Prečítajte si PORTB, aby ste vymazali príznak prerušenia“Ak A spôsobí prerušenie, skontrolujte smer otáčania B, AK je starýA! = A POTOM „Ak sú A a B odlišné, bolo to otáčanie v smere hodinových ručičiek IF A !! bolo otáčanie v smere hodinových ručičiek, AK A == B POTOM GOTO CW 'V opačnom prípade to bolo proti smeru hodinových ručičiek INÉ GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURN Kód ISR som zahrnul do súboru AB_ISR.bas, pretože karty v kóde sa nezobrazujú tak, ako by mali. Pretože ISR má staré hodnoty pre vstupy A a B, môže určiť, ktorý vstup spôsobil prerušenie, porovnať ho s iným (nezmeneným) vstupom a určiť smer. otáčania. Všetko, čo musíte urobiť, je skontrolovať CWflag, aby ste zistili, akým smerom sa gombík otočil (ak má) a zvýšiť alebo znížiť počítadlo, nastavenú hodnotu alebo čokoľvek, čo sa vám páči alebo potrebujete. Dúfam, že to pomôže a nebolo mätúce. Tento typ rozhrania je obzvlášť užitočný, ak váš systém už používa prerušenia, pretože toto je iba jedno ďalšie prerušenie na pridanie. Užite si to!

Odporúča: