Skocz do zawartości

Enkoder & jego obsługa


Gość

Pomocna odpowiedź

Witam wszystkich.

Ze względu na powszechność różnych kodów oraz rozwiązań związanych z obsługą enkoderów mam takie pytanie;

Od czego powinien zacząć ktoś, kto ma ogólne pojęcie odnośnie logiki, ale nigdy wcześniej nie programował w C? Powinien od razu  korzystać z gotowych rozwiązań, czy może uczyć się samodzielnego myślenia starając się tworzyć własny kod do prostych zadań? Dwa tygodnie temu kiedy przyszła zamówiona płytka Arduino Uno rzeczą jasną rozpocząłem od analizy podstawowej składni pętli kodu zaczynając od migającej LED. (Sprawy tak oczywiste, iż nie będę o nich pisać) I chyba jak każdy kto chce się nauczyć chociażby podstaw programowania zaczynając od przycisków, zatrzaskiwania stanów logicznych, odczytywaniem wartości ADC z potencjometrów, obsługi czujników, wyświetlaczy itp. chce w tym wszystkim jeszcze poznać enkoder inaczej zwany elektronicznym potencjometrem. Dlatego z ciekawości znalazłem w pudełku jakiś stary trochę zdarty oraz zaszumiony enkoder, a następnie wypróbowałem pierwszy lepszy kod z Internetu który szczerze mówiąc głupiał. Inny zaś tracił kroki itp. Postanowiłem więc samodzielnie napisać swój kod, a raczej wypróbować rozwiązanie graficzne które kiedyś stworzyłem do obsługi enkoderów zewnętrznych w sterownikach PLC. 


byte encA = 7; //pin enkodera A
byte encB = 8; //pin enkodera B

byte a1 = 0; // wartość początkowa enkodera & wartość wyjściowa
byte a2 = 0; // MIN wartość enkodera (0-255)
byte a3 = 255; // MAX wartość enkodera (0-255)

byte d1 = 0;
byte d2 = 0;
byte d3 = 0;

void setup() {

pinMode(encA, INPUT_PULLUP); 
pinMode(encB, INPUT_PULLUP);

Serial.begin(9600);
}

void loop() {
  
byte D1 = digitalRead(encA);
byte D2 = digitalRead(encB);

if (D1 == 0 && d2 == 0) { 
  d1 = 1;
}
else if (D2 == 0 && D1 == 0 && d2 == 1 && d3 == 1 && a1 > a2){
  a1--; d3 = 0;
}

if (D2 == 0 && d1 == 0){
  d2 = 1;
}
else if (D1 == 0 && D2 == 0 && d1 == 1 && d3 == 1 && a1 < a3){
  a1++; d3 = 0; 
}

if (D1 == 1 && D2 == 1){
  d1 = 0; d2 = 0; d3 = 1;
}

Serial.println(a1);
delay(1);
}

Pytanie jednak nasuwa się inne;

Czy nauka pisania na start kodu w taki sposób w jaki to przedstawiłem wyżej jest poprawna? Mam na myśli to, czy tego typu kody nie powinny być zrealizowane przy pomocy operatorów logicznych? No bo z jednej strony operatory ułatwiają mocno sprawę, a drugiej o tyle komplikują życie, że potrzeba czasu i wprawy zanim zaczniesz w pełni korzystać z operatorów bez pomocy kalkulatora programisty.    

Link do komentarza
Share on other sites

Można i tak, i tak...korzystanie z gotowych rozwiązań (bibliotek) ma tą zaletę że bardzo skraca czas pisania kodu, a w niektórych przypadkach bez tego ciężko było coś zrobić...oczywiście im więcej będziesz pisał własnego kodu tym więcej się nauczysz, no ale biblioteki są po to żeby z nich korzystać 😉 do enkodera też dużo znajdziesz...np taka https://github.com/PaulStoffregen/Encoder (enkoder kwadraturowy)

Link do komentarza
Share on other sites

3 minuty temu, farmaceuta napisał:

Można i tak, i tak...korzystanie z gotowych rozwiązań (bibliotek) ma tą zaletę że bardzo skraca czas pisania kodu, a w niektórych przypadkach bez tego ciężko było coś zrobić

To jest oczywiste, jednak czy na sam start nauki programowania poleciłbyś korzystanie z gotowców do najprostszych zadań tj. obsługa enkodera, czy może samodzielne myślenie?  

Link do komentarza
Share on other sites

3 minuty temu, rafal220 napisał:

To jest oczywiste, jednak czy na sam start nauki programowania poleciłbyś korzystanie z gotowców do najprostszych zadań tj. obsługa enkodera, czy może samodzielne myślenie?  

Bierzesz gotowca, jak przestaje spełniać Twoje wymagania to go poprawiasz 😉 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

1 minutę temu, H1M4W4R1 napisał:

Bierzesz gotowca, jak przestaje spełniać Twoje wymagania to go poprawiasz

Heh, tylko żeby poprawić gotowca najpierw wypadałoby się nauczyć pisać takie gotowce. 😉 

Link do komentarza
Share on other sites

1 minutę temu, rafal220 napisał:

To jest oczywiste, jednak czy na sam start nauki programowania poleciłbyś korzystanie z gotowców do najprostszych zadań tj. obsługa enkodera, czy może samodzielne myślenie?  

Ciężko odpowiedzieć...😉 Napewno samodzielne myślenie się szybko odwdzięczy...choć w przypadku enkodera nie musisz koniecznie znać zasady działania kodu go obsługującego, bo nie jest to wiedza uniwersalna która wykorzystasz w wielu sytuacjach...więc znów przewaga w stronę bibliotek😉 (bo szybciej) 

 Ucz się języka C, pisz co tylko dasz radę, a jak czegoś nie ogarniesz to stosuj biblioteki (w przypadku trudniejszych czujników, wyświetlaczy, modułów, nawet się nie zastanawiaj tylko stosuj biblioteki)

Link do komentarza
Share on other sites

8 minut temu, farmaceuta napisał:

w przypadku trudniejszych czujników, wyświetlaczy, modułów, nawet się nie zastanawiaj tylko stosuj biblioteki

W tym przypadku nawet nie rozważałem takiej opcji. Na dniach przyjdą wyświetlacze 2 x 16, 4 x 20 i przetwornik ADS1115 po I2C.  Będzie okazja popracować z ciekawymi bibliotekami. 

Link do komentarza
Share on other sites

Analizując zauważyłem, że niektóre kody do obsługi enkodera wykorzystują aż 2 przerwania zewnętrzne których ilość jest mocno ograniczona. W przypadku mojego nano są dostępne tylko 2 przerwania. Znając zasadę działania enkodera zastanawiam się po co ktoś zaimplementował aż dwa porty z przerwaniami, kiedy mógł wykorzystać tylko jeden + jeden port bez przerwania zadeklarowany w pętli z przerwaniem zewnętrznym? Przecież to drugie przerwanie można wykorzystać w innym ważnym priorytecie zewnętrznym.

Link do komentarza
Share on other sites

16 minut temu, rafal220 napisał:

Analizując zauważyłem, że niektóre kody do obsługi enkodera wykorzystują aż 2 przerwania zewnętrzne których ilość jest mocno ograniczona. W przypadku mojego nano są dostępne tylko 2 przerwania. Znając zasadę działania enkodera zastanawiam się po co ktoś zaimplementował aż dwa porty z przerwaniami, kiedy mógł wykorzystać tylko jeden + jeden port bez przerwania zadeklarowany w pętli z przerwaniem zewnętrznym? Przecież to drugie przerwanie można wykorzystać w innym ważnym priorytecie zewnętrznym.

Popularna biblioteka mówi że najlepsze efekty są przy dwóch przerwaniach...a jeśli Ci braknie pinów w Ardu (faktycznie tylko dwa przerwania) to zainteresuj się przerwaniami PCInt których masz dużo iw większości zastosowań wystarczą...

Link do komentarza
Share on other sites

7 minut temu, farmaceuta napisał:

Popularna biblioteka mówi że najlepsze efekty są przy dwóch przerwaniach...

Gdyby się odnieść do kontroli jakiegoś serwomechanizmu, bądź innego elementu mechanicznego o dużej precyzji, to można mówić o jakiejś efektywności, ale że od razu potrzeba aż dwóch przerwań do obsługi enkodera którym kręcisz menu po wyświetlaczu? To przecież można zrobić i bez przerwań, a w przypadku długiego kodu w zupełności wystarczy jedno przerwanie. Kolejna sprawa jest taka, że tymi przerwaniami zewnętrznymi nieumiejętnie wykorzystanymi w pewnych okolicznościach możesz narobić niezłego bajzlu przerywając którąś z procedur o większym priorytecie niż sam enkoder. Dlatego osobiście podchodziłbym do tego tematu z dużą ostrożnością oraz o ile to możliwe unikał przerwań zewnętrznych w miejscach w których nie posiadają takowe stosownego uzasadnienia.   

Link do komentarza
Share on other sites

10 godzin temu, rafal220 napisał:

możesz narobić niezłego bajzlu przerywając którąś z procedur o większym priorytecie niż sam enkoder

Nie, tak się nie stanie (chyba że bardzo mocno się postarasz).

Tak w ogóle podaj przykład jakiej to ważnej procedury nie można przerwać.

Przede wszystkim: przerwania w AVR-ach (i nie tylko) możesz w każdej chwili zablokować. A przerwanie i tak się wykona po odblokowaniu (ostatnie). Masz do tego odpowiednie funkcje w Arduino lub (w bardziej skomplikowanych przypadkach) makro ATOMIC_BLOCK.

Po drugie: AVR-y nie mają priorytetów przerwań, a jeśli wykonuje się procedura przerwania to następne przerwanie będzie zablokowane. Czyli nic nie grozi.

10 godzin temu, rafal220 napisał:

To przecież można zrobić i bez przerwań

Zakładając że czas wykonania pozostałej części programu jest zerowy to tak. Ale przerwanie jest do tego, aby w czasie wykonywania jakichś bardziej wrednych operacji można było zrobić coś w międzyczasie. Pomyśl: jeśli jakieś obliczenia zajmują np. kilkadziesiąt milisekund, a w tym czasie kręcisz enkoderem to zgubisz wszystko, co się działo w czasie tych obliczeń i będziesz się zastanawiał czemu enkopder  gubi kroki.

A poza tym owszem, wszystko można zrobić jednym przerwaniem (z jednej linii enkodera). Przy dwóch przerwaniach masz jedynie większą precyzję -  co w przypadku enkoderów typu "gałka do kręcenia" nie ma w praktyce znaczenia. 

  • Lubię! 1
Link do komentarza
Share on other sites

13 minut temu, ethanak napisał:

Przede wszystkim: przerwania w AVR-ach (i nie tylko) możesz w każdej chwili zablokować. A przerwanie i tak się wykona po odblokowaniu (ostatnie). Masz do tego odpowiednie funkcje w Arduino lub (w bardziej skomplikowanych przypadkach) makro ATOMIC_BLOCK.

Jeszcze do tego nie doszedłem. Wiem tylko, że podstawowe wywołanie attachinterrupt przerywa wszystko w pętli głównej. 

15 minut temu, ethanak napisał:

Nie, tak się nie stanie (chyba że bardzo mocno się postarasz).

Programowanie ma to do siebie, że błąd można popełnić wszędzie. W sterownikach PLC jest prościej, a i tak zdarza się, że jakieś rzeczy wychodzą po czasie. 

18 minut temu, ethanak napisał:

Tak w ogóle podaj przykład jakiej to ważnej procedury nie można przerwać.

 Zgrzewarka punktowa do ogniw. Procedury znajdujące się w pętli stopki wyzwalającej powinny mieć najwyższy priorytet. Tam nic innego nie może się więcej dziać przy prądach dochodzących nawet do 10000A (10kA) w rozdzielczości nastawianego parametru czasu co 0,1ms. W przypadku zgrzewarki przerwanie od enkodera nie może mieć większego priorytetu niż stopka. Co prawda nikt w czasie zgrzewania nie kręci jednocześnie enkoderem, ale mimo wszystko urządzenie powinno być głupotoodporne.  

28 minut temu, ethanak napisał:

Zakładając że czas wykonania pozostałej części programu jest zerowy to tak. Ale przerwanie jest do tego, aby w czasie wykonywania jakichś bardziej wrednych operacji można było zrobić coś w międzyczasie. Pomyśl: jeśli jakieś obliczenia zajmują np. kilkadziesiąt milisekund, a w tym czasie kręcisz enkoderem to zgubisz wszystko, co się działo w czasie tych obliczeń i będziesz się zastanawiał czemu enkopder  gubi kroki.

To zależy jaki jest priorytet tych obliczeń. Jeżeli sterownik wykonuje coś ważnego, a zakładam że masz wyświetlacz, to na ekranie możesz wyświetlić symbol zegarka albo coś podobnego przed wejściem w pętle obliczeń, tak aby użytkownik wiedział iż sterownik coś tam mieli. W innych przypadkach długie obliczenia możesz podzielić np. na etapy, cykle itp. Jeżeli ich priorytet nie jest wysoki, to pomiędzy wierszami obliczeń możesz umieszczać co pewien okres krótki warunek odnoszący się do detekcji enkodera oraz nielubianego "go to" zjeżdżając z tych kilkudziesięciu ms do kilkunastu zakładając, że po wejściu do pętli obsługi enkodera dopóki kręcisz gałką program będzie skupiony tylko na enkoderze uwzględniając iż nie masz ustawionych innych przerwań wewnętrznych czy też zewnętrznych. Natomiast w momencie kiedy przestaniesz kręcić, to po wyznaczonym max krótkim czasie program wyjdzie z pętli enkodera. Tak przynajmniej to się robi na prostych sterownikach PLC i to działa przy znacznie skromniejszej bibliotece. W tanich PLC 8 bit po za zmiennymi int nie masz nic innego, tak wiec ci którzy na co dzień operują floatami, longami itp. mogli by być trochę rozczarowani, zwłaszcza kiedy wynik jakiegoś mnożenia przekracza wartość zmiennej int, a samo działanie należy tak sprytnie rozbić aby obliczenie się wykonało z mniejszą, czy też większa dokładnością. 

Link do komentarza
Share on other sites

12 minut temu, rafal220 napisał:

Tam nic innego nie może się więcej dziać przy prądach dochodzących nawet do 10000A (10kA) w rozdzielczości nastawianego parametru czasu co 0,1ms. W przypadku zgrzewarki przerwanie od enkodera nie może mieć większego priorytetu niż stopka.

To się robi na sprzętowych peryferiach mikrokontrolera, avr mają wyjścia pwm sterowane bezpośrednio z timera. Także tam stan zatrzaśnięty będzie tak długo jak długo jest ustawiony jego interwał. 

Link do komentarza
Share on other sites

5 minut temu, rafal220 napisał:

Wiem tylko, że podstawowe wywołanie attachinterrupt przerywa wszystko w pętli głównej

Że co?

Chcesz powiedzieć, że w loop wywołujesz attachInterrupt???

6 minut temu, rafal220 napisał:

w rozdzielczości nastawianego parametru czasu co 0,1ms

A w jaki sposób odmierzasz czas? I dlaczego uważasz, że opóźnienie np. o 10µs wyłączenia zgrzewarki ustawionej np. na 0.5msec (nie znam się więc nie powiem jaki to ma być czas, ale na pewno dłuższy od 100µs) będzie miało jakikolwiek wpływ na jej działanie (przecież tego nawet nie ustawisz). Pamiętaj, że procedura przerwania ma być krótka, ATmega na pracuje z zegarkiem 16 MHz, czyli dla funkcji zgrzewarki wejście przerwania od enkodera będzie praktycznie niezauważalne. A podade 10µs to taka długaśna procedura przerwania 😉

 

13 minut temu, rafal220 napisał:

zakładając, że po wejściu do pętli obsługi enkodera dopóki kręcisz gałką program będzie skupiony tylko na enkoderze uwzględniając iż nie masz ustawionych innych przerwań wewnętrznych czy też zewnętrznych.

Bardzo ładna teoria, sprawdzająca się niestety jedynie w układzie enkoder - wyświetlacz.

Rozumiem, że przyszedłeś tu ze świata PLC, ale mikrokontrolery to coś zupełnie innego i wszelkie podobieństwa są jedynie pozorne.

 

  • Lubię! 1
Link do komentarza
Share on other sites

1 godzinę temu, ethanak napisał:

Rozumiem, że przyszedłeś tu ze świata PLC, ale mikrokontrolery to coś zupełnie innego i wszelkie podobieństwa są jedynie pozorne.

Ja ostatnio musiałem się uczyć programować PLC firmy Wago - bo mają większość certyfikatów towarzystw morskich. Co prawda uczyłem się programować PLC w języku "Structured Text" (język tekstowy oparty na składni Pascala). Niestey niektóre fragmenty kodu i tak muszą być oparte o "bloczki". Próbowałem oprogramować komunikację po CAN 2.0 B z modułami na mikrokontrolerach (nie polecam nikomu). I nie będę raczej fanem PLC ... - wolę programowanie mikrokontrolerów (lub układów FPGA - mam już kilka projektów dla klientów  opartych na FPGA firmy Gowin).

Pozdrawiam

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.