Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 15 lis 2024, o 04:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 13 gru 2015, o 15:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 sty 2013
Posty: 169
Lokalizacja: Silesia - P-ce
Pomógł: 10

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:
Obrazek

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:
Obrazek

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:

Składnia: [ Pobierz ] [ Ukryj ]
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:
Składnia: [ Pobierz ] [ Ukryj ]
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ę:

Składnia: [ Pobierz ] [ Ukryj ]
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:

Składnia: [ Pobierz ] [ Ukryj ]
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
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zawartość pliku ds_enc.c:
Składnia: [ Pobierz ] [ Ukryj ]
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:
Składnia: [ Pobierz ] [ Ukryj ]
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.


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.

_________________
Niewiele trzeba by być szczęślwym.Wystarczy chcieć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2015, o 21:34 
Offline
Użytkownik

Dołączył(a): 14 lut 2015
Posty: 44
Pomógł: 2

Dziękuję za podzielenie się biblioteką :)

Chciałbym ją po testować ze swoim silniczkiem:
https://www.pololu.com/product/2288

Licznik obrotów zrealizowałeś, więc można na tej podstawie mierzyć np. drogę jaką rolka napędowa przebyła,a czy można na podstawie Twojej biblioteki mierzyć rzeczywistą prędkość obrotową silnika/rolki napędowej?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2015, o 21:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 sty 2013
Posty: 169
Lokalizacja: Silesia - P-ce
Pomógł: 10

maniocek napisał(a):
Licznik obrotów zrealizowałeś, więc można na tej podstawie mierzyć np. drogę jaką rolka napędowa przebyła,a czy można na podstawie Twojej biblioteki mierzyć rzeczywistą prędkość obrotową silnika/rolki napędowej?


Można, ale jeżeli będzie zależało ci na dokładności pomiaru drogi i prędkości to przy względnie dużych prędkościach może być dość duże przekłamanie. Zauważ, że "próbkowanie" stanu kanałów odbywa się co 1ms. Poprawny stan jest wykrywany dopiero po 5ms, przy 20 krokach masz 100 ms - więc pełny obrót rolki musiałby wykonać się w czasie nie mniejszym jak 100ms. Pamiętaj też o liczniku (takim moim watchdogu) - domyślnie jest ustawiony na 150 ms więc problemu z resetowaniem zmiennych pomocniczych nie będzie - więc go nie zmieniaj na mniejsze wartości.

A co do obliczania prędkości możesz zrobić tak jak to jest w licznikach rowerowych - znając obwód rolki mierzysz tylko czas pełnego obrotu tej rolki i już masz wszystko co jest potrzebne - drogę i czas do obliczenia prędkości rolki (nie wiem jak to jest w przypadku silników z przekładniami).

Jak już będziesz po testach to daj znać jak się moja biblioteka spisała (nie przewidywałem zastosowania jej do silników, ale zawsze może okazać się przydatna) - pewnie będziesz testował również inne biblioteki więc jestem ciekaw jak wypadnie w porównaniu z nimi.

_________________
Niewiele trzeba by być szczęślwym.Wystarczy chcieć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 gru 2015, o 15:44 
Offline
Użytkownik

Dołączył(a): 14 lut 2015
Posty: 44
Pomógł: 2

Ten silnik+enkoder który mam generuje 8246 impulsów na jeden obrót wału na wyjściu przekładni.
Mam rolkę fi 31 mm, więc maksymalną prędkość jaką uzyskam to ~54 mm/s , oczywiście planuję ją regulować poprzez PWM, więc będzie również sporo niższa.

Zakładając prędkość maksymalną, rolka w ciągu sekundy obróci się o jakieś 1 i 2/3 raza.
8246 impulsów na pełny obrót * 5ms = 41230 ms = 41,230 s
Czas jednego pełnego obrotu rolki jest krótszy niż odczyt, więc Twój warunek jest nie spełniony.

W takim wypadku chyba Twoja biblioteka nie zadziała poprawnie? Czy się mylę?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 20:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 sty 2013
Posty: 169
Lokalizacja: Silesia - P-ce
Pomógł: 10

Dokładnie tak jak piszesz. Jeżeli byś mógł czekać ponad 40s na pełny obrót to byś mógł zastosować, ale piszesz że chcesz mieć dość dużą prędkość więc nie ma co próbować.

Dzięki za chęci.

_________________
Niewiele trzeba by być szczęślwym.Wystarczy chcieć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO