Rotary encoder nasıl çalışır ?

Başlatan pcb, 19 Mayıs 2012, 11:32:37

pcb

Arkadaşlar linkteki basit rotary encoderler nasıl çalışır ? Bunlarda 3 pin var , sağ veya sola dönmesi nasıl algılanıyor ?

http://www.sparkfun.com/products/9117

Mucit23

Bildiğim kadarıyla bunlar Bir PCB üzerine çizilmiş özel yollar üzerinde bir mekanizmanın gezmesiyle A ve B ucları arasında 90 derece faz farkı bulunan iki sinyal geliyor.

Çıkış sinyali aşağıdaki gibidir.

adult upload image
Resmi incelersek 1. aşamada A ve B ucu lojik 0 dır.
2. Aşamaya geldiğinde B ucu lojik 1 e yükselmiş. A sıfır.
3. Aşamada Ave B lojik 1
4. Aşamada ise Sadece A lojik 1

Bu döngü sürekli olarak 1-2-3-4-1-2-3-4-1-2-3-4-1-2-3-4 diye sürekli gider.. Çıkış sinyalide öyle.

Diyelim encoderi Saat yönünde döndürdüğümüzde bu sinyal geliyor. Tam tersi yönde döndürdüğümüzdede benzer sinyal alırız.
Fark ise şurada.

1. Aşamadan 2. Aşamaya geçtiğinde Tüm çıkışlar lojik 0 iken B ucu lojik 1 olmuştu. Ters yönde döndürdüğümüzde ise 2. Aşamada B yerine A ucu lojik 1 olur.  İşte A ve B ucu lojik 0'dayken, ilk önce hangi lojik 1'e çıktığına bakılarak yön tayini yapılıyor.
Gene olarak çalışması böyle

http://en.wikipedia.org/wiki/Rotary_encoder

mufitsozen

#2
kucuk bir duzeltme :

donus yonune gore gelen bilgi binary olarak 1-2-3-4-1... diye değilde 0-1-3-2-0-1-... diye degisir, Buna gray code denir. Bunun boyle olmasi iki birbirini takip eden bilgi arasinda sadece 1 bit degisir. Boylece encoder'dan gelen yanlis bilgiler elenebilir.

gray code iki bitte 00-01-11-10-00... diye uc bitte ise 000-001-011-010-110-111-101-100-000... (0-1-3-2-6-7-5-4-0-..)diye degisir. 4 ve yuksek bitlerde nasil bir sira olacaginida buradan belirliyebilirsiniz.

encoderdan gelen birbirini takip eden iki okumada bu dizi okunmazsa bir problem vardir, yazilim bunu gozonune alacak sekilde yazilabilir, iki ardasik bilgiye gore donus yonude belirlenebilir.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

pcb

encoder in orta pinine 5V bağladım diğer sağ ve sol pinleri ise portlara bağladım.
Anladığım şu, encoder bir kademe çevirilirken portlara bağlı 2 pin 5V kontaklarına temas edip tekrar temas kesiliyor, bu temas önceliği hangi pinde ise sağ veya sola çevirildiği anlaşılabiliyor.
encoder içindeki şaft a bağlı 3 pin açıları birbirinden farklı bu sayede çevirme sırasında yöne bağlı olarak bir pin 5V a önce temas ediyor.
Encoder ve program gayet iyi çalışıyor, yardımlarınız için teşekkür ederim.

ete

Orta pin GND ye bağlanmalı ve A ve B uclarına 10K ile pullup yapılmalı ve aynı zamanda bu uçlar Port pinlerine bağlanmalıdır.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

muhendisbey

if döngüsü ile hangi yöne döndüğünü anlamak mümkün olabilir mi? MSP430'da bir sürü farklı if döngüsü kurdum lakin doğru çalışanı olmadı. illa interrupt ile mi yapmak gerekiyor?
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

ete

Yön bilgisi için üst üste iki okuma yapmak ve iki okuma arasında fark yakalamak gerekir.
ESKI=PORTB & %00000011

TEKRAR:
YENI=PORTB & %000000011
IF YENI=ESKI THEN TEKRAR

YON=ESKI.1 XOR  YENI.0  ' birinin sıfırıncı biti ile diğerinin birinci biti XOR yapılır.
Bu durumda Yon bilgisi saat yönünde hareket için 1 tersi yönde ise sıfır olarak oluşur.

Örnek vermek gerekir ise  yukarıdaki dalga şekline bakarsanız okuma sırasına göre ,
- Soldan sağa doğru harekette (diyelimki saat yönünde) 00 - 10 - 11 - 01 - 00 şeklinde olacaktır.
- Encoder ters yönde döner ise okunan değerler  00 - 01 - 11 - 10 - 00 şeklinde olacaktır.
-  ESKI=00 olsun ve YENI=10 olsun.  YON=0 XOR 0=0 değerini verecektir. Encoder A yönünde dönüyordur.
- ESKI=00 ve YENI=01 olsun   YON=0 XOR 1= 1 o halde encoder A yönünün ters istikametinde dönmektedir diyebilirsiniz.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

pcb

Alıntı yapılan: ete - 19 Mayıs 2012, 15:18:14
Orta pin GND ye bağlanmalı ve A ve B uclarına 10K ile pullup yapılmalı ve aynı zamanda bu uçlar Port pinlerine bağlanmalıdır.
Hocam galiba sizin söylediğinizin tam tersini yaptım ben

muhendisbey

Ete hocam teşekkürler.

Ben daha çok state gibi düşünmüştüm. Eğer 00 dan 10'a gidiyorsa tekrar bir if döngüsü ile 01 i yakala  ve yön belirle
Eğer 00 dan 01'e gidiyorsa 10'ı yakala şeklinde bir if döngüsü kurmuştum. İstediğim sonucu alamamıştım.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

ete

Encoder okumasının mümkün olan en hızlı bir şekilde yapıması tercih edilir. Bu nedenle bir sürü if satırının programı ne kadar yavaşlatacağını tahmin edersiniz.
Bir encoder en fazla 4 ayrı konumda bulunabililr. Mutemel konumlar şunlar olacaktır. 00 01 10 11  tersi yönde dönüşlerde ise bunun tersi olarak 00 11 10 01 şeklind oalcaktır. Bir konum için if komutunu yazar isek
IF ESKI=%00 and YENI=%11 then YON=1
IF ESKI=%00 and YENI=%01 THEN YON=0

Benzer şekilde diğer konumlar içinde ikişer alternatif yazarsanız toplamda 8 adet if satırı ile yön bulursunuz. mBu ise programınızda epeyce bir gecikmeye sebep olur ve puls kaçırırsınız.
İdeal olan yönün bir başka yöntemle tespit edilip programın yön için yalnıca bir pine bakması ve pin 1 ise ileri işlemini, pin sıfır ise geri işlemini uygulamasıdır. Buna ait örneği aşağıdaki linkte görebilirsiniz.

http://etepic.com/index.php?topic=336.msg3606#msg3606

Bu örnekte yön tayini elektronik olarak yapılmakta işlemci yalnızca sayma işlemini yaptığından okuma epeyce hızlı yapılabilmektedir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

z

16 gözü olan lookup table ile doğrudan sonuca ulaşın.

Yon=Tablo[Eski*4+Yeni]
Eski=Yeni
Bana e^st de diyebilirsiniz.   www.cncdesigner.com