LCD görüntü ve RS232 arayüzü olan 1Hz-100Mhz Sıklık(Frekans) sayacı
Özet:
Bu makale AT90S4433 Mikrodenetleyici dizisinin devamıdır.
Size Atmel Mikrodenetleyici Programlama üzerine olan önceki makaleleri
okumanızı öneririm:
Bu kez 1Hz to 100MHz aralığında sıklık ölçebilen bir sıklık sayacı tasarlıyoruz.
Diğer bir seçenek olarak, örneğin sokaktan kaç kişinin (ya da sayısal vurum olabilecek herhangi birşeyin) geçtiği gibi ,
sadece olayları saymak için de kullanabilirsiniz
Sayaçın sayaç sonuçlarını Linux'dan okumak için bir RS232 arayüzü olduğu gibi bir de LCD göstergesi var.
- Linux AVR geliştirme ortamını yükleme ve programlama donanımını kurma:
Mart2002,AVR Mikroişlemcisini GCC ile programlamak
- Kendi basılmış devre kartınızı yapmak:
May 2002,
Linux sunucunuz için LCD denetim paneli
_________________ _________________ _________________
Giriş
Bir sinüs dalgasının ya da kare dalga iminin (sinyal) sıklığı saniye başına salınım sayısı ile anlatılır.
Sürekli bir imin sıklığını belirlemek için bu salınımların sayılması yeterlidir.
Bu yolla sürekli salınan vurumun ilk harmoniğinin sıklığını belirleriz.
Süreksiz "ses"lerden oluşan sıklıkları ölçmek , bir tayf(spektrum) analizcisine gereksinim vardır.
Bu daha değişik bir donanım parçasıdır.
Burada tasarladığımız sürekli salınan imler için olan bir sıklık sayacıdır.
Imi örneklediğimiz aralık boyunca , imin sıklığını değiştirmediğini varsayarız.
Sıklık sayaçımız 2 adımda çalışır:
- Imden herhangi DC ofseti çıkarın ve bunu bir gerilim(voltaj) karşılaştırıcı ile
kare dalgaya dönüştür.
- Süre başına vurum sayısını sayın, ve süre aralığına bölün.
Neye gereksiniminiz var?
Sıklık sayacını kurmak için aşağıdaki parçalara gereksinim duyulur:
1 x Atmel At90S4433 MikrodenetleyiciBunlara ek olarak,bazı kablo, bağlayıcılar (BCD, güç, RS232) ve 9V'luk bir
dönüştürücü(transformatör)veya başka bir AC veya DC güç sağlayıcı(150mA).
Bazen hertür tüketici elektroniği için kullanılan ve duvar yuvasına doğrudan takılabilen
çok ucuz güç sağlayıcıları bulabilirsiniz.
1 x 28pin 7,25 mm IC yuva
2 x 16pin IC yuva
1 x 1pin IC yuva
1 x 14pin IC yuva
MAX903 ve 74F74 için IC yuvasına gerek yoktur.Doğrudan kartın üzerine lehimleyin!
1 x MAX232
1 x 4,194304MHz kristal
1 x LEDs (yeşil)
1 x BC557 PNP transistör
4 x 1uF kapasitör sapmalı(biased)
2 x 27pF seramik kapasitör
4 x 10nF mini seramik kapasitör
3 x 100nF mini seramik kapasitör
1 x 200nF mini seramik kapasitör
1 x 0,47uF mini seramik kapasitör
2 x direnç 470 Ohm
1 x direnç 470K
2 x direnç 100 Ohm
3 x direnç 1k
5 x direnç 10k
3 x direnç 47K
1 x direnç 220 Ohm
3 x direnç 4K7
1 x direnç 3k3
1 x direnç 2k2
1 x direnç 47 Ohm
1 x 4K7 gerilim böler(potansiyometre) (olabildiğince küçük), İsterseniz bu gerilim böleri
bir çift direnç ile değiştirebilirsiniz.Bu gerilim böler LCD netliği (kontrast)
için kullanılmaktadır.
Benim LCD göstergem için 10Ohm ile beraber 1K iyi netlik veriyor.
1 x Z-diyot 4.3V
2 x küçük dokunma düğmesi
1 x 470uF kapasitör (biased)
1 x 4,7uF kapasitör (biased)
1 x 1N4001 diyot
1 x 74HC02 TTL IC
1 x 74F74 hızlı TTL IC
1 x 74HC390 TTL IC
1 x LM393 gerilim karşılaştırıcı
1 x MAX903 yüksek hız gerilim karşılaştırıcı, 8 Pin plastik DIP paket, yerel satıcınızın
stoğunda bulunmaması durumunda www.maxim-ic.com adresinden doğrudan ısmarlayabilirsiniz.
1 x 7805 5V düzenleyici (regülatör)
1 x 2 satır 20 karakterli HD44780 uyumlu
arayüzü olan LCD gösterge . Siyahışık ile yada değil(16 pin veya 14 pin)
Benim gördüğüm 14 veya 16 iğneli bağlayıcısı(konnektör) olan LCD göstergelerin hepsi
HD44780 uyumluydu.
3 veya 4 satırlık gösterge de kullanabilirsiniz ama yazılımı biraz değiştirmeniz gerecek.
Şematik ve kart
Şematik ve kartını Linux için tasarlamak amacıyla eagle
kullandım.
Programın , her çeşit güç sağlayıcısının ICS üzerindeki iğnelerinin 5v olduğunu anlamakta
birkaç sorunu var. Elektriksel kural sağlamasını yaparsanız bazı hatalar elde edeceksiniz.
Fakat tasarım doğru.
Şematik (daha büyük resim için üzerine tıklayın):
Kart (daha büyük resim için üzerine tıklayın):
Kırmızı çizgiler tellerdir.Tek yüzlü basılmış devre kartı üretmek hem daha kolaydır hem
de bunun için daha az doğruluk gerekir.Telleri (Kırmızı) en kısa uzunlukta olacak şekilde
dizebilirsiniz.Bunu Eagle ile yapamadım.
Daha iyi basım için kart düzeni beyaz geri plan ile :
beyaz geri plan üzerine kart düzeni (Not: Bu basılmış devre kartı yapmak için
gereksinim duyduğunuz dosya değildir.)
Makalenin sonunda bilgisayarınıza yükleyebileceğiniz eagle dosyaları,
yazılım(linuxfreqcount-0.4) ile beraber eklenmiştir.
Nasıl çalışır?
AT90S4433 Mikrodenetleyicisinin iki sayacı vardır. Birinin genişliği 16bit ve diğerininki ise 8bit'dir.
8bit genişliği olan sayacı , AT90S4433 saat kristalinin sıklığından bir kusursuz zaman tabanı üretmek için kullanıyoruz
Bu amaç için 4194304Hz'lık bir kristal kullanırız ve 1/256 içsel(dahili) ön-ölçekler aracılığıyla
8bit'lik sayacına vurum veririz (bkz. AT90S4433 bilgi sayfası,makalenin sonunda yükleyin).
8bit'lik sayaç ,taşma olursa kesme üretecek biçimde yapılandırıldı.
Bir diğer deyişle, 4194304Hz / (256 * 256) = 64Hz'lık bir zaman tabanı elde ederiz.
Bir döngü değişkeni kullanarak , bu işlev(fonksiyon) çağrılarından 1Hz aralıklarda
veya 64Hz aralıklarda üretiriz.
Artık çalıştırdığımız sayaç yazılımının durumuna(mode) bağlı olarak 1Hz veya 64Hz aralıklarla
çağrılan bir işlevimiz var.
Şu an tek yapmamız gereken 16bit genişliğindeki sayaçdan bu işlevi okumak ve sonucu görüntülemek.
16bit genişlikli sayaç (Mikrodenetleyici üzerinde PD5 pini) vuruş imlerini ölçüm yapmak istediğimiz imden alır.
Mikrodenetleyici iç saati ile eşzamanlı hale getirmek için veri imlerini örnekler.
Bu yüzden ,örnekleme teoremine göre , en fazla kristal sıklığının yarısına kadar olan
imleri ölçebiliriz.
Kuramsal sınır bu.Artık 1Hz veya 64Hz aralıklarda sayaç yazılımının çalıştığı duruma bağımlı olarak çağırılan
bir işlevimiz var. Uygulamada 1,5Mhz'ye kadar imleri Mikrodenetleyici ile ölçebiliriz.
Daha yüksek sıklıkları ölçebilmek için ön-ölçekler/bölere gereksinim vardır.
74F74 and the 74HC390 IC'ler bunu sağlıyor.
74F74 bir hızlı zamanuyumsuz(asenkron) 1/4 bölücüdür ve 74HC390 ise bir 1/25 bölücüdür.
Doğrudan 74HC390'ı bir 1/100 bölücü gibi kullanamayız çünkü en fazla 25MHz kaldırır.
Devre iki tane girişi sağlamakta.
Biri 1/100 bölücü üzerinden diğeri de doğrudan giriş.
Ölçmek istediğiniz imin sıklığına bağlı olarak bu giriş hatlarından birini (veya ikisini) kullanın.
Eğer sadece 1.5Mhz'a kadar olan sıklıklarla ilgileniyorsanız(örneğin bir işitsel yükselteçin(amplifikatör)
sıklık tepkisinin ölçümünü yapmak) sayaçın daha basitleştirilmiş bir sürümünü kurabilirsiniz ve MAX903, 74F74 and the 74hc390'ı
dışarda bırakın.
2 gerilim karşılaştırıcılarının (MAX903, yüksek hız, and LM393)
imleri yükseltmek ve örneğin sinüs dalgala imlerinden kare dalga imleri yaratmak.
Kart tasarımında ve yerleşim düzeninde eşiğin yakınında karşılaştırıcıların salınımlarını engellemek
için özel özen gösterilmiştir.
MAX903 gerçekten çok yüksek hız kıyaslayıcısı olduğunu dikkat etmelisiniz.
Gürültülü giriş imi kulanırsanız, örneğin 1MHz gürültü ile niteliği değiştirilmiş 100KHz'lık imi düşünün,
100KHz im sıfır gerilimi düzeyini geçtiğinde ek olarak 1MHz vuruşları sayarsınız.
MAX903 üzerindeki 220K direnç artı geribesleme sağlayarak gürültünün
etkisini bir ölçüye kadar keser.Bununla beraber,gürültülü imlerle sayaçı beslememelisiniz.
Mikrodenetleyici RS232 ve 2 düğme aracılığıyla denetlenebilir(temizle tuşu ve
sayma durumunu değiştir tuşu)
2 giriş kanalı bir OR geçiti (74hc02) ile birleştirilirler.
Eğer 74hc390'ın çıkış hattında hala mantıksal "1" bulunurken , 1/100 girişini sökerseniz
OR geçiti giriş imlerini doğal olarak bastıracaktır.
Bu yüzden,sayaç durmunu değiştirdiğinizde veya temizle tuşuna bastığınızda
74hc390 temizlenir (pin 2).
Yazılım
Mikrodenetleyici için olan yazılım engelleme durumunda 2 tane sayaç kurar.
Bunun nasıl yapıldığı AT90S4433 veri sayfasında çok iyi açıklanmıştır(kaynaklara bakınız).
Birkaç tane yazmaç(kayıt) tutmanız gerek.Önemli fakat oldukça yavandır.O yüzden
burda yinelemeyeceğim.Çoğu sıklık sayaçının mantığı
linuxfreqcount.c
dosyasında uygulanmıştır.Diğer dosyalar ise LCD , UART, vs....için olan "kitaplık" dosyalarıdır.
Mikrodenetleyici için yazılım yazarken 128Bytes Ram'den fazlasını kullanmamaya
dikkat edin.Bütün elimizde olan bu.Bu yüzden birçok değiştirme (parametre) içeren
içiçe işlev çağrılarından kaçınmak daha iyidir.
Bayrak ve küresel(global) değişkenler tercih edilir.
Sayaç yazmaçları doğru biçimlendirildikten sonra 64Hz aralıkla
SIGNAL(SIG_OVERFLOW0) işlevi çağrılır.Şimdi 16bit sayaçı okuyoruz ve sayaç sonuçlarını
işlemek için bir bayrak (hflag) tanımlıyoruz,handlecounterresult() işlevi.
1Hz geçit sıklığı ile sayaç sonucunu doğrudan kullanabiliriz ama 1/64 saniye
geçit açılış zamanı ile sonucu 64 ile çarpmamız gerekir.Mikrodenetleyici ile
yapabileceğiniz matematik oldukça sınırlıdır(Pentium CPU'da olduğu gibi hoş 32bit tamsayılarımız
yok).Iyi ki 64 ile çarpmak 6 kat sola kaydırmaya eş.Son sayaç sonucunu
3x 8bit değişkenlerde (counterval[3])saklarız.
Şimdi 24bit sunuş olarak doğru sayaç değerimiz var.Görüntülemek için ASCII ondalığa
dönüştürülmesi gerekir.Printf bunu normalde yapar ama printf 'imiz yok ve bütün belleğimizi taşar.
İkili sayı düzeninden ondalığa dönüşüm yapmak için 24bit sayıları anımsatıcı ile birlikte
10'a böleriz.Anımsatıcılar ondalık sayılardır.CPU'muz 24bit matematik yapamadığı için
8bit'lik parçalar halinde sayıları işleriz(işlev divby10()).
Sıfırın ASCII değerini her basamağa ekleyerek sonunda sayımızın ASCII gösterimini sağlar(longtoascii() işlevi).
Bu ASCII dizgisi RS232 hattı üzerinden LCD göstergesine gönderilebilir.
Basılmış devre kartını yapmak
Basılmış devre kartı için yazılım paketi bir postscript dosyası (linuxfcount.ps) içermektedir.
Kişisel olarak pad'lerin herzaman oldukça küçük olduğunu düşünürüm.Bu yüzden kartı dağlamadan önce
onları boya kalemi ile biraz genişletmenizi öneririm.
Evinizde kart yapma işlemi
Mayıs 2002, Linux sunucunuz için
bir LCD denetleme paneli'nde açıklanmıştır.
Bazı okurlar bana Kontakt Pausklar-21 püskürteç bulmanın zor olduğunu söylediler.
Bunun yerine, gaz lambalarında olduğu gibi, petrol de kullanabilirsiniz.
Kartı geliştiricinin içine koymadan önce petrolü bir parça sabunla çıkartmanız gerekir.
Sıklık Sayaçımız için bir kutu nasıl yapılır?
Hobi elektroniği için genel bir sorun ürettiğimiz narin devreleri
koyacak bir kutu veya kasa bulmaktır.
Hazır yapılmış alüminyum kutular genelde pahalıdır.
Metal tabakaları doğru olarak bükmek
de zordur.Ben ucuz ve uzmanca görünen bir çözüm buldum.
Ben kenar ve köşeler için çam tahtası kullanıyorum,biraz pahalı görünmesini isterseniz
üzerini boyayabilirsiniz.
Su bazlı boya kullanın, yapıiçi (indoor) için olan boya.
Ön ,üst ve alt yüzler için metla tabaka kullandım ve bükmeye de gerek yok.
Sadece doğru ölçüde kesin yeter.
Sağdaki resimde ahşap çerçevenin nasıl durduğunu görebilirsiniz.
Solda ise son halini görüyorsunuz.(Üst kabı eksik)
Kartı birleştirmek
Parçaları karta lehimlerken yüksek sıklık alanlarına(direnç ve kapasitörlerle MAX903 and 74F74)
dikkat etmelisiniz.Genel olarak IC'ler için bir yuva kullanmanızı öneririm çünkü
hata ayıklamayı daha kolaylaştırıyor ama bu iki IC için yuvaları istenmeyen parazit etkilerini ayıklamak için
kullanmamalısınız.
Toprakla güç kaynağını ayıran (decouple eden) kapasitörler için küçük seramik kapasitörler kullanmalısınız.
Bu kapasitörlerin değeri 10nF ile 100nF arasında herhangi bir sayı olabilir.
LinuxFocus için şimdiye dek tasarladığımız en karmaşık devre buydu.
Adım adım kurmanızı öneririm ve aralarda farklı parçaların çalışıp çalışmadığını kontrol edin:
- İlk önce kartın üstüne güç sağlayıçı (7805 vs...)için gereken parçaları lehimleyin ve
doğru çalıştığını kontrol edin.
- Bütün parçaları karta lehimleyin ama tek Mikrodenetleyiciyi yuvaya takın.
- linuxfreqcount-0.4 paketi ,Mikrodenetleyiciyi ,LED ve LCD 'yi denetlemeye yarayan bir deneme programı,
avr_led_lcd_test.c, içerir.Onu yükleyin.Programcı kablosunu ilk AVR makalesinde (March 2002, GCC ile AVR Microdenetleyicisini proglamlama)belirtildiği gibi
bağlayın ve linuxfreqcount-0.4 paketinden avr_led_lcd_test yazılımını yüklemek için
"make testload" yazın.LED yanıp sönmeli ve LCD "Hello" yazısını göstermeli.
- Bütün IC'leri yuvalarına takın.Son yazılımı yükleyin(make load).Önce düşük sıklık parçayı sonra
da yüksek sıklık parçasını tekrar sınayın. Sıklık kaynağı olarak bir çeşit osilatöre gereksiniminiz olacaktır
(Kare dalga imi çıktısı yeğlenir).
Sayacı kullanmak
Sayaç farklı durumlarda işleyebilir:
- sürekli üst sayım
- 1Hz sıklık geçiti ile sıklık sayımı. Bu durumda 16bit sayacın maximum sıklığına kadar ölçebilirsiniz, 1/100 bölücü ile 65535Hz veya 6553500Hz .
- 64Hz sıklık geçiti ile sıklık sayımı. Bu durumda 16bit sayacın maximum sıklığına kadar ölçebilirsiniz, 1/100 bölücü ile 1,5 MHz or 100MHz 'e kadar sayabilirsiniz.
Durumu , durum tuşuyla veya RS232 arayüzü üzerinden ASCII komutlarıyla değiştirebilirsiniz.
RS232 ASCII komut arayüzü Mayıs 2002, Linux sunucunuz için
bir LCD denetleme arayüz paneli makalesinde anlatıldığı gibi çalışmaktadır.
Kullanabilen komutlar README.commands
dosyasında açıklanmıştır.


RS232 ASCII komut arayüzü.


Yeşil LED geçitin ne zaman açık olduğunu gösterir.Yani: vurumlar sayaca ulaşır ve orda sayılırlar.
İkinci tuş temizle tuşudur. Sayacın temizlenmesi için (genellikle üst sayım durumu için) ya da olağan görünüm ile
100 kat arasında geçiş yapmak için kullanılır.
100 kat , sonucun 100 ile çarpılmışını gösterir.Böylelikle aklınızda karışık matematik işlemleri yapmanıza
gerek kalmaz :-)1/100 bölücüsünü kullandığınızda yararlıdır.
Ne kadar kesin?
Her sayısal sayacın +/-1 doğruluk sınırı vardır.Çok kararlı bir giriş iminiz
de olsa son basamakda herzaman biraz sapma olacaktır.Geçit sıklığı 64Hz ise o zaman sonuç içsel olarak
64 ile çarpılır ,ki bu da +/-64 doğruluk demektir.Aynı yolla, 1/100 bölücüsü de sayacın doğruluğunu etkiler.
Bu sayaç ise oldukça iyi.En ana sorun, 4194304Hz kristalinin sıcaklık sapması.Daha sıcak olduklarında
kristaller daha yavaş salınım gösterirler.İşin fiziği budur ve bunu sadece sıcaklığı kesin olarak
denetleyerek engelleyebilirsiniz.
Eğer iyi bir referans imi bulabilrseniz , sayacı
ayar(kalibre) edebilirsiniz. handlecounterresult() işlevine küçük gecikmeler eklerseniz ,yazılım içinde sayacı ayar edebilirsiniz. Ben sayacımı bir referans imi ile karşılaştırdım ve sayacımın nerdeyse kesin olduğunu gördüm.
Bu yüzden ayar gecikmeleri kaynak kodunda açıklanır.
27pF kapasitörlerinden birini biraz değiştirerek de kristalin sıklığını etkileyebilrsiniz
(10pF,50pF vs.. ile deneyin).
Normal ev kullanımı için hiçbirşeyi ayar etmeye gerek yoktur. Standart 4194304Hz kristalleri
çok kesinler.
Sayaç çalışırken
Sayacın işlem sırasındaki son hali aşağıdadır:
Daha ileri çalışma için
Bu makalede Linux altında sonuçları özdevimli(otomatik) olarak değerlendiren
uygulama yazılımı sağlanmamıştır.Bu sıklık sayacını örneğin sıklık sayacını uzak alanlarda rüzgar
hızını ölçmek için veya herhangi başka sayısal sıklığa dönüştürülebilecek başka olaylarda kullanabileceğinizi
düşünebilirsiniz.Uzun süreli ölçüm yapmak için Linux altında yazılım yazmak çok zor değil.
Örneğin, Mayıs 2002, Linux sunucunuz için
bir LCD denetleme paneli makalesindeki Perl programlarını değiştirebilirsiniz.
Eğer sonuçları bir dosyaya yazdırmakla ilgilenirseniz, aşağıdaki komnutları
kullanabilirsiniz:
ttydevinit /dev/ttyS0
cat /dev/ttyS0 > your_logfile.txt
Bu sayacın COM1 (=ttyS0)'a bağlı olduğunu varsayar.
Kolay , değil mi :-)?
Kaynakça
Bu yazı için görüş bildiriminde bulunabilirsiniz
Her yazı kendi görüş bildirim sayfasına sahiptir. Bu sayfaya yorumlarınızı yazabilir ve diğer okuyucuların yorumlarına bakabilirsiniz.
2002-09-24, generated by lfparser version 2.31