Skocz do zawartości

Enkoder kwadraturowy - licznik impulsów i indeksów


PabloTitan

Pomocna odpowiedź

Witam,

Obecnie rozpracowuję enkoder kwadraturowy ENX16: ma dwa kanały A i B z zaprzeczeniami oraz kanał indeksujący z zaprzeczeniem. Najpierw myślałem nad dołożeniem licznika LS7183 albo LS7083, jednak niestety ciężko je kupić. Czy są może jakieś zamienniki albo podobne układy, ktore spełniałyby funkcję zamienienia sygnałów z kanałów A i B przesuniętych względem siebie w fazie na prosty sygnał do zliczania w dół lub w górę?

Drugi problem jest z syngałem indeksującym- przy testowaniu często mikrokontroler gubił impuls, może dlatego, że jest on dużo krótszy niż impulsy A i B. Myślałem nad układem z przerzutnikiem D, żeby wykrywać zbocze narastające, które bym podpiął do CLK, a na D podałbym stan wysoki, wtedy można badać dłuższy impuls wyjściowy mikrokontrolerem, który potem by sobie resetował, jeśli by sobie spokojnie podniósł wartość licznika indeksującego. Czy to jest dobry pomysł, czy można to jakoś inaczej zrobić? 🙂

Z góry dziękuję za podpowiedzi 😉

Link do komentarza
Share on other sites

xmegi i stmy mają sprzętową obsługę enkoderów kwadraturowych. przy stosunkowo małych częstotliwościach można to obsłużyć programowo na ATmedze, żeby wystarczyło czasu na inne zadania.

sygnał indeksujący odbieraj za pomocą przerwania zewnętrznego.

Link do komentarza
Share on other sites

Jest jeszcze rodzina układów HCTL20xx f-my Avago - te są dostępne np. w Farnellu (HCTL2017, 2021), ale ich ceny to jakiś żart. To są produkty z czasów prymitywnych sterowników przemysłowych, gdzie procesory tam używane nie miały sprzętowej obsługi ciągów impulsów kwadraturowych i trzeba było coś małego, jednoukładowego wymyślić.

Jeżeli zliczanie chcesz/musisz robić na ATmedze lub innym procku niemającym wsparcia enkodera, możesz poważnie zmniejszyć liczbę zdarzeń (zboczy) sygnału na które musisz reagować przez zbudowanie prostego układu z dwóch przerzutników D i kilku bramek - szukaj pod hasłem "quadrature decoder". Wtedy na każdy krok enkodera masz tylko jeden impuls (zamiast czterech zboczy) i to na odpowiednim wejściu procesora. Podłączając to do wejść przerywających czułych na zbocze masz pełną obsługę enkodera na (niestety aż) 3 przerwaniach: krok w lewo, krok w prawo i index. Na enkoder możesz też "zmarnować" jakieś małe ale szybkie ATtiny. Tu nawet 100% jego obciążenia nie będzie wielkim kosztem. Jaką wersję enkodera "rozpracowujesz" i co chcesz mierzyć? Programowa obsługa takiego urządzenia przestaje nadążać przy większych obrotach i/lub rozdzielczościach (>10kHz?) i wtedy przydają się rozwiązania sprzętowe. Wobec braku dekodera w procesorze możesz zawsze zbudować coś na TLL/CMOS serii 74xx lub 4xxx (dekoder + licznik dwukierunkowy o dowolnej długości), ale chyba już nikomu nie chce się robić takich układów. No i zostaje też logika programowalna. Sam dekoder pomieści nawet najmniejszy PLD, ale na zliczanie i jakiś interfejs do procesora (SPI?) plus sygnalizację zdarzeń trzeba czegoś większego (CPLD?).

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

Enkoder Maxon ENX16 EASY łącznie z silnikiem DC, rozdzielczość 256 impulsów/obrót, maksymalnie 30 000 obrotów na minutę. Z danych min. state duration = 500 ns i rise/fall time 20 ns wnioskuję, że częstotliwość może być maksymalnie do jakichś 1.8 MHz, jeśli się nie mylę? Ale założę, że aż tak szybko się nie będzie kręcił 🙂

Taki ukad jest ok zamiast tego LS? Tylko, że akurat w CD4013BE który mam, reset jest na stan wysoki, a to raczej niskim się powinno resetować, gdy już jest po impulsie zegarowym prawda? Więc zaprzeczenie dorobić z nand-ów, tak?

A z tym indeksującym to też można zrobić takie przerzucenie przez D zanim podam na pin uC? Bo wejść przerywających np. na ATMega8 mam tylko 2, dla jednego enkodera potrzebowałbym natomiast 3. Poradziłby sobie jakiś AVR z takimi sygnałami już po przeróbce bez przerwań? Czy żeby hulało wszystko bez problemu najlepiej korzystać z przerwań? 😉

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

30000 obr/min to 500 obr/s co przy 256 imp/obr daje max 128kHz. To o wiele mniej niż 1.8MHz ale i tak dużo za szybko, by obsłużyć to programowo. Enkoder produkuje jeden impuls na każdym wyjściu na jeden krok. Ponieważ impulsy są przesunięte w fazie względem siebie o 90° to mamy 4 stany wyjść/impuls: 00, 01, 11, 10. Sekwencja jest oczywiście odwrotna po zmianie kierunku ruchu i to właśnie minimalna długość każdego stanu jest podanym czasem 500ns. Producent podaje go po to, by określić niedokładności wykonania samego enkodera. Po prostu z powodu niezerowych tolerancji wymiarowych, różnych czułości elementów optycznych i dokładności samego montażu podzespołu czasy trwania poszczególnych stanów enkodera są różne. Gdybyś bardzo równomiernie obracał wałem to dostrzeżesz, że prostokąty na wyjściu nie są symetryczne i nie są przesunięte dokładnie o 90° tzn zbocze jednego nie trafia idealnie w środek stanu stabilnego drugiego. Przy powolnym obracaniu tego tak bardzo nie widać, bo wtedy wchodzą w grę jedynie tolerancje mechaniczne, ale gdy rozkręcasz do 500 obr/s wtedy problemem zaczyna być także dynamika układu tj. równomierność oświetlenia czujników opto, różnice ich czułości, pojemności i opóźnienia. Gdy na wyjściu masz 128kHz to różnice opóźnień mogą być tak duże, że przebiegi wyjściowe przestają być kwadraturowe. Te 500ns to właśnie zobowiązanie producenta, że nawet przy maksymalnej prędkości obrotowej najkrótszy (najbardziej ułomny) stan będzie trwał nie krócej niż ten czas. Masz tak zaprojektować swoją logikę (filtry, układ transmisji sygnałów po kablu, dekoder), by działała nawet przy tak krótkim czasie stanu nawet jeśli z pobieżnych obliczeń wychodzi, że prawidłowy stan powinien trwać 1 / (128kHz * 4) = 1.9us.

W układzie który pokazałeś bardzo niebezpieczne jest doprowadzenie tego samego sygnału do CLK i RST - to gra w której nigdy nie zgadniesz który sygnał wygra pomijając fakt, że układ i tak jest jest niepoprawny.

Oprócz typowych wejść INTx masz w ATmedze np. wejścia zegarowe do liczników (T0, T1 itd). Ustawiając licznik na maxa możesz dostać przerwanie od pierwszego zbocza jakie przyjdzie, no i są przerwania od zmiany stanu linii portów.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dziękuję bardzo za tak obszerne wytłumaczenie wszystkiego! 🙂 Czyli powyżej, powiedzmy, tych 10kHz muszę to zrobić sprzętowo, a przy mniejszych można programowo. Zakładając tylko małe częstotliwości impulsów wystarczy ATMega8 z przerwaniami od INT0, INT1 i tego T0, tak? Czy nawet dla małych częstotliwości i tak muszę dorobić osprzęt? Albo inaczej też spytam: czy po sprzętowym odczytaniu kierunku i prędkości obrotów muszę te sygnały odebrać również przerwaniem, zakładając, że ATMega zajmowałaby się tylko obsługą enkodera? Wiem, że jeszcze sporo pracy przede mną, postaram się wszystko doczytać, teraz już wiem czego szukać. W razie problemów będę pisał 😉

Link do komentarza
Share on other sites

Nie istnieje sztywna granica, 10kHz było wartością orientacyjną. Wszystko zależy od tego jak szybki masz procesor i jak wiele jego mocy obliczeniowej możesz poświęcić na obsługę dekodowania kwadraturowego. Pomijając wejście indeksu, w przypadku braku wsparcia (dekodera) sprzętowego masz 2 sygnały i 4 zdarzenia (zbocza) na impuls. Jeśli kręcisz np. 2000 obr/min to w przypadku Twojego enkodera będziesz musiał obsłużyć 256*4*2000/60 tj. ponad 34000 zdarzeń (zboczy) na sekundę. Czy to dużo? Jeżeli poświęcisz całą moc 8MHz ATmegi to masz do dyspozycji 8e6/34e3=235 cykli zegara na zbocze. Na pewno wyrobisz się z obsługą w sensie detekcji kierunku i zliczania impulsów tylko, że coś trzeba z tymi wynikami zrobić. Jeśli obsługa sprowadzi się do zapalania diodki przy przekroczeniu prędkości to OK, zadziała. Jeśli będziesz musiał robić coś więcej, będzie problem.

Gdybyś chciał robić współbieżnie coś jeszcze, musisz obsługę zdarzeń wrzucić do przerwań. Przerwania są fajne, bo w sposób automagicznie niewidzialny robią rzeczy o których program główny nic nie wie, ale niestety kosztują dodatkowy czas zachowywania i odtwarzania kontekstu procesora. Tak więc obsługa zdarzeń (zboczy sygnałów) w przerwaniach będzie gorsza pod względem szybkości, ale lepsza pod względem elegancji rozwiązania i możliwości równoległego robienia innych rzeczy. Dodanie zewnętrznego dekodera (przerzutniki plus bramki) zamienia Ci 4 zdarzenia na jedno, co z oczywistych względów tak samo podwyższa górną obsługiwaną szybkość obrotową. Dostajesz wtedy tylko 256 aktywnych (tzn tych które musisz obsługiwać procesorem) zboczy na obrót w dodatku bez konieczności detekcji ich kierunku. Biorąc pod uwagę znacznie prostszy algorytm sprowadzający się do inkrementacji jakiejś zmiennej po wykryciu impulsu na jednym wejściu i dekrementacji tej samej zmiennej po wykryciu drugiego, zysk będzie jeszcze większy.

Może po prostu napisz co docelowo chcesz zrobić.

Link do komentarza
Share on other sites

Enkoder ma służyć jako część sprzężenia zwrotnego do sterowania silnikiem DC. Sterownik ma być podłączany do Intel Galileo z procesorem Quark na pokładzie, więc dosyć mocny. Jednak chciałbym ile się da zrobić sprzętowo, żeby zostawić duże pole manewrowe. Czy ta poprawiona wersja dekodera:

będzie działać? Bo ja to rozumiem tak:

Gdy A wyprzedza B mamy stany wejść i wyjść na dolnym przerzutniku (IC1B):

A_B_CLK_D_S_|Q

0_0__0__0_0_|0

1_0__1__0_0_|0 (zbocze narastające, ale D=0)

1_1__1__1_1_|1 (sygnał ustawiany przez SET)

0_1__0__1_1_|1

Więc chyba o to chodziło z zamienieniem 4 zboczy na 1 impuls, tak? Jeśli nie, to w czym jest problem?

A z tym indeksującym to też można go jakoś wydłużyć w podobny sposób, żeby można go było spokojnie odczytać i nie gubić żadnego?

[edit]

Dzisiaj przygotowałem jeszcze inny układ, z wykorzystaniem bramek, wyjścią są tym razem cały czas w stanie wysokim, a po wykonaniu odpowiedniej sekwencji stanów pojawia się sygnał niski na odpowiednim wyjściu całego układu, gdy A wyprzedza B lub odwrotnie. Sprawdzałem w Multisimie i działa jak chciałem 🙂

Link do komentarza
Share on other sites

Ta wersja z dwoma przerzutnikami jest OK. Pamiętaj tylko, że wejścia układów CMOS nigdy nie mogą wisieć w powietrzu więc na nieużywane zapodaj stany ustalone, np. GND lub VCC w zależności od potrzeb.

Zbocze na wejściu indeksu możesz oczywiście zatrzasnąć w przerzutniku RS lub D i trzymać to dopóki procesor nie zauważy, nie obsłuży i nie wyzeruje swojego licznika. Powinien zrobić to w miarę szybko tak, by nie zgubić ani jednego impulsu na pozostałych dwóch wejściach, bo inaczej rozjedzie się licznik programowy z rzeczywistym położeniem enkodera. Mając jednak wejście procesora czułe na zbocze raczej nie potrzebujesz zewnętrznego przerzutnika.

W przypadku gdy wyniki zliczania (np. stan licznika po zadanym czasie lub na żądanie) będziesz wysyłał gdzieś na zewnątrz, musisz jeszcze doliczyć narzut na komunikację: przygotowanie danych w założonym formacie, transmisja, potwierdzenia itp. Co chcesz wysyłać do Quarka i jak często? To trochę zależy od tego do czego mu ta informacja. Czasem warto zamknąć pętlę sterowania najkrótszą drogą. Np. w przypadku gdy będzie to jakiś serwonapęd mający zatrzymać wał w zadanym położeniu, chyba lepiej będzie zadawać to położenie z zewnątrz a ATmega sama sobie poradzi z pozycjonowaniem. Mając na pokładzie zawsze aktualną informację o położeniu nie będzie musiała tego nigdzie wysyłać ani czekać na szczegółowe komendy i układ będzie szybszy.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Drugi układ z dwóch przerzutników D sprawdził się w praktyce i dobrze zlicza impulsy 🙂 Galileo odpowiednio do tych impulsów zwiększa liczbę k lub ją zmniejsza. W zależności od tej liczby silnik kręci się w lewo lub w prawo - Galileo steruje mostkiem H i daje pwm. Na razie taka prosta zależność do celów edukacyjnych, wszystko działa jak należy. Później będzie to rozbudowywane. No myślałem też nad dołożeniem mikrokontrolera jako elementu takiego serwa, ale jak Galileo sobie z tym poradziło, to nie ma problemu. Jeśli wyjdzie z tego jakiś fajny projekt to przedstawię na Forbocie. Wielkie dzięki jeszcze raz za pomoc! 😉

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.