2 adet Lm35 ile sıcaklık kontrolü

Başlatan chaoss, 14 Ocak 2011, 10:41:25

chaoss

Arkadaşlar Merhaba,
Devremiz 2 adet lm 35 ile sıcaklığı ölçüp buna göre çıkış vermektedir, Senaryo şu şekilde oluşuyor bir odayı ısıtan kalorifer sistemimiz var, 1. sensörümüz ısıtılması gereken odayı ölçüyor diğer 2. sensörümüz ise odayı ısıtan suyun ısısnı ölçüyor, Su ısısı 45 derecenin altında ise suyun ısınmasını bekliyor , oda içerisindeki sıcaklık ayarlanan değerinin altında ve su ısısı 45 derecenin üstünde ise sistem sirkülasyon pomapsını devreye alıyor ve sıcak suyu sistemde dönderiyor su ısısı 90 derecenin üstüne çıktığında sistem devre dışı kalıyor,

Bu senaryo Simülsyonda sorunsuz çalışmakta,

Bread borda kurduğumda ise gördüğüm sorun ise sıcaklık değeri sürekli değişiyor 22-23-19-22-23-24-18 derece gibi bu da istenmiyen bi durum çünkü motor devreye sürekli girip çıkacak bunu ısıyı bir register içinde toplayım tekrar bölerek ortalama yöntemi ile çözebilirmiyiz?

Devrede lcd üzerinde bulunan 11 ve 12 numaralı uçlar ekran aydınlatma uçları :)

konu ile ilgili isis,ares,pdf,açık şema, pbp http://rapidshare.com/files/442493488/H.Y_PC16F877_120111.rar

program biraz acemice olabilir tavsiyeleriniz için şimdiden teşekkürkürler :)
NOT:programın ADC bölümü alıntıdır.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 05.01.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
define osc 4
TRISA=%00000011
TRISB=0
TRISC=%00000111
TRISD=0
TRISE=7
portd=0
'-------------------------------------------------------------------------------
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
'-------------------------------------------------------------------------------
DEFINE LCD_DREG PORTB 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD RWREG PORTB 'LCD R/W Bacağı Hangi Porta bağlı?
DEFINE LCD_RWBIT 2 'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 1 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor
DEFINE ADC_BITS 10 'A/D çevirim sonucu kaç bit olacak
DEFINE ADC_CLOCK 3 'Clock kaynağı (3=rc)
DEFINE ADC_SAMPLEUS 100 'Şarj zamanı mikro saniye cinsinden.
'-------------------------------------------------------------------------------
ADCON1=%10000000 '7. bit 1 yapıldı 10 bit sonuç almak için.
ADCON0=%11000000
'-------------------------------------------------------------------------------
ISI VAR word
ISI2 VAR WORD
HAM VAR WORD
HAM2 VAR WORD
deger var byte
w var byte
TOPLAM1 VAR BYTE
TOPLAM2 VAR BYTE
'-------------------------------------------------------------------------------
Low PORTB.2 ' LCD R/W line Low (W), şemada direkt GND ye bağlanabilir.
LCDOut $FE,1 ' LCD de CLS yapar
pause 200 ' LCD nin açılması için gerekli süredir.
'-------------------------------------------------------------------------------
deger=27                                               ;ısı 27 derece başlangıç ayarı
PORTD=0                                                ;röle ve ledi 0 yap
BASLA:
GOSUB SENSOR1      ; 1 sensörü oku
GOSUB SENSOR2      ; 2 sensörü oku
lcdout $fe,1               ;  lcd temizle 
lcdout "ODA ISISI =",# ISI,"`C"              ; oda sıcaklığını yaz           
LCDOUT $FE,$C0,"SU ISISI =",# ISI2,"`C"     ; su sıcaklığını yaz
pause 200              
if portc.0=1 then gosub menu                 ;ayar tuşuna basıldımı ?

IF ISI2>90 THEN DURDUR                        ;su ısısı 90 derecenin üstünde ise sistemi durdur
IF ISI2>45 THEN KONTROL                      ;su 45 derecenin üstünde ise  oda ısını kontrol et
PORTD=0                                                 ;röle ve ledi 0 yap
goto basla                                               ;ana programa dön
 
KONTROL
if ISI<deger THEN MOTOR                       ;oda içerisindeki ısı set edilen değerden küçükse motora git
PORTD=0                                                 ;röle ve ledi 0 yap
GOTO BASLA                                            ; ana programa dön

MOTOR   
PORTD=3                                                 ;oda ısısı  set edilen değerden düşük  motoru devreye al ledi yak
GOTO BASLA                                            ;ana menüye dön

DURDUR                                   
PORTD=0                                                 ;su sıcaklığı 90 derecenin üstünde röleyi ve ledi 0 yap
lcdout $fe,1                
lcdout "SU COK SICAK"                            ; ekranda su çok sıcak çalıştırlamaz yaz
LCDOUT $FE,$C0,"CALISTIRILMAZ"
PAUSE 1000
GOTO BASLA

;--------------------- MENU AYARLARİ--------------------------------------------
menu
lcdout $fe,1
lcdout "ODA ISI AYARINA"
LCDOUT $FE,$C0,"HOSGELDiZ"
pause 200

menu1
if portc.0=1 then  basla                            ; ayar tuşuna tekrar basıldı ise ana programa dön
if portc.1=1 then gosub artir                    ; artir butonuna basildimi
if portc.2=1 then gosub azalt                  ; azalt butonuna basildimi
GOTO menu1                                           ; ayar menüsünde bekle

artir
deger=deger+1                                      ;artir butonuna basıldı değeri bir artir
lcdout $fe,1
lcdout "YENi"
LCDOUT $FE,$C0,"ODA ISISI =",# DEGER,"`C"      ;yeni değeri ekranda yaz
pause 200
return

azalt
deger=deger-1                                                     ;azalt butonuna basıldı  dğeri bir azalt
lcdout $fe,1
lcdout "YENi"
LCDOUT $FE,$C0,"ODA ISISI =",# DEGER,"`C"     ;yeni değeri ekranda yaz
pause 200
return
end
;---------------------sensörleri okuma alt programı-----------------------------

SENSOR1

ADCIN 0,HAM '0 nolu kanaldan Analog değeri oku ve RAW değişkenine aktar.
BAK1 
IF ADCON0.2=1 THEN BAK1 'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.
ISI=(5*HAM)-(5*HAM/64)-(5*HAM/128)
ISI=ISI/10
RETURN


SENSOR2
ADCIN 1,HAM2 '1 nolu kanaldan Analog değeri oku ve ham2değişkenine aktar.
BAK2 
IF ADCON0.2=1 THEN BAK2 'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.
ISI2=(5*HAM2)-(5*HAM2/64)-(5*HAM2/128)
ISI2=ISI2/10
RETURN
;-------------------------------------------------------------------------------
end


[IMG]http://img842.imageshack.us/img842/916/hyaikema120111.png[/img]

Uploaded with ImageShack.us


\\\In Tolerance Be like the Sea/ // Hz. Mevlana

Maxim

hemen lm35 ler ile işlemci arasına 10k seri direnç koyun ve bu dirençlerin işlemci tarafına yani adc girişlerine şase ile arasına 100nf kondansatör ekleyin .

not: programa hiç bakmadım, hata varmı bilmiyorum

fahri-

LM35 lerin çıkışına Dalgalanmayı ve gürültüyü süzecek şekilde RC filtre eklerseniz daha stabil ölçüm yaparsınız. (10K, 100n gibi)

chaoss

Teşekkürler arkadaşlar yazılımsal bir çözüm bulabilirmiyiz?  :-\
\\\In Tolerance Be like the Sea/ // Hz. Mevlana

Maxim

Alıntı yapılan: chaoss - 14 Ocak 2011, 11:23:05
Teşekkürler arkadaşlar yazılımsal bir çözüm bulabilirmiyiz?  :-\

o filtreler olmak zorunda
yazılımsal olarakta her adc girişinden 10 kere ard arda örnek alıp toplam örneği 10 a bölerseniz daha stabil olur .
ama 10k ve 100nf olsun .

chaoss

Bu örnek alma konusunda biraz daha araştırma yapmam gerek, Bu programda ADC konusund nasıl örnekleme yapabilirm ?
\\\In Tolerance Be like the Sea/ // Hz. Mevlana

chaoss

#6
Arkdaşlar , Bu şekilde örnekleme doğrumu? 
SENSOR1
toplam1=0
for w=0 to 9
ADCIN 0,HAM '0 nolu kanaldan Analog değeri oku ve RAW değişkenine aktar.
BAK1 
IF ADCON0.2=1 THEN BAK1 'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.
ISI=(5*HAM)-(5*HAM/64)-(5*HAM/128)
ISI=ISI/10
toplam1=toplam1+isi
next w
isi=toplam1/10
RETURN
\\\In Tolerance Be like the Sea/ // Hz. Mevlana

OG

Programı incelemedim, LM35 gibi analog sensorlerin kablolaması çok çok önemlidir.

Sensör uzakta ise,
Yol kayıpları (sensor milivoltlar ile çıkış verir), kabloya binen parazitler bir şekilde önlenmelidir.

Ben deniz suyunu LM35 ile ölçüp otele kadar 200m kablo ile taşıdım. Ama bunu direk kablolama ile yapamazsınız.

Çözüm şudur. LM35'e 5V değil 9-12V gibi bir voltaj göndereceksiniz. Devre üzerinde 5V'a düşürecek ve süzeceksiniz. LM35'in çıkışına 12F675 gibi bir pic bağlayacak ve ölçümü bu pice yaptıracaksınız. Okuduğunuz değeri 12F675'in başka bir portundan seri data olarak ana devreye göndereceksiniz.

Datayı gönderirken header (tanımlama datası), ardından en az iki defa okunan değeri göndereceksiniz.

SEROUT2 picpin, 813,["BENITANI", okunan,okunan,okunan]    gibi

Alıcı taraf ise
oku:
SERIN2 picpin,813,[WAIT("BENITANI"),alinan_1,alinan_2,alinan_3]

if alinan_1 <> alinan_2 then oku
if alinan_1 <> alinan_3 then oku  gibi doğrulama yapacaksınız.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

chaoss

 
Alıntı yapılan: OG - 14 Ocak 2011, 16:33:13
Programı incelemedim, LM35 gibi analog sensorlerin kablolaması çok çok önemlidir.

Sensör uzakta ise,
Yol kayıpları (sensor milivoltlar ile çıkış verir), kabloya binen parazitler bir şekilde önlenmelidir.

Ben deniz suyunu LM35 ile ölçüp otele kadar 200m kablo ile taşıdım. Ama bunu direk kablolama ile yapamazsınız.

Çözüm şudur. LM35'e 5V değil 9-12V gibi bir voltaj göndereceksiniz. Devre üzerinde 5V'a düşürecek ve süzeceksiniz. LM35'in çıkışına 12F675 gibi bir pic bağlayacak ve ölçümü bu pice yaptıracaksınız. Okuduğunuz değeri 12F675'in başka bir portundan seri data olarak ana devreye göndereceksiniz.

Datayı gönderirken header (tanımlama datası), ardından en az iki defa okunan değeri göndereceksiniz.

SEROUT2 picpin, 813,["BENITANI", okunan,okunan,okunan]    gibi

Alıcı taraf ise
oku:
SERIN2 picpin,813,[WAIT("BENITANI"),alinan_1,alinan_2,alinan_3]

if alinan_1 <> alinan_2 then oku
if alinan_1 <> alinan_3 then oku  gibi doğrulama yapacaksınız.


1. sensör ile kart arasındaki kablo mesafesi yaklaşık 20mt.
2. sensör ile kart arasındaki kablo mesafesi yaklaşık 5 mt.

Bu metrajlarda da dediğiniz sistemi yapmak zorundamıyız?
ki böyle bir durum varsa ds18b20 kullanmak daha mantıklı pull-up direncini düşürerek daha uzak mesaflere bilgi gönderebiliyoruz die biliyorum.( Bu devre için yazıyorum 200mt hakkında bir fikre sahip değilim)
\\\In Tolerance Be like the Sea/ // Hz. Mevlana

OG

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

chaoss

verdiğiniz bilgiler için tşkkür ederim devreyi ds18b20 sensörüyle revize etmem gerekecek, Bu na benzer sıcaklık ölçümlerinde dijital sensör kullanmak daha mantıklıyımış bunu öğrenmiş olduk :) forumda bir akrdaş 60 mt kablo ile ölçüm yaptığını yazmış bu benim için çok güzl bi rakam,
bilgiler için tekrardan teşekkürler,
iyi çalışmalar
chaoss...
\\\In Tolerance Be like the Sea/ // Hz. Mevlana