Obsah:

Jak interpretovat směr otáčení z digitálního otočného přepínače s obrázkem: 5 kroků
Jak interpretovat směr otáčení z digitálního otočného přepínače s obrázkem: 5 kroků

Video: Jak interpretovat směr otáčení z digitálního otočného přepínače s obrázkem: 5 kroků

Video: Jak interpretovat směr otáčení z digitálního otočného přepínače s obrázkem: 5 kroků
Video: 220V pračka Univerzální změna směru motoru 2024, Červenec
Anonim
Jak interpretovat směr otáčení z digitálního otočného přepínače pomocí PIC
Jak interpretovat směr otáčení z digitálního otočného přepínače pomocí PIC

Cílem tohoto Instructable je ukázat, jak propojit digitální (kvadraturně kódovaný) otočný přepínač s mikrokontrolérem. Nebojte se, vysvětlím, co pro nás znamená kvadraturní kódování. Toto rozhraní a doprovodný software umožní mikrokontroléru rozpoznat směr otáčení pro každý pohyb z jedné zarážky do druhé. Nedávno jsem použil tento typ přepínače v projektu mikrokontroléru, který vyžadoval zadání požadované hodnoty tlaku pomocí knoflíku s 16 zarážky místo tlačítek nahoru/dolů. Cílem bylo umožnit uživateli „vytočit“požadovaný tlak. V důsledku toho jsme museli vyvinout softwarovou rutinu, abychom získali informace o poloze ze spínače a odvodili směr otáčení, abychom zvýšili nebo snížili nastavenou hodnotu tlaku pro hlavní systém. V tomto Instructable pokryju fyzické rozhraní k mikrokontroléru, teorii provozu otočného přepínače, teorii provozu softwaru a rutinu odpočtu. Nakonec vám ukážu svou aplikaci rutiny odpočtu. Jak postupujeme, pokusím se zachovat věci poněkud obecné, aby se myšlenka dala aplikovat na co nejvíce platforem, ale také se podělím o to, co jsem udělal, abyste viděli konkrétní aplikaci.

Krok 1: Díly

Díly
Díly

Abyste to mohli implementovat, budete potřebovat: Otočný přepínač (kódovaný kvadraturou) Vytáhnout odpory Vhodná platforma mikrokontroléru Pro svůj projekt jsem použil optický kodér Grayhill 61C22-01-04-02. Datový list pro otočný přepínač vyžaduje 8,2 k ohmové zatahovací odpory na dvou datových linkách přicházejících z přepínače. Budete chtít zkontrolovat datový list kodéru, který se rozhodnete použít. Otočný přepínač, který jsem použil, lze také objednat s axiálním tlačítkovým spínačem. Je to užitečná funkce pro potvrzení výběrů, které byly vytočeny atd., Ale nebudu zde diskutovat o jeho rozhraní. Mám uvedenou „vhodnou platformu mikrokontroléru“, protože (myslím) to lze implementovat na více než jedné platformě. Viděl jsem spoustu lidí, kteří používají jiné mikrokontroléry pro Instructables, takže chci ukázat také obecný přístup. Napsal jsem celý kód v PIC Basic Pro pro použití s Microchip PIC16F877A. Klíčovou věcí, kterou na mikrokontroléru potřebujete, je schopnost přerušit, když dojde ke změně logiky na kterémkoli ze dvou pinů. Na PIC16F877A se tomu říká přerušení změny PORTB. Na jiných ovladačích to může mít i jiné názvy. Tato funkce přerušení mikrokontroléru je součástí toho, co dělá tuto implementaci tak elegantní.

Krok 2: Hardwarové rozhraní

Hardwarové rozhraní
Hardwarové rozhraní

„Jednoduché“řešení by bylo mít přepínač „jeden pól-16 hod“se 16 připojeními k mikrokontroléru. Každý výstup spínače by pak byl svázán s kolíkem na mikrokontroléru, takže každou polohu ovladače může kontrolovat mikrokontrolér. Toto je nadměrné používání I/O pinů. Věci se ještě zhoršují, pokud chceme mít na přepínači k dispozici více než 16 pozic (zarážky). Každá další pozice na přepínači by vyžadovala další vstup do mikrokontroléru. To se rychle stává velmi neefektivním využíváním vstupů na mikrokontroléru. Zadejte krásu otočného přepínače. Otočný přepínač má pouze dva výstupy do mikrokontroléru uvedené v datovém listu jako A a B. Tyto řádky mohou mít pouze čtyři možné logické úrovně: AB = 00, 01, 10 a 11. To výrazně snižuje počet vstupních řádků, které musíte použít při připojování přepínače k mikrokontroléru. Takže jsme snížili počet vstupních řádků na pouhé dva. Co teď? Zdá se, že opravdu potřebujeme 16 různých stavů, ale tento nový přepínač má pouze čtyři. Zastřelili jsme se do nohy? Ani náhodou. Číst dál. Vysvětlíme si trochu teorii za operací otočného přepínače.

Krok 3: Hardwarová teorie provozu

Hardwarová teorie provozu
Hardwarová teorie provozu
Hardwarová teorie provozu
Hardwarová teorie provozu
Hardwarová teorie provozu
Hardwarová teorie provozu

Snímání směru otáčení je možné pomocí výše uvedeného přepínače „jednopólový-16 hod“, ale využívá mnoho vstupů na mikrokontroléru. Použití otočného přepínače snižuje počet vstupů do mikrokontroléru, ale nyní musíme interpretovat signály přicházející z přepínače a převést je do směru otáčení. Již dříve jsem zmínil, že přepínač byl kódován kvadraturně. Toto je také jedna z klíčových elegancí tohoto řešení. To znamená, že přepínač obsahuje 2bitový kód, který odpovídá poloze přepínače. Možná si říkáte: „Pokud je do mikrokontroléru vstup se dvěma bity, jak reprezentujeme všech 16 pozic?“To je dobrá otázka. Nezastupujeme je všechny. Potřebujeme znát relativní polohy knoflíku, abychom mohli určit směr otáčení. Absolutní poloha knoflíku je irelevantní. Při otáčení ve směru hodinových ručiček se kód, který přepínač poskytuje, opakuje každé čtyři zarážky a je šedě kódován. Šedě kódované znamená, že pro každou změnu polohy existuje pouze jedna bitová změna. Místo toho, aby se vstup AB odpočítával pro otáčení ve směru hodinových ručiček v binárním systému takto: 00, 01, 10, 11, mění se takto: 00, 10, 11, 01. Všimněte si, že u posledně uvedeného vzoru se mění pouze jeden vstup mezi sady. Hodnoty proti směru hodinových ručiček pro vstup AB do mikrokontroléru budou vypadat následovně: 00, 01, 11, 10. Toto je jednoduše obrácen ve směru hodinových ručiček, přičemž AB = 00 je uvedeno jako první. Vizuálnější vysvětlení najdete v diagramech.

Krok 4: Softwarová teorie provozu

Softwarová teorie provozu
Softwarová teorie provozu

Rutina, která odvozuje směr otáčení, je řízena přerušením. Mikrokontrolér, který vyberete, musí být schopen přerušit kdykoli dojde ke změně na (alespoň) dvou pinech, když je přerušení povoleno. Toto se nazývá přerušení změny PORTB na PIC16F877A. Při každém otočení přepínače bude mikrokontrolér přerušen a provádění programu bude odesláno do rutiny přerušení služby (ISR). ISR rychle zjistí, jakým způsobem byl přepínač otočen, vhodně nastaví vlajku a rychle se vrátí do hlavního programu. Potřebujeme, aby se to stalo rychle, v případě, že uživatel otočí přepínač velmi rychle. Víme, že šedě kódovaný AB vzor se opakuje každé čtyři pozice, takže pokud uděláme rutinní práci pro přechody mezi těmito čtyřmi polohami, bude to fungovat pro všechny ostatní. Všimněte si, že v jednom čtyřpolohovém cyklu jsou čtyři hrany. Stoupající a sestupná hrana pro vstup A i pro vstup B. Mikroprocesor se přeruší pokaždé, když se objeví hrana, což znamená, že mikrokontrolér se přeruší při každém otočení knoflíku. V důsledku toho musí ISR zjistit, jakým způsobem byl knoflík otočen. Abychom zjistili, jak to udělat, obrátíme se na průběh otáčení ve směru hodinových ručiček. Všimněte si, že kdykoli má A hranu, její nová hodnota je vždy odlišná od hodnoty B. Když knoflík přejde z polohy 1 do 2, A přejde z logické-0 do logické-1. B je pro tento přechod stále 0 a neodpovídá nové hodnotě A. Když knoflík přejde z polohy 3 do 4, A má sestupnou hranu, zatímco B zůstává na logice-1. Znovu si všimněte, že B a nová hodnota A jsou různé. Právě teď vidíme, že kdykoli A způsobí přerušení během otáčení ve směru hodinových ručiček, jeho nová hodnota se liší od hodnoty B. Podívejme se na B, abychom zjistili, co se stane. B má stoupající hranu, když přepínač přechází z polohy 2 do 3. Zde je nová hodnota B stejná jako A. Při pohledu na poslední zbývající hranu pro otáčení ve směru hodinových ručiček má B sestupnou hranu pohybující se z polohy 4 do 5. (Pozice 5 je stejná jako pozice 1.) Nová hodnota B je stejná jako A i zde! Nyní můžeme provést nějaké odpočty! Pokud A způsobí přerušení a nová hodnota A je odlišná od hodnoty B, rotace byla ve směru hodinových ručiček. Kromě toho, pokud B způsobí přerušení a nová hodnota B je stejná jako A, pak byla rotace ve směru hodinových ručiček. Podívejme se rychle na případ rotace proti směru hodinových ručiček. Stejně jako otáčení ve směru hodinových ručiček způsobí otáčení proti směru hodinových ručiček čtyři přerušení v jednom cyklu: dva pro vstup A a dva pro vstup B. Vstup A má stoupající hranu, když se knoflík pohybuje z polohy 4 do 3 a sestupná hrana se pohybuje z polohy 2 do 1. Když se knoflík pohybuje z polohy 4 do 3, nová hodnota A je stejná jako hodnota B. Všimněte si, že když se A přesune z polohy 2 na 1, její nová hodnota je stejná jako hodnota B. Nyní vidíme, že když A způsobí přerušení a jeho nová hodnota odpovídá hodnotě B, rotace byla proti směru hodinových ručiček. Rychle se podíváme na vstup B, abychom vše ověřili. B způsobí přerušení, když se knoflík přesune z polohy 5 (což je stejné jako 1) do 4 a když se knoflík přesune z polohy 3 do 2. V obou těchto případech nová hodnota B neodpovídá stávající hodnotě A, což je opak případů, kdy B způsobí přerušení pro otáčení ve směru hodinových ručiček. To je dobrá zpráva. Všechno se kontroluje, jak by mělo. Abych to shrnul, pokud A způsobí přerušení a jeho nová hodnota neodpovídá hodnotě B nebo pokud B způsobí přerušení a nová hodnota B odpovídá hodnotě A, víme, že došlo k otáčení ve směru hodinových ručiček. V ostatních případech můžeme v softwaru zkontrolovat otáčení proti směru hodinových ručiček, nebo můžeme předpokládat, že protože nešlo o otáčení ve směru hodinových ručiček, bylo to proti směru hodinových ručiček. Moje rutina jednoduše učinila předpoklad.

Krok 5: Software

Software
Software
Software
Software

V PIC Basic Pro jsem nepoužíval vestavěné přerušení. K řízení rutiny jsem použil několik souborů, které jsem vložil do svého kódu od Darrel Taylor. Tady patří Darrelovi obrovský kredit! Soubory jsou zdarma. Chcete -li získat další informace, další aplikace a soubory stáhnout, navštivte jeho web. Tuto část můžete přeskočit, pokud nepoužíváte PIC s přerušením Darrel Taylor. Stačí nastavit přerušení podle potřeby na platformě, kterou používáte. Chcete-li nastavit přerušení Darrel Taylor (DT), musíte udělat dvě věci: 1.) Zahrňte do svých souborů DT_INTS-14.bas a ReEnterPBP.bas code.2.) Zkopírujte to a vložte do makra code. ASMINT_LIST; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, yes endm INT_CREATEENDASMI Vložte karty a mezery jako obrázek na konec Instructable, abyste ve svém kódu viděli věci trochu snáze. Budete jej muset mírně upravit, aby vyhovoval vašim potřebám. V části Štítek nahraďte ISR názvem podprogramu, který je vaším ISR. Nezapomeňte na podtržítko! Potřebujete to! Aby přerušení fungovalo, musíte udělat ještě dvě věci: 1.) Napište ISR. Napíšete to stejně, jako byste chtěli napsat podprogram PBP, až na to, že místo RETURN budete muset na konec podprogramu vložit @ INT_RETURN. To potvrdí přerušení a vrátí provádění programu tam, kde skončilo v hlavní smyčce. Uvnitř ISR musíte vymazat příznak přerušení, aby se váš program nezachytil v rekurzivním přerušení. K vymazání příznaku přerušení na PIC16F877A stačí pouze přečíst PORTB. Každý jiný mikrokontrolér má jiný způsob vymazání příznaků přerušení. Zkontrolujte datový list svého mikrokontroléru. 2) Když dosáhnete bodu v kódu, ve kterém chcete povolit přerušení, použijte tento řádek kódu:@ INT_ENABLE RBC_INT Když chcete přerušení zakázat, jednoduše použijte:@ INT_DISABLE RBC_INT Je toho hodně věcí zabalených do toho, co jsem právě pokryl, takže to rychle shrnu. Váš program by zatím měl vypadat nějak takto:; Jakékoli potřebné nastavení nebo 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; Jakékoli další potřebné nastavení nebo kód@ INT_ENABLE RBC_INT; Kód, který potřebuje vědět, jakým způsobem se knoflík otáčí@ INT_DISABLE RBC_INT; Jiný kódEND; Konec programumyISR:; Kód ISR zde@ INT_RETURN (Tabulka nastavení obsluhy přerušení) Myslím, že právě zde se může znovu připojit kdokoli, kdo nepoužívá přerušení PIC nebo DT. Nyní musíme skutečně napsat ISR, aby mikrokontrolér věděl, jakým způsobem se knoflík otáčí. Připomeňme si z části teorie softwaru, že směr rotace můžeme odvodit, pokud známe vstup, který způsobil přerušení, jeho novou hodnotu a hodnotu druhého vstupu. Zde je pseudokód: Přečtěte PORTB do proměnné scratch, abyste vymazali příznak přerušení Zkontrolujte, zda přerušení způsobil A. Pokud je to pravda, porovnejte A a B. Zkontrolujte, zda se liší, pokud se liší, byla rotace ve směru hodinových ručiček Jinak, byla proti směru hodinových ručiček EndifCheck Zkontrolujte, zda B způsobilo přerušení. Pokud je to pravda, porovnejte A a B Zkontrolujte, zda jsou různé, pokud jsou stejné. Bylo to ve směru hodinových ručiček Jinak, Bylo to proti směru hodinových ručiček EndifReturn od přerušení Objevování nové hodnoty změněného vstupu a dalšího (nezměněného) vstupu je snadné, protože je můžeme přečíst uvnitř ISR. Potřebujeme vědět, jaký byl stav každého z nich, než bude poprava odeslána ISR. To se děje v hlavní rutině. Hlavní rutina sedí a čeká na to, že bajtovou proměnnou, kterou jsme nazvali CWflag, nastaví ISR na 1 nebo zruší na 0. Po každé potvrzené změně knoflíku nebo v případě, že knoflík není aktivní, je proměnná nastavena na 5, aby indikovala klidový stav. Pokud je příznak nastaven nebo je vymazán, hlavní rutina okamžitě zvýší nebo sníží tlak nastaveného bodu vhodně na základě otáčení a poté nastaví proměnnou CWflag zpět na 5, protože knoflík je nyní opět nečinný. Jelikož hlavní rutina kontroluje CWflag, dokumentuje také stav hodnot otočného spínače A a B. To je opravdu jednoduché a vypadá to takto: oldA = AoldB = B Tady opravdu není nic super. Stačí zahrnout tyto dva řádky na začátek smyčky, která kontroluje rotaci CWflag. Právě aktualizujeme logické hodnoty vstupů z otočného ovladače uvnitř inkrementační/dekrementační smyčky v hlavní rutině, abychom viděli, jaký vstup způsobil přerušení při spuštění ISR. Zde je kód ISR: ABchange: scratch = PORTB 'Přečíst PORTB k vymazání příznaku přerušení' Pokud A způsobí přerušení, zkontrolujte směr otáčení B, IF oldA! = A PAK 'Pokud se A a B liší, bylo to otáčení ve směru hodinových ručiček IF A !! bylo otáčení po směru hodinových ručiček IF A == B THEN GOTO CW 'Jinak to bylo proti směru hodinových ručiček JINÉ GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURN Zahrnul jsem kód ISR do souboru AB_ISR.bas, protože karty v kódu se nezobrazují tak, jak by měly. Nyní, protože ISR má staré hodnoty pro vstupy A a B, může určit, který vstup způsobil přerušení, porovnat jej s jiným (nezměněným) vstupem a určit směr otáčení. Vše, co hlavní rutina musí udělat, je zkontrolovat CWflag, abyste zjistili, kterým směrem se knoflík otočil (pokud má) a zvýšit nebo snížit čítač, nastavenou hodnotu nebo cokoli chcete nebo potřebujete. Doufám, že to pomůže a také nebylo matoucí. Tento typ rozhraní je obzvláště užitečný, pokud váš systém již používá přerušení, protože toto je pouze jedno další přerušení, které chcete přidat. Užívat si!

Doporučuje: