Protonda ntc okuma ..

Başlatan mustafa_cmbz, 18 Ekim 2014, 06:17:23

mustafa_cmbz

Merhabalar...

Geçenlerde bir sensör içerisindeki ntc yi okuyup değerlendirmem gereken bir proje ile uğraşıyordum.Araya başka işler girince yarım kalmıştı.Şimdi yeniden devam ediyorum.


https://www.picproje.org/index.php/topic,24675.0.html

Forumda daha önce açılan bir konuda ersin arkadaş bir program paylaşmıştı.O programı indirip c dilindeki yazılımı değiştirerek proton'a uyarladım.Çokta kolay oldu.Fakat ntc değeri ile ölçülen değer arasında hiç bir uyum yok.

Belki kodu uyarlarken veyahutta benim yaptığım bir yanlıştan dolayı bir sıkıntı var ama bir türlü bulamadım.

kodlar aşağıdaki gibi.:

Device 18F452
'CONFIG XT_OSC , WDT_OFF , PWRTE_ON , BODEN_ON , LVP_OFF , WRTE_OFF , CP_OFF , DEBUG_OFF 
Xtal=20 
'Include "Proton18_4.Inc"
Declare LCD_Type 0 
Declare LCD_DTPin PORTD.4 
Declare LCD_ENPin PORTD.3 
'DECLARE LCD_RWPIN = PORTd.2 ******* buraya dikkat ********
Declare LCD_RSPin PORTD.2 
Declare LCD_Interface 4 
Declare LCD_Lines 2

ADCON1 = %10000000
Declare Adin_Res 10         'ADC ÇÖZÜNÜRLÜÐÜ 10 BÝT 0...1023 
Declare Adin_Tad FRC
Declare Adin_Stime 50       'ÖRNEKLEME ZAMANI 50 US


Dim LnRt As Float
Dim ADC  As Float
Dim RA   As Float  
Dim RB   As Float  
Dim RC   As Float
Dim T    As Float   
Dim RT   As Float  


' 10k ntc kullanıyorum.

RA= 0.000627905938165509                ' -10 derece için
RB = 0.000227302471218448               '  25 derece için
RC = 0.0000000715553390346178       '   80 derece için 


BASLA: 
ADC = ADIn 0
RT = (3300.0 * ADC)/(1024.0 - ADC)
LnRt = Log (RT)
T = (1.0/(RA + Rb*LnRt + Rc*pow(LnRt, 3.0)))-273.15 
Print At 1,1 ,"ISI: ", Dec8 T 

GoTo BASLA 

End 


program kısmı da şu şekilde :




Kullandığım tabloda bir çin satış sitesinde ntc teknik detaylarının altında buldum bilmiyorum doğrumudur değilmidir..








Maxim

#1
mustafa öncelikle verilen tabloda gariplik var
25 derecede 10.0000 yazıyor bu 10k mı?
10.000 olması gerekmezmi?
10.0000 aslında 100k
edit:
sondan 1 hane atmalısın tabloda.


ikincisi
float işlemlerde 1 satırda 3 işlemden fazla hesap yapmamalısın
yani bu satırı 3 lü aritmetik işlemlere bölerek hesapla
T = (1.0/(RA + Rb*LnRt + Rc*pow(LnRt, 3.0)))-273.15

MC_Skywalker

#2
Benzer bir sıkıntıyı bende mbed tte sorun yaşıyorum sanırım benim problemim formülleri proramda düzgün işleyememek.
Alıntı Yap
Elimde sadece 25C de 10K oladuğu biline bir NTC var bunu kullanara öncelikle PIC ile sıcaklık ölçmek isitiyorum.

(Resim gizlendi görmek için tıklayın.)
Alıntı Yap
Material: Messing vernickelt
Messgenauigkeit: ca. 0,3K (Präzisionsmessung möglich)
Kabel: 2-Pin Stecker mit ca. 50cm Kabel
Widerstand 10KOhm

Malzeme: nikel kaplama pirinç
Ölçüm hassasiyeti: yaklaşık 0.3K (hassas ölçüm mümkün)
Kablo: 50cm kablo ile 2-pimli fiş
Direnç: 10KOhm
elimde hiç bir veri olmadığı için öncelikle su sebilinden 2 bardak su aldım ve IR termometre yardımıyla aşağıdaki şu değerlere ulaştıp notettim.

25C -> 298,15Kelvin ->10000 ohm
15,2C-> 288,15Kelvin -> 15613 ohm
65C -> 338,35Kelvin ->2666 ohm

(Resim gizlendi görmek için tıklayın.)

işlerim nedeni ile şimdilik ara vermek zorunda kaldım.



//  +3.3V O----/\/\10k/\/\----|p15|----/\/\NTC/\/\----O 0V
//T = (1.0/(A + B*LnRt + C*pow(LnRt, 3.0)))-273.15;
// formulede kullanilmak uzere hesaplanan duzeltme katsayilari 
//A = -577,585
//B = 91,91317
//C = -0,34424
// lpc1768'in ADC si 12bit
#include "mbed.h"

Serial pc(USBTX, USBRX);
AnalogIn ntcadc(p15);

double Ra = -577.585;
double Rb = 91.91317;
double Rc = -0.34424;
double T = 0;
double i = 0;
double Rt = 0;
double LnRt = 0;

int main()
{
    pc.printf("\x1B\x48\x1B\x4A");                           //imlec satirbasina ve ekrani temizle VT52 komutlari
    pc.printf("*****[ okunan ]*****");                       // :)
    while(1)                                                 //Sonsuz dongu
           {                               
           pc.printf("\x1B\x48");                            //imlec satirbasina VT52 komutlari
           i = ntcadc.read();
           Rt = (10000 * i) / (4096 - i);
           LnRt = log(Rt);
           T = (1.0/(Ra + (Rb * LnRt) + (Rc * pow(LnRt, 3.0)))) - 273.15;  //
           pc.printf("\n\n\rADC okuma sonucu: %d ",T);       
                                                             
           wait(1);                                         
           }
}