Enkoder kwadraturowy - szybki "algorytm odczytu"
-
Autor tematu - 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"
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.
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.
-
- Lider FORUM (min. 2000)
- Posty w temacie: 1
- Posty: 2103
- Rejestracja: 07 lip 2006, 00:31
- Lokalizacja: mazowieckie
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").
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").
-
- Lider FORUM (min. 2000)
- Posty w temacie: 4
- Posty: 9290
- Rejestracja: 26 lut 2011, 23:24
- Lokalizacja: mazowieckie
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ć.
.
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ć.
.
-
Autor tematu - Nowy użytkownik, używaj wyszukiwarki
- Posty w temacie: 6
- Posty: 6
- Rejestracja: 15 wrz 2011, 17:36
- Lokalizacja: Otwock
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:
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
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
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
-
- Lider FORUM (min. 2000)
- Posty w temacie: 4
- Posty: 9290
- Rejestracja: 26 lut 2011, 23:24
- Lokalizacja: mazowieckie
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.
.
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 - Nowy użytkownik, używaj wyszukiwarki
- Posty w temacie: 6
- Posty: 6
- Rejestracja: 15 wrz 2011, 17:36
- Lokalizacja: Otwock
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.
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.
-
- Specjalista poziom 3 (min. 600)
- Posty w temacie: 2
- Posty: 637
- Rejestracja: 21 maja 2008, 10:02
- Lokalizacja: Damasławek
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.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?
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.