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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 9 kwi 2025, o 09:20


    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 ] [ Zaznacz wszystko ]
    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 ] [ Zaznacz wszystko ]
    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 ] [ Zaznacz wszystko ]
    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 ] [ Zaznacz wszystko ]
    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