Spisu treści:

Jak interpretować kierunek obrotu z cyfrowego przełącznika obrotowego z PIC: 5 kroków
Jak interpretować kierunek obrotu z cyfrowego przełącznika obrotowego z PIC: 5 kroków

Wideo: Jak interpretować kierunek obrotu z cyfrowego przełącznika obrotowego z PIC: 5 kroków

Wideo: Jak interpretować kierunek obrotu z cyfrowego przełącznika obrotowego z PIC: 5 kroków
Wideo: LDmicro 19: Rotary Encoder Menu Navigation (Microcontroller PLC Ladder Programming with LDmicro) 2024, Lipiec
Anonim
Jak interpretować kierunek obrotu z cyfrowego przełącznika obrotowego za pomocą PIC?
Jak interpretować kierunek obrotu z cyfrowego przełącznika obrotowego za pomocą PIC?

Celem tego Instruktażu jest zilustrowanie, jak połączyć cyfrowy (kodowany kwadraturowo) przełącznik obrotowy z mikrokontrolerem. Nie martw się, wyjaśnię, co oznacza dla nas kod kwadraturowy. Ten interfejs i towarzyszące mu oprogramowanie pozwolą mikrokontrolerowi rozpoznać kierunek obrotu dla każdego ruchu od jednego punktu do drugiego. Ostatnio używałem tego typu przełącznika w projekcie mikrokontrolera, który wymagał wprowadzenia wartości zadanej ciśnienia za pomocą pokrętła z 16 zapadki zamiast przycisków góra/dół. Pomysł polegał na umożliwieniu użytkownikowi „wykręcenia” żądanego ciśnienia. W rezultacie musieliśmy opracować procedurę oprogramowania, aby uzyskać informacje o położeniu z przełącznika i wywnioskować kierunek obrotu w celu zwiększenia lub zmniejszenia wartości zadanej ciśnienia dla systemu głównego. W tej instrukcji omówię interfejs fizyczny do mikrokontrolera, teorię działania przełącznika obrotowego, teorię działania oprogramowania oraz procedurę dedukcji. Na koniec pokażę ci moje zastosowanie procedury dedukcji. W miarę postępów postaram się zachować nieco ogólny charakter, aby pomysł można było zastosować na jak największej liczbie platform, ale podzielę się również tym, co zrobiłem, abyście mogli zobaczyć konkretną aplikację.

Krok 1: Części

Części
Części

Aby to zrealizować, będziesz potrzebować: Przełącznik obrotowy (kodowany kwadraturowo)Rezystory podciągająceOdpowiednia platforma mikrokontrolera Do mojego projektu użyłem enkodera optycznego Grayhill 61C22-01-04-02. Arkusz danych przełącznika obrotowego wymaga rezystorów podciągających 8,2 kΩ na dwóch liniach danych wychodzących z przełącznika. Będziesz chciał sprawdzić arkusz danych dla kodera, którego zdecydujesz się użyć. Przełącznik obrotowy, którego użyłem, można również zamówić z przełącznikiem osiowym. Jest to przydatna funkcja do zatwierdzania dokonanych selekcji itp., ale nie będę tutaj omawiał jej interfejsu. Mam na liście „odpowiednią platformę mikrokontrolera”, ponieważ (chyba) można ją zaimplementować na więcej niż jednej platformie. Widziałem wiele osób używających innych mikrokontrolerów dla Instructables, więc chcę również pokazać ogólne podejście. Napisałem cały kod w PIC Basic Pro do użytku z Microchip PIC16F877A. Naprawdę, kluczową rzeczą, której potrzebujesz w mikrokontrolerze, jest możliwość przerwania, gdy nastąpi zmiana logiki na jednym z dwóch pinów. W PIC16F877A nazywa się to przerwaniem zmiany PORTB. Na innych kontrolerach mogą istnieć inne nazwy. Ta funkcja przerwania mikrokontrolera jest częścią tego, co czyni tę implementację tak elegancką.

Krok 2: Interfejs sprzętowy

Interfejs sprzętowy
Interfejs sprzętowy

