Eğitim Şart

Taşı delen suyun şiddeti değil sürekliliğidir!…

Arduino İle Frekans Ölçümü- ICL8038 İle Dijital Sinyal Jeneratörü

Bu projemizde bir sinyal jeneratörü yapmaya çalışıyoruz. Bunu da Arduino kullanarak dijital hale getirip, bir ekran (1602 LCD) üzerinde üretilen dalganın cinsini, frekansını ve görev döngüsünü (duty cycle) görmek amacımız.

FTDT

Belki dalgalarla ilgili bazı terimleri hatırlamak gerekir. Arduino kullanacağımdan bunu bir kare dalga üzerinde çalışmak istedim. Arduino’nun dijital girişi ya 5 volt (HIGH), ya da 0 volt (LOW) olabiliyor. Tekrar eden (periyodik) dalgalarda HIGH ile LOW zamanlarının toplamı bize periyodu verir. Frekans bunun tam tersidir (F = 1 / T). Zaman birimi saniye olduğunda, frekans birimi de Hertz olur. Bir de görev döngüsü (duty cycle) kavramı var ki bu da sinyalin HIGH olduğu zamanın periyoda oranıdır. Arduino’daki dijital çıkışlardan analog çıkış alabilmemizi sağlayan da bu duty cycle oranlarının değiştirilebilmesidir. Oran dedim çünkü duty cycle HIGH zamanının toplam periyodun yüzde kaçı olduğu şeklinde dillendirilir. Yani HIGH ve LOW süreleri eşitse duty cycle %50 olur.

IMG_20191209_152508

Öncelikle sinyal jeneratörü için ICL8038 entegresini kullanmaya karar verdim çünkü elimde bu vardı. (Eski elektronik emekçisi, arkadaşımın babası Yavuz Tokad rahmetli olduğundan, elindeki malzemelerin içinden çıkmıştı). Bunun için Aliexpress üzerinde satılan ucuz sinyal jeneratörlerinin devresini çıkarttım.

alt_üst

Fritzing üzerinde baskı devreyi oluşturup devre şemasını oluşturduğumda bu devrenin aslında ICL8038 entegresinin data sheet’indeki temel devrenin çok benzeri olduğunu gördüm.

ICL8038

Bu 14 bacaklı entegre zaten hazır sinüs, üçgen ve kare dalga çıkışı veren bacaklara sahip. 1 ve 12 numaralı bacaklardan sinüs dalgasında oluşabilecek bozulmalar bir ayarlı direnç yardımı ile düzeltilebiliyor. 4 ve 5 numaralı bacaklara bağlı dirençler duty cycle ayarı için kullanılıyor. Önce 5 numaralı bacağa bağlı 15MΩ ayarlı dirnci bağlamadım. Bu durumda duty cycle %45 ile %60 arasında değiştirilebiliyordu. 15MΩ trimpotu (bende o büyüklükte olmadığından 1MΩ kullandım) eklediğimde %10 seviyelerine kadar ayarlama yapabildim. 8 numaralı bacaktan 10 kΩ ayarlı direnç ve 100 nF kondansatörden oluşan filtre ile frekans ayarlı yapılabiliyor. Bu elemanlarla 25-30 Hz ile 6 kHz arasında frekans ayarlanabiliyor. Daha geniş bir aralık oluşturabilmek için kondansatörün değiştirilmesi gerekiyor. Çin’de satılan modellerde burada değişik değerli kondansatörler bir komutatör anahtarla seçilip ölçülen değerlerin 20Hz – 20kHz olan data sheet değerlerine ulaşması sağlanıyor. Benim devresini çıkardığım üründe bir anahtar ile 10 nF ve 100 nF seçimleri yapılıyordu. Yani eklenecek daha küçük kondansatörlerle daha yüksek frekans çıkışlarına ulaşılabiliyor.

filter

 

Solda, ICL8038 ile yapılan bir devrenin ilgili bölümü gösterilmiştir.

0-30 volt ya da (-15)-(+15) volt besleme gerilimlerinde çalışabilen bu devrenin dalga çıkış gerilimleri biraz garip. Örneğin sinüs dalgası besleme geriliminin 0.22, üçgen 0.25 katı çıkış verirken kare dalgada bu katsayı 0.9’a kadar yükseliyor. yani 10 volt gerilimle beslediğimizi varsayarsak çıkış değerleri yaklaşık olarak sinüs için 2.2 volt, üçgen için 2.5 volt kare dalga için 9 volt civarında. Bu uyumsuzluk güzel değil! Ayrıca 2 volt civarındaki çıkışlar da çok kullanışlı değil. Bunun için genellikle yapılan bir düzeltme çıkışa eklenen işlemsel yükselteç(opamp) ile çıkış geriliminin düzenlenebilmesi. Bu sayede çıkış genliği ayarlanabiliyor ve offset  eklenebiliyor. Ancak bunun için kullanılacak opamp’ın düşük gürültülü, hassas ve hızlı olması gerekiyor, TL071, LF353 gibi. Bendeki 741, LM324, LM358 opampları maalesef düzgün çalışmıyor ve sinyali bozuyor. Siparişini verdiğim opamp elime ulaştığında bu özelliği de ekleyip kutularsam, masama bir sinyal jeneratörü eklenecek.

Burada Arduino’nun görevi bu devrede üretilen sinyalin frekansını ve görev döngüsünü LCD ekranda görüntülemesi. Yoksa bunu multimetre’nin frekans ölçümü yapan bölümü olarak düşünmedim. Bunun nedenini kodu inceledikten sonra daha iyi anlatabileceğim. Kodun LCD ekranla olan kısımlarından bahsetmeyeceğim. Burada bizi ilgilendiren komut: ‘pulseIn‘. Bu komut gelen atmanın HIGH ya da LOW halinde süresini mikrosaniye olarak ölçüyor.

pulseHigh = pulseIn(pulsePin,HIGH);
pulseLow = pulseIn(pulsePin,LOW);
period = pulseHigh + pulseLow; 
frequency = 1000000/period; 
dutyCycle = pulseHigh * 100.0/ period;

Yukarıdaki kodda devrenin kare dalga çıkışına bağlanan dijital girişe (pulsePin) gelen HIGH süresi ‘pulseHigh‘ değişkenine, LOW süresi de ‘pulseLow‘ değişkenine atanıyor. Daha sonra bu süreler toplanıp periyot bulunuyor. Sonra “mikrosaniye”,  1 000 000 ile çarpılıp “saniye” birimine dönüştürülerek tersi alınıp “Hertz” cinsinden frekans bulunuyor. En alttaki satırda ise görev döngüsü yüzde olarak hesaplanıyor. Belki burada daha önceki projemizde yaptığımız gibi f>1000 olduğunda değeri 1000’e bölüp birimi “kHz” olarak değiştirebiliriz. Peoje aşamasına geçtiğimde opamp eklenip çıkış gerilimi de LCD ekranda görüntülenebilir. Ayrıca Dalga seçimi için kullanılacak olan komütatörden faydalanılarak dalganın cinsi de (şu anki göstermelikti) ekranda görüntülenebilir.

Görüşmek üzere…

ICL8038 Data Sheet:

Devre Kodu:

%d blogcu bunu beğendi: