NTC ile Sıcaklık Ölçümü

Başlatan picker, 20 Nisan 2009, 01:55:00

xenix

Bu mesajı yukarıdaki formulün isbatı olarak yazıyorum, ilgilenenler için :) beni matematiğe boğma diyenlerin sadece yukarıdaki formülü kulanmaları yeterli :)

NTC ler için en genel formül:

R1=R2 × exp(K×( 1/T1 - 1/T2 ))

Burada R1 T1 deki direnç değeri, R2 ise T2 deki direnç değeri. Sıcaklıklar kelvin cinsinden. Şimdi biz NTC nin 25° deki direncini biliyoruz. 25 derece 25+273=298Kelvin yapar. O zaman formül şu hale gelir.

R=R25° × exp(K×( 1/(T+273) - 1/298 ))

Bu formülde sıcaklık artık santigrad. R25 bilinen bir şey, örneğin 10k, K ise NTC nin datasheetinden bulunabilir, 10k NTC ler için 4100 civarında.

Bu formül ile sıcaklığı dirence çevirebiliriz. Ama bize lazım olan direnci sıcaklığa çevirmek. R25° karşı tarafa bölüm olarak geçirelim, iki tarafında doğal logaritmasını alalım, unutmadan ln(exp(x))=x dir.
ln(R/R25°)=ln(exp(K×( 1/(T+273) - 1/298 )))
ln(R/R25°)=K×( 1/(T+273) - 1/298 ), buradan T yi çekersek;

T=1/( (ln(R/R25°))/K + (1/298) ) -273

aradığımız formülü bulmuş oluruz. Burada R yerine voltaj bölüm formülünü koyarsak gerilimi sıcaklığa çeviren formülü elde ederiz. Gerilimi de 255 ile çarpıp 5 e bölerek ADC sonucunu sıcaklığa çeviren formülü bulabiliriz buluruz, o da bir yukarıdaki formül:

T=(1/( LN( (R*ADC / (255-ADC))/R25° )/K + 1/298 ) ) - 273

Maxim

xenix hocam ,
K değerini bilmediğimiz bir ntc nin K değerini hesaplayabilmemiz mümkünmüdür ? yoksa üreticinin verisine muhtaçmıyız ?
veya en üstteki yolumu izlemek zorundayız ,yanlışım yoksa orada K değeri kullanılmamış .

xenix

25° deki direncini biliyoruz. Bunun haricinde başka bir sıcaklıktaki direncini de bilirsek aşağıdaki formule koyup bulabiliriz.

R1=R2 × exp(K×( 1/T1 - 1/T2 ))

K=ln(R1/R2)/(1/T1- 1/T2)

Sıcaklıklar, kelvin, santigratlara 273 eklemeliyiz.

xenix

R2 ve T2 değeri olarak NTC yi kaynar suya daldırıp ölçtüğünüz değeri kullanabilirsiniz.

Maxim

formuldeki "exp" expand mi demek hocam ?

xenix

exp(x)=e^x= e üzeri x

Bütün programlama dillerinde exp(x) olarak kullanılır.

Maxim

şimdi birkaç deneme yaptım ,
sanırım bu Beta değerininde ilgili dereceler arasında hesaplanarak veriliyor
yani atıyorum beta:3810 ama hangi dereceler arasındaki beta ?

0-50 derece ise,
biz 0 - 100 derece arasındaki direnç değerlerine göre beta hesabı yapıyorsak sonuç hatalı çıkıyor ,
denedim , 0-50 derece değerleri ile neredeyse aynı çıktı , yanlışmıyım?

xenix

Bir yerlerde yanlışınız var gibi.
Şu datasheetin 3. sayfasındaki NTC ye göre hesap yaptım, şu K değerlerini buldum:

R50°-R25° → K=3933
R85°-R25° → K=3973
R100°-R25° → K=4006

aralarında fark var, hangisini kullanmalı? Özellikle hangi sıcaklık değerlerine yakın çalışacaksak onu seçmeliyiz. 100° civarında çalışacaksam, orda az hata yapmak istiyorsam K=4006 kullanırdım. Örneğin üst mesajlarda yazdığım formul 91 derece civarı olması gereken sıcaklığı K=4006 için 91,3° hesaplarken K=3933 için 92,8° hesaplıyor, yarım derece fark var, yani K daki ±100 lük değişimler sıcaklık ölçümünü pek de etkilemiyor. Zaten bu hata datasheetdeki NTC nin %3 hassasiyetinin içinde.

picker

Alıntı yapılan: "ozcanozay"Sevgili konuyu açan arkadaş, NTC'nin direnç değeri bildiğin gibi sıcaklık ile değişiyor, senin hesabın  doğru ama çok uzun, NTC direncini hesaplayan 4 satır ve sıcaklığı hesaplayan tek satır kod yazdım, herşey mükemmel çalışıyor (toplam 5 satırda) ama kodu vermeyeceğim sen vermiyorsun ya hahaha

