PIC16F877 ile LM35 Sıcaklık Sensörü Kullanımı
Bu içeriğimizde, PIC16F ile LM35 sıcaklık sensörü kullanımını işliyoruz. Bu içeriği uyguladığınızda temel olarak ADC yani analog, dijital dönüşümünü öğrenmiş olacaksınız. Koda kısmında ADC ile işlenen veriler 10 bit çözünürlüğe sahiptir yani girişe uygulanan veriyi (0,1023) olarak işler. Giriş verilerini LM35’ten alacağımız için gelen veriler voltaj bilgisi olacaktır bu veriyi işleyerek sıcaklık bilgisine çevireceğiz.
PIC16F877 mikrodenetleyicisinde ADC işlemleri için 8 farklı kanal bulunmakta, bu kanallar PORTA ve PORTE‘ye bağlıdırlar. Ayrıca ADC işlemleri için kullanabileceğimiz register’lar yani kaydediciler ADCON0 ve ADCON1‘dir. Bu kaydedicileri kullanmak için dönüşümün kaynak frekansı, başlama bitleri gibi ayaları vardır, projeyi gerçekleştirmeden önce bu kaydedicileri inceleyelim.
Ayrıca LM35 sensörünün veri sayfasına buradan bakabilirsiniz.
ADCON0 Kaydedicisi
Bu kaydedicinin genel mimarisi aşağıdaki gibidir:

ADCON BIT0(ADON)
Analog, dijital çeviriyici yetkilendirme bitidir. ADON=1 ise A-D çevirici açıktır ve işlem yapılabilir. ADON=0 ise A-D çevirici kapalıdır.
ADCON BIT2(GO/DONE)
Eğer ADON değeri 1 ise A-D çevirici statü biti görevini üstlenir. GO/DONE=1 ise A-D çevirici işlem yapıyor demektir. GO/DONE=0 ise A-D çevirici üzerinde herhangi bir işlem yapılmıyordur.
ADCON BIT3-4-5(CHS0-CH1-CHS2)
A-D çevirici için kanal seçim bitlerini oluşturur. Bu bitlere verilecek değerlerle A-D çevirme için hangi kanalın seçileceği belirlenir. Daha önceden de belirttiğimiz gibi PIC 16F877’de A-D çevirici için 8 kanal mevcuttur. Aşağıda sağdan sola CHO-CH1-CH2’nin bit durumlarına göre seçilen kanallar gösterilmiştir.
000 = kanal 0, (RA0/AN0)
001 = kanal 1, (RA1/AN1)
010 = kanal 2, (RA2/AN2)
011 = kanal 3, (RA3/AN3)
100 = kanal 4, (RA5/AN4)
101 = kanal 5, (RE0/AN5)
110 = kanal 6, (RE1/AN6)
111 = kanal 7, (RE2/AN7)
ADCON BIT6-7(ADCS0-ADCS01)
Analog dijital çevirici için saat(clock) frekansı seçim bitleridir. Bu bitlere verilecek değerler ile A-D çevirme işlemi esnasında kullanılacak frekans değeri bize sunulan değerler içerisinden seçilir.
00 = FOSC/2
01 = FOSC/8
10 = FOSC/32
11 = FRC (Dahili RC osilasyon kaynağından gelen saat darbeleri kullanılır.)
ADCON1 Kaydedicisi
Bu kaydedicinin genel mimarisi aşağıdaki gibidir:

ADCON1,0:3(PCFG0:PCFG3)
Analog dijital çevirici portunun biçimini düzenlemeyi sağlayan bitlerdir. Yani A-D çevirme işleminde kullanılacak pinlerin nasıl davranacağını belirlememize olanak sağlarlar. Bu bitlerle PORTA ye bağlı kanalların analog veya dijital olma durumları ayarlanır.
Tabloda PCFG3-PCFG2-PCFG1-PCFG0 bitlerinin aldığı değere göre yaptığı işlemler gösterilmiştir.

ADCON1,7(ADFM)
Analog dijital çevirme işlemi esnasında meydana gelen verinin biçimini belirlemeye yarayan bittir. ADFM=1 ise ADRESH kaydedicisinin MSB kısmındaki altı biti 0 kabul edilir ve A-D çevirme sonucunda elde edilen veri ADRESH’ın 2 bitlik LSB kısmına ve ADRESL’ye yazılır.
ADFM=0 ise ADRESL’nin LSB kısmındaki 6 biti 0 kabul edilir ve A-D çevirme sonucu elde edilen veri ADRESL’nin son iki bitine ve ADRESH’a yazılır.
ADRESH: ADRESL kaydedicileri A-D dönüşümün 10 bit sonucunu kapsar. A-D dönüşümü bittiği zaman, sonuç A-D sonuç kaydedicisinin içine yüklenir.
A-D modülü şeması:

Ayrıca picte referans gerilimimiz 5V oldugundan dolayı ADC kanalından maksimum 5V okuyabiliriz.Pic bu bilgiyi 10 bitlik bilgiye çevireceğinden dolayı 5V 1023 tam sayısına karşılık gelmektedir(0 da dahil).Buna göre 5/1023=0,0048=4,88mV hassasiyetinden ölçüm yapabileceğimiz anlamına gelir.
Genel olarak PİC16F877 mikrodenetleyicisinde ADC için kullanılan kaydedicileri inceledikten sonra PİC C dilinde ADC kullanımı gösteren basit bir uygulama yapalım.Uygulamadan önce daha ayrıntılı bilgi için ekte bulunan PİC16F87X datasheetine bakmanızı öneririm.
LM35 Uygulaması:Analog dijital dönüşüm için temel detaylara baktıktan sonra ADCyi kullanarak sıcaklık ölçelim.Sıcaklık bilgisi için LM35DZ sensörünü kullanacağız.Bu sensörün çıkışı 10mv/C(derece) olarak verilmiş.(Ayrıntılı bilgi için datasheetine bakabilirsiniz.)Bu da demek oluyor ki 10 derece için sensörden 100mV okumalıyız.LM35 sensörü ANO kanalında iken sıcaklık ölçümü için gerekli kod aşağıdaki gibi olacaktır.
Proje Kodu
#include<htc.h> #include "delay.h" #include "lcd.h" __CONFIG(0x3B31); //Fuse(sigorta) ayarları void main(void){ const float a=5000.0/1024.0; //Kalibrasyon float mV,derece; //Değişkenler unsigned int sicaklik; //Değişkenler TRISB=0x00; //PORTB çıkış olarak ayarlanıyor TRISA=0xFF; //PORTA giriş olarak ayarlanıyor ADCON1=0x8E; // 8E=10001110 ADFM=1 PCFG3=1 PCFG2=1 PCFG1=1 PCFG0=0 //AN0 analog olarak seçildi ADCON0=0x41; // 41 hex=01000001 binaryFosc/8 ADON=1 lcd_init(); //LCD Ekranı Başlatma lcd_clear(); //LCD Ekranı temizleme lcd_goto(S1_3); //1 satır 3.sütun lcd_puts("devreyakan.com"); lcd_goto(S2_1); //2.satır 1.sütun lcd_puts("LM35 Uygulamasi"); lcd_clear();//LCD Ekranı temizleme DelayMs(250); //250ms bekle for(;;){ //Sonsuz döngü başlatılıyor ADCON0=0x45;45 hex =01000101 binary //ADC işlemi while((ADCON0&4)!=0); //ADC çevirmesi bekleniyor sicaklik=ADRESH; //Yüksek değerlikle bitlerin alınması sicaklik=256*sicaklik+ADRESL; //Ham bilgi elde ediliyor mV=sicaklik*a; //Ham bilgi mV ye çevriliyor derece=mV/10.0; //mV dereceye çevriliyor. Her 10mv = 1 santigrat derece lcd_puts("Sicaklik="); lcd_goto(S1_10); lcd_write_int(derece); //Derece değişkenin içeriği yazdırılıyor. lcd_goto(S1_1); }}
Devre Şeması/Simülasyon

Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.