„Prostym” rozwiązaniem byłoby posiadanie przełącznika „single pole-16 throw” z 16 połączeniami z mikrokontrolerem. Każde wyjście przełącznika byłoby następnie powiązane z pinem w mikrokontrolerze, tak aby każda pozycja pokrętła mogła być sprawdzana przez mikrokontroler. Jest to nadmierne użycie pinów I/O. Sprawy się pogarszają, jeśli chcemy mieć więcej niż 16 pozycji (zaczepów) dostępnych na przełączniku. Każda dodatkowa pozycja na przełączniku wymagałaby dodatkowego wejścia do mikrokontrolera. To szybko staje się bardzo nieefektywnym wykorzystaniem wejść w mikrokontrolerze. Wprowadź piękno przełącznika obrotowego. Przełącznik obrotowy ma tylko dwa wyjścia do mikrokontrolera wymienione jako A i B w arkuszu danych. Istnieją tylko cztery możliwe poziomy logiczne, które te linie mogą przyjąć: AB = 00, 01, 10 i 11. To znacznie zmniejsza liczbę linii wejściowych, których należy użyć przy podłączaniu przełącznika do mikrokontrolera. Tak więc zmniejszyliśmy liczbę wierszy wejściowych do zaledwie dwóch. Co teraz? Wygląda na to, że naprawdę potrzebujemy 16 różnych stanów, ale ten nowy przełącznik ma tylko cztery. Czy strzeliliśmy sobie w stopę? Nie. Czytaj. Aby wyjaśnić, omówimy trochę teorii stojącej za działaniem przełącznika obrotowego.

Krok 3: Teoria działania sprzętu

Sprzętowa teoria działania
Sprzętowa teoria działania
Sprzętowa teoria działania
Sprzętowa teoria działania
Sprzętowa teoria działania
Sprzętowa teoria działania

Wykrywanie kierunku obrotów jest możliwe za pomocą wspomnianego wcześniej przełącznika „single pole-16 throw”, ale zużywa on wiele wejść na mikrokontrolerze. Użycie przełącznika obrotowego zmniejsza liczbę wejść do mikrokontrolera, ale teraz musimy zinterpretować sygnały pochodzące z przełącznika i przełożyć je na kierunek obrotu. Jak wspomniałem wcześniej, przełącznik był zakodowany kwadraturowo. To także jedna z kluczowych elegancji w tym rozwiązaniu. Oznacza to, że przełącznik podaje 2-bitowy kod, który odpowiada pozycji przełącznika. Być może myślisz: „Jeśli do mikrokontrolera jest dwubitowe wejście, jak mamy reprezentować wszystkie 16 pozycji?” To dobre pytanie. Nie reprezentujemy ich wszystkich. Wystarczy znać względne położenie pokrętła, aby określić kierunek obrotu. Bezwzględne położenie pokrętła nie ma znaczenia. W przypadku obrotu w prawo kod nadany przez przełącznik powtarza się co cztery zapadki i jest oznaczony na szaro. Kodowanie na szaro oznacza, że dla każdej zmiany pozycji występuje tylko jedna zmiana bitu. Zamiast odliczania wejścia AB w kierunku zgodnym z ruchem wskazówek zegara w postaci binarnej w następujący sposób: 00, 01, 10, 11, zmienia się tak: 00, 10, 11, 01. Zauważ, że dla tego drugiego wzorca jest tylko jedno wejście zmieniające się między zestawy. Wartości przeciwne do ruchu wskazówek zegara dla wejścia AB do mikrokontrolera będą wyglądać tak: 00, 01, 11, 10. Jest to po prostu odwrotność wzorca zgodnego z ruchem wskazówek zegara z AB = 00 na liście. Spójrz na diagramy, aby uzyskać bardziej wizualne wyjaśnienie.

Krok 4: Teoria działania oprogramowania

Teoria działania oprogramowania
Teoria działania oprogramowania

