Strona 1 z 2
Enkoder kwadraturowy - szybki "algorytm odczytu"
: 15 wrz 2011, 17:56
autor: tengu
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.
: 15 wrz 2011, 19:12
autor: GumiRobot
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.
: 15 wrz 2011, 19:45
autor: kszumek
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
: 15 wrz 2011, 20:48
autor: ezbig
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").
: 15 wrz 2011, 21:42
autor: tuxcnc
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ć.
.
: 16 wrz 2011, 09:14
autor: qqaz
Albo pruć prosto w licznik sprzetowy procka i wszysko mieć na pokładzie programowym.
( sam nie robię.... słyszałem).

: 16 wrz 2011, 09:26
autor: tengu
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
: 16 wrz 2011, 19:29
autor: tuxcnc
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.
.
: 17 wrz 2011, 00:53
autor: tengu
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.
: 17 wrz 2011, 15:06
autor: cosimo
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.