Pic ile encoder sinyallerini saydırmak

Evet Arkadaşlar, yukarıda yazdığım bol bol kelime sarf ettiğim metnin kod kısmında tanımladığım fonksiyon olan;
FonkRotaryOku();
fonksiyonunu kullanarak, şu kodu yazdım


Kod:
void main(void) {

while(1) {   // Sonsuz döngü

int eski = 0;    // Sadece rotariden gelen adımları toplamak için
int yeni = 0;    // Rotariden yeni adımlar gelince ekrana yazdırmak için
int hamal =0;   // fonksiyondan gelen adımları tutmak için 

do {

hamal = FonkRotaryOku();

yeni = yeni + hamal;      //  hamalı whilede de kontol etmek için kullandım

} while(hamal!=0);

}

if( yeni!=eski ) {   
eski = yeni;
printf("Rotary Encoder toplam Adımı= %d", yeni );
}

}


Yukarıda arkadaşlar, bir önceki mesajda yazdığım FonkRotaryOku(); fonksiyonunu kullanarak rotary encoder i sürekli tarama yapmak için kullandım.


Şimdi her defasında okuduğum değeri ekrana yazdırmak için kullansa idim ekrana yazdırma yaparken var olan adımları okuyamazdım. Bu sebeple yazdığım fonksiyondan gelen değer sıfıra eşit ise yada adım sayacımız değişmişse gibi kontrollere göre adımları görsel bir ara yüze atmayı denedim. Yani, rotaryden gelen adımlar sıfırsa rotary duruyor demektir. Bu sayede bir işlem yapmaya müsade ettim. ve de daha önce ekrana yazdırdığım değer rotary durduktan sonra var olan değerden farklı ise yeniden ekrana değer yazdırmayı mümkün kıldım.

Bu sayede rotary encoder daha fazla izlenmiş ve adım kaçırılmamış olacak :)

Bu kodları derledim ve breadboard da bi deneme yaptım. Rotary ucunu çevirmeyi bırakana kadar ekrana bişey yazdırılmıyor. Bunu engellemek için rotary den gelen değerin kontrol edildiği do...while döngüsü içine bir sayaç atılıp bunun önüne geçilebilir. Mesela yazdığım fonksiyon 10ms lik ve sıfırdan başlayan bir sayının while içinde her bir işlemde arttırımını sağlayıp 100 e eşit olana kadar bir müsade sağlarsanız, 1 sn de bir ekranın tazelenmesini sağlayabilirsiniz.

Tabi ben bir bandın durmasını bekliyeceğim için while döngüsünü kesme gibi bir niyetim yok. Takometre gibi bir uygulama yapacak olanlar saniyede bir ekranı tazelemeleri gerekecek.

Bu uygulamamda bir sorunla karşılaştım. Rotary adımları misal 1555 iken rotarinin miline bir teker taktım. Tekeri bi sağa bi sola bi sağa bi sola rahat 15 defa ileri geri yaptım. Orta noktada duracak şekilde durdurdum. Ama ekranda 1555 gibi bir değer yerine 1809 gibi bir değer gördüm. Ben yaklasık 254 clock luk bir yöne hariket etmedim. 500 clock luk rotary e göre yarım tur bi yöne gitmiş olama gerekiyor. Halbuki ben hala aynı notadayım.

Sonuç olarak, rotary nin X1 yada X2 ucunun birini referans alıp diğerinin konumuna bakarak işlem yaptırabilmek için sadece bu işe atanmış ap ayrı bir kontrolcünün olması gerektiğini düşünüyorum. Öleki, bu kontrolcü sadece geri bildirim verecek.


BENİMLE AYNI FİKİRDE OLMAYIN LÜTFEN!

DÜŞÜNCELERİNİZİ, YORUMLARINIZI YAZIN!

BURADA BERABER FİKİRLERİMİZİ PAYLAŞALIM.
 
Arkadaşlar!

Rotary ile pek haşırneşir değilim. Yukarılarda yazdığım kodlar sanırım idealde doğru çalışır.

Gerçekte, kesme kullanmadan doğru bir sonuç elde edemeyeceğiniz.

Yukarıdaki kod ile 44 MHz lik bir Atmel 8051 de 500 luk rotaryden anca 200 - 220 gibi veriler elde ediyordum. Birisi bana faz-1 metodu bu dedi. Yani x1 e bağlı olarak bu tarz bi taramada 250 alabileceğin değerdir dedi! Sonra, amacım 500 ü elde etmek dedim ve geçtim kesme ile ne yapabilirm diye!

Kesme kullanarak, Rotary nin X1 ucunu kesme ucuna bağladım ve X1 in düşen kenar kesmesinde X2 nin durumuna bakarak, ram deki sayacı arttırdım yada azalttım.

AUTONİCS e50s8-500-6-l-5 model rotary encoder da 500 yerine 490 darbe elde ettim. Sonucu saniyede 1 Lcd ekranda gösteriyordum. Belki ondandır diye lcd yerine seri porttan Hyper-terminalde görmeye çalıştım. Gine 490 gine 490 .....


anlamış değilim. Atmelin hızı yetersiz dicem, sucu ona atacam ama bu kolayı olur. Rotarının ucunu yavaş çevirincede hızlı çevirincede sonuç değişmiyor.

Bi uzman, bilgidini ve deneyimini paylaşabilecek birisi !!! Ne olursunuz bi iki satırda olsa şundan diyin. Zaten Pic di ATMEL di amd ydi intel di zengin ediyoruz milleti. Bide gidip HCTL2020 dene bi entegreye bi ton para dökmeyelim.
 
herkese merhaba arkadaşlar...
staj yaptığım yerde mühendisin bana verdiği proje LTN marka 3 çıkışı olan (A,B,Z) encoderden gelen pulse leri saydırmak. bunu fpga ile vhdl dilinde yapıcam kod kısmında çok problemim olmayacak fakat arkadaşların anlattığı A ve B çıkışlarını kullanarak çözünürlüğü arttırma kısmında kafamda soru işaretleri var. Mühendise sordugumda bana ikisini aynı anda saydırmadaki kastının aşağıda şekilde verdiğim gibi iki işareti OR layarak sonucun '1' oldugu yerleri saymam demek oldugunu söyledi bu durumda çözünürlük 3 katına mı çıkar yada benmi yanlış düşünüyorum neden böyle bişey söyledi anlamadım.


birde pulse leri şekildeki gibi arttra bilmem için pulsleri her inen ve çıkan kenarlarında orlamam ve sonuc 1 se arttırmam gerekiyor, aynı zamanda ters yöne döndüğünü anlamakta sıkıntı, yani kod çok karışacak. acaba benm yanlış anladığım bişeylermi var diye düşünüyorum.
sizin fikirlerinizi almak istedim. ş
şimdiden teşekkürler...
 

Yeni mesajlar

Forum istatistikleri

Konular
129,801
Mesajlar
930,219
Kullanıcılar
452,604
Son üye
cemocan44

Yeni konular

Geri
Üst