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
(https://i.ibb.co/H70bJ95/ss.jpg) (https://ibb.co/H70bJ95)
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.
ayrı bir besleme yada güzel bir Power kompanze problemini çözer sanırım.
Besleme LM2596 ile gayet güzel.
Ben pic register ayarlarından şüpheleniyorum.
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
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 ?
(https://i.hizliresim.com/ADGY4L.png) (https://hizliresim.com/ADGY4L)
HAM_DEGER=ADIn 1
VOLT= (HAM_DEGER * 5) /1023
VOLT=VOLT*1000
VOLT=VOLT/10
Print At 3,3,"LM35-2: ", Dec1 VOLT ," C"
(https://i.hizliresim.com/LlGYY0.png) (https://hizliresim.com/LlGYY0)
Verdiğim kısımda bu şekilde değer okuyabiliyorsun..
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.
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.
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 ?
(https://i.hizliresim.com/ADGY4L.png) (https://hizliresim.com/ADGY4L)
HAM_DEGER=ADIn 1
VOLT= (HAM_DEGER * 5) /1023
VOLT=VOLT*1000
VOLT=VOLT/10
Print At 3,3,"LM35-2: ", Dec1 VOLT ," C"
(https://i.hizliresim.com/LlGYY0.png) (https://hizliresim.com/LlGYY0)
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.
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
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