LCD ekranda 4 ayrı sıcaklık okuma için yardım ltf .

Başlatan Maxim, 05 Aralık 2005, 15:34:17

Maxim

Herkese slm ,

Daha önce aşağıdaki linkte de birşeyler yapmaya çalıştığımı anlatmıştım ,
(Kısaca anlatmak gerekirse ben ,aracımın 4 adet silindir çıkışındaki ayrı ayrı sıcaklıkları tek bir lcd ekranda görebilmek istiyorum )
baktım uzun iş ,gittim hazır bir panel metre aldım ,12 volt ile çalışan ,taktım 1 adet type K prob olay çözülmüş gibi oldu ,fakat nedense bu bir türlü içime sinmiyor ,benim sıcaklıkları ayrı ayrı olarak aynı anda görmeliyim .

https://www.picproje.org/index.php/topic,6149&highlight=

Tekrar söylüyorum pic programlamayı bilmiyorum ,bunun için bir arkadaşımdan yardım aldım ,picbasic ile bir program yaptık ,biryerlere geldik fakat buradan daha ileriye gidemiyoruz ,belki giderizde çok uğraşmamız gerekiyor ,belki sizin yardımınızla daha çabuk halledebiliriz ,

Yaptığım çalışma ,picbasic hex , source ları ve proteus simulasyonuna eger arzu ederseniz buradan bakabilirsiniz ,
http://rapidshare.de/files/8653600/thermo.zip.html

Bu programı yazdık ,

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [set under view...options]                        *
'*  Notice  : Copyright (c) 2005 [set under view...options]     *
'*          : All Rights Reserved                               *
'*  Date    : 19.11.2005                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
' Picbasic Pro program to read pots on 16F877 ADC

' Define LCD pins
DEFINE  LCD_DREG        PORTD
DEFINE  LCD_DBIT        4
DEFINE  LCD_RSREG       PORTD
DEFINE  LCD_RSBIT       2
DEFINE  LCD_EREG        PORTD
DEFINE  LCD_EBIT        3

' Define ADCIN parameters
DEFINE	ADC_BITS	10	' Set number of bits in result
DEFINE	ADC_CLOCK	3	' Set clock source (3=rc)
DEFINE	ADC_SAMPLEUS	20	' Set sampling time in uS


'Define ADC_SAMPLEUS 50 
'DEFINE ADC_Clock3 
'!TRISA = %00001011

' Allocate variables
x1      VAR     WORD
x2      VAR     WORD
x3      VAR     WORD
x4      VAR     WORD
A       VAR     WORD
B       VAR     WORD
C       VAR     WORD
D       VAR     WORD
   
       
        ADCON1 = $82              ' Set PortA 0, 1, 3 to A/D inputs

        LOW PORTE.2             ' LCD R/W line low (W)
        PAUSE 20               ' Wait for LCD to start
        GOTO    mainloop        ' Skip subroutines


' Subroutine to read a/d converter
getad:
        PAUSEUS 50             ' Wait for channel to setup
        ADCON0.2 = 1            ' Start conversion
        PAUSEUS 20             ' Wait for conversion

        RETURN

' Subroutine to get pot x value
getx1:
        
        
        ADCON0 = $41            ' Set A/D to Fosc/8, Channel 0, On
        GOSUB getad
        A.LowByte= ADRESL
        A.HighByte= ADRESH  
        x1 = A 
        
        RETURN

' Subroutine to get pot y value
getX2:
        ADCON0 = $49            ' Set A/D to Fosc/8, Channel 1, On
        GOSUB getad
        B.LowByte= ADRESL
        B.HighByte= ADRESH 
        x2 = B
        RETURN

' Subroutine to get pot z value
getX3:
        ADCON0 = $51            ' Set A/D to Fosc/8, Channel 2, On
        GOSUB getad
        C.LowByte= ADRESL
        C.HighByte= ADRESH 
        x3 = C
        RETURN

getX4:
        ADCON0 = $59            ' Set A/D to Fosc/8, Channel 3, On
        GOSUB getad
        D.LowByte= ADRESL
        D.HighByte= ADRESH 
        x4 = D
        RETURN

mainloop:
        GOSUB   getx1            ' Get x value
        GOSUB   getX2            ' Get y value
        GOSUB   getX3            ' Get z value
        GOSUB   getX4            ' Get z value
        PAUSE   100 
        
        LCDOUT $FE, 1
        LCDOUT  "1->", #x1
        'Lcdout $FE, 2
        'LCDOUT $FE,$14,$FE,$14,$FE,$14,$FE,$14,$FE,$14,$FE,$14,$FE,$14,"C"
        'Pause   50 
        LCDOUT $FE, 2         
        LCDOUT $FE,$14,$FE,$14,$FE,$14,$FE,$14,$FE,$14,$FE,$14,$FE,$14,$FE,$14,$FE,$14, "2->", #x2
        'Pause   50
        LCDOUT $FE,$C0, "3->", #x3
        'Pause   50
        LCDOUT $FE,$C9, "4->", #x4
        'Pause   50
        GOTO    mainloop        ' Do it forever

        END


Şimdi asıl problemimizi anlatmak istiyorum ,

4 silindirli bir arabam var ,
haliyle motordan 4 tane ekzost çıkışı mevcut ,bunları ayrı ayrı ama bir tane lcd ekran üzerinde görmem gerekiyor ? neden gerekiyor ? araç oldukça modifiyeli ve turbo ,silindirlerin içerisindeki sıcaklık belirli bir seviyenin üzerine çıkmaması lazım ,hatta bu devreye alarm bile eklemem gerekiyor ,mesela bir set değeri verip sıcaklık o değerin üzerine çıktığı anda bir buzzer beni uyarabilir .

Bu değeri okumak için TYPE K tipi thermo couple kullanıyorum ,biliyorsunuz max 1200 dereceye kadar ölçüm yapabiliyor ,bunlardan 4 tane takıp ,her birinin çıkışına 4 tane de AD595 entegresi koyuyorum ,
http://www.analog.com/en/prod/0,,766_811_AD595,00.html
evet bu entegre çok pahalı ama 4 tane pistondan daha ucuz ,herneyse .

Bu entegre thermocouple çıkışındaki ucubik voltajı anlaşılır bir değere çeviriyor ,100 derece -1 volt ,800 derece 8 volt ,1100 derece 11 volt gibi ,

şimdi ,simulasyondada göreceğiniz gibi ,bir gerilim bölücü direnç yardımı ile 1200 derecede 12 volt olan ad595 çıkışını 12 volt=5 volt gibi bölüyoruz ,fakat olay bundan sonra bizi aşıyor :)

pic 16c877 de 10bit adc kullandık ,yani 0- 1023 arası kısacaı 0volt -5 volt =0 -1023 değerine kadar olan bölge tamam ,bundan sonrasını nasıl anlatayım bilemiyorum ?,ad595 entegresinden 12 volt çıkınca lcd ekranda 1200 yazması lazım biz onu halledemiyoruz ,pic basic de bölme işlemi yaptırıyoruz fakat , (virgül) den sonraki rakkamları kaybediyoruz ,yani bölme sonucunda tam sayı aldığımız için doğru bir kıyaslama yapmamız mümkün olmuyor ,umarım anlatabilmişimdir .
Hepinize teşekkürler .

Code tag lütfen

Maxim

Rapidshare de bi gariplik var ,
proje dosyaları burada ,MaxiBoost altındadır .

http://groups.yahoo.com/group/PicProjeUP15/files/

aster


Maxim

Alıntı yapılan: "aster"Böyle bir şey mi yapmak istiyorsunuz?

Tam anlamadım ama ,
lcd derken piyasada satılan 2 X16 karakter lcd  .
simulasyon devresindeki gibi ,

Maxim

Arkadaşlar tık yok  :roll:
acaba sorunu benmi anlatamadım düzgünce sizlere ,yada ilginizimi çekmedi ?

stlg

