Rotary enkoder kontakt atlaması (contact bounce)

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,872
Piyasada bulunan ucuz Çin malı bir enkoderde bounce ne şekilde oluyor birkaç deneme ile gözlemleyelim. Bir arduino uno'ya enkoderi bağladım. Dijital pinlerin olduğu header'a uygun şekilde taktım ve CLK çıkışına osiloskobu bağladım.

IMG_20220413_165848.jpg


IMG_20220413_165918.jpg


IMG_20220413_170016.jpg
 
Enkoderin pull up'larını Vcc ye bağlayan "+" pini GPIO 13'e denk geliyor. Bir programla bu pini lojik 1 yaptım

C++:
void setup() {
    pinMode(13, OUTPUT);
}

void loop() {
    digitalWrite(13, HIGH);
}
 
Sonra da osiloskobu düşen kenarda trigger ettirdim. Çoğu zaman temiz geçişler olurken, bazan çok pis bounce oluyor.

a.png


a.png


a.png
 
Sonra bir test programı yazdım. enkodering CLK pininin bağlı olduğu 10 numaralı GPIO da ne zaman bir değişim olsa bir counter arttıracak. Counter'i de arada bir serial monitöre yazacak. Encoder her döndüğünde bir clock palsı oluşuyor, o yüzden her dönüşte counter'in 2 artması lazım.

C++:
static unsigned int period = 0xffff;
static unsigned int count = 0;

static unsigned int prev = 1;

void setup() {
  Serial.begin(115200);

  pinMode(10, INPUT);

  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
}

void loop() {
  if (period == 0)
  {
     period = 0xffff;
     Serial.print(count); Serial.print('\n');
  }
  else
  {
     --period;
  }

  unsigned int curr = digitalRead(10);
  if (curr != prev)
  {
     ++count;
     prev = curr;
  }
}
 
Bu programı çalıştırıp enkoderi tam olarak 10 kere döndürdüm. Ortaya çıkan count 30 ...

1649860176907.png
 
Şimdi bir RC filtre ekleyince durum nasıl oluyor görelim. Maksimum bounce süresini 10 ms kabul ederek ve belli bir marj da bırakarak zaman sabiti 20 ms olacak şekilde bir RC filtre koyalım. Aslında burada kondansatör şarj olurken 94 k deşarj olurken 47 k görüyor, ama neyse.

1649862666682.png
 
Durumda pek bir değişiklik yok. Gene arada bir ciddi bounce oluyor

a.png


a.png
 
10 μF koydum :cheeky2:

a.png
 
100 μF

a.png
 
2200 μF yok artık, bu ne saçmalık yav, zerre kadar bir fark yok.

a.png
 
Çıkışı kondansatörün ucundan alacağıma dirençlerin ortasından almışım. Tekrar başlıyoruz :facepalm1: 470 nF kondansatör ile:

İlk resim bounce olmadığı durum. İkincisi bounce olan durum. Ama kondansatör bounce'u iyice yumuşatmış, amortisörlü bounce :)

a.png


a.png
 
Yalnız burada ikinci pals 100 ms sonra meydana geliyor. Genişliği de çok fazla. bu contact bounce değil başka birşey sanki.
 
Üstelik çoğu zaman da lojik 0 eşiğine ulaşmıyor. Burada mesela 2 V a kadar inmiş ve sonra geri çıkmış. Bu dönüşü büyük intimalle arduino kaçırdı

a.png
 
Neyse yukarıda yazmış olduğum program ile denedim. RC filtre olmayan duruma göre daha az hata oluyor, ama gene hata oluyor. Kondansatör değerini küçültürsem, hata sayısı artacak. Büyütürsem, enkoder hızlı döndüğünde dönüş kaçıracak. Benim buradan çıkardığım sonuç, enkoder bounce'unu bir RC filtre ile gideremiyoruz.
 
Sonra enkoderin switch'ini bağladım bu RC filtreye. 20 kere butona bastım ve her seferinde temiz bir geçiş gözlemledim ve program da her seferinde 2 ileri saydı. Tabi burada varsayım, kullanıcının basışının 80 ms gibi bir değerden uzun olacağı. Buton bırakıldıktan sonra da bir sonraki basışa kadar en az 80 ms süre geçeceği. Birisi özellikle uğraşır ve daha kısa süreli olarak butona basarsa gene sorun çıkabilir.

a.png
 
Basabildiğim en hızlı şekilde enkoder switch'ine 5 kez bastım, hem osiloskop ekranında hem de program çıktısında tam olarak 10 geçiş gördüm. Bu testi de birkaç kez tekrarladım, her seferinde sorunsuz çalıştı.

a.png
 
Yani neticede bir RC filtre ile yukarıdaki tarzda basit mekanik enkoderin sinyalinin debounce'unu yapmak mümkün görünmüyor. Ya yeterince filtrelememiş oluyorsun ve gene bounce oluşuyor, yada fazla filtreliyorsun ve değişim kaçırıyorsun.

Ama yaptığım sınırlı sayıda deneyde, RC filtre ile bir push butonun kontakt bounce sorununu çözüyoruz gibi duruyor. Ama bana kalsa, yazdığım programda gene de debounce algoritması çalıştırmayı tercih ederim, çünkü böyle bir devreyi tüm olasılıkları hesaba katarak test etmek, kendi başına oldukça kapsamlı bir proje olur. Özel hardware debounce entegreleri var, bunlar kullanılırsa yazılımda debounce'a gerek kalmaz, ama RC filtre metodu, özellikle de çok hızlı basılıp bırakılma durumu olan butonlarda sorun çıkarma ihtimali az da olsa var.
 
Bu arkadaş işi çözmüş gibi görünüyor.
Yalnız biz yapmak istersek Türkiye de bulunabilen bir entegre kullanmalıyız.


Abi kodlama ile debounce yapmayı da gösterecek misin?
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,880
Mesajlar
100,277
Üyeler
2,491
Son üye
djkop

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top