PIC16F877 ile LM35 Negatif Sıcaklık Ölçümü
Daha önce PIC16F877 mikrodenetleyicisi ile LM35 sıcaklık sensörünün kullanımını anlatmıştık. Bu yazımızda ise LM35 negatif sıcaklık ölçümü yapıyoruz. Bu içeriğe geçmeden önce mutlaka önceki yazımıza göz atmanızı öneririz.
LM35 sıcaklık sensörü, veri sayfası bilgilerine göre -50 ile +150 derece arasında sıcaklık ölçebiliyor. Sensör, temel bağlantı durumunda (pozitif sıcaklık ölçme) +2 ile +150 derece arasında her 1 derece artışa karşılıkta 10mV gerilim üretiyor. Yani sensör 1 derecelik sıcaklık artışı için için 10mV gerilim üretiyor.
Sensörü 4-30V gerilim ile besleyebilmek mümkün. Sensör hiç ek eleman gerektirmeden, besleme gerilimi verildiginde çıkışından direk pozitif sıcaklık değeri ile orantılı gerilim bilgisi alınabiliyor. Fakat bu bağlantı ile negatif sıcaklıkları ölçmek mümkün değil.
Negatif sıcaklık ölçümü için datasheet’te farklı alternatifler mevcut. Yazıda en kolay yol olan iki diyot ve bir direnç ile yapılan uygulamayı işleyeceğiz.

Bağlantı şekli görüldügü gibi oldukça sade. Şimdi bu şemadan nasıl sıcaklık okuyacagımıza gelelim. Şemada “+” ve “-” ile gösterilen uçlar birer analog girişe bağlanır, analog girişler okunur. “+” uçtan okunan değere ilk_deger, “-” uçtan okunan değerede son_deger diyelim. ilk_deger-son_deger işleminin sonucunun pozitif veya negatif olma durumu sıcaklığın negatif veya pozitif olmasına karşılık gelecektir.
İşlem sonucunun sayısal değeride bize sıcaklık değerini verecek. Tabi bu veri ham gerilim bilgisi oldugundan bunu önce gerilime, sonrada sıcaklıga çevirmemiz gerekiyor.
Proje Kodu
#include <xc.h> #include <stdio.h> #include <stdlib.h> #include "usart.h" #define _XTAL_FREQ 4000000 void main() { TRISA = 0xFF; PORTA = 0x00; usart_init(); ADCON1 = 0x80; ADCON0 = 0x41; // ADC Clock, ADC aktifleştirme const float adc = 500.0 / 1023; int ilk_deger, son_deger; float sicaklik; printf("LM35 Negatif Olcum\n\r"); for (;;) { ADCON0bits.CHS=0x00; //AN0 seçimi __delay_us(25); ADCON0bits.GO_DONE = 1; // Çeviri başlatma while (ADCON0bits.GO_DONE); // Çeviri bitmesini bekleme ilk_deger = (ADRESH << 8) + ADRESL; ADCON0bits.CHS=0x01; //AN1 seçimi __delay_us(25); ADCON0bits.GO_DONE = 1; // Çeviri başlatma while (ADCON0bits.GO_DONE); // Çeviri bitmesini bekleme son_deger = (ADRESH << 8) + ADRESL; sicaklik =(ilk_deger - son_deger)*adc; printf("ham1:%d ham2:%d sicaklik:%f\n\r", ilk_deger, son_deger, sicaklik); __delay_ms(1000); } }
Devre Simülasyonu

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.