Yarı iletken bir yapıya sahip olan LM35 ısı sensörüdür. Hassas ve küçük değerli sıcaklık ölçümleri için ideal bir sensördür.
-55 derece ile 150 derece arasında çalışabilen LM35 ısı sensörü çıkış geriliminin sıcaklık farkına göre değişmesi prensibi ile çalışır. Bir derece değişim çıkış voltajını 10 mV değiştirir. 4 ile 20 V arasında giriş voltajı uygulanabilen sensör, 0.5 derece hassasiyete sahiptir.
Örneğin: Sensör çıkışı 328mV ise elde edilen sıcaklık 32.8’C dir.
PIC’in analog pinlerinden sensör çıkışı okunur. Bit seviyesine göre okunan değerle çarpılır ve 1000 ile çarpılır. Son olarak 10 ile bölünerek sıcaklık değeri elde edilmiş olur.
Devremiz Aşağıdaki gibi tasarlanmıştır. Pin_a0 analog pininden sensör gerilimi okunup dönüştürme formülü ile 2×16 LCD de sıcaklık olarak gösterilecektir.
Yazılım;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <16f877.h> #device adc=10 #fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD #use delay(clock=4000000) #use fast_io(a) #define LCD_ENABLE_PIN PIN_B2 #define LCD_RW_PIN PIN_B1 #define LCD_RS_PIN PIN_B0 #define LCD_DATA4 PIN_B3 #define LCD_DATA5 PIN_B4 #define LCD_DATA6 PIN_B5 #define LCD_DATA7 PIN_B6 #include <lcd.c> unsigned long int bilgi; float voltaj,sicaklik; void main() { set_tris_a(0x01); setup_adc(adc_clock_div_32); setup_adc_ports(AN0); lcd_init(); set_adc_channel(0); delay_us(20); printf(lcd_putc,"\fSicaklik"); while(1) { bilgi=read_adc(); voltaj=(0.0048828125*bilgi)*1000; sicaklik=(voltaj/10); lcd_gotoxy(10,1); printf(lcd_putc,"%f'c",sicaklik); } } |
Komutlara sırayla bakacak olursak;
1 |
#device adc=10 |
Komutu ile adc çeviri işleminin 10bit olarak yapılacağı belirtilmiştir. Yani dönüşümde hesaplanan adım büyüklüğü; 5/2^10 = 0,0048828125 V olur.
1 |
set_tris_a(0x01); |
Komutu ile pin_a0 pini giriş, diğer port_a pinleri çıkış olarak ayarlanmıştır.
1 |
setup_adc(adc_clock_div_32); |
Komutu ile ADC çalışma frekansı fosilatör/32 olarak ayarlanmıştır.
1 |
set_adc_channel(0); |
Komutu ile pin_a0 pini analog okuma olarak kullanılacağı belirtilmiştir.
1 |
printf(lcd_putc,"\fSicaklik"); |
Komutu ile dönüşüm işlemi LCD de hızlı olarak gösterilmek istendiği için bir kez ilk satıra “Sicaklik” kelimesi yazılır.
1 |
bilgi=read_adc(); |
Komutu analog okuma için ayarlanan pin_a0 pinini okur ve işaretsiz 16 bit bilgi değişkenine atar.
*Niye değişken 8 bit değilde 16 bit?
Çünkü 8 bit seçilseydi işaretsiz int8 aralığı = 0 – 255, işaretli int8 aralığı = -128 – 127 dolaysıyla 10 bit ADC çevrim sonucu çıkan dijital sonuç (min 0, max 1024) değişken limitini aşmaktadır, overflow hatası verir. Bu yüzden max limiti 1024den büyük olan veri tipi seçmemiz gerekir. int16 ve yukarısı seçilmelidir.
1 |
voltaj=(0.0048828125*bilgi)*1000; |
1 |
sicaklik=(voltaj/10); |
1 2 |
lcd_gotoxy(10,1); printf(lcd_putc,"%f'c",sicaklik); |
lcd_gotoxy(10,1) komutu sicaklik kelimesinden sonraki karakter konumuna gider. (Sicaklik = 8 karakter + 1 boşluk = 1 karakter)
1 |
printf(lcd_putc,"%0.1f'c",sicaklik); |
Komutu ile sicaklik değişkeni ekrana yazılmaktadır. “%0.1f” komutu değişkenin float olduğunu (f), baştan boşluk bırakılmayacağını (0) ve virgülden sonra 1 karakter alınacağını (.1) belirtmiştir.
1-) #include şeklinde kütüphane ekleyemiyorum.
2-)#device adc=10 yazdığımda expecting a( gibi bi hata alıyorum, kabul etmiyor. Yardımcı olursanız çok sevinirim.
Derleyiciniz de problem olabilir.