Witam.
Chciałbym wam przedstawić moją bibliotekę do obsługi enkodera.
Na początku chce jednak zaznaczyć, że została ona utworzona w celu przypomnienia sobie pewnych zagadnień, zrozumienia działania enkodera, a także sprawdzeniu swoich umiejętności. Pewnie nie jest ona optymalna pod względem szybkości i objętości, jak biblioteka zaprezentowana przez mirka w
http://mirekk36.blogspot.com/2013/04/en ... y-cz2.html , ale najważniejsze że działa i spełniła swoją rolę.
Warunki pracy biblioteki:
- kwarc co najmniej 8MHz;
- przerwanie od dowolnego timera, wykonywane co 1ms (biblioteka nie konfiguruje przerwania) - do ustawienia przez użytkownika;
- podłączenie kanałów A i B do dowolnego pina mikrokontrolera - niekoniecznie do tego samego portu.
Zasada działania enkodera obrotowego (wyglądem przypomina potencjometr) jest oparta na odpowiednim przełączaniu kanałów A i B. W zależności w jakiej kolejności te kanały po sobie są załączane i wyłączane można określić w którą stronę kręcimy.
Do interpretacji kierunku obrotu, oraz w celu usunięcia pomyłek w odczycie do życia powołałem zmienną
stan, w której przechowywane są informacje dot. kierunku obrotu, oraz na którym etapie przełączania znajduje się enkoder. Poniżej przedstawiam graficzną interpretację zmiennej
stan:
Cztery najmniej znaczące bity określają kierunek obrotów zgodny z ruchem wskazówek zegara (CW), natomiast 4 najbardziej znaczące kierunek przeciwny do ruchu wskazówek zegara (CCW). Poniżej w dwóch kolumnach znajduje się reprezentacja stanu kanałów A i B podczas obrotu w danym kierunku. Należy zaznaczyć, że poziom logiczny 0 oznacza, że kanał jest aktywny (tak jak to ma miejsce podczas obsługi przycisków). Podczas każdej zmiany stanu kanału w odpowiedniej 4-ce bitów zmiennej
stan ustawiane są w 1 bitowe (odpowiednim miejscu) w zależności który etap został wykryty (etapy zmiany stanów określone są jako A B C D).
Jeżeli został wykryty etap A dla kierunku zgodnego z ruchem wskazówek zegara, kolejne etapy będą wykrywane tylko dla tego obrotu - dzięki czemu podczas zakończenia ruchu zmienna
stan osiągnie wartość 0xF0 (dla CCW) bądź 0x0F (dla CW). Po wykonanym obrocie można sprawdzić wartość tej zmiennej i określić czy obrót został dobrze zinterpretowany przez program czy nie.
Poniżej przedstawiam algorytm działania programu, które może rozwiać większość wątpliwości:
Dodatkowo podczas rozpoczęcia ruchu "uruchamiany" jest licznik, który odmierza czas w którym obrót powinien się zakończyć. W przypadku prawidłowego obrotu, licznik jest zatrzymywany. Natomiast, gdy ruch się zakończył a zmienna
stan nie osiągnęła wartości 0x0F lub 0xF0 (poprzez wykonanie pół kroku, lub jakieś inne zakłócenia) licznik zakończy swoje odliczanie, czego skutkiem będzie zresetowanie wszystkich zmiennych do wartości początkowych. Dzięki temu zabiegowi uniknąłem przekłamań i błędów podczas odczytu stanów z enkodera.
Działanie biblioteki oparte jest na zdarzeniach. Użytkownik ma do dyspozycji rejestrację dwóch zdarzeń - od obrotu w dowolną stronę, oraz od przycisku:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Konfiguracja biblioteki dostępna jest w osobnym pliku. Użytkownik może ustawić odpowiednie porty oraz piny do których jest podłączony enkoder (biblioteka nie korzysta z przerwań zewnętrznych - enkodera podłączamy do dwóch dowolnych pinów uC). Może również ustawić czas dla licznika (taki mój watchdog - pisałem o nim wcześniej), ilość impulsów przypadających na pełny obrót dla danego enkodera, oraz czy enkoder posiada przycisk (parametr ten włącza do kompilacji zdarzenie, oraz funkcje dla obsługi przycisku).
Zawartość pliku ds_enc_conf.h:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wszystkie informacje dot. enkodera zapisane są w strukturze, do której użytkownik ma dostęp poprze zmienną
enkoder_status. Struktura ta ma następującą budowę:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Do dyspozycji użytkownika oddane są również następujące funkcje:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Pierwsza funkcja powinna znaleźć się przed pętlą główną - odpowiada ona za poprawną inicjalizację enkodera (
Inicjalizacja ta nie obejmuje konfiguracji przerwania
).
Całe dekodowanie enkodera znajduje się w kolejnej funkcji - encoder_proccedure. Funkcję tą NALEŻY umieścić w przerwania od dowolnego timera, które jest wykonywane co 1ms.
Ostatnia funkcja zeruje wszystkie wartości które są przechowywane w strukturze enkoder_status.
Zawartość pliku ds_enc.h
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Zawartość pliku ds_enc.c:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Poniżej przedstawiam przykład zastosowania bilioteki:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Reasumując - biblioteka ta umożliwia poprawny odczyt obrotów z enkodera, niwelując przy tym wystąpienie zatrzymanie enkodera w "połowie kroku". Nie jest również wrażliwa na drgania styków, które również występują w enkoderze. Użytkownika ma do dyspozycji dość obszerną strukturę, w której znajduję się wszystkie informacje dot. enkodera. Obsługa oparta jest na zdarzeniach - zdarzenie od enkodera aktywowane jest w przypadku wykrycie obrotu w dowolnym kierunku (użytkownik musi zadbać o wyzerowanie tych zmiennych). Natomiast zdarzenie dla przycisku aktywowane jest tylko gdy przycisk jest wciśnięty podczas przejścia do obsługi tego zdarzenia.
Mam nadzieję, że wszystko opisałem w dość zrozumiały sposób.
Jestem ciekaw czy w jakiś sposób zainteresowałem kogoś moim sposobem obsługi enkodera.
Jak są jakieś pytania to pisać - postaram się na nie odpowiedzieć.
Jeżeli jest jakaś fala krytyki - pisać. Może uda mi się wybronić;)
Dodano po chwili namyślenia;) :
Ach teraz zauważyłem dopiero, że w złym miejscu umieściłem ten post. Proszę więc o przeniesienie go do Projekty programistyczne w DIY. Dzięki
Zapomniałem też napisać, że chociaż biblioteka ma kilka dni to jest używana w urządzeniu. Jak na razie działa bezproblemowo.