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

#11

Post napisał: tengu » 17 wrz 2011, 20:29

zgadza się, ale w przykładzie, w linku, enkoder obracany jest ręcznie. Sprawdziłem i wtedy nie ma pomyłki, natomiast przy silniku myly się bardzo. 2500imp/obr ponieważ w eziservo enkoder ustawiony jest na sztywno i nie można tego zmienić (mówię oczywiście o sprzętowym bo programowy ma taką możliwość, ale nie zmienia na wyjściu podglądu enkodera, ilości impulsów.



Awatar użytkownika

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

#12

Post napisał: cosimo » 17 wrz 2011, 23:21

zgadza się, ale w przykładzie, w linku, enkoder obracany jest ręcznie. Sprawdziłem i wtedy nie ma pomyłki, natomiast przy silniku myly się bardzo.
Myli się bo procesor prawdopodobnie się nie wyrabia. W Twoim przypadku jedyne wyjście to wykorzystywać tylko jedno przerwanie (drugie koniecznie wyłączyć). W przerwaniu zostawić tylko inc/dec licznika. Jeżeli i to okaże się za mało - to tylko wstawki w asemblerze o ile bascom na to pozwala (bo tego nie wiem).

Jest jeszcze możliwość występowania jakichś zakłóceń. Jeżeli kręcąc ręcznie enkoderem - nie myli się, a kręcąc z taką samą prędkością (ten sam enkoder) silnikiem jest nie tak - to znaczy coś tutaj jest na rzeczy.

Awatar użytkownika

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

#13

Post napisał: tuxcnc » 17 wrz 2011, 23:50

Atmega ma parę mipsów i powinna się wyrabiać.
Bascom produkuje fatalny kod, ale bez przesady.
Mi się nie podoba układ formowania impulsów z dwiema gałęziami RC jedna po drugiej.
Trzeba by znaleźć maksymalną prędkość przy której liczy dobrze i popatrzeć oscyloskopem co się dzieje.

A tak w ogóle to ile obrotów na sekundę próbujesz zmierzyć ?

.


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

#14

Post napisał: tengu » 18 wrz 2011, 08:40

W granicach 1 do 7obr/s - a może nawet ok 20obr/s.
Przy formowaniu impulsów używałem 74LS14 z jakaś małą pojemnością i na oscyloskopie przebiegi były ok, bez szpilek itp.
Czy przy zastosowaniu zwykłego serwa do programu sterującego (np. Mach) zwracana jest ilość impulsów z enkodera i na tej podstawie ustalana pozycja, czy wysyłane są impulsy o konkretnej ilości a serwo i jego elektronika martwi się o resztę?
Tak jak mówiłem jestem kompletnym laikiem i dopiero zaczynam w temacie napędów do CNC, a czytając taką ilość materiałów jaka jest w necie, mam pożar mózgu...

Awatar użytkownika

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

#15

Post napisał: tuxcnc » 18 wrz 2011, 11:00

Wychodzi mi, że procedura ma jakieś 14 mikrosekund pomiędzy przerwaniami.
To już chyba nie Bascom i tak jak pisałem wyżej dedykowany procek tylko do konwertowania stanów enkodera na DIR/STEP albo inny protokół komunikacji.

Natomiast serwo nigdy nie jest tam, gdzie być powinno.
Zasada działania polega bowiem na porównaniu sygnału błędu z wartością zadaną.
Krótko mówiąc serwo kręci się tym szybciej, im dalej jest od założonego położenia.
Dodatkowo stosuje się algorytm PID i strojenie całego układu kinematycznego.
Coś jak z kierowcą, który musi przecież zacząć hamować przed miejscem w którym chce się zatrzymać.
Jak zacznie za wcześnie, to nie dojedzie, a jak za późno to przejedzie.
W pierwszym przypadku traci się czas, w drugim układ wpada w oscylacje.
Taka jest zasada, a konkretna implementacja zależy od pomysłowości projektanta.

.


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

#16

Post napisał: tengu » 18 wrz 2011, 16:35

Czyli tak jak napisałem? Wysyła sie tylko impulsy bez czytania enkodera. Elektronika serwa martwi się o to, żeby zatrzymać się po iluś tam obrotach w tej samej pozycji? (teoretycznie)? A tak jaśniej - wysyłam 800 impulsów i nie sprawdzam czy faktycznie serwo zrobiło te 800 kroków i zakładam że je zrobiło? nie mieszam już w to dodatkowego enkodera?

A czy ktoś ma przykład samej obsługi enkodera w C? Chodzi mi o to czy jest zrealizowana tylko na przerwaniach, czy w trybie licznika (np CTC), czy też licznika który liczy góra/dół (tego akurat nie wiem jak zrealizować - jeszcze)


dzarek
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 1
Posty: 1
Rejestracja: 02 lis 2004, 20:39
Lokalizacja: Tarnów/Kraków

#17

Post napisał: dzarek » 19 wrz 2011, 11:49

A czy ktoś ma przykład samej obsługi enkodera w C? Chodzi mi o to czy jest zrealizowana tylko na przerwaniach, czy w trybie licznika (np CTC), czy też licznika który liczy góra/dół (tego akurat nie wiem jak zrealizować - jeszcze)
Witam.
Ja obsługując impulsator (działa tak samo jak enkoder) użyłem takiego sposobu:
- jedno z wyjść np. A podpinam pod przerwanie zewnętrzne przykładowo INT0, które reaguje zarówno na zbocze narastające jak i opadające,
- w przerwaniu badam if'em wartość ex-or obu kanałów i na tej podstawie rozpoznaje kierunek obrotu
- w przerwaniu inkrementuje bądź dekrementuje zmienną "pozycja", która prezentuje aktualną pozycją wału.

Przykładowy kod w C wygląda tak:

Kod: Zaznacz cały

#define ENKODER_A   			bit_is_clear (PIND, 2) 
#define ENKODER_B   			bit_is_clear (PIND, 3) 

ISR (INT0_vect) 
{ 
	if ( ENKODER_A ^ ENKODER_B ) pozycja++; 
	else pozycja--; 
}	
Tym sposobem możesz odczytać w Twoim przypadku 5000 imp/obr. Pamiętaj aby zmienna "pozycja" była odpowiedniego typu, aby nie uległa szybkiemu przepełnieniu. Przy ATmega16 i zegarze 16MHz sądzę, że 20 obr/sek nie powinno stanowić żadnego problemu gdy program będzie pisany w C :)
Pozdrawiam

Jarek

Awatar użytkownika

Yogi_
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 1
Posty: 759
Rejestracja: 13 sty 2010, 08:07
Lokalizacja: Braniewo

#18

Post napisał: Yogi_ » 19 wrz 2011, 17:18

Witam :-)
Hmm... może się wtrącę - choć prawdopodobnie nie na temat
Używając procesorów z rodziny PIC i programujac w języku jal v.2
wyglądałoby to tak:

Kod: Zaznacz cały

;Quadrature decoder for Rotary encoder
;------------------------------------------------------
-- Initialize the interrupt control register
INTCON_GIE = 1 -- Enable global interrupt
INTCON_RBIE = 1 -- Enable interrupt on port(B4-B7) change

var bit UV_stat = false
var volatile bit button
var word mouse ; two BCD bytes 99:59
var byte mouse_b[2] at mouse ; aliasing
var byte last_quad = 0
var volatile bit click ; mouse changed

procedure quadrature() is
pragma interrupt
if pin_b6 == high then
_usec_delay(10) 
button = pin_b6
else
button = low
end if
var sbyte n = 0
; always process the mouse
if INTCON_RBIF == high then
_usec_delay(10) -- debounce
last_quad = last_quad | (PORTB & 0b_0011_0000) 
case last_quad of
--0b_0010_0000,
--0b_1011_0000,
--0b_1101_0000,
0b_0100_0000: 
n = 1
--0b_0001_0000,
--0b_0111_0000,
--0b_1110_0000,
0b_1000_0000: 
n = -1
end case
last_quad = last_quad << 2
INTCON_RBIF = 0
end if
; but change the actual variable only when UV is off
if UV_stat == false then
; do not allow mouse to overflow (and wrap around) 
if (n == 1) then
if (mouse != (99 << 8)+99) then
bcd_inc(mouse_b) 
click = true
end if
elsif (n == -1) then
if (mouse != 0) then
bcd_dec(mouse_b) 
click = true
end if
end if
end if
end procedure
Pozdrawiam
Krzysiek


jarekk
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 1
Posty: 1701
Rejestracja: 17 mar 2006, 08:57
Lokalizacja: Gdańsk

#19

Post napisał: jarekk » 19 wrz 2011, 21:35

qqaz pisze:Albo pruć prosto w licznik sprzetowy procka i wszysko mieć na pokładzie programowym.
( sam nie robię.... słyszałem). :mrgreen:
Wszystkie dsPICe z rodziny "motor control" ( niektóre 30Fxxx i 33FJxxMCxx ) mają sprzętowy enkoder - niektóre nawet dwa.
Jeżeli to ma być jednostkowa rzecz to warto zainwestować - o ile pamietam to max częstotliwość wynosi około 10Mhz. Poza tym są też tam filtry.

Np. http://ww1.microchip.com/downloads/en/D ... 70208B.pdf

Można tu przeczytać jak takie rzeczy są robione sprzętowo - daje to pojęcie jak powienien wyglądać soft.

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Automatyka przemysłowa”