Merhabalar!
16F84 le çok baş başa kalamadan, at89c51 e geçiş yapmış biri olarak, rotary encoder ı ortak nokta kabul ederek sizlerle fikir alışverişi yapalım.
---
Ben autonics marka 500 pulce lik 3 çıkışlı ve 3 de aynı çıkışların değillenmiş halleri olan (x1,x2 ve y ( y bir turda bir clock veriyor) ) TTL-5V luk rotary encoderla proje geliştiriyorum. Bi yürüyen bandın ana sisteme bağlı olmadan kaç mm fazla yada az çekildiğini bulmak (KABA HASSASİYET) ve kalan milimetreyide optik sensörle cross denilen özel bir kontrol baskısını arattıran ( İNCE HASSASİYET) tamamiyle bağımsız çalışan bir proje yapıyorum. Projede bandın kaç cm çekileceğini girmek için 4*4 tuş takımı, seri eeprom, metin
Lcd, optik sensör, endüktif sensör ( ayar yapan kolların sınırları için 2 tane) falan filan var. Biraz fazla açıkladım ama projeyi anlarsanız beni daha iyi anlayabileceğinizi düşündüğümden!
-----------
Yapmak istediğim şu:
rotary encoderın hangi yöne döndüğü ve kaç tur attığı?Bu bilgiyi aldıktan sonra zaten bandın durup durmadığını iki okuma arası karşlılaştırma ile anlarız ->> ilk != son ise bant hareketli
----
Ben yön bilgisini yönlü bir 16bit integer (tamsayı) kullanarak almayı düşündüm
RX1 diye rotary nin ilk ucu olan X1 i tanımladım
RX2 diye rotary nin ikinci ucu X2 yi tanımladım
C dili ile:
Kod:
integer FonkRotaryOku() {
int hafiza;
byte okuma;
byte yon;
hafiza = 0;
timerAyarla(10); // 10ms lik timer ayarlandı ve TMFULL=1 olursa süre dolar!
while(!TMFULL) {
okuma=0;
if(RX1) {
while(RX1 && !TMFULL) {
if(RX2) { if(!RX2) { yon = 0; okuma=1; } } else { if(RX2) { yon = 1; okuma=1; } }
}
}
else {
while(!RX1 && !TMFULL && z==0) {
if(RX2) { if(!RX2) { yon = 1; okuma=1; } } else { if(RX2) { yon = 0; okuma=1; } }
}
}
if(okuma==1) {if(yon==1) {hafiza ++;} else {hafiza --;} }
}
}
return hafiza ;
}
Evetttt!... Yukarıdaki kod arkadaşların dediği gibi
x1 = 1 iken x2 = 1 ise a yöne, 0 ise b yöne dönüyor demektir!
Peki ya okuma esnasında x1=0 ise ne yapacak! Ozaman tersi olacak x2=1 ise b yöne, 0 ise a yöne dönüyor demektir!!! Bu sayede hassasiyet artmış olur!
Kod ilk başta zamanlayıcıyı ayarlıyor. 10ms ye ye bu atmelde farklı kayıtçıların yüklenmesi ile oluyor o sebeple örnek bir ifade ile anlattım ve taşma dediğimiz zamanlayıcının işini bitirmesi sonucu etkilenen bayrağıda TMFULL ile gösterdim.
10 ms içinde X1 in konumu ne ise ( 1 yada 0 ) while döngüsü içinde diğer while e giriyor. Sonra x1=1 kabul edersek, o whilein içinde x2 nin o anki değerine göre ilgili if koşuluna bakıyor. O koşulun içindede x2 nin değili var yani bir clock darbesi olup olmama olayı!. Eğer x1=1 iken ve 10msn dolmamışken, x2=1 den X2=0 a geçiyor ise YON = 0 kabul edilir ve bir işlem yapıldığı için okuma = 1 kabul edilerek while den çıkılır ve okuma yapıldığı için en alttaki koşulun içine girilir ve yön=0 olduğundan hafıza değerinden düşme yapılır! Sonra asıl while in ( sayacın taşmasına bağlı olan) ilk satırına gidilir. Burada da okuma=0 yapılarak ilgili işlemler sayaç taşana kadar tekrarlanır!
Hiç bir dönme yoksa, zamanlayıcının taşması ile fonksiyon zaten bitirilecektir.
İyi hoş! Buraya kadar iş gören bir kodumuz var! Acak, benim rotary 500 pulce lik ken ben lcd den genelde 200 falan okuyorum! Bu durumu lcd ye gönderilecek rakamların basamaklanması ve lcd ye yazılması ile uğraşılıyor olması yüzünden yaşanan geçikmeden dolayı rotarynin okunamaması denilebilir.
Ben bunu hiç bir ilem yapmadan şu şekilde denedim:
toplam_miktar=0;
for(x=0;x<100;x++) {
toplam_miktar += FonkRotaryOku();
}
biçiminde yaptım. Yani fonksiyon 1 saniye boyunca rotarinin okunmasından başka bir iş yapmıyor!
Sonuç gine aynı oldu!
Bu arada atmel 60MHz lik ve 1 işlem 12pulce de oluyor. Yani saniyede 5 milyon işlem ve 1 işlemin süresi 200nsn ediyor.
5MHz lik sinyalleri algılayabilir bir sistem yapılamaz ama 1Mhz ye yaklaşılır bence! Giriş değerinin okunması, karşılaştırılması ve dallanmalar falan 1MHz de çok oldu
Neyse arkadaşlar, x1 in 1 ve 0 kenki durumlarınıda hesaba katıp bir işlem yapayım dedim ama 500 lük rotary den anca 200 ile 250 arası pulce okudum. Böyle bir uygulama bırakın kaba hassasiyet yapmayı sistemi komple hurdaya götürür. Takmasak sorunlu bir otomasyon daha iyi çalışacaktır