Güzel... Benim kodumda o kadar. Yukarıdakileri tek bir formülde birleştirmenin ne kadar kolay olduğunu sanırım sen de anlamışsın...

Tebrikler ve başarılı çalışmalarının devamı dileklerimle...

ÖZLÜ SÖZ :
İnsanları köle yapmak istiyorsan onlara balığı hazır ver ki, hep sana muhtaç olsunlar.

İnsanları özgür kılmak istiyorsan, onlara balık tutmayı öğret ki kimseye bağlı kalmasınlar...

picker

Alıntı yapılan: "xenix"Bir yerlerde yanlışınız var gibi.
Şu datasheetin 3. sayfasındaki NTC ye göre hesap yaptım, şu K değerlerini buldum:

R50°-R25° → K=3933
R85°-R25° → K=3973
R100°-R25° → K=4006

aralarında fark var, hangisini kullanmalı? Özellikle hangi sıcaklık değerlerine yakın çalışacaksak onu seçmeliyiz. 100° civarında çalışacaksam, orda az hata yapmak istiyorsam K=4006 kullanırdım. Örneğin üst mesajlarda yazdığım formul 91 derece civarı olması gereken sıcaklığı K=4006 için 91,3° hesaplarken K=3933 için 92,8° hesaplıyor, yarım derece fark var, yani K daki ±100 lük değişimler sıcaklık ölçümünü pek de etkilemiyor. Zaten bu hata datasheetdeki NTC nin %3 hassasiyetinin içinde.

Yaptığınız hesap dar aralıklar için kesinlikle doğru.

Bununla birlikte tüm aralığı minimum hata ile ölçmek istiyorsanız, benim verdiğim eğri formülüyle NTC'nin genel fonksiyonunu çıkartmalısınız.

Bazı arkadaşlar sanmış ki tüm o hesaplamalar yazılıma gömülecek. Hayır, başta yapılacak ve sonrasında çıkan fonksiyon program içerisinde kullanılacak.

Eğer NTC'yi -40 +150 arasında hassas ölçümle kullanmak istiyorsanız, -40, 25 ve +150 derece değerleri için verdiğim formülden katsayıları hesapladığınızda, bütün bu aralıkta neredeyse hatasız sonuç elde ettiğinizi göreceksiniz.

Yok eğer 3-5 derece aralıkda ölçüm yapmakdan bahsediyorsak, o takdirde mutlaka xenix'in formülünü kullanırdım.

ErsinErce

#25
@picker hocam tekrardan Teşekkürler

Verdiğiniz formülle C# da kendimce bir program yazdım.
Formüldeki katsayıları bulup daha sonra bu katsayılar üzerinden karşılaştırma yapabiliyoruz ayrıca
Rp(pullup direnci) sayesinde adc girince hangi değerin hangi sıcaklığa karşılık geldiğini görüp tablo şeklinde çıktıda alabiliyoruz.

Programın linki NTCCalc.rar
rarlı 17.8 KB, açılınca 192KB

Eksik gördüğünüz veya yanlış olan bir tarafı varsa bildirirseniz sevinirim.

JKramer

Teşekkür ederim, gayet başarılı bir program. Hatta kodları bile veriyor :). Ben de Excel'de yaptığım NTC Calc.xls dosyasını rafa kaldırabilirim artık :).

Erol YILMAZ

cynetron;
program çok başarılı ellerine sağlık,,,

biraz da grafik olsa daha hoş olur.

hopehard

çalışmanız güzel bende katkıda bulunayım ntc ile yaptığım kartta ısıyı ölçüp modbus üzerinden gönderebiliyorum bununla oparetör panelleri ve scada ile haberleşilebilir.

SpeedyX

Alıntı yapılan: FxDev - 26 Haziran 2010, 19:52:47Yine de elinize, kolunuza sağlık. Yoksa kullanacağım projemde teker teker elimle yazacaktım.
Program çok güzel ama ufak bir not: bu tarz işler için genelde matlab kullanıyorum, tek tek yazmaya gerek yok, minik bir döngü herşeyi sizin yerinize hallediverir.

clc;
clear all;

Supply = 3.3;
Rp = 63.6;

fprintf('ADCTempTable[]={');
for Tx=-50:100
    R = 15*(2.71828)^(3440*(1/(273+Tx)-1/298));
    V = Supply*(R/(R+Rp));
    ADC = round(V/(Supply/1023));
%    fprintf('R=%f Temp=%d V=%f ADC=%f\n',R,Tx,V,ADC);
%    fprintf('Temp=%d ADC=%d\n',Tx,ADC);
    fprintf('%d,',ADC);
end
fprintf('};');

fprintf('\nNTable[]={');
 for N=0:128; fprintf('%d,',round(((178 + 25 + (0.16)*N)^2)/178)-1); end;
fprintf('};');

fprintf('\nEnergyTable[]={');
 for T=-50:100; fprintf('%1.3f,',((0.285 - 0.003135 * (T - 25.0)) * 1)); end;
fprintf('};');