LM35 ile sıcaklık ölçümünde 3 derece aşağı yukarı sıçrama

Başlatan kaganayanoglu, 12 Şubat 2019, 16:20:17

kaganayanoglu

LM35 ve 16F877A kullanarak yaptığım ısı ölçümlerinde 3 derece yukarı ve aşağı sıçramalar oluyor. Çözüm konusunda yardımcı olursanız sevinirim. Kod ve şema aşağıdadır.

;----[16F877A Hardware Configuration]-------------------------------------------
#IF __PROCESSOR__ = "16F877A"
  #DEFINE MCU_FOUND 1
#CONFIG
cfg = _HS_OSC                ; HS oscillator
cfg&= _WDT_OFF                ; WDT disabled
cfg&= _PWRTE_OFF              ; PWRT disabled
cfg&= _BODEN_OFF              ; BOR enabled
cfg&= _LVP_OFF                ; RB3 is digital I/O, HV on MCLR must be used for programming
cfg&= _CPD_OFF                ; Data EEPROM code protection off
cfg&= _WRT_OFF                ; Write protection off; all program memory may be written to by EECON control
cfg&= _DEBUG_OFF              ; In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins
cfg&= _CP_ALL                ; All program memory code-protected
  __CONFIG cfg

#ENDCONFIG

#ENDIF


'*************************************
'ISLEMCI TANIMLAMALARI
DEFINE OSC 20      'KRİSTAL FREKANSI
DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 2 ' 20mhz DIS KRISTAL KULLANILIYOR 
DEFINE ADC_SAMPLEUS 100
    
'*************************************
ADCON1 = %10001001  'SAGA YASLANIK sonuç almak için

TRISA = %00101111
TRISB = %11000000
TRISC = %00000011
TRISD = %00111000
TRISE = %00000111


Pause 100 ' 100 ms AÇILIŞ GECİKMESİ

DEFINE LCD_DREG PORTB      'LCD data bacakları hangi porta bağlı? LCD nin D0 D1 D2 D3 
DEFINE LCD_DBIT 0          'LCD data bacakları hangi bitten başlıyor? ***
DEFINE LCD_RSREG PORTB    'LCD RS Bacağı Hangi Porta bağlı ?        
DEFINE LCD_RSBIT 4        'LCD RS bacağı Hangi Bite bağlı ?        4 ***
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 5          'LCD Enable Bacağı Hangi bite bağlı ?    5
DEFINE LCD_BITS 4          'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 4
'*************************************
'DEGISKEN TANIMLAMALARI
ORTAM          VAR WORD
ONDA_ORTAM      VAR WORD
DEFR            VAR WORD
ONDA_DEFR      VAR WORD
MOTORISI        VAR WORD
ONDA_MOTORISI  VAR WORD
CIKIS          VAR WORD
ONDA_CIKIS      VAR WORD
GIRIS          VAR WORD
ONDA_GIRIS      VAR WORD
AKIM            VAR WORD
ONDA_AKIM      VAR WORD
HAM            VAR WORD
ISI            VAR WORD
ONDA            VAR WORD
I              VAR BYTE
ISARET          VAR BYTE
MI              VAR BIT
DEF            VAR BIT
H              VAR BIT
L              VAR BIT
SN              VAR BYTE
SAY            VAR WORD
KALAN_SURE      VAR BYTE
AKIM_SINIRI    VAR BYTE
T VAR BYTE
SIRA VAR BYTE


ANA:

 
    SN = 0
    HAM =0 
    FOR I = 0 TO 10        
    ADCIN 0 , HAM    
    ISI=Ham*/1243
    NEXT I
    ONDA_ORTAM=ISI//10
    ORTAM=ISI/10          'ORTAM SICAKLIGI
    
    HAM =0 
    FOR I = 0 TO 10        
    ADCIN 1 , HAM    
    ISI=Ham*/1243
    NEXT I
    ONDA_DEFR=ISI//10
    DEFR=ISI/10          'DEFROST SICAKLIGI
      
    
    HAM =0 
    FOR I = 0 TO 10        
    ADCIN 2 , HAM    
    ISI=Ham*/1243
    NEXT I
    ONDA_MOTORISI=ISI//10
    MOTORISI=ISI/10        'MOTOR SICAKLIGI
    
    HAM =0 
    FOR I = 0 TO 10        
    ADCIN 4 , HAM    
    ISI=Ham*/1243        
    NEXT I
    ONDA_GIRIS=ISI//10
    GIRIS=ISI/10          'GIRIS SU SICAKLIGI
    
    HAM =0 
    FOR I = 0 TO 10        
    ADCIN 3 , HAM    
    ISI=Ham*/1243
    NEXT I
    ONDA_CIKIS=ISI//10
    CIKIS=ISI/10          'CIKIS SU SICAKLIGI  

LCDOUT $FE,1  
LCDOUT $FE, $80, "SISTEM SICAKLIK "
LCDOUT $FE, $C0, "ORTAM MOTOR G.SU"
LCDOUT $FE, $90, DEC ORTAM,"'C", "  ", DEC MOTORISI,"'C", "  ",DEC GIRIS,"'C"
LCDOUT $FE, $D0, "  SISTEM NORMAL "
PAUSE 1000

goto ana

ladybird

Hocam ölçüm hızınız çok önemli değilse Low Pass Filter ekleye bilirsiniz.Besleme uçlarına dekuplaj kondansatörü eklemeniz sıçramaları azaltır(100nF). Ama simülasyonda etki eder mi bilmiyorum. 
"Bana ait sözcükler olsun isterdim. Ama kullandığım bu sözcükler, bilmiyorum kaç bilinçte sürüklendi." Jean Paul Sartre

M.Salim GÜLLÜCE

ayrı bir besleme yada güzel bir Power kompanze problemini çözer sanırım.

kaganayanoglu

Besleme LM2596 ile gayet güzel.

Ben pic register ayarlarından şüpheleniyorum.

ete

Devrede başka Analog kanal yok ise ADCON1 registerine ; ADCON1 = %10000010
değerinin verilmesi daha uygun olacaktır. Böylece ihtiyacınız kadar analog kanal seçmiş olursunuz.

Define tanımlamalarında DEFINE ADC_SAMPLEUS 100 değeride abartılı olmuş. Bu işlemcide örnekleme için gereken zaman 19,72us ~20us dir. dolayısıyla buranında DEFINE ADC_SAMPLEUS 20 şeklinde değiştirilmesi gerekir.

Okuma için döngü kurmuşsunuz ama hiç bir işe yaramıyorlar. Mevcut durumda en son okunan değer hesaba katılıyor. Döngüdeki temel amaç okuma ortalaması almaktır. Bu nedenle bir döngünün nasıl olması gerektiğini ben yazacağım diğerlerini siz düzeltiniz.
SN = 0
    TOPLAM=0  'her döngü başında sıfırlanacaktır TOPLAM word tipi değişkendir
     FOR I = 0 TO 49        
    ADCIN 0 , HAM    
    TOPLAM=TOPLAM+HAM
    PAUSEUS 50
    NEXT I
    HAM=TOPLAM/50:SAY=HAM
    ISI=(Ham*/1249)
    ONDA_ORTAM=ISI//10
    ORTAM=ISI/10          'ORTAM SICAKLIGI
görüleceği üzere toplamda 50 adetlik (0-49) bir döngü kurdum.Her okuduğum HAM değerini Toplam isimli değişkene ekledim ve döngü sonunda TOPLAM değerini 50 ye bölerek ortalama aldım sonra sıcaklığı hesapladım.
Hesapta kullandığınız 1243 sabit çarpanını belkide 150 dereceye göre hesaplamışsınızdır. Şayet sizin için mahsuru yok isee 100 derece ye göre bir hesap yaptım. 100 derecede ADC den okunan değer 205 olacaktır.
Çarpan=(1000/205)*256 şeklinde hesaplanırsa 1248,7 gibi bir değer bulunur ve bunu 1249 olarak kullandım. Böylece hesaplanan değerler biraz daha gerçeğe yakın çıkacaktır.
Aslında çözünürlük çok düşük olduğu için illaki hesapta şaşmalar olacaktır. İşin doğrusunu yapmak için okunan değeri maksimum sıcaklığıda dikkate alarak 0-5V seviyesine opamp kullanarak çıkartmak gerekir.

Dikkatimi çeken diğer bir kusur da LCD satır başlarının değerleri oldu. Şayet 4x20 LCD kullanıyorsanız değerler yanlış ama 4x16 kullanıyorsanız doğru. Bildireyim istedim.

Ete
 

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

mustafa_cmbz

Alıntı yapılan: kaganayanoglu - 12 Şubat 2019, 17:18:54Besleme LM2596 ile gayet güzel.

Ben pic register ayarlarından şüpheleniyorum.

Beslemen güzel ama filitre yapın nasıl ? anlaşılan ac su motorlarının olduğu bir ortamda çalışıyor.

Kartın besleme girişine Pİ tipi filitre eklemelisin her işlemci yakınına 100nf ekle rölelerini opto ile sürmeni tavsiye ederim.

sensör kablolarını sheetli kablo kullanmalısın...

Son olarak mevcuttaki programını protona uyarladım denemelerimde 1 derece fark olduğunu gördüm.

sensör olarak niye DS18B20 kullanmadınız ?



   
HAM_DEGER=ADIn 1
    VOLT= (HAM_DEGER * 5) /1023
    VOLT=VOLT*1000
    VOLT=VOLT/10
    Print At 3,3,"LM35-2: ", Dec1 VOLT ," C"



Verdiğim kısımda bu şekilde değer okuyabiliyorsun..

Kabil ATICI

işlemcinin adc ile ilgili olarak Vref+ diye bir bacağı olması gerekir. Bu bacağı uygun referans gerilimini uygularsanız(burada besleme geriliminden ayrı özellikle referans gerilimi için üretilmiş regülatörlerden bahsediyoruz), beslemedeki dalgalanmalardan işlemcinin adc'sini yalıtmış olursun.

-her lm35 besleme bacakları arasına 10uF ve 100nf eklemen yararlı olabilir.
-Eğer kabloların uzun ise lm35 veri kağıtlarındaki 1uf ve 75Ohm damper bağlantısı yardımcı olacaktır.

-lm2596 beslemesi güzel olabilir, bazı regulatörlerde minimum akım akıtılmaya ihtiyaç duyabiliyor. Bu minimum akımın altında kalındığı zaman ilginç sorunlar çıkabiliyor.

Not: Buradaki söylediklerim gerçek devreler içindir. Simülasyon ile ilgili sorunlar için program ile ilgili siteleri incelemeniz gerekir. Çünkü programın ve bilgisayarın kaprisleri söz konusudur.
ambar7

kaganayanoglu

Alıntı yapılan: Kabil ATICI - 13 Şubat 2019, 00:44:00işlemcinin adc ile ilgili olarak Vref+ diye bir bacağı olması gerekir. Bu bacağı uygun referans gerilimini uygularsanız(burada besleme geriliminden ayrı özellikle referans gerilimi için üretilmiş regülatörlerden bahsediyoruz), beslemedeki dalgalanmalardan işlemcinin adc'sini yalıtmış olursun.

-her lm35 besleme bacakları arasına 10uF ve 100nf eklemen yararlı olabilir.
-Eğer kabloların uzun ise lm35 veri kağıtlarındaki 1uf ve 75Ohm damper bağlantısı yardımcı olacaktır.

-lm2596 beslemesi güzel olabilir, bazı regulatörlerde minimum akım akıtılmaya ihtiyaç duyabiliyor. Bu minimum akımın altında kalındığı zaman ilginç sorunlar çıkabiliyor.

Not: Buradaki söylediklerim gerçek devreler içindir. Simülasyon ile ilgili sorunlar için program ile ilgili siteleri incelemeniz gerekir. Çünkü programın ve bilgisayarın kaprisleri söz konusudur.

Güzel bilgiler teşekkür ederim.

kaganayanoglu

Alıntı yapılan: mustafa_cmbz - 12 Şubat 2019, 17:59:40Beslemen güzel ama filitre yapın nasıl ? anlaşılan ac su motorlarının olduğu bir ortamda çalışıyor.

Kartın besleme girişine Pİ tipi filitre eklemelisin her işlemci yakınına 100nf ekle rölelerini opto ile sürmeni tavsiye ederim.

sensör kablolarını sheetli kablo kullanmalısın...

Son olarak mevcuttaki programını protona uyarladım denemelerimde 1 derece fark olduğunu gördüm.

sensör olarak niye DS18B20 kullanmadınız ?



   
HAM_DEGER=ADIn 1
    VOLT= (HAM_DEGER * 5) /1023
    VOLT=VOLT*1000
    VOLT=VOLT/10
    Print At 3,3,"LM35-2: ", Dec1 VOLT ," C"



Verdiğim kısımda bu şekilde değer okuyabiliyorsun..

Bilgiler için teşekkürler

sensör olarak niye DS18B20 kullanmadınız ?

Daha önce hiç kullanmadım bu sensörü. Aynı hatta 3-5 adet bağlanabiliyor diye duymuştum. Ama nasıl bir kod yazmalıyım araştırmadım. Sonraki projelerde güzel olabilir. Örneklerle yardımcı olursanız öğrenmek isterim.

kaganayanoglu

Alıntı yapılan: ete - 12 Şubat 2019, 17:50:29Devrede başka Analog kanal yok ise ADCON1 registerine ; ADCON1 = %10000010
değerinin verilmesi daha uygun olacaktır. Böylece ihtiyacınız kadar analog kanal seçmiş olursunuz.

Define tanımlamalarında DEFINE ADC_SAMPLEUS 100 değeride abartılı olmuş. Bu işlemcide örnekleme için gereken zaman 19,72us ~20us dir. dolayısıyla buranında DEFINE ADC_SAMPLEUS 20 şeklinde değiştirilmesi gerekir.

Okuma için döngü kurmuşsunuz ama hiç bir işe yaramıyorlar. Mevcut durumda en son okunan değer hesaba katılıyor. Döngüdeki temel amaç okuma ortalaması almaktır. Bu nedenle bir döngünün nasıl olması gerektiğini ben yazacağım diğerlerini siz düzeltiniz.
SN = 0
    TOPLAM=0  'her döngü başında sıfırlanacaktır TOPLAM word tipi değişkendir
     FOR I = 0 TO 49        
    ADCIN 0 , HAM    
    TOPLAM=TOPLAM+HAM
    PAUSEUS 50
    NEXT I
    HAM=TOPLAM/50:SAY=HAM
    ISI=(Ham*/1249)
    ONDA_ORTAM=ISI//10
    ORTAM=ISI/10          'ORTAM SICAKLIGI
görüleceği üzere toplamda 50 adetlik (0-49) bir döngü kurdum.Her okuduğum HAM değerini Toplam isimli değişkene ekledim ve döngü sonunda TOPLAM değerini 50 ye bölerek ortalama aldım sonra sıcaklığı hesapladım.
Hesapta kullandığınız 1243 sabit çarpanını belkide 150 dereceye göre hesaplamışsınızdır. Şayet sizin için mahsuru yok isee 100 derece ye göre bir hesap yaptım. 100 derecede ADC den okunan değer 205 olacaktır.
Çarpan=(1000/205)*256 şeklinde hesaplanırsa 1248,7 gibi bir değer bulunur ve bunu 1249 olarak kullandım. Böylece hesaplanan değerler biraz daha gerçeğe yakın çıkacaktır.
Aslında çözünürlük çok düşük olduğu için illaki hesapta şaşmalar olacaktır. İşin doğrusunu yapmak için okunan değeri maksimum sıcaklığıda dikkate alarak 0-5V seviyesine opamp kullanarak çıkartmak gerekir.

Dikkatimi çeken diğer bir kusur da LCD satır başlarının değerleri oldu. Şayet 4x20 LCD kullanıyorsanız değerler yanlış ama 4x16 kullanıyorsanız doğru. Bildireyim istedim.

Ete
 


Teşekkür ederim Erol bey.
 
Okuma için döngü kurmuşsunuz ama hiç bir işe yaramıyorlar. Mevcut durumda en son okunan değer hesaba katılıyor. Döngüdeki temel amaç okuma ortalaması almaktır.

Döngünün eksik olduğunu farketmemişim. Düzeltince aşırı sapmalar düzeldi tabiki.  :)

Bu projede 1 derece hassasiyet yetiyor. Fakat örneğin vücut (ten) sıcaklığı gibi hassas ölçümlerde hangi sensörü önerirsiniz.

KGN

ete

Vücut sıcaklığı konusunda bir araştırmam olmadı. Ancak kullandıklarım arasında bir değerlendirme yapabilirimki onda da DS18B20 ağır basıyor. Bu konuda elimin sıcaklığını ölmede pek çok deneme yapmıştım gerçeğe yakın sıcaklıklar ölçebiliyor. sensör temas yüzeyini bir Aluminyum levha en azından baş parmak alanı kadar büyüklükte bir levhaya sensörü düz yüzeyinden çokince bir yapıştırcı (japon) ile yapıştırırsanız güzel sonuçlar alabilirsiniz.
Belki arkadaşların daha iyi önerileri olabilir onlara kulak verin.

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