Rotary Encoder okuma problemi

Başlatan berkay_91, 08 Ağustos 2014, 14:29:15

Tagli

QEI modülünü başka bir projede kullanıyorum, çok faydalı ve kullanışlı. Ancak bu projede fazla işlem gücüne ihtiyaç yok, o yüzden QEI'i olan dsPIC30F biraz abartılı olacak. Ayrıca QEI içeren modeller en az 28 bacaklı olduğu için fazla yer kaplıyorlar ve genelde dsPIC veya PIC24 içinde oluyorlar ki onların fiyatları pahalı sayılabilir. O yüzden 18 bacaklı bir modeli (muhtemelen PIC16) tercih ediyorum. Gerçi 18 bacaklı PIC + 8 bacaklı özel entegre daha fazla yer kaplayacak o da ayrı mesele.
Gökçe Tağlıoğlu

arm-beginner

Bu tür entegreler dakikada birkaç 1.000 tur ile dönen motorlara bağlı olan encoder'lar için.
Bizim iki parmak arasında sağa ve sola çevirdiğimiz encoder'lar için en zayıf MCU bile fazla gelir.
Her 1ms ile bir timer-interrup tetikleyiniz ve A-B girişlerinde ne var ne yok kontrol ediniz.

Tagli

Tam hızını bilmemekle birlikte benim encoder sinyalinin yüksek frekanslı olacağını tahmin ediyorum. 100 kHz veya daha yüksek frekanslı olabilecekmiş gibi sistemi ayarlamaya çalışıyorum. 8 bacaklı bir PIC12'yi sadece bu iş için ayarlayıp kodu ASM'de yazarsam belki 10 us'de döngüyü tamamlayabilirim. İlk aklıma gelen PIC12F675/629 oldu. Ama 4 MHz (1 MIPS) ile bu iş mümkün değil. Ya harici 20 MHz kristal kullanılmalı ya da PIC12F1822 gibi bir işlemci seçilmeli. İkincil işlemci 1 bitlik yön bilgisini hesaplayıp verse yeter. Ama yine de genel olarak ikincil işlemci biraz saçma bir fikirmiş gibi geliyor.
Gökçe Tağlıoğlu

mozkan87

Alıntı yapılan: arm-beginner - 10 Ağustos 2014, 21:06:49
Bu tür entegreler dakikada birkaç 1.000 tur ile dönen motorlara bağlı olan encoder'lar için.
Bizim iki parmak arasında sağa ve sola çevirdiğimiz encoder'lar için en zayıf MCU bile fazla gelir.
Her 1ms ile bir timer-interrup tetikleyiniz ve A-B girişlerinde ne var ne yok kontrol ediniz.


Hocam ben bu yöntemle sorun yaşadım. Rotary encoderın döndürülme hızına göre arada değer kaçırdığını gördüm, mesala yavaş çevirirken sıkıntı yoktu ama biraz hızlı çevirirken arada bazı pulsleri kaçırdığımızı gördüm. Daha sonra çözümü encoder'ın A ucunu interrupt(any change) pinine bağladım ve kesme oluştuğunda A ve B nin durumlarını karşılaştırdım, en iyi sonucu böyle elde ettim.

Mucit23

Donanımsal encoder okuma modülü olmayan mcularda Timer ile saymak en mantıklı yöntem. Şu Pot tipi encoderlerden kullanılmayacaksa kesmeye güven olmaz.

Erol YILMAZ

Rotary encoder için donanım yok ise !
Timer in ileri geri ilerlemek için girişleri yok ise,

Interrupt ile okumak halen mantıklı.
Neden?

Değerleri max seviyede düşünelim...
1000 pals encoder 5 mm vidalı sistemde dk'da 15 metre hareket etmiş olsa,
biz bu encoderi 4x modunda okumuş olsak, 200.000 / sn adet INT oluşur.

48 Mhz Cortex M0 Mcu'da en zor ihtimalle, 240 komutta bir INT,
64 Mhz PIC18 Mcu'da en sor durumda, 320 komutta bir INT demek.

Olmaz değil, Biraz incelenirse, gayet güzel çalışır.

arm-beginner

Alıntı yapılan: mozkan87(...) Daha sonra çözümü encoder'ın A ucunu interrupt(any change) pinine bağladım ve kesme oluştuğunda A ve B nin durumlarını karşılaştırdım, en iyi sonucu böyle elde ettim.

Bu yöntem diğer interrupt metodlardan (A ve B sinyalerin rising veya falling edge'ler ile interrupt tetikleyenlerden) çok daha iyi. Ama encoder'lar bir süre sonra yıpranıyorlar ve sonra sinyalerde sıçramalar oluyor. Ve MCU her sıçramada konu ile ilgilenmek zorunda.
Not: burda insanların kullanımı için üretilmiş encoder'lardan bahsediyorum. Yüksek tur ile çalışan encoder'lar hakkında bilgim yok.

Tagli

Alıntı yapılan: arm-beginner - 11 Ağustos 2014, 09:06:59
Bu yöntem diğer interrupt metodlardan (A ve B sinyalerin rising veya falling edge'ler ile interrupt tetikleyenlerden) çok daha iyi.
Ne açıdan daha iyi? Çözünürlük açısından daha iyi olmadığını söyleyebilirim çünkü çözünürlük yarıya düşüyor. Buna 2x modu deniyor. Hem A hem B'nin hem yükselen hem düşen kenarlarına bakıldığında 4x modu oluyor ve en yüksek çözünürlüğe bu şekilde ulaşılabilir.
Gökçe Tağlıoğlu

skara1214

18f2431 kullanın kasmayın uğraşmayın
Herkes ölür ama herkes gerçekten yaşamaz

arm-beginner

#24
Tagli, sen Encoder'larin datasheet'indeki güzel karelere bakma. Onlar belki en başta öyle bir sinyal yaratabilirler; ama bir süre sonra şuna benziyeceklerdir:

Kaynak: http://en.wikipedia.org/wiki/Switch#Contact_bounce

Opala, resim nerde? Neyse, link'i veriyorum:
http://en.wikipedia.org/wiki/File:Bouncy_Switch.png

Tagli

Doğrudur. dsPIC30F QEI modülünün içinde opsiyonel dijital alçak geçiren filtre var. Demek ihtiyaç oluyor ki koymuşlar. BLDC hall sensörlerinde benzeri bir durum yaşamıştım. Girişlerin Schmitt trigger olması şart. R-C ile alçak geçiren filtre de ayrıca eklenebilir.
Gökçe Tağlıoğlu

arm-beginner

Gelen A/B sinyaleri interrupt ile değerlendirmekden vazgeçmeyenler için optical encoder önerebilrim. Fiyatarı 25 EUR ile başlıyor, ama orda en azından sinyalerde sıçrama olmiyor.
Örneğin Bourns EM14-Serisi veya "para sorun değil" diyenler için EN-Serisi.
http://www.bourns.com/data/global/pdfs/EM14.pdf

mozkan87

Benim kullandığım devrede RC filtre mevcut bu nedenle bouncing sorunu yaşamıyorum.

arm-beginner

#28
RC-Filtre tabii ki bir çözüm; ama böylece encoder'ın max. dönme hızını sınırlıyorsun. Ayrıca yazılım ile yapabileceğin birşeyi niçin donanm ile çözüyorsun?

mesaj birleştirme:: 12 Ağustos 2014, 22:20:13

Belki birisinin ilgisini çeker:
http://www.mikrocontroller.net/topic/341165
Kişi burda bir stepper-motorunu encoder olarak kullanıyor. İnternet'de bu tür çözümler bol miktarda var; ama burdaki özellik sinyaler ADC ile okunuyor ve basamakların geçiş-direncini 2 aşamali düzenliyor.
Atmega88 kullanılmış ve program C ile yazılmış.