Procedura, która określa kierunek obrotów, jest sterowana przerwaniami. Wybrany mikrokontroler musi mieć możliwość przerwania za każdym razem, gdy nastąpi zmiana na jednym z (co najmniej) dwóch styków, gdy przerwanie jest włączone. Nazywa się to przerwaniem zmiany PORTB w PIC16F877A. Za każdym razem, gdy przełącznik zostanie obrócony, mikrokontroler zostanie przerwany, a wykonanie programu zostanie wysłane do procedury przerwania (ISR). ISR szybko zorientuje się, w którą stronę został obrócony przełącznik, odpowiednio ustawi flagę i szybko wróci do programu głównego. Musimy to zrobić szybko na wypadek, gdyby użytkownik bardzo szybko obrócił przełącznik. Wiemy, że zakodowany na szaro wzór AB powtarza się co cztery pozycje, więc jeśli rutyna zadziała dla przejść między tymi czterema pozycjami, będzie działać dla wszystkich pozostałych. Zauważ, że w jednym cyklu czterech pozycji są cztery krawędzie. Zbocze narastające i opadające dla wejścia A i wejścia B. Mikroprocesor będzie przerywany za każdym razem, gdy pojawi się zbocze, co oznacza, że mikrokontroler zostanie przerwany za każdym razem, gdy przekręci się pokrętło. W rezultacie ISR musi dowiedzieć się, w którą stronę przekręcono pokrętło. Aby pomóc nam dowiedzieć się, jak to zrobić, zwracamy się do przebiegu w celu obrotu zgodnie z ruchem wskazówek zegara. Zauważ, że za każdym razem, gdy A ma krawędź, jej nowa wartość jest zawsze inna niż B. Gdy pokrętło przechodzi z pozycji 1 do 2, A przechodzi z logicznego-0 na logiczne-1. B nadal wynosi 0 dla tego przejścia i nie odpowiada nowej wartości A. Gdy pokrętło przechodzi z pozycji 3 do 4, A ma zbocze opadające, podczas gdy B pozostaje na logice-1. Zauważ ponownie, że B i nowa wartość A są różne. W tej chwili widzimy, że za każdym razem, gdy A powoduje przerwanie podczas obrotu zgodnie z ruchem wskazówek zegara, jego nowa wartość jest inna niż B. Sprawdźmy B, aby zobaczyć, co się stanie. B ma zbocze narastające, gdy przełącznik przechodzi z pozycji 2 do 3. W tym przypadku nowa wartość B jest taka sama jak A. Patrząc na ostatnią pozostałą krawędź do obrotu zgodnie z ruchem wskazówek zegara, B ma zbocze opadające przesuwające się z pozycji 4 do 5. (Pozycja 5 jest taka sama jak pozycja 1.) Nowa wartość B jest taka sama jak tutaj! Możemy teraz dokonać pewnych odliczeń! Jeśli A powoduje przerwanie, a nowa wartość A jest inna niż B, obrót był zgodny z ruchem wskazówek zegara. Dodatkowo, jeśli B powoduje przerwanie, a nowa wartość B jest taka sama jak A, to obrót był zgodny z ruchem wskazówek zegara. Zbadajmy szybko przypadek obrotu przeciwnego do ruchu wskazówek zegara. Podobnie jak obrót w prawo, obrót w lewo spowoduje cztery przerwania w jednym cyklu: dwa dla wejścia A i dwa dla wejścia B. Wejście A ma zbocze narastające, gdy pokrętło przesuwa się z pozycji 4 do 3 i zbocze opadające przesuwające się z pozycji 2 do 1 Kiedy pokrętło przesuwa się z pozycji 4 na 3, nowa wartość A jest taka sama jak wartość B. Zauważ, że gdy A przechodzi z pozycji 2 na 1, jej nowa wartość jest taka sama jak wartość B. Teraz widzimy, że kiedy A powoduje przerwanie, a jego nowa wartość odpowiada wartości B, obrót był przeciwny do ruchu wskazówek zegara. Szybko przyjrzymy się wejściu B, aby wszystko zweryfikować. B spowoduje przerwanie, gdy gałka przesunie się z pozycji 5 (czyli to samo co 1) do 4 oraz gdy gałka przesunie się z pozycji 3 na 2. W obu tych przypadkach nowa wartość B nie pasuje do istniejącej wartości z A, co jest przeciwieństwem przypadków, w których B powoduje przerwanie obrotu zgodnie z ruchem wskazówek zegara. To jest dobra wiadomość. Wszystko wygląda tak, jak powinno. Podsumowując, jeśli A powoduje przerwanie, a jego nowa wartość nie odpowiada wartości B lub jeśli B powoduje przerwanie, a nowa wartość B odpowiada wartości A, wiemy, że nastąpił obrót zgodnie z ruchem wskazówek zegara. Możemy sprawdzić inne przypadki pod kątem obrotu w kierunku przeciwnym do ruchu wskazówek zegara w oprogramowaniu lub możemy założyć, że ponieważ nie był to obrót zgodnie z ruchem wskazówek zegara, był przeciwny do ruchu wskazówek zegara. Moja rutyna po prostu zakładała.

