Enkoder kwadraturowy - szybki "algorytm odczytu"

Rozmowy dotyczące budowy, działania i naprawy urządzeń automatyki przemysłowej

Autor tematu
tengu
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 6
Posty: 6
Rejestracja: 15 wrz 2011, 17:36
Lokalizacja: Otwock

Enkoder kwadraturowy - szybki "algorytm odczytu"

#1

Post napisał: tengu » 15 wrz 2011, 17:56

Mam pytanie odnośnie prawidłowego (powiedzmy "profesjonalnego") algorytmu obsługi enkodera (zasadę działania znam,ale...), lub wytłumaczenia jak chłopu na miedzy jak powinno się to prawidłowo zrealizowac w programie ( w przerwaniach, liczniku czy inaczej?).

Posiadam enkoder o rozdzielczości 2500imp/obr zintegrowany z silnikiem krokowym (ezi-servo). Wszelkie wcześniejsze próby na Atmega16 i bascomie (wiem, wiem ale dopiero zaczynam z programowaniem...), przy częstotliwości z jednego kanału ok 12khz i jednym przerwaniu jako tako wychodziły - w najlepszym przypadku mylił się o 10imp. Czy jest jakiś "standardowy" algorytm i sposób odczytu?

Przeczytałem naprawdę sporo materiałów i naprawdę do tego się przyłożyłem ale dokładność jaką uzyskuję jest jak dla mnie b. mała... Kanały z których odczytuję to A i B (bez negacji)
Z góry dziękuję za pomoc.

Jeżeli napisałem w złym dziale, to przepraszam i proszę o przeniesienie do właściwego.




GumiRobot
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 1
Posty: 689
Rejestracja: 21 mar 2005, 18:51
Lokalizacja: Trójmiasto

#2

Post napisał: GumiRobot » 15 wrz 2011, 19:12

Polecam stronę Microchipa, jest tam trochę o tym dla starszych kontrolerów, w nowszych jest specjalnie dedykowany moduł który zlicza wszystkie trzy kanały enkodera.


kszumek
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 1
Posty: 495
Rejestracja: 04 kwie 2006, 18:08
Lokalizacja: Białystok

#3

Post napisał: kszumek » 15 wrz 2011, 19:45

Witam
jest sprzętowy dekoder licznik LS....ale raczej trudny do zdobycia
można coś zmajstrować na układzie programowalnym
można użyć szybszego procka
zobacz czy przypadkiem nie masz zakłóceń albo koślawych zboczy sygnału
może tu leży problem
pozdrawiam


ezbig
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 1
Posty: 2103
Rejestracja: 07 lip 2006, 00:31
Lokalizacja: mazowieckie

#4

Post napisał: ezbig » 15 wrz 2011, 20:48

Ja też bawiłem się w to w bascom-ie i mi atmega 8 na wewnętrznym zegarze 8MHz wyrabiała przy enkoderze 300imp/obr do prędkości 3000 orb/min. 1200 imp zliczał bez pomyłki. W samym bascom-ie to robiłem w nieskończonej pętli i wyrabiało, ale w przerwaniach już ciężko było. Ostatnia wersja w przerwaniach to wstawka asembler-owa i działało bez zarzutów. Możesz przykładowy kod wykroić sobie z kodu Elm Chan servo.

Policz sobie częstotliwość impulsów: 2500x4=10000 imp/obr. Przy takim enkoderze to np. przy 3000 obr/min masz impulsy o częstotliwości 500 kHz. Przy zegarze 20MHz impuls będzie co 40 cykli, więc tylko tyle masz czasu na interpretację. Dla bascom-a to możliwe, ale trzeba mieć tę świadomość i kod zaczyna być podobny do asembler-owego (a w asemblerze to tylko kilka instrukcji /i cykli/ "bez ozdobników").

Awatar użytkownika

tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 4
Posty: 9290
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

#5

Post napisał: tuxcnc » 15 wrz 2011, 21:42

Przy dzisiejszych cenach mikrokontrolerów warto poświęcić jeden układ wyłącznie na obsługę enkodera, a resztę robić na drugim.
Na wyjściu "dekodera" wystawiać DIR/STEP, które to sygnały są szybko i bezproblemowo obsługiwane przez przerwania, bo jak dasz STEP na wejście INT, to tylko stan DIR musisz sprawdzić żeby wiedzieć czy licznik zwiększyć czy zmniejszyć.

.


qqaz
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 1
Posty: 2342
Rejestracja: 28 sty 2007, 16:12
Lokalizacja: Łódź

#6

Post napisał: qqaz » 16 wrz 2011, 09:14

Albo pruć prosto w licznik sprzetowy procka i wszysko mieć na pokładzie programowym.
( sam nie robię.... słyszałem). :mrgreen:


Autor tematu
tengu
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 6
Posty: 6
Rejestracja: 15 wrz 2011, 17:36
Lokalizacja: Otwock

#7

Post napisał: tengu » 16 wrz 2011, 09:26

Dziękuję za zainteresowanie.

Pytanie do Ezbig - w nieskończonej pętli. I dane były odczytywane z licznika, czy w inny sposób? ja robię to obecnie (w bascomie) w przerwaniu tak:

Kod: Zaznacz cały

Obroty: 

     If 1mm <> Odl Then
                   If Phase_b <> Phase_a Then
                       Incr Imp
                                If Imp >= 2500 Then
                                   Imp = 0
                                   Incr 1mm
                              End If
                        Else
                             Decr Imp
                                If Imp =< -2500 Then
                                   Imp = 0
                                   Decr 1mm
                               End If
                  End If
 Else
        Set Clk
        Disable Int2
        Imp = 0
    End If
Return
gdzie:
imp to zmienna typu integer - zliczane impulsy
1mm to droga do pokonania.
odl to droga zadana
clk to zewnętrzny generator (włączany 0)

To jest to, co robi w przerwaniu. W głównej pętli jest obsługa wyświetlacza, ale działa tylko wtedy gdy zakończy się przerwanie i tylko raz. Procek to Atmega 16 z kwarcem 14745600Hz

wzorowałem się na tym linku:

http://www.mcselec.com/index.php?option ... &Itemid=57

Awatar użytkownika

tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 4
Posty: 9290
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

#8

Post napisał: tuxcnc » 16 wrz 2011, 19:29

Algorytm i jego implementacja są rzeczywiście bardzo proste.
Na jednym pinie enkodera badamy zbocza, a na drugim stany.
Chodzi o to czy na rosnącym zboczu jest stan wysoki czy niski i czy na opadającym jest na odwrót.
Taki układ można zrobić tak jak podano, łącząc oba wejścia INT i ustawiając jedno przerwanie od zbocza rosnącego a drugie od opadającego, albo na jedno wejście INT podać sygnał bezpośrednio, a na drugie po zanegowaniu.
Trzecim rozwiązaniem jest zbudować układ wystawiający impuls po każdej zmianie sygnału i tymi impulsami sterować jedno wejście INT.

Układ można sprawdzić w ten sposób, że z programu wywalić wszystko oprócz zwiększania/zmniejszania zmiennej IMP, wartość zmiennej wysyłać na wyświetlacz (może być nawet pojedyńczy LED), a na wejściach dać przyciski.

Przycisk podłączony do wejść INT powinien zmieniać wartość zmiennej IMP po każdym wciśnięciu i każdym puszczeniu.
Wciskając i puszczając przyciski we właściwej kolejności można zasymulować enkoder CW i CCW.

.


Autor tematu
tengu
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 6
Posty: 6
Rejestracja: 15 wrz 2011, 17:36
Lokalizacja: Otwock

#9

Post napisał: tengu » 17 wrz 2011, 00:53

qqaz - sprawdziłem, ala albo ja jestem zbyt "cienki w bascomie" albo to kiepsko działa` (mimo wszystko sprawdziłem i coś jest nie tak - tu gubi i tak - mimo wszystko b. dziękuję bo podsunęło mi pomysła)

Chwilowo poległem z tym tematem, ale z tego co się doczytałem to na wyjściu enkodera eziservo jest rs422 i tego tematu nie znam, więc muszę dokładnie doczytać bo najpewniej tu poległem (dodałem 74hct14 do wyjścia "+" itd - standard przy formowaniu sygnału ale chyba mnie poniosła wyobraźnia...).
Pytanie - czy przy zastosowaniu klasycznego serva (silnik dc +enkoder wbudowany +sterownik PID) też - przy klasycznych rozwiązaniach cnc - stosuje się enkoder dodatkowy, czy wystarczy podawanie samych impulsów w określonej ilości?
Przepraszam, że zadaję laickie pytania, ale to pierwsza próba ogólnie z serwami.

Awatar użytkownika

cosimo
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 2
Posty: 637
Rejestracja: 21 maja 2008, 10:02
Lokalizacja: Damasławek

#10

Post napisał: cosimo » 17 wrz 2011, 15:06

Przy częstotliwości z jednego kanału ok 12khz i jednym przerwaniu jako tako wychodziły - w najlepszym przypadku mylił się o 10imp. Czy jest jakiś "standardowy" algorytm i sposób odczytu?
A po co Ci dwa kanały na przerwaniach? Takie rozwiązanie stosuje się jak chcesz podwoić dokładność enkodera. W twoim wypadku to chyba już przesada jak masz normalnie 2500 imp/obr. W takim układzie ukłądzie uP musi obsłużyć dwa razy więcej przerwań niż normalnie.

Poza tym zobacz w tym podanym przykładzie w przerwaniu jest tylko zwiększany lub zmniejszany licznik i nic więcej - reszta w pętli głównej.

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Automatyka przemysłowa”