pıc 16f877A ya OPTİK enkoder palsleri nasıl saydırılır(okutulur) acil yardımmm

Başlatan emrpolat, 17 Nisan 2011, 08:58:21

emrpolat

arkadaşlar 12v 2 adet enkoderli dc motoru l298 ile sürüyorum fakat enkoderden gelen palsleri keme yaparak 16f 877 e yazdırmam gerekiyoda bunu nasıl yapacam bilmiyorum enkoder uçları b portunun 6 ve 7 bitinde bağladım kesme oluşturabilmem için pic basic pro kullanıyorum yardımcı olursanız çok sevinirim enkoderi nasıl saydırcam motorlar japon servo co ltd http://www.sahibinden.com/ilan/alisveris-elektronik-devre-montaj-dme34be50g-108-dc-motor-12v-41643259/detay bi turda 24 pals dakikada 1200 kare dalga üretiyo şimdiden teşekkürler.


ete

Forumda arama yaptınmı? Çünki encoder okuma konusunu daha önce detaylı olarak açıklamış idim.
Encoder çıkışını A ve B olarak kullandığına göre yön kontrolüde yapacaksın demektir yoksa tek çıkış işini görebilirdi.
Kesme kullanmak işini kolaylaştırır ancak kesmesizde halledebilirsin. Aşağıda işin temelini açıklayacağım. İlave sorun olursa cevaplarım.
Encoder şayet bildiğim rotary encoder tipinde çalışıyor ise iki çıkışı olmalı ki sende iki çıkştan bahsediyorsun. Bu çıkışlar birbirine göre 90 derece faz farklıdır. Bu nedenle A ve B çıkışlarının muhtemel kombinasyonları şöyle olacaktır;
(AB) , 10 , 11 , 01 , 00 şeklinde.
Şimdi okuma için yapılacak işlem
ILK= PORTB & (%11000000)   bu komut ile yalnızca encoder bitlerini alıp ILK değişkenine vermiş oluyoruz.
Ardından yeniden bir okuma daha yapacağız.
IKINCI=PORTB & (%11000000) aynı şekilde yine encoder bitlerini IKINCI isimli değişkene vermiş oluyoruz.
Şayet ILK=IKINCI ise encoder dönmüyor demektir. O halde Yeniden IKINCI yi okumak üzere programı o satıra yönlendiririz.
Diyelimki ILK ile IKINCI bir birinden farklı. O halde encoder döndü demektir.  Bu durumda önce dönüş yönünü tespit etmemiz gerekir.
YON=(ILK.Bit7) ^(IKINCI.Bit6)  Açıklaması ILK,7. biti ile IKINCI nin 6.cı bitini XOR işlemine tabi tutuyoruz.
ILK=10 olsun
IKINCI=11 olsun
O halde YON=1 XOR 1=0 olacaktır. O halde YON=0 ise saat istikametinde (terside olabilir ama biz öyle kabul edelim)dönüş var demek olacaktır. Şimdi birde tersini inceleyelim.
Yani ILK=00 ve IKINCI=01 Olsun
YON=0 XOR 1 =1 olacaktır.
Bu şekilde emcoderin dönüş yönü kolaylıkla tespit edilebilir.
Yön tespiti yapıldıktan sonra
Şayet YON=0 ise SAYAC=SAYAC+1
Şayet YON=1 ise SAYAC=SAYAC-1 şeklinde saydırma yapılarak enkoder okuma kısmından çıkılır.
Hepsi bu kadar. Tabiiki sayac değerlerinin sınırlarını artırma yada eksiltme kısımlarında tanımlaman gerekir. Sayacın belli değerin üzerine çıkmaması yada belli değerin altına inmemesini bu bölümde tanımlaman gerekiyor.

Normal şartlarda ilk okuma ile ikinci okuma arasında belirli bir zaman sayacıda çalıştırarak encoderin dönmemesi halinde o zaman sayacı değerine hem saydırıp hemde ikinci okumayı yaparsın. Encoder hala dönmemiş ve senin zaman sayacında limite gelmiş ise sayamadan encoder okumadan çıkman ve daha sonra yeniden gelmen daha uygun olur.
İşte bu kadar encoder okuma.

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

emrpolat

ete hocam ilgilendiğiniz için teşekürler http://www.sahibinden.com/ilan/alisveris-elektronik-devre-montaj-dme34be50g-dc-motor-44725534/detay elimde bu motordan var 2 adet yükdek okul öğrencisiyim okulu bitirmem için projeyi bitirmem şart bi halı yıkama robotu üzerinde çalışıyorum.şimdi robotu  halının herhangi bir köşesine koyduğum zaman köşeyi referans 0 kabul ederek lcd de bulunan menüden halı boy ve en uzunuğu tuş takımı sayesinde girilecek ve verilen bu değerlere göre enkoder pulse leri sayılarak en boy oranı hesaplanacaktır. ben bunu yapamaya çalışıyorum ama bir türlü yapamadım pic basic pro kullanıyorum ama başaramadım.  ben ilk başta donanımsal timer kullancaktım ama hocam kesme ile yapmalısın dedi ama ben yapamadım. yardım ederseniz çok sevinirim

Tagli

ete hocam, anladığım kadarıyla emrpolat'ın encoder'ları tek çıkışlı. Yani yön bilgisi alınması mümkün değil.

emrpolat, iki adet encoder'ı PORTB kesmesi kullanarak sayabilirsin. Kesme geldiğinde ilgili girişleri okuman ve değişiklik olan bacakla ilişkili sayacı arttırman gerekli. Tabi bunu yapabilmek için önceki okuma değerini de bir yerde saklıyor olmalısın.

Öte yandan, aracın düz gidebilmesi iki motorun da aynı hızda dönebilmesine bağlıdır. Senin encoder bilgisine göre motor hızlarını da eşit tutman gerekli. Yani hız ve pozisyon kontrolünü aynı anda yapmalısın.

Son olarak, sadece encoder verisiyle yön ve mesafe tayin etmek genelde mümkün olmaz. Ölçümsel hatalar zamanla birikir ve sistemin doğru çalışmasını engeller.

Ayrıca, tuş takımından girilen ölçülerin ne amaçla kullanılacağını tam anlayamadım. Biraz açıklık getirirsen sevinirim.
Gökçe Tağlıoğlu

ete

İlk mesajda 2 motordan bahsetmiş arkadaş ama ben anlamamışım demekki. Amaç çok açık belirtilmemiş. Her neyse şimdi anlaşılıyor ne istendiği.
Peki elinde bir proje var ve sen neler yaptın bakalım. Koy ortaya ve mümkünse proje detaylarınıda buraya yaz ve bizde üzerinde kafa yorup nasıl bir yardım yapabiliriz düşünelim.
Sana yalnızca motorun döndüğü sürece palslerin okunmasımı gerekli bu bilgi elinde olursa işi çözebilecekmisin. ?
Bu projenin ne gibi kısımları mevcut ve sen bunların hangilerini yapamayacak durumdasın?
Kısaca nasıl bir yardım bekliyorsun. ?
Bunları soruyorum çünki ilk mesajında yalnızca encoder okumasını sormuşsun bende detaylı anlatmışım. Yön bilgisi fazladan olmuş onu çıkarıp geri kalanını amacın için kullanabilirsin.
Ete

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

emrpolat

ete hocam 16f877a kullanıyorum 5 adet motorum var 1. pomapa motoru,2. 2 adet dc motor fırçalar için 3. 2 adet enkoderli dc motor hepsi 12v ile çalışıyo enkoderli olan motorları l298 motor sürücüsü ile sürüyorum ama motorlardan konum bilgisi yani ilk mesajta anlattığım gibi halı dikdörtgen bir şekilde olduğundan  en ve boy kenarı var ilk önce lcd ekranda bulunan menüden halının en ve boy uzunluğu artır ve azalt butonu yardımıyla belirlernir bunun için önceden bir en ve boy uzunluğuna bir ilk değer atanmalıdır en ve boyu girdikten sonra robotun bulunduğu herhangi bir köşe referans 0 kabul edilerek yıkama ( sayma bu anda başlar) işlemine başlanır taki girilen boy oranı tamalana kadar ilk tur tamalanınca geriye dönülür yıkama yapılır  2,3,4  tur bu şekilde tamamlanır. yıkama böyle devam eder sağa ve sola dönüşlerde gidilen yol miktarını toplayarakta (başka türlü bir yöntem varmıdır) en oranı hesaplanıcak yıkama bitirilecek dönüşlerde fırçalar ve pompa motoru çalışmayacak . enkoderli motorlara donanımsal pwm uyguluyorum 92.6 rpm ama halı iyi yıkanması için motorun yavaş dönmesi gerekli . enkoderleri saydırmayı başaramadım  motorlar her 2 yöndede hareket istenmektedir (dönüşlerde) elimde ısıste yaptığım devre var ama nasıl eklencek bilmiyorum ilginiz için çok teşekür ederim kırklareli üniversitesi tbmyo mekatronik öğrencisiyim