Makinalara canlılara özgü bir özellik katan şey, onların haberleşmesi ve bir dillerinin olmasıdır. Makinalar, elektrik sinyallerinin dijital sistemler için uyarlanması sonucu haberleşirler. Çevresel faktörlerden elde edilen düzensiz elektriksel sinyaller(analog bilgi) belli bir düzende ya da belli bir kurala göre aktarılmalıdır ki makinalar anlaşabilsinler . Tıpkı insan dilindeki gramer kuralları gibidir. İnsan düzensiz bir ses çıkardığında diğer insanlar için hiç bir anlam ifade etmez. Çünkü çıkardığı sesin bir kuralı ve belli bir literatürü yoktur. Makinalarda böyledir işte.
Peki çevresel faktörleri nasıl dijitale çevirebiliriz? Bunu yapmak için çok farklı yollar izlenilebilir. Fakat , bunlar için bu faktörleri ilk önce elektrik sinyaline çevirmemiz gerekir. Elde ettiğimiz bu sinyallere analog bilgi denir. Bu bilgi, belli işlemlerden geçirilerek dijitale çevrilir. Bildiğiniz gibi dijital sistemler sadece 5V ve 0V değerlerinden anlarlar. Onlar için 5V logic-1, 0V logic-0 bilgisidir.
Elde ettiğiniz çevresel faktörlerin analog bilgisi çok fazla parametreye ya da çok çeşitli boyutlarda bilgiye sahip olabilir. Böyle bir sinyali dijitale çevirmek için kullanılacak en iyi yollardan birisi, bu bilgiyi bir timer-trigger entegre yardımı ile belli bir kareye frekans içeren kare dalgaya dönüştürmek olacaktır.
Bu kare dalganın pik noktası logic-1 yani 5 volttur. Böylelikle farklı voltaj değerlerinde yani farklı bir elektriksel sinyalde farklı bir frekans çıkışına sahip olacağız. Her bir frekans, farklı bir bilgiyi temsil edecektir. İşte böylelikle analog bilgimizi dijitale çevirmiş olduk. Şimdi geriye kalan tek şey bu bilgiyi işleyebilmektir.
Piyasada analog bilgiyi dijitale çevirmek için kullanılan LM231, 331 ya da bir çok voltage-frequency entegresi vardır. Mesela LM231 in datasheetinden şöyle bir devre ile ışık bilgisini dijitale çevirmemiz mümkün;
Ya da sıcaklık yoğunluğunu dijitale
çevirmek için örnek bir devre yine entegrenin datasheetinden;
Şimdi elde ettiğimiz bu dijital bilgiyi ilemeye geldi sırada. Mesela sıcaklığa göre alınan bir dijital çıkışda kare dalganın her bir frekans değeri farklı bir sıcaklık değerini temsil eder. Ama biz bu frekans değerlerini kullandığımız sisteme nasıl anlatabiliriz?
Bunun da çeşitli yolları var tabi ki. 🙂 Ben sadece bir yolunu gösterip uygulamasını dilim döndüğünce anlatmaya çalışacağım. Genelde böyle bir dijital çıkışın yorumlanması için eğer pic ya da bir denetleyici kullanıyorsanız dış kesmeler kullanılır. Mesela 16f877 de B portunu dış kesme için kullanabilirsiniz. Dış kesme de belirtilen pine bir sinyal geldiğinde programda belirtilen bir fonksiyon icra edilir.
Mesela şöyle bir devre kurduk;
Program şu şekilde; Şimdi bu devrede gördüğünüz gibi bir frekasn üretici b0 pinine bağlanmış. bu frekans kaynağı bizim dijital inputumuz olsun. B3 pinine bağlı led dalganın her 5 volt olduğunda durum değiştiriyor. B2 pinine bağlı led ise yarım saniye de bir durum değiştiriyor. b1 pinine bağlı led ise frekans kaynağının ürettiği sinyal 50 hz olduğunda yanıyor. Eğer frekans kaynağı 50 hz den başka bir frekans üretiyorsa bu led yanmıyor.
#include // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
int i=0; // Tamsayı tipinde değişken tanımlanıyor
int j=0; // Tamsayı tipinde değişken tanımlanıyor
int f; // Tamsayı tipinde değişken tanımlanıyor
//****** Dış Kesme Fonksiyonu *****************
#int_ext // Dış (External) RB0/INT kesmesi, b1 pinine gelen her bi sinyalde bu fonksiyona girer
void ext_kesmesi () // Dış kesme fonksiyonu
{
output_toggle(pin_b3);
i++;
}
#int_timer1 // Timer1 kesmesi 0.5 sn de bir
void timer1_kesme () // Kesme fonksiyonu ismi
{
set_timer1(3036); // TMR1 değeri belirleniyor
output_toggle(pin_b2);
j++;
if(j==2) // 1 sn olduğunda fonksiyona gir
{
j=0;
f=i; // frekasn değeri hesaplanır
if(f==50)
{
output_high(pin_b1);
}
else
{
output_low(pin_b1);
}
i=0;
}
}
/********* ANA PROGRAM FONKSİYONU********/
void main ( )
{
setup_psp(PSP_DISABLED); // PSP birimi devre dışı
setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF); // ADC birimi devre dışı
setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
set_tris_b(0x01); // RB0 pini giriş,diğer uçlar çıkış olarak yönlendiriliyor
output_b(0x00); // B portu çıkışı ilk anda sıfırlanıyor
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // Timer1 ayarları yapılıyor
set_timer1(3036); // TMR1 değeri belirleniyor
enable_interrupts(INT_timer1); // int_timer0 kesmesini aktif yapar
ext_int_edge(H_TO_L); // INT_EXT kesmesinin düşen kenarda aktif olacağını belirtir
enable_interrupts(INT_EXT); // INT_EXT kesmesini aktif yapar
enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver
while(1); // Sonsuz döngü
}
İşte böylece dijital bilgiyi almış olduk. Genellikle analog bilgiler bu şekilde dijital sistemlere uyumlu hale getirilir. Tabi bunun dışında çok çeşitli yollarda vardır 🙂 Şimdilik o yollardan bir tanesini öğrenmiş olduk.
Dökümanları uradan indirebilirsiniz; external interrupt