lm35 ısı ondalık problemi

Başlatan yasargunaydin, 21 Ağustos 2020, 20:17:23

yasargunaydin

Arkadaşlar merhaba;
Lm35 ısı sensörü ile sıcaklık ölçümünü yaptırdım fakat ondalık kısmını yazdıramadım.Yardımcı olabilirmisiniz.
OKU=HAM*/1150      1150 değerini deneyerek buldum

ONDALIK=ISI//10  BURAYI beceremedim

TRISA=%11111111     
TRISB=%11111111     
TRISC=%00000000
TRISD=%00000000

DEFINE  ADC_BITS        10         
DEFINE  ADC_CLOCK       3         
DEFINE  ADC_SAMPLEUS    100     
'-------------------------------------------------------------------------------

DEFINE LCD_DREG     PORTB
DEFINE LCD_DBIT     0
DEFINE LCD_EREG     PORTB
DEFINE LCD_EBIT     5
DEFINE LCD_RSREG    PORTB
DEFINE LCD_RSBIT    4
DEFINE LCD_BITS     4
DEFINE LCD_LINES    2

DEFINE OSC 4
ADCON1=%10001110
'-------------------------------------------------------------------------------
X VAR WORD
ISI   VAR WORD
HAM   VAR WORD
 HAM1 VAR WORD
ONDALIK VAR WORD
 I VAR BYTE

'-------------------------------------------------------------------------------
BASLA:
      ADCIN 0,HAM 
     LCDOUT $FE,1
     LCDOUT $FE,$80,"HAM=",DEC HAM
    LCDOUT $fe,$C0,"SICAKLIK=" ,dec ISI,"," ,DEC ONDALIK
     
BAK:  IF ADCON0.2=1 THEN BAK 'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.


 FOR I = 1 TO 10
    ADCIN 0, HAM1
    HAM=HAM+HAM1
    PAUSE 5
    NEXT I
   
    HAM=HAM/10   ' 10 DEFA ÖLÇÜP ORTALAMASINI ALIYORUZ
   '' OKU=HAM*/1130
   ISI=HAM*/1150
    ISI=ISI/10
     
   ONDALIK=ISI//10
   
      GOTO basla 

ete

Programda eksik bir komut var.
BASLA:
      ADCIN 0,HAM 
şeklinde HAM değeri ilk okumada bir değer alıyor.
Peşinden
 FOR I = 1 TO 10
    ADCIN 0, HAM1
    HAM=HAM+HAM1
    PAUSE 5
    NEXT I
satırları ile HAM değerine 10 okuma daha ekleniyor. Toplamda 11 okuma yapılıp tamamı HAM değerine eklenmiş oluyor. Ama sonucu bulurken ,
  HAM=HAM/10   ' 10 DEFA ÖLÇÜP ORTALAMASINI ALIYORUZ
satırı ile 10 okuma ortalamasını almış oluyorsun. Bu hatalı bir hesap şekli.
Öncelikle ilk okuma neden yapılıyor onu anlamadım. Onu kaldırıp 0 to 9 veya 1 to 10 şeklinde döngü kurup 10 okuma yapıp ortalamasını almak daha doğru olacak. Ayrıca bir hata olmaması için 10 okuma başlamadan evvel HAM değeri de sıfırlanması gerekir.

Gelelim hesap kısmına. Sensörün maksimum kaç derece sıcaklığı okuyacağına karar verip o sıcaklıkta yaklaşık ADC karşılığını ne okuyacağını bilmek yada bulmak gerekir.
Varsayım da bulunarak devam edecek olursak. Diyelimki 100 dereceye kadar okuyacağız ve 100 derecede LM35 den okunacak olan ADC değerimiz 800 olacak. Ondalıklı çalışacağımız için 100 dereceyi 1000 (yani 100,0) şeklinde düşüneceğiz. Hesap da şöyle yapılacak.
1000/800=1,25 gibi bir değer buluruz. Bunu 256 ile çarparak 320 değerini buluruz. O halde formülümüz, ISI=(HAM_Deger*/320)  şeklinde uygulanacaktır. Hemen test edelim,
Okunan değer 800 olsun (800*320)/256=1000 olarak bulunacaktır.
Ekrana verirken Sıcaklığın tamsayı kısmını ISI/10 şeklinde (LCDOUT $fe,80,"SICAKLIK=",dec (ISI/10)
Ondalık kısmını ise ISI//10 şeklide hesaplayıp ekrana vermek gerekecek. Oda şöyle olur.
LCDOUT $FE,$80,"SICAKLIK=",dec (ISI/10),",",dec1 (ISI//10)
Umarım anlaşılmıştır.

yasargunaydin

Hocam öncelikle cevabınız için teşekkür ederim.
Ben proteus simülasyonda lm35 sensörü 100e getirince ham değerini 205 okuyorum.aşağıdaki gibi formulude düzelttim.1000/205=4,87 ve 4,87*256=1249

BASLA:
LCDOUT $fe,$C0,"SICAKLIK=" ,dec ISI,"," ,DEC1 ONDALIK
     ham=0
BAK:  IF ADCON0.2=1 THEN BAK 'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.

  FOR I = 1 TO 10
    ADCIN 0, HAM1
    HAM=HAM+HAM1
    PAUSE 5
    NEXT I
    HAM=HAM/10 

ISI=(HAM*/1249)
    ISI=ISI/10
       ONDALIK=ISI//10
goto basla

sanırım oldu gibi.

ete

  FOR I = 1 TO 10
bu döngüden evvel HAM=0 komutunu eklemen gerekiyor. Aksi halde ikinci okuman yanlış olur.
Zira HAM değeri döngü sonunda ortalama bir değer alır. Diyelimki 190 değerini aldı.
Yeni hesaplamada bu değer üerine eklersin yeni 10 okumayı ve hesap şaşar.
Her döngüsel okumada HAM değeri sıfırlanmalıdır.

Ete

Powered by EzPortal