enkodér

Odpovědět
Uživatelský avatar
fulda
Příspěvky: 617
Registrován: 04 led 2016, 17:18

enkodér

Příspěvek od fulda » 05 čer 2018, 16:24

Ahoj,
trochu jsem si hrál s rotačním enkodérem. Předělával jsem ho z jednobodového na kvadratický. Vyšel mi docela zajímavě jednoduchý kód. Vycházel jsem z toho, že nesleduji stavy jako takové, ale víc pracuji s rozdílem (XOR).
Používám dvě proměnné OLD a NEW, celkem logicky OLD je stav z předchozího čtení, NEW je aktuální stav.
Tabulka ukazuje obsah proměnné OLD a k tomu XOR pro směr CW a CCW

Kód: Vybrat vše

;   ___
;__|   |____  PORTA,2
;     ___
;____|   |__  PORTA,1
; --> CW   <-- CCW

OLD  |X CW |X CCW
A2|A1|X2|X1|X2|X1
 0  0| 1  0| 0  1
 1  0| 0  1| 1  0
 1  1| 1  0| 0  1
 0  1| 0  1| 1  0
 0  0| 1  0| 0  1
 1  0| 0  1| 1  0
 1  1| 1  0| 0  1
 0  1| 0  1| 1  0
Zajímavé je, že pokud se ten XOR ještě zneguje za každý bit v proměnné OLD, tak je tabulka velmi lineární X2=1 pro CW a X1=1 pro CCW

A vlastní program mi vyšel na 9 instrukcí :) ale dělal jsem to na PICu a tomu tady nikdo nerozumí, tak dám jen opis:

Kód: Vybrat vše

Přečti nový stav do NEW
W = NEW xor OLD
pokud W = 0, potom konec
pokud bit OLD,1 = 1, potom W = W xor b"11"
pokud bit OLD,2 = 1, potom W = W xor b"11"
pokud bit W.2 = 1, potom CW, jinak CCW
OLD = NEW
(asi jsem vymyslel kolo žejo? Ale kvadratické)
Za pravopisné chyby v této zprávě může moje učitelka češtiny.

MartinL
Příspěvky: 119
Registrován: 24 úno 2013, 14:13

Re: enkodér

Příspěvek od MartinL » 05 čer 2018, 16:55

Samozřejmě, že jsi vynalezl kolo, podobné řešení jsem už někde viděl. Ale kdybys chodil na Robodoupě, tak bys znal (z mého pohledu) ještě úspornější řešení, viz. https://robotika.vosrk.cz/guide/sensors/decode/cs.

pgerla
Příspěvky: 348
Registrován: 11 dub 2013, 00:17

Re: enkodér

Příspěvek od pgerla » 08 čer 2018, 16:26

Obrázek

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host