avatar_ete

Encoder ve Encoder Pot Kullanımı

Başlatan ete, 29 Şubat 2012, 17:22:35

gogoce

Alıntı yapılan: Mucit23 - 20 Ocak 2014, 17:17:58
Hocam merhabalar.

Gray Kodu encoderler hakkında bilgi almam lazım. Çıkış sinyalinin nasıl olduğunu çözemedim.

Örneğin aşağıda 8 bit gray encoder var. Dış tarafın düşük 8 bit, iç tarafında yüksek 8 bit olduğunu düşünürsek binary formatında nasıl bir çıkış sinyali alırım?


resim yuklemek

Bu tip bir encoder ile konum ölçümü yapabilirmiyim?



Selam mucit

GRAY CODE her satırda 1 bitin değiştiği bir koddur

BCD kodunun exorlanmış hali de diyebiliriz

bu özelliğinden dolayı gray code asansör kat sayma sistemlerinde kullanılmış idi

örnek vermek gerekirse
desimal                 bcd                  gray
0 >                     0000                  0000
1>                      0001                  0001
2>                      0010                  0011
3>                      0011                  0010

bu tablo böyle uzar gider dikkat edilecek husus gray code de her satırda bir bit değişir

binary code de bit isimleri B7-B6-B5-B4-B3-B2-B1-B0 DIR . GRAY CODE İSE M7-M6-M5-M4-M3-M2-M1-M0 DIR . lsb biti 0 , msb biti 7 dir


binary to converter yapmak çok basittir

b0-b1 i exorlar isen m0 elde edersin
b1 ile b2 exorlar isen m1 elde edersin
b0 ile b2 exorlar isen m2 ielde edersin
b3  = m3      tür . desimal 16 ya kadar en basiti böyledir


şayet asansör panolarında m0-m1-m2-m3 gibi bir rumuz görürseniz bilin ki bunlar sayıcı şalter uçlarıdır



saygılarımla
gogoce
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

Mucit23

Merhaba,

Benim anladığım şöyle

B3 = M3 olacak,
B3 ile M2 Exorlanacak, bulunan değer B2 olacak,
B2 ile M1 Exorlanacak, bulunan değer B1 olacak,
B1 ile M0 Exorlanacak, bulunan değer B0 olacak

Yani X. Gray bit ile bir önceki işlemden bulunanan Binary bit Exorlanıp sonuç binary'ye yazılıyor.

Sizin bahsettiğiniz birazdaha farklı. Siz Binary leri kendi aralarında Xor işlemine tutuyorsunuz.

http://www.wisc-online.com/Objects/ViewObject.aspx?ID=IAU8307
Burada farklı bir şekilde anlatılmış.

Ben 8 bit için uygulayacağım bu sistemi,
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

gogoce

ben binary to gray diye anlamışım :(
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

Eksik anlatım ve ifadeler her zaman bu tür sorunları doğurur. Buradada benzeri yaşandı. konuya açıklık getirmek için bendoğrusunu yazayım bilmeyenler öğrensin.
Bu işte iki türlü çevirim var.
Birisi Binay den Gray 'e
diğeri de Gray den Binary 'e.

Her iki çevrimde de çevirme işlemi daima MSB bitinden başlıyor.
- Binary den Gray'e çevrim yaparken  Binary MSB değeri aynen alınıyor. Sonra MSB ile yanındaki bit (diyelimki B2) XOR yapılıp M2 olarak yazılıyor. Bir sonraki işlemce B2 ile B1 XOR yapılıp M2 olarak yazılıyor bu işlem M1 elde edilinceye kadar devam ediyor.

- Gray den Binary'e çevirimde ise, yine M3 aynen alınıp B3 yapılıyor. Sonra B3 ile M2 XOR lanıyor ve B2 olarak yazılıyor sonra B2 ile M1 XOR lanıp B1 olarak yazılıyor ve B0' bulununcaya kadar işlem devam ediyor.

Ete

Mucit23

Yaptım herhalde  :)

İki adet fonksiyon yazdım.

unsigned int8 gray_to_binary(unsigned int8 gray_val){
unsigned int8 bin_val=0,i=0,z=6;

  if(bit_test(gray_val,7))
  {
    bit_set(bin_val,7);
  }else{
    bit_clear(bin_val,7);
  }
  for(i=0;i<6;i++)
  {
      bin_val=bit_mask(bin_val,z,bit_test(gray_val,z)^bit_test(bin_val,z+1));
      z--;
  }
 
return bin_val;
}

unsigned int8 bit_mask(unsigned int8 main_val,unsigned int8 bit, unsigned int1 fill){
if(fill)
{
   bit_set(main_val,bit);
}else
{
   bit_clear(main_val,bit);
}
return main_val;
}


Sonuç olarak gray_to_binary fonksiyonuna gönderdiğim gray kodu binary'ye dönüştürülüp fonksiyondan geri döndürülür.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Hattuşa

slm ete hocam;
http://www.robotistan.com/Rotary-Encoder-Rotary-Potansiyometre-ve-Pot-Basligi,PR-1753.html
sitesinden 1 adet rotary encoder pot aldım,


burada örnek teşkil eden butonlu hali ile bağlantı yaptım, pullup dirençlerini +5v a bağladım,
http://bildr.org/2012/08/rotary-encoder-arduino/
int0 kesmesini aktif ettim ve sizin tek encoder yazılımını adapte ettim denemek için, amacım butonlu menu yerine encoderle menu oluşturmaktı, skoptan encoder çıkışlarını görüyorum normal, ancak devre kesmeye girmiyor, biraz acelece yaptım ama çalışmadı,  ;D
intb0 in yükselen kenar yakalaması vs denedim nafile kesmeye sokup bir türlü beceremedim,
işin özü şu hocam ben encoderin çalışma mantığını anlamadım, eğer vaktiniz varsa bize biraz konu hakkında detay verebilirmisiniz?
teşekkür ederim.

ete

Önce bağlantı kontrolünü yapalım. Ortadaki bacak direk GND ye bağlanacak dıştaki iki bacak ise her biri 10K direnç ile +5V ta bağlanacak. Sistem bu.  Çalışma şekline gelince. Dışta yer alan iki bacaktan birisi A diğeride B dir. (Orta bacak C olarak geçiyor)
A ve B çıkışlarının şeklini aşağıda veriyorum.

Resimden de anlaşılacağı üzere A ile B arasında 90 derece faz farkı bulunmaktadır.
Saat yönünde dönme sonucu %11 - %01 - %00 - %10 - %11 şeklinde çıkış alınmaktadır.
Yön tayinininnasıl olması gerektiğini şekilde de açıkladım. Yalnızca bir çıkışı PORTB.0 kesmesine bağlarsanız sistem yine çalışır.

Kesme oluşmuyorsa sisteminde bri bağlantı hatası var demektir. Açıklamalara göre yeniden kontrol et bak bakalım hata nerede imiş.

Ete

Hattuşa

ete hocam bilgi için teşekkür ederim, devreye bakma fırsatım oldu ve hata yazılımda giriş-çıkış ayarlarından kaynaklı bir hataymış şimdi sizin kodu çalıştırdım, yani encoder tek yazılımınız çalışıyor burda sorun yok, yalnız geri sayımlarda bazen şaşırarak aşağı doğru iniyor, yani 1 erli değilde bazen 2-3 lü olarak iniyor, sorun değil önemli olan bir başlangıç yapabilmekti.

hocam sizin vermiş olduğunuz koda göre;
Disable
KES:
    If YON=1 Then
      VOLT=VOLT+EKLE
      If VOLT>300 Then volt=300
    Else
      volt=volt-EKLE
      If volt>300 Then volt=0
    EndIf
    lcdout $fe,$02,"volt= ",Dec volt/10,",",Dec volt//10,"  "
   
INTCON.1=0   'komutu ile kesme bayrağı sıfırlanır.
Resume
Enable


örnek olarak;
A nın yükselen kenarlarına göre (K harfi ile belirttim) B de (b yi yon olarak tanımlamışız) yon =1 ise volt değeri 1 artıyor, değilse 1 eksiltiyor
amacım yazılımınızı sorgulamak değil, sadece anlamadığım noktaları öğrenmeye çalışıyorum.
yada hocam sizin bu okuma noktalarına göre yön tayinini basitce nasıl yapıp, mesela 4 konumlu ve her konumu artan eksilen bir menu haline dönüştürebilirim. ne önerirsiniz.

ete

Yön tayini ard arda iki farklı okumadan birin sıfır nolu biti ile diğer okumamın 1 nolu biti XOR lanır. Sonuç 1 ise diyelimki saat yönünde sonuç sıfır ise saatin tersi yönde dönüyor kabul edilir. Ard arda iki farklı okumadan şunu kadt ediyorum. İlk okuma %00 ikinci okumda aynısı ise zaten encoder dönmüyor demektir. Bir sonraki %01 olmuş ise farklı okuma gerçekleşmiş olur. Bu durumda %00 okumanın birinci biti "0" ile ikinci okumanın "1" olan sıfır nolu biti XOR yapılırsa sonuç 1 çıkacaktır. Verdiğim şekilde açıklama kısmında bu yön hesabını vermiştim gözden kaçmış sanırım.

Ete

Hattuşa

#24
hocam gözden kaçma değilde anlamadığımdan farkedemedim,
hocam sizin kodu anlamaya çalışıyorum zira başka elimde kaynak yok ve öğrenmeye çalışıyorum.
hocam şu "encoder_tek.bas" yazılımınızdaki bazı noktaları anlamadım açıklayabilirmisiniz?
ilk önce
EKLE    VAR Byte 56
VOLT    var Word 57

tanımlamalardaki 56 ve 57 değerleri neyi kastediyor?

EKLE=1+(1-TUS)*9  'pullup lı sistem


burdaki matamatiksel işlemde TUS değeri lojik 1 durumunda ve ekle =1+(1-1) *9 => tus =1 olmuyor mu? ve 9 katsayısı nerden geliyor

biliyorum çok oluyorum ama bu encoder işini çözmek istiyorum.

ete

Programı isisde denerken değişkenlerin aldığı değerleri izlemek bazen çok yararlı oluyor. Değişkenlerin yanına koyulan o rakamlar değişkenlerin derleme esnasında o adreslere yerleşmesini sağlıyor. Dolayısıyla iside watchwindow yada izleme penceresini açıp değişken adı ve adresini verirsen çalışma esnasında değişkenlerin aldığı değerleri görebiliyorsun. Sen rakam koymaz isen derleyici sıradan bir adres verir ve sen nereye yerleştiğini anlamazsın. Derleme sonunda oluşturulan asm uzantılı dosyayı açsrsan değişkenlerin aldığı adresleri orada görebilirsin.

Diğer konuda encoder butonu kullanılarak sistemin sayma şekli değiştiriliyor.
Her saydırma olayı gerçekleştiğinde biz normalda sayac=sayac+1 şeklinde bir formül kullanırız.
Diyelimki encoder butonuna badılınca birer birer değilde 10 ar 10 ar artsın değerimiz istiyoruz.
Bunu normalde If tus=1 then sayac=Sayac+10 şeklinde yapabiliriz. Ama if kullanmadan yapmak içinde bu formülü geliştirdim.
Tuşa basıldığı zaman Tus=0 değerini alır. Formülde yerine koyalım.
Ekle=1+(1-0)*9=10
Basılmadığı zaman tus=1 değerini pullup tan dolayı alacak ve sonuç
Ekle=1+(1-1)*9=1 değerini alacaktır.
Akıllıca değilmi?

Ete

F®T

"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Hattuşa

hocam çok mantıklı,  sayenizde encoder potu da çalıştırmayı başardım, şimdi sorunum, encoderi çevirdiğimde sağa veya sola değişim çok hızlı oluyor (18F serisi işlemcide 40 mhz osc den kaynaklı hızdan dolayı sanırım), hatta int0 ve int1 kesmelerini de aktif edip sağa ve sola değişimleri yakalıyorum, sorunum hızdan dolayı 2 ser 3 er atlamaları nasıl yavaşlatabilirim. onu düşünüyorum.

ete

Neden çok hızlı değişiyor onuda söyleyeyim. Potun her tık demesinde %00-%01-%10-%11 olarak pot 4 adet çıkış veriyor.
Her tık da bu çıkışları teker teker verse sorun olmayacak ama her nedense bütün encoder potlar bu sistemle çalışıyor.
Benzer sorunları bende yaşıyorum. SOnuçta mekanik kontak üzerindeki bazen aksaklık da çıkabiliyor.
Her tık sonucunda encoderin verdiği AB çıkışını tespit et ve ona göre bir sistem geliştir bence.
Mesela diyelimki tık edince encoder %11 çıkışını veriyor Bu senin Eski okuman olsun . Yeni okumayı da ortadakilerden birini al mesela 3. cü çıkış değeri neyse onu al. Böylece çevirme anında ufak da olsa toleransın olmuş olur.
Ete

F®T

hocam ayrıca ben mekanik sorunlar için 100nf kondansatörleri şase ile a ve b girişi arasına atmıştım faydalı olmuştu.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Powered by EzPortal