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



Teraz jest 23 kwi 2024, o 22:27


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 7 mar 2021, o 23:57 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

Witam, próbuję obsłużyć enkoder obrotowy. Mikokontroler, którego używam to atmega328p. Wyjście enkodera A->PD2, wyście B->PD3. Z moich testów wynika, że ma on pełne kroki, a do uC podpięty jest według schematu jaki pokazuje Pan Mirek w swoich poradnikach. Chciałbym obsłużyć ten enkoder bez użycia przerwań i przeczytałem na internecie o metodzie poolingu. Z racji na to, że w moim przypadku czas drgań styków wynosi 10ms to ustawiam timer tak aby przerwanie występowało co 10ms ,a następnie obsługuję enkoder. Przy powolnym przekręcaniu wszystko działa ok, przy trochę szybszym gubi kroki, a przy bardzo szybkim wartość zmiennej stoi w miejscu (czasami nawet liczba wyświetlana na LCD dekrementuje albo inkrementuje się w przeciwną stronę). Czy ten mój pomysł z użyciem timera jest ok, a jeżeli tak to co tutaj mogę poprawić, żeby wszystko dobrze działało?

Link do enkodera: https://botland.com.pl/enkodery/9533-cz ... -ec11.html

Link do kodu, którym się wzorowałem: https://github.com/swharden/AVR-project ... der/main.c

Kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 mar 2021, o 13:18 
Offline
Nowy

Dołączył(a): 24 gru 2012
Posty: 12
Pomógł: 1

Skąd założenie, że czas drgań styków to 10ms. Odczytując stan styków co 10ms
nie widzisz tego co dzieje się "pomiędzy". Pozdrawiam Janek.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 mar 2021, o 16:06 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 544
Pomógł: 27

https://www.youtube.com/watch?v=IP5t_XzfRRM
Obejrzyj tą serię poradników.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2021, o 00:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Poszukaj tu gdzieś na forum mojego rozwiązania obsługi enkodera. Naprawdę ciężko w nim zgubić kroki. Może Ci się akurat spodoba...

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2021, o 10:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2019
Posty: 147
Pomógł: 37

antosV10 napisał(a):
Przy powolnym przekręcaniu wszystko działa ok, przy trochę szybszym gubi kroki, a przy bardzo szybkim wartość zmiennej stoi w miejscu

Jeszcze sprawdź jak "działa" bez kręcenia.

_________________
Think for yourself and question authority.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 mar 2021, o 00:00 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

SylwekK napisał(a):
Poszukaj tu gdzieś na forum mojego rozwiązania obsługi enkodera.


Znalazłem bibliotekę. Widzę, że forumowicze bardzo sobie ją chwalili :D. Mam tylko kilka pytań co do ustawień w pliku.h

1. Jeżeli mam enkoder z pełnymi krokami to jak mam ustawić te makra, bo nie rozumiem o co tu chodzi?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


2. W przykładowym kodzie była pokazana coś takiego
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Czyli funkcja enkoder.get() zwraca przyrost impulsów. A mogę tutaj jakoś przypisać tej funkcji aby przy kręceniu enkoderem, np. wykonywała jakąś funkcję ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 mar 2021, o 10:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Ad.1. Typ enkodera ustawia się w tej linii:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


natomiast tu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ustalasz pod które bity podpięty jest enkoder i wskazujesz możliwe stany 0/1. Wybrałem taki sposób (dla niektórych może kontrowersyjny), bo wiele mi to ułatwia w dalszej części programu. Można oczywiście dopisać sobie własne opcje definiowania, ale mnie to wystarczy. Istotne jest, że enkoder może być podłączony tylko w obrębie jednego portu czyli NIE może np. jedna końcówka w porcie A druga w porcie B. Obie muszą być podpięte albo pod A albo pod B. W powyższym przykładzie enc podpięty jest pod piny 0 i 1 portu. Pozostałe 2:7 można wykorzystać do innych celów.

