SAYISAL DEVRE TASARIMI_2_ADC

Bu yazıma geçmeden önce tavsiyem bu linkteki 1. yazımı okumanız. Çünkü başlangıç yazısı olduğu için burada anlatmayacağım bazı temel bilgileri içeriyor. Sayısal devre tasarım_1 

Bu yazımda bir analog sıcaklık sensörünün mikroişlemci kullanmadan nasıl kullanılacağını göstereceğim. Aynı zamanda sıcaklık değerinin 8 bit değere karşılık nasıl 7 seg displayde gösterilebileceğini bulacaksınız.

Öncelikle konumuz ADC (Analog Digital Converter) Fakat bununla bağlantılı olarak DAC (Digital Analog Control) devresine de göz atacağız. Farkı görebilirsiniz.

ADC kısmını entegrelerle dijitale çevireceğiz. Fakat bu entegrelerin bazıları seri çıkışlı, bazıları paralel çıkışlıdır. Devre tasarımınıza hangisi uygunsa onu seçebiliriz. Ben tasarımımda, seri çıkışlı 8 bit çıkışa sahip bir entegre kullandım.
Öncelikle ADC nin temeline bakalım. Aşağıdaki devrede +4V yazan yer, eşik gerilimi dediğimiz bir gerilimi oluşturur. Analog input girişinden gelen sinyal genliği bu eşik gerilimlerinden birini aşarsa ona bağlı olan opamp çıkışı 1 seviyesine çıkar. bu şekilde elimizdeki değişken genlikteki analog sinyalleri dijitale çevirebiliriz. Resimde gördüğünüz üzere eşik gerilimleri 0.5V luk parçalara bölünmüş. ADC entegreleri öncelikle girişindeki opamp sayısına göre adlandırılırlar. yani 8 bit ADC 10 bit ADC 12 bit ADC gibi. burada 8 bit var ve bölüntü 0.5V şayet 10 bit veya 12 bit olsaydı bu bölüntü daha küçük gerilimlerde olacak ve ara değerleri de alabilecektiniz. Yani çok hassas işlemlerde 12 bit ve daha yukarısındaki ADC entegrelerini kullanmanız gerek. Fakat ortam sıcaklığını ölçecekseniz çok hassas değilse bunu 8 bit ya da 10 bit ADC ile yapabilirsiniz. Bu ADC çıkışları normalde 8 bit olsa da, daha küçük veya daha büyük bitlerde bulunabilir. Hatta  mikroişlemci kullanmadan, sayısal devre tasarımı elemanlarıyla, ADC devresi yapabilirsiniz.
LM35 nispeten sabit bir gerilim verir. bu da 1C derece= 10mv olduğunu düşünürsek 20C derece yaptığınızda 200mv olacak demektir. Bu da sıcaklık değeri ani değişmezse sabit bir gerilim demektir.

İşleri biraz daha karmaşık hale getirmek istersek, verilen analog sinyalin bir sinüs dalgası ya da bir ses sinyali olduğunu düşünebiliriz. Bu tip bir durumda ise dilimleyici devreler kullanılır. Analog ölçümler belli zamanlarda alınır. Bu zamanlarda ölçülen değerler kayıt edilerek sonrasında aynı dilimleme oranıyla DAC entegresinden geçirilerek, verilen orjinal analog sinyale yakın bir sinyal elde edilir. Bu tip entegreler ise gelen analog giriş frekansından büyük, bir dilimleme frekansına sahiptir.
Mesela CD lerde saniyede 44100 kere dilimleme kullanılıyor ve 16 bit dijital çıkışa sahip oluyordu. Mesela mp3 sıkıştırılmamış sinyaller saniyede 128000 veya daha kaliteli istenirse saniyede 256000 kere örnekleme alınarak dijitale çevrilir. Örnekleme frekansı ne kadar yüksek olursa o kadar orjinal giriş sinyaline benzeyen bir DAC çıkışı elde edilir.
Devremizde ise CS girişi HIGH seviyesine çıkıp LOW seviyesine düşerken örnekleme yapar ve değeri çıkışa gönderir. Bu şekilde buraya vereceğiniz bir osilatör sinyali ile dilimleme yapıp çıkışa dijital seviyeyi gönderebilirsiniz.
Fakat burada bir şeye daha dikkat etmelisiniz. ADC0831 entegresi seri çıkışa sahiptir. Bundan dolayı bu entegre dilimleme işlemi için uygun değildir. Çünkü 1 kere aldığınız veriyi seri olarak gönderirken 8 clock palsinde gönderiyorsunuz. Bu da örnekleme frekansının çok düşük tutulması ve giriş sinyalinin bozuk olmasına sebep olması demektir. Şayet dilimleme yapılacaksa bu şekilde bir Dijital dönüşüm kayıtları tutulacaksa paralel çıkışa sahip bir ADC kullanılması yerinde bir karar olacaktır. 