Sevgili maxiboost
Arkadasım ben programlarımı asm de yazıyorum ama sana su sekilde anlatabilirim programında bir adet tablo hazırlayacaksın olctugun degeri
degişik degerlerle karsılastıracaksın ve bu bilgiler  seni bu tabloda bir yere goturecek sen bu tablodaki degeri lcd ekrana aktaracaksın baya zahmetlice bir iş ama guzel sonuclar verir istersen lineer olmayan bir olcumu bile bu sekilde yapabilirsin atıyorum 1v olcumu 1000 goster
2v olcumu 1500 goster gibi inşallah anlatabilmişimdir kolay gelsin

       ALLAHA EMANET OLUNUZ
ALLAHA EMANET OLUNUZ Hoştur bana senden gelen,  Ya gonca gül yahut diken,  Ya kaftandır yahut kefen,  Kereminde hoş lütfunda hoş.

Maxim

selamlar ,

sene sonu yoğunluğu nedeni ile biraz ara vermiştim ,dün akşam bayaa bir arama tarama sonucunda işime yarayacak cevabı gene burada buldum ama biraz daha sorun var .

https://www.picproje.org/index.php/topic,7139

buradaki mhk arkadaşın örneğinden faydalanarak bir çalışma yaptık ,
Orjinali bu şekilde ,

' PicBasic Pro program to measure voltage (0-5VDC) 
' and display on LCD with 2 decimal places 
' 
' This program uses the */ operator to scale the 
' ADC result from 0-1023 to 0-500.  The */ performs 
' a divide by 256 automatically, allowing math which 
' would normally exceed the limit of a word variable. 
' 
' Connect analog input to channel-0 (RA0) 

' Define LCD registers and bits 
DEFINE  LCD_DREG        PORTD 
DEFINE  LCD_DBIT        4 
DEFINE  LCD_RSREG       PORTE 
DEFINE  LCD_RSBIT       0 
DEFINE  LCD_EREG        PORTE 
DEFINE  LCD_EBIT        1 

' Define ADCIN parameters 
DEFINE  ADC_BITS        10        ' Set number of bits in result 
DEFINE  ADC_CLOCK       3        ' Set clock source (3=rc) 
DEFINE  ADC_SAMPLEUS    50       ' Set sampling time in uS 

adval  VAR WORD               ' Create adval to store result 


      TRISA = %11111111      ' Set PORTA to all input 
        ADCON1 = %10000010      ' Set PORTA analog and right justify result 
        Low PORTE.2            ' LCD R/W line low (W) 

        Pause 500                   ' Wait .5 second 

loop:    ADCIN 0, adval               ' Read channel 0 to adval (0-1023) 

      adval = (adval */ 500)>>2      ' equates to: (adval * 500)/1024 

       LCDOut $fe, 1               ' Clear LCD 
        LCDOut "DC Volts= ",DEC (adval/100),".", DEC2 adval   ' Display the decimal value  

        Pause 100                   ' Wait .1 second 

        GoTo loop                   ' Do it forever 
        End




Programı bu şekilde değiştirdim ,


' Define LCD registers and bits 
DEFINE  LCD_DREG        PORTD 
DEFINE  LCD_DBIT        4 
DEFINE  LCD_RSREG       PORTD 
DEFINE  LCD_RSBIT       2 
DEFINE  LCD_EREG        PORTD 
DEFINE  LCD_EBIT        3 

' Define ADCIN parameters 
DEFINE  ADC_BITS        10        ' Set number of bits in result 
DEFINE  ADC_CLOCK       3        ' Set clock source (3=rc) 
DEFINE  ADC_SAMPLEUS    20       ' Set sampling time in uS 

adval  VAR WORD               ' Create adval to store result 


        TRISA = %11111111      ' Set PORTA to all input 
        ADCON1 = %10000010      ' Set PORTA analog and right justify result 
        Low PORTE.2            ' LCD R/W line low (W) 

        Pause 50                   ' Wait .5 second 

loop:   
        ADCIN 0, adval               ' Read channel 0 to adval (0-1023) 
        adval = (adval */ 1200)>>2      ' equates to: (adval * 1200)/1024 
        LCDOut $fe, 1               ' Clear LCD 
        LCDOut "CIKIS= ",DEC (adval/1),"." ,DEC2 ADVAL' Display the decimal value  
        Pause 100                   ' Wait .1 second 
        GoTo loop                   ' Do it forever 
        End



