rotary encoder

Başlatan blueboard, 13 Kasım 2016, 21:14:20

blueboard

Ete Hocam , bir firmadan rotary encoder aldım. Encoder uçlarından ortada olanı GND 'ye bağladım, diğer A ve B uçlarını ise 10K lık dirençlerle +5 volta bağladım. Encoder datasheet'inde çıkışların saat yönünde 11-10-00-01-11  ve saatin ters yönünde ise 00-10-11-01-00 olduğu belirtiliyor. Yapmak istediğim şu: Encoderin dönüş yönünü tespit ederek portb.4 veya portb.5 pinlerini istediğim süre için lojik1 konumuna getirmek istiyorum.Konu ile ilgili sitenizde bir çok örnek var ama ben bir türlü bunlardan faydalanarak istediğimi yapabilmiş değilim. Şurada kesme kullanarak LCD de dönüş yönünü belirlemişsiniz:
http://etepic.com/index.php/topic,336.0.html   İlk mesajınızda verdiğiniz programda şöyle bir kesme oluşturulmuş "KESME:
         YENI=PORTB & %11000000
         YON=A ^ B
         IF YON=1 THEN
           SAYAC=SAYAC+1
         ELSE
           SAYAC=SAYAC-1
         ENDIF
         ESKI=YENI
         TEMP=PORTB"
Ben bunda şöyle bir değişiklik yaptım:
"YON=A ^ B
         IF YON=1 THEN
           SAYAC=SAYAC+1
            portb.4=1 : pause 500 : portb.4=0 : pause 200
           
         ELSE
         SAYAC=SAYAC-1 
         portb.5=1 : pause 500 : portb.5=0 : pause 200
           
         ENDIF"
Bu şekilde yön durumuna göre portb.4 veya portb.5 lojik 1 oluyor ama zaman zaman program dönme yönünü tespit ederken hata yapıyor.
Daha sonra şuradaki konunuzu okudum:      http://etepic.com/index.php/topic,508.msg18302.html#msg18302
Burada yazdıklarınıza göre bir mantık geliştirdim ama yazdıklarımın ne derece doğru olduğunu bilmiyorum. Konu ile ilgili dosyaları ekliyorum. Proteus çiziminde encoder olarak neyi seçeceğimi bilmediğimden encoder olduğunu anlatmaya çalıştım. Mümkünse programı kontro eder misiniz. Mesajım biraz uzunca oldu,kusura bakmayın.

ete

#1
Bir yandan enkoder okuyup yön belirledikten sonra Pause 500 demek bu kod çalışmasın demekle aynı şey.
O çıkışı encoder ile HIGH yapıp timer ile LOW yapmak en doğrusu bence. Aksi halde encoder okuma sistemin çalışmayacaktır.
500 ms lik bir sür eiçinde encoder bir kaç tur atabilirdi sen ise ona mani oluyorsun.

Encoderin A ve B uçları var sende ki uçlar. Bunlar dönerken bir birlerinde 90 derece faz farklı sinyal üretiyorler. Bundan yararlanarak yön tayini yapılıyor. Neyi beceremediğini anlamakda çok zor. Koda bakılırsa A ve B çıkışların PORTB.6 ve PORTB.7 de bağlı gözüküyor.
İşin temelinde bir birinden farklı ve takip eden iki farklı okumayı yakalamak yatıyor. Enocder saat yönünde 11 10 00 01 kodlarını üretiyor. Diyelimki saat yönünde çeviriyoruz. önce ilk okumayı yapıyorsun. Diyelimki 11 okudun.
Peşinden gelen 10 okumasını yakalamak için sürekli okuyorsun. yakaladığın anda Yö tayinin şu şekilde olacaktır. Seninbağlantına göre yapmak gerekirse;
ILK=(PORTB & %11000000) (Bu konumda ILK=%11000000 olduğunu varsayıyoruz)
TEKRAR:
SON=(PORTB & %11000000)
IF ILK=SON THEN TEKRAR
'program bu satıra geçerse demekki farklı okuma sağlandı
YON=ILK.7 ^ SON.6  'BU konumda SON=%10000000 olduğunu kabul ediyoruz.)
Yani YON=1 ^ 0 lojik ifadesi bize 1 değerini verecektir.
O halde yön=1 diyoruz.
Şimdi saatin tersi yönüne bakalım. Tersi yönde encoderden 01 00 10  11 01 00.... değerlerini okumamız gerekiyor.
İLK=%11000000 olarak okunmuş idi.
SON=%0100000 olarak okunacaktır bu durumda.
YON=ILK.7 ^ SON.6 = %1 ^ %1=% 0 değerini verecektir. Bu durumda YON=0 olacaktır. Bu kadar basit yön bulmak.
Yön bulma işi tamamda o koyacağın Pause işi berbat edecek ona bir çare bulman gerek.

Ete

Not: Şemanda encoder bağlantın PORTB.0 ve PORTB.1 pinlerine bağlanmış ama programda PORTB.6-PORTB.7 pinleri giriş olarak seçilmiş. Bu bir çelişkidir. Programın çalışmama sebebi bu olsa gerek. Ayrıca encoder için motor encoder kullanabilirsin.


blueboard

Teşekkür ederim,uyarılarınızı dikkate alacağım.

İlyas KAYA

Erol hocam; Hazır burada bir konu var buradan sorayım.

Daha önce encoder kullanmadan motor sayım yaptınız mı ?

Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ete

Encoder kullanmadan??? Yok yapmadım.
Ete

İlyas KAYA

Evet hocam. DC motoru encoder kullanmadan sayım yapmam lazım. Sesli olarak düşündüğümde ;

PWM palslerini zıt emk dan okuyup bu işi yapabilirmiyim diye düşünüyorum. PWM pulsi verdiğimizde motor hareket ettikçe pwm tam olarak zıt emk dan gelir. Ama sıkıştığında yada akım çektiğinde genliği değişir ise bununla da çektiği akımı bulabilirim diye tahmin ediyorum.
Henüz ar-ge sine başlamadım. Belki bir fikriniz vardır diye konuyu görünce aklıma geldi sorayım istedim.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ete

Tahmin ettim ne olacağını ancak hiç bir fikir yürütemiyorum. Zaten oldum olası bu tür şeyler bana ters geliyor her nedense. Düşünce olarak ters geliyor demek istedim. Ben motora PWM sinyali vereceğim Sinyalin LOW peryodunda motor sargısı Zıt EMK üretecek bende onu o anda ölçeceğim yada bir şekilde işlemciye gördüreceğim. Hem çok kısa bir aralık hemde boyutsal olarak çok küçük bir değer olsa gerek.
Fikir olarak vereceğin PWM leri saysan daha uygun olmazmı sence illaki motordan geri gelenleri mi sayacaksın?
Cevabı evet ise PWM nin LOW a düştüğü and emk okumak durumunda kalacaksın sanırım.
Sana kolaylıklar dilerim. Sonucu merak ediyorum.

Ete

İlyas KAYA

Evet biraz mantık dışı ancak encoderlar sağlıklı çalışmıyor. Toz vb den etkileniyor. Hall effect sensor de kullanmıyorlar.
Optik lerde ise zamanla emisyon düşüyor ve kayma meydana geliyor. 

Kaliteli encoder da fiyatından dolayı kullanmak istemiyorlar.

Eğer encodersiz olarak yapabilirsem iyi olacak.  Motordan dönenleri okumak istememin sebebi motorun pwm 'e olan tepkisini görmek. PWM verdik ancak motor durmuş yahut zorlanıyor olabilir.

Teşekkür ederim yine de verdiğiniz bilgileri için. Sonuç alırsam paylaşacağım .
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

F®T

İlyas hocam selamlar.Sanırım pwm 1 pozisyonunda dc motoru sürüp 0 pozisyonundada adc ile okuma yapacaksınız.Burdaki ters emk voltu dc motor hızı ile sanırım doğru orantılı bir artış gösteriyor.Olur diye düşünüyorum.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Powered by EzPortal