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
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.
-
- Specjalista poziom 3 (min. 600)
- Posty w temacie: 2
- Posty: 637
- Rejestracja: 21 maja 2008, 10:02
- Lokalizacja: Damasławek
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).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.
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.
-
- Lider FORUM (min. 2000)
- Posty w temacie: 4
- Posty: 9323
- Rejestracja: 26 lut 2011, 23:24
- Lokalizacja: mazowieckie
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ć ?
.
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 - Nowy użytkownik, używaj wyszukiwarki
- Posty w temacie: 6
- Posty: 6
- Rejestracja: 15 wrz 2011, 17:36
- Lokalizacja: Otwock
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...
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...
-
- Lider FORUM (min. 2000)
- Posty w temacie: 4
- Posty: 9323
- Rejestracja: 26 lut 2011, 23:24
- Lokalizacja: mazowieckie
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.
.
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 - Nowy użytkownik, używaj wyszukiwarki
- Posty w temacie: 6
- Posty: 6
- Rejestracja: 15 wrz 2011, 17:36
- Lokalizacja: Otwock
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)
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)
-
- Nowy użytkownik, używaj wyszukiwarki
- Posty w temacie: 1
- Posty: 1
- Rejestracja: 02 lis 2004, 20:39
- Lokalizacja: Tarnów/Kraków
Witam.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)
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--;
}

Pozdrawiam
Jarek
Jarek
-
- Specjalista poziom 3 (min. 600)
- Posty w temacie: 1
- Posty: 759
- Rejestracja: 13 sty 2010, 08:07
- Lokalizacja: Braniewo
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:

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
Krzysiek
-
- ELITA FORUM (min. 1000)
- Posty w temacie: 1
- Posty: 1701
- Rejestracja: 17 mar 2006, 08:57
- Lokalizacja: Gdańsk
Wszystkie dsPICe z rodziny "motor control" ( niektóre 30Fxxx i 33FJxxMCxx ) mają sprzętowy enkoder - niektóre nawet dwa.qqaz pisze:Albo pruć prosto w licznik sprzetowy procka i wszysko mieć na pokładzie programowym.
( sam nie robię.... słyszałem).
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.