Programın son hali  ,

' Define LCD registers and bits 
DEFINE  LCD_DREG        PORTD 
DEFINE  LCD_DBIT        4 
DEFINE  LCD_RSREG       PORTD 
DEFINE  LCD_RSBIT       2 
DEFINE  LCD_EREG        PORTD
DEFINE  LCD_EBIT        3 

' Define ADCIN parameters 
DEFINE  ADC_BITS        10       ' Set number of bits in result 
DEFINE  ADC_CLOCK       3        ' Set clock source (3=rc) 
DEFINE  ADC_SAMPLEUS    20       ' Set sampling time in uS 

INPUT1  VAR WORD                  ' Create adval to store result 
INPUT2  VAR WORD
INPUT3  VAR WORD
INPUT4  VAR WORD

SET     var word
        TRISA = %11111111        ' Set PORTA to all input 
        TRISD = %00000001       ' 
        ADCON1 = %10000010      ' Set PORTA analog and right justify result 
        Low PORTE.2             ' LCD R/W line low (W) 
        READ 101,SET.highbyte
        READ 100,SET.LOWbyte
        'Pause 50                   ' Wait .5 second 

loop:   
       
       IF PortD.0=1 then
       Lcdout $FE, 1
       LCDOUT $FE,$C0,"SET DEGERI=",DEC SET
       Pause 100 
       READ 101,SET.highbyte
       READ 100,SET.LOWbyte
       set=SET+10
       WRITE 101,SET.HIGHbyte 
       WRITE 100,seT.LOWbyte                            
       endif
       IF (INPUT1>=SET OR INPUT2>=SET OR INPUT3>=SET OR INPUT4>=SET) THEN
       PORTD.1=1
       ELSE
       PORTD.1=0
       ENDIF
       goto zero
      
zero:   
        
       IF PORTD.0 =0 THEN
       GOTO ADCLOOP
       ELSE
       GOTO ZERO                                              
       ENDIF 
ADCLOOP:        
       ADCIN 0, INPUT1               ' Read channel 0 to adval (0-1023) 
       INPUT1 = (INPUT1 */ 1200)>>2      ' equates to: (INPUT1 * 500)/1024  
       PAUSE 50
       ADCIN 1, INPUT2               ' Read channel 0 to adval (0-1023) 
       INPUT2 = (INPUT2 */ 1200)>>2      ' equates to: (INPUT1 * 500)/1024  
       PAUSE 50
       ADCIN 2, INPUT3               ' Read channel 0 to adval (0-1023) 
       INPUT3 = (INPUT3 */ 1200)>>2      ' equates to: (INPUT1 * 500)/1024  
       PAUSE 50
       ADCIN 3, INPUT4               ' Read channel 0 to adval (0-1023) 
       INPUT4 = (INPUT4 */ 1200)>>2      ' equates to: (INPUT1 * 500)/1024  
       PAUSE 50
       
       LCDOut $fe, 1               ' Clear LCD 
       LCDOut "1>",DEC INPUT1 '(INPUT1/100),DEC2 adval ' Display the decimal value  
       LCDOUT $DF
       Lcdout $FE,$89, "2>" ,DEC INPUT2        
       LCDOUT $DF             
       Lcdout $FE,$C0, "3>" ,DEC INPUT3        
       LCDOUT $DF             
       Lcdout $FE,$C9, "4>" ,DEC INPUT4        
       LCDOUT $DF 
       PAUSE 50          
           
       IF set>=1200 then 
       WRITE 100,0
       WRITE 101,0 
       endIF
       
       GoTo loop                   ' Do it forever 
       End



fakat simulasyonda girişe 5.0 volt verince lcd ekranda 1198.98 okuyorum ,bu olay 1023 - 1024 olayından kaynaklanıyor heralde .
Mesela 1200 değerini 10 yaparsanız yani 0-1023 olan giriş değerini 0-10 olarak lcd ye atarsanız hata iyice belirgin oluyor  9.09  gibi .
acaba burada ne gibi bir finetuning yapılabilir ?


http://groups.yahoo.com/group/PicProjeUP15/files/
burada maxiboost altında çalışmanın son versiyonu var ,isteyen inceleyebilir ,devreye set değeri girişinide ekledik ,10'ar 10'ar arttırabiliyorsunuz ,4 girişin herhangibiri set değerinin üzerine çıkarsa lamba yanar .Burada set tuşuna basınca lcd ekranın bir kaç saniye set değerinde kalmasını istedik fakat henüz olmadı .

aYe

AD595 yerine 1/4 fiyatina maxim var. Tam olarak ayni işi görürmü bilmiyorum ama datasheet'in son sayfasında thermocouple için application vermişler.
http://pdfserv.maxim-ic.com/en/ds/MAX430-MAX432.pdf

Thermocouple'unu maxim ds2760'a baglayip 1wire ile sıcaklığı okuyabilirsin.Hem 4 tanesini tek kabloya baglamanda mümkün. Daha temiz bir montaj çıkar. Motor kısmından içeri taşıman gereken kablo sayisi sadece bir.(gnd zaten şase)
http://pdfserv.maxim-ic.com/en/an/1wirethermo.pdf

Maxim de konuyla alakalı bir dünya şey var, istersen girip bir göz at.
İyi çalışmalar...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

Maxim

Teşekkürler arkadaşım fakat Ad595 kullanmak istiyorum o entegre sadece o iş için üretilmiş doğal olarak bir takım üstünlükleri var ,fiyatı o yüzden uçuk ,üstelik bunun beslemesi + - ,seri üretim yapmayacağım için fiyatını dert etmiyorum ,ama dediğin gibi maximin sayfalarını inceliyorum da .

Devre üzerinde vakit buldukça çalışmaya devam ediyorum ,bayaa yol aldım ,program hazır sayılır ,delikli pertinax üzerine toplamaya başladım ,bir kaç malzeme eksiğim daha var onları tamamladıktan sonra çalıştırıcam .En kısa zamanda son halini sizinle paylaşırım .

İlerledikçe başka sorunlar çıkıyor ,mesela zaten basit olan ad595 devresi hazır kullanıyorum ,fakat type k ısı probunun çabuk okuma yapması için kullanılan kılıfın kalın olmaması gerekiyor .İlk yaptırdığım sensörde buna pek dikkat etmediğim için okuma yavaş oluyordu (algılama diyelim ) .Hızlı okuma yapabilmek için üretici firma tc nin birleşim yerini probun uç kısmına kaynak yapmayı önerdi .Bu süper hızlı okuma demek fakat aracın şasesinde - kutup olduğu için bu sorun teşkil etmekte .Bende ne yapsam acaba diye düşünüyorum . böyle gidiyor işte ....

aster

Sıcak Nokta ( termo eleman çiftinin birleştiği yer) kesinlikle bir yere değmemeli, daha doğrusu termokupl tamamen izole olmalı
ölçüm yerine ise bir yalıtkanla temes ettirmen gerekli
bu yalıtkanın iyi ısı ileten malzeme olması senin ısıyı hızlı okuman anlamına gelir, olaya böyle bakarak çalışmalarına yön ver
örnek porselen çok iyi ısı iletir, bizim komponentlerde kulandığımız ısı ileten izalasyon bez silikonlardan kullanabilirsin termoelemanı bu silikonla sarıp yüzeye temes ettirirsen farkı görebilirsin
veya termokuplu yaptırırken ince fişek türü bir kılıfa koydurabiliyorsan buda olacaktır

Maxim

http://redlinegauges.com/product_info.php?cPath=22&products_id=20&dfwtekid=e381a4d1aa7a9d42e929c4acf0b57536

adresteki proba göz atarmısınız ,adam incecik yere nasıl sığdırmış olabilir 2 adet kabloyu bir yere değmeden ? bu işte bi tuhaflık var ,anlarız yakında .
Bunun gibi çok örnek var egt gauge diye aratabilirsiniz .

http://redlinegauges.com/product_info.php?cPath=22&products_id=23&dfwtekid=e381a4d1aa7a9d42e929c4acf0b57536

hatta bazı modellerde birleşim yeri açıkta bırakılmış daha çabuk okusun diye .Yukardaki adreste

aster

verdiğin resimler dediğim gibi fişek (bayonet) türü diye tabir ettiğimiz kılıflardan
ama bunu kullana bilmen için motor gövdesi sanırım kulanacağın yer oralarda buna hazne yeri yani delik açman gerek, sonra bunlara diş çekeceksin ve verdiğin resmi iyi incele termo eleman içine giriyor sonra üstündeki rekoru buraya kitliyorsun hatta iyi temas etsin diye bu araya bir de yay koyarlar termoeleman yüzeye sıkıca basar ama sıcak nokta kesinlikle açıkta değildir
http://katalog.elimko.com.tr/Pdf_files/TC/tc_bayonet_tip.pdf
sen bunu bir imalat için düşünüyorsan pratiklik olmasını göz önüne almak zorundasın, örnek olarak aklıma şu geldi videolarda drum motor üstünde nem (dew) sensörleri olur, ayrıca araçlarda da ısı için radyatör üstünde ısı nuzulları olur onların durumlarınıda bir incele

ilk msj tekrar okudum her silindiri ayrı ayrı ölçmek istiyorum diyorsun
bu çok zor bir işlem çünkü silindir gövdesi yekpare tek bloktan oluşur
ısıyı iyi algılaman için içlere kadar girmen gerek, yoksa ısı genel blok üstünde zaten dağılacaktır

aYe

Selam Aster hocam,
Sanirim motorun performansini arttirmak için manifoltu kaldirip 4 silindir için de ayrı ayrı egzoz çıkışları vermiş, 4 silindir için ayrı ayrı olan isilari bu egzos çıkışları üzerinden ölçmek istiyor. Ne kadar etkili olur bilemiyorum ama niyeti böyle gibi. Blok üzerinden tek sicaklikta okuyabilir de sanirim nitroksit gibi bir uygulamada sicakliği geç farkettiğinde motoru kaybetmiş olabilir.  Manifoltu kaldirmadiysa sizin dediğiniz tamamen dogru 4 sensör'den de birbirine çok yakın değerler dışında bişey okumayacaktır. Her hangi bir silindir bir sebepten dolayı çalışmazsa ısı farkından ancak ariza tespiti için istifade eder. Gerçi her halükarda üzerinde bu kadar oynanamış araçlar bir süre sonra kaybedilir :D İyi çalışmalar...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

aster

Sahi ya senin piston kollarını silindir gövdesini delip kaputtan çıkardığın maceraların vardı  :)
evet tecrübeyi dinliyelim

aYe

Alıntı yapılan: "aster"Sahi ya senin piston kollarını silindir gövdesini delip kaputtan çıkardığın maceraların vardı  :)
evet tecrübeyi dinliyelim
Abi bizim şöför modifiyeliydi :D Sizin bilmediğiniz birde sahil yolunda 300'le viraja girilerek yapılan "bir taşla palmiye katliamı" projem var :D Sensörünü bulursam ben de bir adrenalin göstergesi yapmak istiyorum :) İşin şakası bir yana tutkularının arkadaşı elektronige yaklaştırmış olması çok güzel. Giden gider bilgisi kalır. Yalnız arkadaşın en pahalısı en iyisidir şeklindeki mantigina katilmiyorum. Analog devices bir çok firmaya onbinlerce yüzbinlerce adette ürün verir, bir çok cdrom cep telefonu gibi ürünün içinde analog devices ürünlerini görürüz. Basit bir hesapla o aletlerin fiyati içindeki analog devices ürünlerinin toplanmından daha ucuzdur. Buda şunu net bir şekilde gösterir ki; Analog Devices adetler söz konusu olunca en ucuza mal satan firmadır,dolayısıyla zaten bütün üretimi pazarlamış durumdadır , extra satışlar sadece extra gelirdir ve fiyatları budur alıcının işine gelirsedir. Sample'i ücretli veren nesli tükenmiş semiconductor üreticilerinin son temsilcisi olarak antipatimi sonuna kadar kazanmıştır....
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)