Ad.2. Możesz przecież wykonanie funkcji uzależnić od stanu jakiegoś utworzonego na szybko licznika i w momencie osiągnięcia przez niego wartości zerujesz go (albo jakąś inną domyślną wartość wstawiasz) i wykonujesz funkcję. To tak na szybko co mi do głowy przychodzi :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2021, o 20:22 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

SylwekK napisał(a):
zerujesz go (albo jakąś inną domyślną wartość wstawiasz) i wykonujesz funkcję. To tak na szybko co mi do głowy przychodzi :)


Racja, racja.

Tylko jeszcze dopytam, podpiąłem piny enkodera do uC A->PD2 i B->PD3 bez żadnych filtrów itd. Używam atmegi328p więc ustawiłem makro PIN_ENC tak jak poniżej:

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


I teraz jeszcze raz jeżeli chodzi o te makra "STAN", jak mam enkoder pełnokrokowy to powinny powinny one być ustawione tak jak tutaj? Bo obecnie wynik na LCD nie rusza z miejsca. I dziękuję za pomoc od razu :D

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



Jeszcze dodaje cały kod źródłowy tak w razie czego.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2021, o 20:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

W tych liniach TYLKO wskazujesz piny i kolejność ma być dla Twojego projektu taka jak poniżej:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Gdybyś korzystał, np. z pinów 0 i 7

to zapis wyglądałby tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pisałem Ci gdzie zmienia się typ enkodera (pełny/półkrok). Przeoczyłeś ? :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2021, o 21:20 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

Hmm, wszystko ustawiłem tak jak trzeba, ale na LCD wynik dalej zamrożony :( jakiś pomysł? Testowałem też kod używając jednej diody i z tego wynika, że program tak jakby w ogóle nie zauważał, że kręcę enkoderem (wartość zmiennej odczyt się nie zmienia)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2021, o 21:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

A co się dzieje gdy wyświetlisz bezpośrednio zmienną "odczyt"? Przerwania działają?

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2021, o 21:30 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

Na lcd po prostu pokazuje się napis: "enc: 0", a przerwania działają bo sprawdzałem na diodzie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2021, o 21:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Jaka częstotliwość przerwań? Coś musiałeś przekombinować, albo źle skonfigurować w pliku h, ewentualnie połączenia pomylone. W wielu programach w różnych konfiguracjach korzystam z tej lib i wszystko hula.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2021, o 21:43 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

Częstotliwość ustawiłem na 10kHz, podłączone wszystko jest na pewno dobrze, bo sprawdzałem kilka razy. Poniżej jeszcze umieszczam kod pliku.h:

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2021, o 10:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Wygląda, że ustawienia są w porządku. Szukał bym jednak błędu w sprzęcie lub w obsłudze lcd (np. po co ten Lcd_clear za każdym razem w pętli?)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 mar 2021, o 19:40 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

SylwekK napisał(a):
Szukał bym jednak błędu w sprzęcie

Dokładnie:) sprawdzałem 100 razy czy wszystko jest do każdego pingu uC podpięta jest odpowiednia nóżka enkodera, ale ani razu nie sprawdzałem połączenia brzęczykiem. Okazało się, że coś mi się dzieje ze stykówką i akurat piny mikrokontrolera do, których podpięty był enkoder nie były połączone. Bardzo dziękuję za pomoc. Na koniec jeszcze zapytam, czy można tą biblioteką można obsłużyć kilka enkoderów na raz? I jeszcze raz bardzo dziękuję, bo wszystko świetnie działa :D :D.

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 mar 2021, o 20:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Nie jest do tego przystosowana, bo zazwyczaj z jednego enc się korzysta. Można, np. zrobić jej kopie pod inna nazwą jako zupełnie niezależna i pozmieniać nazwy zmiennych. Raz nawet musiałem tak zrobić :) Można też pokombinować z tablicowaniem zmiennych. Co kto lubi :)

_________________
http://www.sylwekkuna.com



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: 17 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO