MCU ile Buton Okuma

Bilindiği gibi gömülü sistemlerde butonlar sıkça kullanılan elektromekanik elemanlardır.

 

 

 

 

 

 

 

 

Standart bir push buton

İdeal bir butonun davranışı bastığımız anda kısa devre olan ve bıraktığımız gibi de açık devre çalışabilen bir yapıda olmalıdır.

Her elektronik/elektromekanik üründe olduğu gibi hayat ideal değildir. Bir butonun davranışı genel olarka basma ve bırakma anlarında gürültülü çalışmaktadır. Bu gürültüye İngilizce olarak bouncing ismi verilir. Bouncing zıplama olarak çevrilebilir. Gelin bu ismin neden verildiğine bir osiloskop görüntüsü üzerinden inceleyelim.

İlgili resimde de görüldüğü gibi butona bastığımız anda oluşan zıplama efektleri kuracağımız algoritmalarda temel düşman olarak hedefe koyacağımız yegane elementlerdir. Bu sorunun çözümü adına neredeyse sayılamaz miktarda çözüm mevcuttur diyebiliriz.

Gelin sıkça kullanılanlardan ve avantaj/dezavantajlarından bahsedelim.

  • Kesme (Interrupt) ile buton olayı (event) yakalama: Bu yöntemde kenar geçişlerine bir interrupt kurularak butonun o an ki durumu yakalanmaya çalışılır. Yöntemin yegane dezavantajı yukarıda ki resimde görebileceğiniz gibi zıplama efektlerini bir buton basma/bırakma olayı olarak yakalama durumudur. Bu sorunun üstesinden gelmek için ana akışta ki kodda filtreleme yapılmalı veya başka algoritmalara yönelinmelidir. Ekseri olarak bu algoritma sınıfta kalma potansiyeli yüksek bir yaklaşımdır.

  • Donanımsal müdahele yardımıyla interrupt ile event yakalama: Bu yaklaşımda butona paralel bir kapasite atılarak ortaya çıkan zıplama efektlerinin zayıflatılması hedef alınır. 1. Algoritma ile aynı yazılım implemente edilir. Fark şudur ki zıplama efektleri için seçilen kapasite ne çok büyük ne de çok küçük olmalıdır. Çok büyük seçildiğinde butona basma noktanız ile eventin tetiklenmesi arasında gözle görülür bir zaman farkı oluşması kaçınılmazdır. Çok küçük seçildiğinde ise zıplamaları sadece azaltıp tamamen kökünü kurutmayacaktır. Debounce çipi eklenmesi ise bir diğer yöntemdir ve kesin çözümdür. Lakin fiyat/fayda yaklaşımına pekte uymamaktadır.
  • Zamanlayıcı ve filtreleme yardımıyla buton okuma: Bu yöntemde butonun bağlı olduğu uç belirli periyotlarla okunup sayısal filtreden geçirilerek butonun o an ki durumu değerlendirilir. Bu yöntem alt alanlara bölünebilir literatür olarak buton bounce süresi maksimum 4-5 milisaniye arasındadır.
  • Doğrudan zamanlayıcı üzerinden buton okuma: Bu yöntem aslında 3. Numaralı yöntemle aynı pratikleri taşımaktadır. Tek farkı herhangi bir filtreye ihtiyacı bulunmamasıdır. Bu yöntemde debounce süresinden daha kesin olarak daha büyük bir periyot seçilir. Örneğin 20 ms gibi bir süre bize keskinlik sağlayacaktır. Her 20 ms bir yapacağımız okumalar butonun gerçek durumunu en fazla 20 ms gecikme (bounce anında alınacak bir örnek bu gecikmenin sebebidir) ile bildirecektir. 20 ms göz ile algılanabilecek bir değer olmadığından makul metodlardan birisi olarak karşımıza çıkmaktadır.

Yazımın başında bahsettiğim gibi sıraladığım çözümler konuya ait tek çözüm olmamakla birlikte en çok tanık olduğum yaklaşımlardır. Hem maliyet hem de kullandığımız minik sistemlerde kontrolcü kaynaklarımızı minimum harcamak için genelde sonuncu metodu başarılı bulmaktayım.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir