lm35 ve dijital termometre sorunu

Başlatan yhykrkrt, 21 Ocak 2007, 20:21:59

yhykrkrt

selam arkadaşlar.

lm35 ve pic16f877 kullanarak dijital termometre yapmak istiyorum ancak bir türlü muvaffak olamadım.aşağıda devre şemasını (proteus) ve picbasic kodlarını veriyorum. sizce neden doğru sonuç alamıyorum bir türlü??

DEFINE LCD_DREG PORTB 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 0 'LCD data bacakları hangi bitten baslıyor?
DEFINE LCD_RSREG PORTC 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 0 'LCD RS bacağı Hangi Bite bağlı ?
define LCD_RWREG PORTC
define LCD_RWBIT 1
DEFINE LCD_EREG PORTC 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 2 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS 8 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor

DEFINE ADC_BITS 10 ' Sonuç kaç bitlik olsun?
DEFINE ADC_CLOCK 3 ' Pals kaynağı seçimi (3=rc)
DEFINE ADC_SAMPLEUS 50 ' Örnekleme zamanı seçimi uS


Trisb=0
Trise=0
ADCON1=%10000010  '10 Bit sonuç almak için
Trisc=0
TrisA=%11111111


SAY     VAR BYTE
PISI    VAR WORD

SAY=0

BASLA:
    IF SAY=2 THEN GOTO EKRAN
    LCDOUT $FE,1,"     DiJiTAL  "
    LCDOUT $FE,$C0,"    iSTANBUL  "
    PAUSE 1000
    LCDOUT $FE,1
    LCDOUT $FE,$80, "   TERMOMETRE  "
    LCDOUT $FE,$C0,"    iSTANBUL  "
    PAUSE 1000
    SAY=SAY+1
    GOTO BASLA

EKRAN:    
    LCDOUT $FE,1 
    LCDOUT $FE,$80," PROP ISISI:" 
D1: GOSUB ADCEV
    LCDOUT $FE,$8C, DEC2 PISI, " C"
    GOTO D1

   
    
ADCEV:
      adcin 0 ,PISI 
CONT: if ADCON0.2=1 then cont
      PAUSE 10 
      PISI=(PISI */ 500) >>2
            
      RETURN   

END


[img=http://img480.imageshack.us/img480/6964/694258344jg.th.jpg]

omenek

http://rapidshare.com/files/12420572/dijital_saat_dosyas__305__c_de_yaz__305_lm__305_s.txt

Bir arkadaşa okuldan ödev verilmiş (yukarıdaki link)benden kodları derlememi rica etti cc5x ile yazılmış olan bu kodları derleyemedim.


Bende oturup asembler ile kendim kod yazdım (aşağıdaki link)devre çalışıyor ama aceleye geldiği için profesyonel olmadı devrede lm35 ve adc0831 var bir incele istersen.Umarım işine yarar

http://rapidshare.com/files/12738050/deneme.rar

muser53

devreyi ben çalıştıdım.
picbasic pro ve 16f877 ile kolay gelsin.

http://rapidshare.com/files/12754043/LCD.rar

muser53

picbasic pro yazdım.
tek yapman gereken ismine göre değişiklik yapacan .
ben okulda öğrencilere yaptırdım.

muser53

DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB 'LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 'LCD 4 sıra olarak çalışıyor.
LOW PORTB.2 'RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.
'-------------------------------TANIMLAMA--------------------------------
Include "MODEDEFS.BAS"
DEFINE         ADC_BITS    10             'A/D çevirim sonucu kaç bit olacak
DEFINE         ADC_CLOCK          3      'Clock kaynağı (3=rc)
DEFINE         ADC_SAMPLEUS  100     'Örnekleme zamanı mikro saniye cinsinden
ON INTERRUPT   GOTO  AYAR   ; Kesme olduğunda ayar alt programına git
OPTION_REG =  $BF           ; 6. bit "0" diğerleri "1"  
INTCON  = $90                ; 7,4. Bitleri "1" 1.biti "0" yap
TRISB.0=1                   ; RB0 GİRİŞ YAPILDI.
RST var PORTC.0
SCLK var PORTC.1
IO var PORTC.2

mode var PORTD.0
set var PORTD.1
i var BYTE
olcum var word
toplam var word
sonuc var word
trisa = %11111111
adcon1 = %10000010
saniye var byte
dakika var byte
saat var byte
ay var byte
gun var byte
tarih var byte
yil var byte
kontrol var byte
trickle var byte
trickle=%00000011
kontrol=$00
LOW PORTC.0
LOW PORTC.1
program:
GOSUB AD
gosub oku
GOSUB hava
goto program
AD:
LCDOUT $FE,1," muser53"
LCDOUT $FE,$C0,"ELEKTRONiK"," ",%11101111,"GRT."
PAUSE 3000
LCDOUT $FE,1,"MiMAR SiNAN"
LCDOUT $FE,1,"MESLEK LiSESi"
LCDOUT $FE,$C0,"ELKTRONiK BOLUMU"
PAUSE 1500
RETURN


oku:
for I=1 to 15
HIGH RST
Shiftout IO, SCLK, LSBFIRST, [$bf]  ' okuma yapılacağı bildirildi.
Shiftin IO, SCLK, LSBPRE, [saniye,dakika,saat,gun,ay,tarih,yil,kontrol]
LOW RST
lcdout $fe,1             ' ekran temizlendi
lcdout "      SAAT"           ' saat kelimesi ekrana yazdırıldı
lcdout $fe,$c0           ' 2. satıra geçildi
lcdout "    "               ' boşluk bırakıldı
lcdout hex2 saat         ' saat değişkeni yazıldı
lcdout ":"               ' : yazıldı
lcdout hex2 dakika      ' dakika değişkeni yazıldı
lcdout ":"               ' : yazıldı
lcdout hex2 saniye,"    "      ' saniye değişkeni yazıldı
pause 500
next I
             ' 3000 mili saniye bekle
lcdout $fe,1," "            ' ekran temizlendi        
lcdout hex2 gun      ' tarih değişkeni yazıldı
lcdout "/"                  ' boşluk bırakıldı
select case ay              ' ay seçiliyor
case 1
lcdout "OCAK"
case 2
lcdout "SUBAT"
case 3
lcdout "MART"
case 4
lcdout "NISAN"
case 5
lcdout "MAYIS"
case 6
lcdout "HAZIRAN"
case 7
lcdout "TEMMUZ"
case 8
lcdout "AGUSTOS"
case 9
lcdout "EYLUL"
case 10
lcdout "EKIM"
case 11
lcdout "KASIM"
case else
lcdout "ARALIK"
end select                                    ' ay seçme bitti
lcdout "/20"                                     ' ekrana 20 yazıldı
lcdout hex2 yil
lcdout $FE,$C0
select case tarih                               ' gün seçiliyor
case 1
lcdout "     PAZAR"
case 2
lcdout "   PAZARTESI"
case 3
lcdout "     SALI"
case 4
lcdout "   CARSAMBA"
case 5
lcdout "   PERSEMBE"
case 6
lcdout "     CUMA"
case else
lcdout "   CUMARTESI"
end select                                       ' gün seçme bitti
pause 3000                                     ' 3000 mili saniye bekle
return                                              ' ana programa dön

hava:
lcdout $fe,1                                   ' ekran temizlendi
i=1                                                 ' i=1 atandı
toplam=0                                   ' toplam=0 atandı
while i<100                             ' 100 kere döngüyü tekrarla
i=i+1                                   ' her döngüde i 1 artsın
adcin 0 ,olcum                          ' analog veri alınıyor
toplam=toplam+olcum                       ' her döngüde ölçümler toplanıyor
wend                                    ' while döngüsü bitti

lcdout $fe,1                                ' ekranı temizle
lcdout $fe,129                              ' 2. sütuna git
lcdout "HAVA SICAKLIGI"                     ' hava sıcaklığı ekrana yazıldı
lcdout $fe,$c0                              ' 2. satıra geç
lcdout $fe,198                              ' 7. sütuna git
lcdout dec toplam*1/200                 ' toplam1‘ in ortalamasını al.10luk olarak yaz
if toplam//200 > 180 then                   ' 0.1 hassasiyet için döngü
lcdout ".9"
goto devam3
endif
if toplam//200 > 160 then
lcdout ".8"
goto devam3
endif
if toplam//200 > 140 then
lcdout ".7"
goto devam3
endif
if toplam//200 > 120 then
lcdout ".6"
goto devam3
endif
if toplam//200 > 100 then
lcdout ".5"
goto devam3
endif
if toplam//200 > 80 then
lcdout ".4"
goto devam3
endif
if toplam//200 > 60 then
lcdout ".3"
goto devam3
endif
if toplam//200 > 40 then
lcdout ".2"
goto devam3
endif
if toplam//200 > 20 then
lcdout ".1"
goto devam3
else
lcdout ".0"
goto devam3
endif                                       ' 0.1 hassasiyet için döngü bitti.
devam3:                                         ' devam3 etiketi
lcdout 223                              ' derece işareti ekrana yazıldı
lcdout "C"                              ' C işareti ekrana yazıldı
pause 3000                              ' 3 saniye bekle
return                                  ' başa dön



ayar:
DISABLE             ;oluşacak kesmeler etkisiz yapıldı.
INTCON=$80          ; 4. BİT "0" YAPILDI KESMELER İPTAL EDİLDİ.

lcdout $fe,1
lcdout "AYAR MENUSUNE!"
Lcdout $fe,$C0
lcdout "!!HOS GELDiNiZ!!"
PAUSE 500
LCDOUT $fE,1,"MODE TUSU iLE"
lCDOUT $FE,$C0,"SAAT DK. GUN"
PAUSE 500
LCDOUT $FE,1,"AY,YIL "
LCDOUT $FE,$C0,"SECiMi YAPILIR."
PAUSE 500
LCDOUT $FE,1,"SET TUSU iLE"
LCDOUT $FE,$C0,"ARTIRMA YAPILIR "
PAUSE 500
LCDOUT $FE,1,"MENU CIKIS=>"
LCDOUT $FE,$C0,"AYAR TUSU"
PAUSE 500

sa_ay:
LCDOUT $FE,1,"SAAT:"
pause 100

sbas:
 IF portb.0=0 THEN
pause 150
gosub son
endif
IF MODE=0 THEN
PAUSE 150
GOSUB dk_ay
ENDIF

IF SET=0 THEN
PAUSE 150
saat=saat+1
if saat>=24 then saat=0
lcdout $FE,1,"SAAT:" ,DEC2 saat
endif
goto sbas
return

dk_ay:
LCDOUT $FE,1,"DAKiKA:"
pause 100
dkbas:
IF portb.0=0 THEN
pause 150
gosub son
endif
IF MODE=0 THEN
PAUSE 200
gosub gun_ay
ENDIF

IF set=0 THEN
PAUSE 150
dakika=dakika+1
if dakika>=60 then dakika=0
lcdout $FE,1,"DAKiKA:" ,dec2 dakika
endif
goto dkbas
return

gun_ay:
LCDOUT $FE,1,"GUN:"
pause 100
gunbas:
IF portb.0=0 THEN
pause 150
gosub son
endif
IF mode=0 THEN
pause 150
gosub ay_ay
ENDIF

IF set=0 THEN
pause 150
gun=gun+1
if gun>=32 then gun=0
lcdout $FE,1,"GUN:" ,DEC2  gun
endif
goto gunbas
return

ay_ay:
LCDOUT $FE,1,"AY:"
pause 100
aybas:
IF portb.0=0 THEN
pause 150
gosub son
endif
IF mode=0 THEN
pause 150
gosub yil_ay
ENDIF

IF set=0 THEN
pause 150
ay=ay+1
if ay>=13 then ay=0
lcdout $FE,1,"AY:" ,DEC2 ay
endif
goto aybas
return

yil_ay:
LCDOUT $FE,1,"YIL:"
pause 100
yilbas:
IF portb.0=0 THEN
pause 150
gosub son
endif
IF mode=0 THEN
pause 150
gosub tarih_ay
ENDIF
IF set=0 THEN
pause 150
yil=yil+1
if yil>=13 then yil=1
lcdout $FE,1,"YIL:" ,DEC2 yil
endif
goto yilbas
return

tarih_ay:
LCDOUT $FE,1,"TARiH:"
pause 100
tarihbas:
IF mode=0 THEN
pause 150
gosub sa_ay
endif
  IF portb.0=0 THEN
pause 150
gosub son
endif
IF set=0 THEN
tarih=tarih+1
if tarih>=8 then tarih=1
lcdout $FE,1,"TARiH:"
select case tarih                          
case 1
lcdout $FE,$C0, "     PAZAR"
case 2
lcdout $FE,$C0,"   PAZARTESI"
case 3
lcdout $FE,$C0, "      SALI"
case 4
lcdout  $FE,$C0, "    CARSAMBA"
case 5
lcdout $FE,$C0, "    PERSEMBE"
case 6
lcdout $FE,$C0,  "      CUMA"
case else
lcdout $FE,$C0, "   CUMARTESI"
end select                                          
pause 200
endif

Goto tarihbas
RETURN

son:

saat= ((((saat/10)&$0F)<<4)+((saat//10)&$0F)) 'desimal bcd'ye çevrildi.
dakika= ((((dakika/10)&$0F)<<4)+((dakika//10)&$0F))
gun= ((((gun/10)&$0F)<<4)+((gun//10)&$0F))
ay= ((((ay/10)&$0F)<<4)+((ay//10)&$0F))
yil= ((((yil/10)&$0F)<<4)+((yil//10)&$0F))
saniye=$00
RST = 1
Shiftout IO, SCLK, LSBFIRST, [$8e, 0]
RST = 0
RST = 1
Shiftout IO, SCLK, LSBFIRST, [$be,saniye, dakika,saat,gun,ay,tarih,yil, 0]
RST = 0
lcdout $fe,1, "MENUDEN CIKILYOR......."
pause 150
 
INTCON=$90      
ENABLE
GOTO PROGRAM
RESUME

END

ete

@yhykrkrt,

Aslında programında hata yok. Eksik var. Mantıken şöyle düşün.
LM35 sensörü -50 ile +150 dereceler arasında çalışır ve derece başına 10 mv verir. -50 ile +150 derece arasında 200 kademe var. 150 derecede sensörün vereceği voltaj 1500 mv dur. Bu durumda şayet referans voltajın 1500 mv olsa idi 150 derece okuyacağın ADC değeri 1023 olacak idi. Ancak Pic'in +5V olan referans voltajını kullandığın için okuyacağın maximum değer 307 olacaktır. (5 volt /1,5 Volt=3,33 ve 1024/3,33=307)
Bu durumda birim okuma başına elde edeceğin volt değeri 0,65146 olacak ve bunuda 256 ile çarparsan 166,77 gibi bir değer elde edersin. Bu değeri 167 olarak kullanacağız. Dolayısıyla ADC den okuduğun her değeri bu sayı ile çarpıp 256 ya bölersen sana direk sıcaklığı verecektir.
Ancak okuyacağın değerler arasında eksi sıcaklıklarda bulunmaktadır. Toplam 200 adet sıcaklığın ilk 50 tanesi eksi sıcaklık kalan 150 taneside artı sıcaklıktır. Bu durumda gerçek sıcaklığı işareti ile bulabilmek için ufak bir ilave gerekiyor. Böylece sensörün hem eksi sıcaklıklarıda gösterecek hemde doğru ölçüm değerlerini göstermiş olacaktır.
Bu esaslara göre düzeltilmiş programı aşağıya koyuyorum.

DEFINE LCD_DREG PORTB 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 0 'LCD data bacakları hangi bitten baslıyor?
DEFINE LCD_RSREG PORTC 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 0 'LCD RS bacağı Hangi Bite bağlı ?
define LCD_RWREG PORTC
define LCD_RWBIT 1
DEFINE LCD_EREG PORTC 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 2 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS 8 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor

DEFINE ADC_BITS 10 ' Sonuç kaç bitlik olsun?
DEFINE ADC_CLOCK 3 ' Pals kaynağı seçimi (3=rc)
DEFINE ADC_SAMPLEUS 50 ' Örnekleme zamanı seçimi uS


Trisb=0
Trise=0
ADCON1=%10000010  '10 Bit sonuç almak için
Trisc=0
TrisA=%11111111


SAY     VAR BYTE
PISI    VAR WORD
ISI     var word
ISARET VAR BYTE

SAY=0

BASLA:
    IF SAY=2 THEN GOTO EKRAN
    LCDOUT $FE,1,"     DiJiTAL  "
    LCDOUT $FE,$C0,"    iSTANBUL  "
    PAUSE 1000
    LCDOUT $FE,1
    LCDOUT $FE,$80, "   TERMOMETRE  "
    LCDOUT $FE,$C0,"    iSTANBUL  "
    PAUSE 1000
    SAY=SAY+1
    GOTO BASLA

EKRAN:   
    LCDOUT $FE,1
    LCDOUT $FE,$80,"   PROB ISISI:  "
    
D1: GOSUB ADCEV
'    LCDOUT $FE,$80," ham:",dec pISI,"  "
    LCDOUT $FE,$C5,ISARET, DEC ISI,223,"C     "
    GOTO D1   
   
ADCEV:
      adcin 0 ,PISI
       ISI=((PISI) */ 167)
       IF ISI>50 then 
          ISI=ISI-50
          ISARET="+"
       ELSE
          ISI=50-ISI
          ISARET="-"
       ENDIF
             
      RETURN   

END


Bu arada programı isis de doğru çalıştırabilmen için ADC0 girişine 1 adet ayarlı pot koy POT-HG olanı seç. Pot'un alt ucunu GND ye ver orta ucunu ADC0 girişine ver ve üst taraftan 1500 mv (1,5Volt) voltaj gir. Böylece full skala LM35 sensörü elde edersin. Pot ile oynadıkça sıcaklığın nasıl değiştiğinide göreceksin.
Ayrıca LCD ekranı 8 bit kullanmışsın. BU LCD 4 bit olarakda çalışabilir. Böylece bütün LCD B portuna bağlanabilir. Pic de Bacak tasarrufu gerektiğinde bu dediklerimi hatırlarsın.
 
kolay gelsin

E T E
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

prof77

picbasic pro nerden bulurum bir kaç tane denedim hep demo çıktı
ilaç hocam ilaç

wonder

Alıntı yapılan: "ete"@yhykrkrt,

Aslında programında hata yok. Eksik var. Mantıken şöyle düşün.
LM35 sensörü -50 ile +150 dereceler arasında çalışır ve derece başına 10 mv verir. -50 ile +150 derece arasında 200 kademe var. 150 derecede sensörün vereceği voltaj 1500 mv dur. Bu durumda şayet referans voltajın 1500 mv olsa idi 150 derece okuyacağın ADC değeri 1023 olacak idi. Ancak Pic'in +5V olan referans voltajını kullandığın için okuyacağın maximum değer 307 olacaktır. (5 volt /1,5 Volt=3,33 ve 1024/3,33=307)
Bu durumda birim okuma başına elde edeceğin volt değeri 0,65146 olacak ve bunuda 256 ile çarparsan 166,77 gibi bir değer elde edersin. Bu değeri 167 olarak kullanacağız. Dolayısıyla ADC den okuduğun her değeri bu sayı ile çarpıp 256 ya bölersen sana direk sıcaklığı verecektir.
Ancak okuyacağın değerler arasında eksi sıcaklıklarda bulunmaktadır. Toplam 200 adet sıcaklığın ilk 50 tanesi eksi sıcaklık kalan 150 taneside artı sıcaklıktır. Bu durumda gerçek sıcaklığı işareti ile bulabilmek için ufak bir ilave gerekiyor. Böylece sensörün hem eksi sıcaklıklarıda gösterecek hemde doğru ölçüm değerlerini göstermiş olacaktır.
Bu esaslara göre düzeltilmiş programı aşağıya koyuyorum.

E T E

ete usta burada 0.65146 yı bulmak için hangi işlemi yaptınız?
ben şöyle düşündüm 150/307=0,488599
0,488599*256=125
sizin yazdığınız kodları aynen denedim 33 derece civarındaydı. olması gereken (analog bi tane termometreden bakıyorum aynı zamanda :)) 25 falandı. bende işlem yapılan yere yerine 125 yazdım 25 dereceyi gösterdi.
yorumunuz nedir?
bide gerçek ondalık kısmı nasıl gösteririz?

nurim

Alıntı yapılan: "wonder"
ete usta burada 0.65146 yı bulmak için hangi işlemi yaptınız?
ben şöyle düşündüm 150/307=0,488599
0,488599*256=125
sizin yazdığınız kodları aynen denedim 33 derece civarındaydı. olması gereken (analog bi tane termometreden bakıyorum aynı zamanda :)) 25 falandı. bende işlem yapılan yere yerine 125 yazdım 25 dereceyi gösterdi.
yorumunuz nedir?
bide gerçek ondalık kısmı nasıl gösteririz?

Alıntı yapılan: "ete"LM35 sensörü -50 ile +150 dereceler arasında çalışır ve derece başına 10 mv verir. -50 ile +150 derece arasında 200 kademe var. 150 derecede sensörün vereceği voltaj 1500 mv dur. Bu durumda şayet referans voltajın 1500 mv olsa idi 150 derece okuyacağın ADC değeri 1023 olacak idi. Ancak Pic'in +5V olan referans voltajını kullandığın için okuyacağın maximum değer 307 olacaktır. (5 volt /1,5 Volt=3,33 ve 1024/3,33=307)
Bu durumda birim okuma başına elde edeceğin volt değeri 0,65146 olacak ve bunuda 256 ile çarparsan 166,77 gibi bir değer elde edersin. Bu değeri 167 olarak kullanacağız. Dolayısıyla ADC den okuduğun her değeri bu sayı ile çarpıp 256 ya bölersen sana direk sıcaklığı verecektir.

"Pic'in +5V olan referans voltajını kullandığın için okuyacağın maximum değer 307 olacaktır." "-50 ile +150 derece arasında 200 kademe var."
200/307= 0.65146

Kolay gelsin
nurim
"Bilgi paylaştıkça artar ,acı ve keder paylaştıkça azalır"

wonder

Alıntı yapılan: "nurim"
"Pic'in +5V olan referans voltajını kullandığın için okuyacağın maximum değer 307 olacaktır." "-50 ile +150 derece arasında 200 kademe var."
200/307= 0.65146

Kolay gelsin
nurim

ama şöylede bi durum var, lm 35 in datasheetinde ve forumda okuduğum kadarıyla -C 'yi görmek için lm35 in eksisi ile şase arasına 2 diyot koymak gerekiyo, şaseyi yukarı çekmiş oluyoruz, eğer böyle bi düzenleme yapmadan lm35 in eksisini direk şaseye bağlarsak ölçülebilecek aralık 2-150C arası oluyo. yani benim dediğime geliyo o zaman. ki denedim 167 ve 125 ile.
125 te dereceyi doğru okudum. böyle bi düzeltme gerekiyo sanırım burada.

bu işlemlerden kurtulmak için bi arkadaşla şöyle bişey düşündük. 1.024 ref gerilimi uyguladık ve 0-100C arası ölçüm (bu bizim için yeterli bi aralık) yaptık sonuçta işlemşi basitleştirdik çıkan değeri direk 10a bölerek ve 10a kalanlı bölerek ölçüm sonucunu bulduk. aşağıdaki kodlar mevcut 16f877 kullandım
DEFINE  LCD_DREG    PORTC
DEFINE  LCD_DBIT    4    
define  LCD_RSREG   PORTD
DEFINE  LCD_RSBIT   2
DEFINE  LCD_EREG    PORTD
DEFINE  LCD_EBIT    3
DEFINE  LCD_BITS    4
DEFINE  LCD_LINES   2
DEFINE ADC_BITS 10 ' Sonuç kaç bitlik olsun?
DEFINE ADC_CLOCK 3 ' Pals kaynağı seçimi (3=rc)
DEFINE ADC_SAMPLEUS 50 ' Örnekleme zamanı seçimi uS 

TRISA=%00001001
TRISB=0
TRISC=0
TRISD=0
TRISE=0
ADCON1=%10000101  '10 Bit sonuç almak için ra0 ve ra1 analog, ra3 ref:1.024v


pisi    var word
ISI   VAR word
ONDA  VAR word


LCDOut $FE,1            ' LCD de CLS yapar
pause 200               ' LCD nin açılması için gerekli süredir.


D1: 
    GOSUB ADCEV
    LCDOUT $FE,$80," ham:",dec pISI
    LCDOUT $FE,$C0, DEC isi,",",DEC ONDA,223,"C"
    pause   500
goto    d1   
   
ADCEV:
    adcin 0 ,PISI
BAK: IF ADCON0.2=1 THEN BAK
ISI=PISI/10       
ONDA=PISI//10
    RETURN

END

nurim

Alıntı yapılan: "wonder"ama şöylede bi durum var, lm 35 in datasheetinde ve forumda okuduğum kadarıyla -C 'yi görmek için lm35 in eksisi ile şase arasına 2 diyot koymak gerekiyo, şaseyi yukarı çekmiş oluyoruz, eğer böyle bi düzenleme yapmadan lm35 in eksisini direk şaseye bağlarsak ölçülebilecek aralık 2-150C arası oluyo. yani benim dediğime geliyo o zaman. ki denedim 167 ve 125 ile.
125 te dereceyi doğru okudum. böyle bi düzeltme gerekiyo sanırım burada

Ben,açıklamayı senin "ete usta burada 0.65146 yı bulmak için hangi işlemi yaptınız?" diye sorduğun soru ve "ete"nin  "200/307= 0.65146" tarifi üzerine yaptım.
Eğer bir yorum getirmem gerekiyorsa; bu hesapların doğruluğu LM35 in 5 voltta ve bu bağlantı şekli ile -50 ila +150C arasını ölçtüğü kabul edilip 200 aralığın olması halinde doğrudur.Senin söylediğin gibi düz bağlantı şeklinde ölçme 2-150C arasında yapılabiliyorsa (datasheete bakınca öyle gözüküyor) o zaman senin dediğin doğrudur.Hesaplama zaten aynı yöntem,ile yapılıyor. (200/307) yada (148/307) .

Kolay gelsin
nurim
"Bilgi paylaştıkça artar ,acı ve keder paylaştıkça azalır"

wonder

teşekkür ederim nurim,
yeterince anladım bu konuyu, ayrıca bişey eklemek istiyorum anladığım kadarıyla şaseyi direk eksisine bağladığımıda 2 dereceden daha aşağısını gösteremiyor ama 2 derecede de bi miktar gerilim üretiyo ve biz işlem aralığını belirlerken adc miz "0" a kadar düştüğü için 150 ye bölmeliyiz. ufak bi ayrıntı aslında hesaplamada çok şey değiştirmeyecektir.

kolay gelsin

nurim

LM35 sensörü bağlantı örnekleri......



Kolay gelsin
nurim
"Bilgi paylaştıkça artar ,acı ve keder paylaştıkça azalır"