Bunu ise aşağıdaki resimde görebilirsiniz. Ayrıca bu linkten ayrıntılı bilgilere ulaşabilirsiniz. 


saniyede 44100 kez ölçüm alınan bir giriş sinyali. PCM denilen ses örnekleme sistemi arduino ile ses çıkışı devrelerinde kullanılır.

 

DAC konusuna gelince, temel prensip birbirine benzemekle birlikte, bir ters işlem vardır.
R2R çalışma prensibi, bizler tarafından sıklıkla kullanılan bir temel prensiptir. Aşağıda göreceğiniz gibi 1K ve 2K, R 2R yi temsil ediyor. Gelen dijital sinyale göre Yük direncinin üzerinde düşen gerilim analog çıkış oluyor.
Videoda bunun çalışmasını görebilirsiniz.
7493 entegresi 4 bitlik binary sayıcıdır. Burada 0000 dan 1111 e kadar sayar. ( Burada 7490 entegresini kullanamıyoruz. Çünkü bu entegre DECADE sayıcıdır yani 0000-1001 arasını sayar. O zaman 9 dan sonraya sayamadığımız için analog çıkış da VCC gerilimine yaklaşamaz. ) Bu binary sayıcı çıkışları, dirençler üzerinden geçerken belli bir gerilim düşümü oluşturur. Bu da analog çıkıştan okunabilir. Tabii ki bu 5V luk VCC geriliminde bu şekilde olur. Şayet 15V luk VCC geriliminde bir cmos entegre kullanıyorsanız, bu dirençlerden okuyacağınız değer VCC ye yakın olacaktır. Yani 15V ta yakın olacaktır.
Ayrıca bunun bir kaba versiyon olduğunu görebilirsiniz. Şayet daha fazla bölüntü olmasını ve daha küçük gerilim aralıkları isterseniz, o zaman ADC deki gibi bit sayısını arttırmanız gerekir.
4 bitten daha fazla bit sayısına çıkarmanız gerekir.


Şimdi ise tasarladığım devreyi anlatayım.
Bu serinin ilk yazısında söylediğim gibi, devre tasarımı sondan başa doğru gider. Biz de son kısımda ne yapmak istediğimize karar verelim. Birinci devre, bir klima kontrol devresi gibi düşünün. Klima, Motor şeklinde simüle edilmiştir.

Motor, yazın ve kışın farklı şekilde kontrol edilmelidir. Yazın sıcaklık düşmesi yapması gerekir kışın sıcaklık yükselmesi gerekir. Buna göre düşünürsek, bunu sağlamak için bir karşılaştırıcı devre kullanmamız gerek. 7485 entegresi 4 bitlik bir karşılaştırma olanağı sağlar. Fakat sıcaklık kontrolü yaptığımız LM35 sensörü 8 bit çıkış verir. Bundan dolayı 7485 entegresinden 2 tane kullanmamız gerek.
Bu entegre karşılaştırmayı 4 bitlik yaptığı için 8 bitlik sayının ilk 4 bitini 1. entegreye veririz. Tabii ki karşılaştırılacak değeri de bu entegreye vermemiz gerekir. Bu da SET değerimiz olacak. Bu değerler karşılaştırılır ve ><= çıkışları oluşur.
Biz de bu çıkışları, uygun şekilde bağlayarak motorumuzu çalıştırırız. Örnekte KIŞIN çalışma simüle edildi. Yani Ayarladığımız sıcaklıktan düşük ise motor çalışsın eşit ise motor çalışsın şeklinde AND kapıları kullanıldı.
Bu kapıların çıkışında diyotlar göreceksiniz.

Çıkış kapıları ortak bir girişe bağlanıyorsa LOW çıkışlar HIGH çıkışları sıfırlamasın diye tüm kapı çıkışları, diyotlarla ortak girişe bağlanır.

Ayrıca şunu da belirtmekte fayda var. ANALOG ÇIKIŞLAR KARŞILAŞTIRILIRKEN eşit olacağı varsayılmaz. Çünkü analog sinyal değişkendir. Bundan dolayı sadece = çıkışı değil >< çıkışı da kullanılır. Yoksa eşitlik ara sıra bozulacak ve devre tekrar, tekrar açılıp kapanacaktır. Bundan dolayı küçüktür ve eşittir kullanıldı.

Ayrıca bu tip devrelerde bir tolerans bölümü bulunmalıdır. Fakat devrenin daha karmaşık olmaması için bu tolerans devresini eklemedim. Tolerans devresi ise, sıcaklık SET seviyesini geçtiğinde dursun derseniz ve tolerans vermezseniz, sıcaklık hemen düşer ve çalışmaya başlar. Bundan dolayı tolerans olarak 0.5 derece ya da 1 derecelik tolerans verilir. Yani SET değerinden 1 derece yukarı çıktığında dur ve SET değerine geldiğinde çalış derseniz, hemen devreden çıkıp, ardından hemen devreye girmez. Bu şekilde cihazınız korunmuş olur.