Krok 5: Oprogramowanie

Oprogramowanie
Oprogramowanie
Oprogramowanie
Oprogramowanie

Nie korzystałem z wbudowanych przerwań w PIC Basic Pro. Użyłem kilku plików, które dołączyłem do mojego kodu od Darrela Taylora, aby sterować procedurą. W tym miejscu należy ogromny kredyt Darrela! Pliki są bezpłatne. Wystarczy odwiedzić jego stronę internetową, aby uzyskać więcej informacji, inne aplikacje i pobrać pliki. Możesz pominąć tę część, jeśli nie używasz PIC z przerwaniami Darrel Taylor. Po prostu skonfiguruj przerwania zgodnie z potrzebami na używanej platformie. Aby skonfigurować przerwania Darrela Taylora (DT), należy wykonać dwie rzeczy: 1.) Dołącz pliki DT_INTS-14.bas i ReEnterPBP.bas do swojego code.2.) Skopiuj i wklej to do swojego kodu. ASMINT_LIST macro;IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, tak endm INT_CREATEENDASMIWstaw tabulatory i spacje, takie jak grafika na końcu Instructable, dzięki czemu możesz zobaczyć trochę łatwiej w swoim kodzie. Będziesz musiał go nieco zmodyfikować, aby dopasować go do swoich potrzeb. W obszarze Etykieta zastąp ISR nazwą podprogramu, który jest Twoim ISR. Nie zapomnij o podkreśleniu! Potrzebujesz tego! Aby przerwania działały, musisz zrobić jeszcze dwie rzeczy: 1. Napisz ISR. Napiszesz to tak, jakbyś pisał podprogram PBP, z tą różnicą, że będziesz musiał wstawić @INT_RETURN na końcu podprogramu zamiast RETURN. To potwierdzi przerwanie i zwróci wykonanie programu do miejsca, w którym zostało przerwane w głównej pętli. Wewnątrz ISR, musisz wyczyścić flagę przerwania, aby twój program nie został złapany w przerwaniu rekurencyjnym. Wystarczy odczytać PORTB, aby wyczyścić flagę przerwań na PIC16F877A. Każdy inny mikrokontroler ma inny sposób kasowania flag przerwań. Sprawdź arkusz danych swojego mikrokontrolera.2.) Kiedy dojdziesz do punktu w kodzie, w którym chcesz włączyć przerwanie, użyj tego wiersza kodu:@ INT_ENABLE RBC_INTGdy chcesz wyłączyć przerwanie, po prostu użyj:@ INT_DISABLE RBC_INTJest dużo rzeczy zapakowanych w to, co właśnie omówiłem, więc szybko podsumuję. Do tej pory Twój program powinien wyglądać mniej więcej tak:; Wszelkie potrzebne ustawienia lub kodINCLUDE "DT_INTS-14.bas"INCLUDE "ReEnterPBP.bas"ASMINT_LIST makro;IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, tak endm INT_CREATEENDASM; Wszelkie inne potrzebne ustawienia lub kod@ INT_ENABLE RBC_INT; Kod, który musi wiedzieć, w którą stronę obraca się pokrętło@ INT_DISABLE RBC_INT; Inny kodEND; Koniec programumyISR:;kod ISR@ INT_RETURN(Tabela konfiguracji obsługi przerwań)Myślę, że jest to miejsce, w którym każdy, kto nie używa przerwań PIC lub DT, może ponownie dołączyć. Teraz musimy właściwie napisać ISR, aby mikrokontroler wiedział, w którą stronę obraca się pokrętło. Przypomnij sobie z rozdziału poświęconego teorii oprogramowania, że możemy wywnioskować kierunek obrotu, jeśli znamy wejście, które spowodowało przerwanie, jego nową wartość i wartość drugiego wejścia. Oto pseudokod: Wczytaj PORTB do zmiennej scratch, aby wyczyścić flagę przerwania Sprawdź, czy A spowodował przerwanie. Jeśli prawda, porównaj A i B. Sprawdź, czy jest inny, jeśli inny, To był obrót zgodnie z ruchem wskazówek zegara W przeciwnym razie, To było przeciwnie do ruchu wskazówek zegara EndifSprawdź, czy B spowodował przerwanie. Jeśli prawda, Porównaj A i B Sprawdź, czy różne, jeśli takie same, Obrót w prawo Else, Obrót w lewo EndifReturn z przerwania Skąd wiemy, czy zmiana na A lub B spowodowała przerwanie? Odkrycie nowej wartości zmienionego wejścia i drugiego (niezmienionego) wejścia jest łatwe, ponieważ możemy je odczytać wewnątrz ISR. Musimy wiedzieć, jaki był stan każdego z nich, zanim wykonanie zostanie wysłane do ISR. Dzieje się tak w głównej rutynie. Główna procedura siedzi i czeka, aż zmienna bajtowa, którą nazwaliśmy CWflag, zostanie ustawiona na 1 lub wyczyszczona do 0 przez ISR. Po każdej potwierdzonej zmianie pokrętła lub w przypadku braku aktywności pokrętła, zmienna jest ustawiana na 5, co wskazuje na stan bezczynności. Jeśli flaga zostanie ustawiona lub zostanie wyczyszczona, główna procedura natychmiast zwiększy lub zmniejszy nastawę ciśnienia odpowiednio w oparciu o obrót, a następnie ustawia zmienną CWflag z powrotem na 5, ponieważ pokrętło jest teraz ponownie bezczynne. Ponieważ główną procedurą jest sprawdzanie flagi CW, dokumentuje ona również stan wartości przełączników obrotowych A i B. To jest naprawdę proste i wygląda tak:staryA = AoldB = BNaprawdę nie ma tu nic super wymyślnego. Po prostu dołącz te dwie linie na początku pętli, która sprawdza flagę CW pod kątem rotacji. Po prostu aktualizujemy wartości logiczne wejść z pokrętła wewnątrz pętli inkrementacji/dekrementacji w głównej procedurze, abyśmy mogli zobaczyć, jakie wejście spowodowało przerwanie podczas wykonywania ISR. Oto kod ISR:ABchange: scratch = PORTB ' Odczytaj PORTB, aby wyczyścić flagę przerwania ' Jeśli A powoduje przerwanie, sprawdź kierunek obrotu B IF oldA != A THEN ' Jeśli A i B są różne, to był obrót w prawo IF A != B THEN GOTO CW ' W przeciwnym razie był to obrót w kierunku przeciwnym do ruchu wskazówek zegara ELSE GOTO CCW ENDIF ENDIF ' Jeśli B powoduje przerwanie, sprawdź kierunek obrotu A IF oldB != B THEN ' Jeśli A i B są takie same, był zgodny z ruchem wskazówek zegara IF A == B THEN GOTO CW ' W przeciwnym razie był to obrót w kierunku przeciwnym do ruchu wskazówek zegara ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURNZałączyłem kod ISR w pliku AB_ISR.bas, ponieważ zakładki w kodzie nie pokazują się tak, jak powinny. Teraz, ponieważ ISR ma stare wartości dla wejść A i B, może określić, które wejście spowodowało przerwanie, porównać je z innym (niezmienionym) wejściem i określić kierunek rotacji. Wszystko, co musi zrobić, to sprawdzić flagę CW, aby zobaczyć, w którym kierunku obróciło się pokrętło (jeśli tak) i zwiększyć lub zmniejszyć licznik, wartość zadaną lub cokolwiek chcesz lub potrzebujesz. Mam nadzieję, że to pomogło i nie było zbyt zagmatwane. Ten typ interfejsu jest szczególnie przydatny, jeśli twój system już używa przerwań, ponieważ jest to tylko jedno dodatkowe przerwanie do dodania. Cieszyć się!

Zalecana: