[LinuxFocus-icon]
Ev  |  Erişimdüzeni  |  İçindekiler  |  Arama

Duyumlar | Belgelikler | Bağlantılar | LF Nedir
Bu makalenin farklı dillerde bulunduğu adresler: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Photo of the Author]
tarafından Guido Socher (homepage)

Yazar hakkında:

Guido bu sistemlerin geniş imkanlarını keşfetmesini olduğu kadar tasarımında yer alan kişileri de keşfetmesi eğlenceli olduğu için Linux'u seviyor.



Türkçe'ye çeviri:
Seçkin Gökaltun <seckin(at)be.itu.edu.tr>

İçerik:

 

LCD görüntü ve RS232 arayüzü olan 1Hz-100Mhz Sıklık(Frekans) sayacı

[Illustration]

Özet:

Bu makale AT90S4433 Mikrodenetleyici dizisinin devamıdır. Size Atmel Mikrodenetleyici Programlama üzerine olan önceki makaleleri okumanızı öneririm:

  1. Linux AVR geliştirme ortamını yükleme ve programlama donanımını kurma:
    Mart2002,AVR Mikroişlemcisini GCC ile programlamak
  2. Kendi basılmış devre kartınızı yapmak:
    May 2002, Linux sunucunuz için LCD denetim paneli
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.
_________________ _________________ _________________

 

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:
  1. Imden herhangi DC ofseti çıkarın ve bunu bir gerilim(voltaj) karşılaştırıcı ile kare dalgaya dönüştür.
  2. 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 Mikrodenetleyici
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.

Bunlara 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.  

Ş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):
[Schematic]

Kart (daha büyük resim için üzerine tıklayın):
[board]


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?

[final case, open] [wooden frame] 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

[circuit] 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:
  1. İ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.
  2. Bütün parçaları karta lehimleyin ama tek Mikrodenetleyiciyi yuvaya takın.
  3. 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.
  4. 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:
  1. sürekli üst sayım
  2. 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 .
  3. 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.
[ASCII commands via rs232]
RS232 ASCII komut arayüzü.
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.

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:
[the frequency counter]

 

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.
 talkback page 

Görselyöre sayfalarının bakımı, LinuxFocus Editörleri tarafından yapılmaktadır
© Guido Socher, FDL
LinuxFocus.org
Çeviri bilgisi:
en --> -- : Guido Socher (homepage)
en --> tr: Seçkin Gökaltun <seckin(at)be.itu.edu.tr>

2002-09-24, generated by lfparser version 2.31