Dc Motor encoder kontrolü

Başlatan Jamesbond79, 04 Kasım 2017, 19:28:52

Jamesbond79

Elimde 2 adet encoderli motor var arduino ile kesme sayesinde encoderdan konum okuyup konuma göre motorları durdurma ileri geri yapma gibi işlerde uğraşmak istiyorum. Encoder sürekli degiscegi için acaba program gerginden fazla kesme de kalır mı çünkü sistemde sensörlerde olucak kesmede kalırsa sensör bilgilerini kacirabilir. Bunla ilgili çözüm önerisi var mı?

sezgin05

Donanımsal  kesme de ana program etkilenmez hocam endişeye gerek yok.

Jamesbond79

Bugün encoder çalıştırmayı denedim ama çalışmadı acaba neyi yanlış yaptım motorlar faulhaber encoder beslenmelerini ters baglarsam encoder arizalanir mı? Pullup 1k direnç bağlayarak yaptım arduino serialprint kesme oluşturup baktım herhangi bir değişim yok motorlara enerji vermeden ellle çevirerek denedim sorun ne olabilir. Encoder konusunda deneyimli arkadaşlar yardiminizi bekliyorum.

sezgin05


ete

Encoder okuma prensibini bilip bilmediğini anlayamadığım için buraya açıklama verme gereği duydum.
Bir encoder de 2 pin vardır. A ve B olarak Adlandırılırlar. Bu pinlerin çıkışları bir birlerine göre 90 derece faz farkı ile yapılır.
Faz farkı encoderin dönüş yönünü tespit etmek amacı ile kullanılır. Bahsettiğim genel rotary encoderler için geçerlidir.
Encoder pot dediğimiz potlarda durum farklı değildir. 3 adet pin vardır orta pin GND ye bağlanır dıştaki iki pin A ve B olarak işlemciye giriş yapar. Ancak bu pinlerin 4K7 direnç ile Pullup yapılması (yada işlemcinin dahili Pulluplarının kullanılması) gerekir.
Bir encoder pinilerinin olası 4 farklı çıkış verme durumu vardır. Bunlar Saat yönünde dönüşlerde %11 - %01 - %00 - %10 - %11 şeklinde yürür. Encoder ters tarafa döndürülür ise bu seferde çıkışlar %11 - %10 - %00 - %01 - %11 şeklinde yürür.
Yön tayini için Önce iki pin okunur Diyelimki Eski=%11 okundu.
Sonra hemen ardından tekrar bir okuma daha yapılır bunada YENI denir. Şayet ESKI=YENI ise encoder henüz dönmemiştir yada dönmüyordur anlamına gelir. Diyelimki enocder dönüyor ve okunan değer YENI=%01 şeklinde oldu. Bu iki bilgi kullanılarak dönüş yönü şöyle bulunur.
ESKI.Bit1 XOR Yeni.Bit2 (Yada ESKI.Bit0  XOR  Yeni.Bit1) şlemi bize yön bitini verecektir. Bakalım YON=1 XOR 0=1 O halde YON=1 ise saat istikametinde dönüyor diyebiliriz.
Şimdi tersine dönüş için bir YON bulalım.
ESKI=%11 olsun yine. YENI=%10 olacaktır. YON=1 XOR 1=0 bilgisini bize verecektir. sonucun 0 çıkması saaitin tersi yönde döndüünü gösterecektir.
Sonrasında dönüş yönüne göre IF YON=1 then YOL=YOL+1 veya IF YON=0 THEN YOL=YOL-1 şeklinde artırma ve eksiltmeler yaptırılmalıdır.
Olaya İŞlemcide KESME yaratılması açısından baktığımızda ii pinin aynı anda değerlendirilmesi gerekir. Zira yalnızca tek pin bazı durumlarda konum değiştirir. Ama ikisi birden değerlendirilirse her türlü değişikliği yakalarsınız. Bu nedenle PORTB değişiklik kesmesi encoder kullanımına daha uygundur. PORTB.6 ve PORTB.7 pinlerine bağladığınız encoder pinleri ile değişiklikleri yakalar ve işlem yapabilirsiniz.
Programa başlarken ESKI=PORTB & %11000000 şeklinde Encoder okuması yapıp saklanır ve kesme oluştuğunda okunan değer ise YENI kabul edilir. Böylece aralarındaki farka bağlı yön hesabı yapılıp kesmeden çıkılır. Çıkarkende ESKI=YENİ diyerek çıkmanız gerekir.

Hepsi bu. Maalesef C dilinde çok iyi değilim. Bu nedenle işin temelini genel anlamda bir dile bağlı kalmaksızın anlatmaya çalıştım.
Gerisini siz halledersiniz artık.
Son olarak şunuda eklemek isterim. Encoder potlar da her bir tık yukarıda açıkladığım 4 konumu içerir. Yani her tıkta encoder pot 4 farklı çıkışıda verir. Bu nedenle yavaşça çevirip bakarsanız sayacınızın her tık da 4 saydığını kolaylıkla görebilirsiniz. Bu nedenle bu konumlardan yalnızca birini esas almanız gerekir. Mesela encoder çıkışı %00 iken saydırma yapın.

Ete

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

Jamesbond79

İlginize tşk ederim. Osiloskop ile ölçümleri yaptığımda herhangi bir çıkış alamadım büyük ihtimalle encoder kısmı arızalı.