Bu bilgiden sonra devreye devam edelim. LM35, 8 bitlik bilgi veriyor dedim. Fakat bu bilgiyi 8 bitlik seri çıkış olarak verir. Bundan dolayı bir CLK palsıyla 8 defada bunu okumamız lazım. Bunu da bir seri paralel çeviriciye uygularsak, o zaman karşılaştırma devresinin kullanabileceği 8 bitlik veriye ulaşırız. Seri paralel çevirici entegresi (4094) ile gelen data, paralel çıkışa çevrilir. Fakat bunun için 8 CLK palsi gerekir. CLK palsi kendi başına duramayacağı için 4017 entegresiyle 8 adet saat palsi gelmesi temin edilmiştir. 8. pals geldiğinde 4094 işini bitirir ve durur. Aynı zamanda 4017 de ADC nin CS ucundaki osilatör ile senkron olarak çalıştığı için ADC nin okuduğu sırada 4017 MR girişi HIGH seviyesine çıkarak 4017 entegresini resetler ve her defasında 8 CLK palsi sağlanmış olacaktır. Bu devrelerin arasındaki kapı devreleri ise bu CLK palsinin, 4094 e uygulanırken, ADC nin veri yollama frekansıyla senkron olmasını sağlar. U4B ve U4C ile 4094 entegresinin CLK ucu ADC ile senkron olarak verileri doğru alması sağlanır.

Devre buraya kadar istediğimiz gibi çalışır. Fakat 4094 çıkışı değişirken, karşılaştırıcı çıkışı da küçük değişimleri algılar ve çıkışta motorun durup kalkmasını sağlar. Yani titreşimli bir çalışma olabiliyor. Bunu daha stabil yapmak için D Flip Flop entegrelerini kullanabiliriz. KLİMA_LM35_MOTOR_ilk.DSN şeması D flip flop olmadan çalışmasını gösterir.
KLİMA_LM35_MOTOR.DSN ise D FF entegreleri dahil edilmiş şemadır.
Aradaki farkı videoda görebilirsiniz.

D Flip Flop lar olmadan
D Flip Flop lar eklenmiş olan son devredir. YAZIN diye yazılmış. Yanlış olmuş. KIŞIN olacak.

 

Bunun yanı sıra yine giriş devresi aynı kalmakla birlikte, LM35 değerini display üzerinde göstermek isteyebilirsiniz. 8 bit, 255 sayısına kadar sayabilir. Display göstergeler ise 4 bitlik giriş ile çalışır.
Elimizde 8 bitlik çıkış var. 4 er bit olarak bağlasak 2 display kullanırız ve bu da bizi yanlışa götürür. Bundan dolayı 3 display kullanmamız lazım.
Normalde Arduino programlama kullanıyorsak 8 bitlik sayıyı 255 olarak elde edip sonrasında bunu MOD komutu kullanarak birler, onlar ve yüzler basamağı diye ayırırız. Bu şekilde displayde gösteririz.
Fakat sayısal devrelerde bunu bu şekilde yapmamız mümkün değil. Bunun için kolay olduğunu düşündüğüm bir yöntem kullandım. Başka yöntemlerde bulunabilir. Fakat her bulunan yöntemde daha fazla entegre kullanmanız gerekebilir. Ben ise 2 adet EPROM kullandım. 8 bit çıkışlı Epromun içeriğini 255 adresine kadar displayde göstermek istediğim sayıya göre programladım. (Bu konuyu videoda görebilirsiniz.) Ayrıca proteusta kullanacağınız BIN dosyalarını da programların bulunduğu yerde göreceksiniz. Bunların nasıl yapıldığını anlamak için ise bir HEX editör link verdim. Bu link ile BIN dosyanızı kolaylıkla hazırlayabilirsiniz.  Bu linkten sayfaya ulaşabilirsiniz. İlk dosyanızı oluşturmak için verdiğim BIN dosyalarından birini çağırıp üzerinde değişiklik yapıp kayıt edebilirsiniz. Bu şekilde proteus simülasyonunda entegre içine aktarabilirsiniz. (Videoya bakın)

Not: Verdiğim Proteus dosyaları düşük versiyon ile yapıldığından tüm proteus versiyonlarında kullanılabilir.

Tüm programlara buradan ulaşabilirsiniz. 

Bir Soru: Şayet 8 bitlik bir sayıya sahipseniz, benim yaptığım gibi EPROM gibi hafıza entegresi kullanmadan.
Bir de mikroişlemci kullanmadan.
8 bitlik sayıyı, 3 displayde nasıl gösterebilirsiniz. Tüm fikirlere açığım. 

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.