Arkadaşlar,
Şu sıralar aldığım bir termometre siparişini henüz bitirdim. Bu arada, NTC ile -40 ile +100 derece arasındaki sıcaklıkları nasıl ölçebileceğimi epey bir araştırdım. Aslında burada nasıl ölçebileceğim derken, hassas ölçümden bahsediyorum. Yoksa NTC'yi lineer kabul edip 5-6 derece fark ölçmek kolay. Yine 5-10 veya 20 derece aralıklı bir tablo oluşturup 2 dereceye kadar farklı ölçmek de son derece kolay. Bahsettiğim, herhangi bir andaki derece değerini tam ölçmek ile ilgili. Ve sonunda bulup uyguladım.
Yaptığım devrenin şemasını ve kodunu elbette vermeyeceğim. (Şemanın dosyası yok çünkü şu anda).
Aşağıda anlatacağım yöntem ile sıcaklık hesabı yapıldığında devremin testlerinde şunu gördüm :
1. Kalibrasyondan sonra, civalı termometre ile aynı değerleri çok yakın aldım.
2. Piyasada satılan ticari termostatlara göre çok daha hızlı yanıt veren bir sonuç elde ettim.
Şimdi gelelim hesaplarımıza.
Bir kere, NTC direnç değerine karşılık gelen derece (kelvin cinsinden) şu aşağıdaki formüle eşit :
T=1/(A+B.ln(R) + C.ln^3(R))
Bu formül nedir? Bilindiği gibi NTC'nin sıcaklık eğrisi aşağı doğru azalan logaritmik bir eğridir. Bu formül, o eğrinin fonksiyonunu verir.
Aslında tam fonksiyon T=1/(A+B.ln(R)+C.ln^2(R)+D.ln^3(R)) dir fakat yazdığımız kadarı dahi 0.1'den daha hassas sonuç vermektedir. NTC'lerin tablolarındaki sonuçları da bire bir vermektedir.
Buradan da
1/T=A+B.ln(R) + C.ln^3(R)
olur. Bu formüldei R, o andaki ölçülen direnç değeridir.
Burada A, B ve C katsayılarını bulmamız gerekecektir.
Bunun için NTC'nin tablosuna bakacağız (hani 5 veya 10 derece aralık ile direnç değerlerini veren tablo). Buradaki derece değerlerine 273,15 ekleyerek her bir derecenin kelvin cinsinden karşılığını bulacağız.
Şimdi, 3 adet derece ve 3 adet karşılık gelen direnç değeri elimizde oldu.
Ne yapıyoruz?
3 bilinmeyenli 3 denklemimizden A, B ve C katsayılarımızı hesaplıyoruz.
Sonrasında yukarıdaki formülü aynen yazılımımızda kullanıyoruz.
Analog-Dijital çevirici portumuzdan okuduğumuz gerilimden direnç değerini hesaplayıp, formülümüz yardımıyla anında sonucu buluyoruz.
Herkese sevgiler...
Neden lm35 değil ntc eksi degerlerlemi ilgili
birtane canlı hesaplama örneği görebilirmiyiz yukarıdaki formül için ?
Arkadasım, örnek kod koysan ne olur?Paylasım formundasın.Bilgiyi paylasmaktan korkma.
Alıntı yapılan: "stlg"Neden lm35 değil ntc eksi degerlerlemi ilgili
Evet LM35 ile bu tip uygulamalar çok kolay yapılabiliyor.
Eksi değer olarak -55 ile +150 derece LM 35 ile ilgili uygulama örneği datasheet dosyasında var.
sonuç
Değerli arkadaşlar,
Öncelikle 2 soruya yanıt vereyim.
1. Neden LM35 değilde NTC?
Arkadaşlar, sıcaklığı n faklı yöntemle ölçebilirsiniz. Bunların bazıları son derece kolay, bazıları ise biraz daha meşakkatlidir. Bununla birlikte uygulamayı çalıştıracağınız ortam, koşullar sizi belli bir takım sensör tiplerini seçmeye itebilir. Bu sebeple her uygulama DS1820, LM35, DS1620, NTC veya PTC ile yapılamaz. Dolayısıyla bunun sorgulanması çok da doğru değil.
2. Neden kod vermiyorum?
Burada mevzu nasıl analog dijital dönüştürülür değil. Yukarıda yazdıklarım kod yazmak için yeterlidir. O bilgiye ulaşmak benim 2 günümü aldı yaklaşık. Ondan önce de ısı tablosu ile yapma gayretine girdim. Fakat floating point kullandığımdan dolayı bir süre sonra PIC hafızası değişken sayısını kaldırmamaya başladı. Bu sebeple ben de önce yukarıda yazdığım formülasyona ulaştım. Sonra da yaklaşık 8-10 satırlık bir kod ile her değer için hassas direnç değerini dizi değişken kullanmadan, if-then'lerle uğraşmadan, tek değişken ile çözdüm. Şimdi deniyor ki sen o kadar uğraştın, balığı tuttun, balığı bana ver... Hayır... Balığı vermeyeceğim. Ama bir arkadaşımın isteği üzerine nasıl balık tutulacağını anlatacağım... (Hesaplama örneği)
1K NTC için hesaplama örneği
NTC datasheet'inde 1K NTC için sıcaklık tablosuna bakıyoruz (Murata marka).
Şimdi üç farlı değer için (Örneğin -10, 0 ve 25 derece olsun) direnç değerlerini seçelim...
-10 Derece için 4829 Ohm
0 Derece için 2977 Ohm
25 Derece için 1000 Ohm (NTC'lerin değerleri 25 derecedeki dirençleri için verilir).
Şimdi bu derece değerlerini Kelvine çeviriyoruz.
-10 Derece : 263,15 kelvin
0 Derece : 273,15 Kelvin
25 Derece : 298,15 Kelvin
Bunlar bizim T1, T2 ve T3 değerlerimiz...
Şimdi 1/T1, 1/T2 ve 1/T3 değerlerini hesaplayalım.
Sırasıyla : 0,0038, 0,003661, 0,003354 değerlerini bulduk.
Şimdi, Ln(4829), Ln(2977) ve Ln(1000) (Bu direnç değerlerinin 10 tabanına göre logaritmalarını alıyoruz) değerlerini hesaplayalım.
Bunlar da sırasıyla
8,48
8
6,91 çıktı.
Şimdi bunların 3. kuvvetlerini (küplerini) alalım.
Sırasıyla :
610,32
511,74
329,62
değerlerini bulduk.
Dolayısıyla şu üç denklemi elde ediyoruz :
0,0038=A+8,48.B+610,32.C
0,003661=A+8.B+511,74.C
0,003354=A+6,91.B+329,62.C
Şimdi buraya kadar verdim hesabı.
Bu 3 denklemden A, B ve C'yi hesaplayıp katsayıları buluyoruz.
Devam ediyoruz.
Önce 1. denklemin tüm katsayılarını 2. denklemdeki C'nin katsayıları ile çarpıyoruz.
Sonra 2. denklemin tüm katsayılarını 1. denklemdeki C'nin katsayıları ile çarpıyoruz.
Şu çıkıyor :
1,944689127=511,7449437A+4340,822591B+312326,6113C
2,234365537=610,3169464A+4881,72468B+312326,6113C
Bu iki denklemi birbirinden çıkarıyoruz. Şunu elde ediyoruz :
-0,28967641=-98,57200268A-540,9020892B+0C
Aynı işlemi 2 ve 3. denklemler için yapıyoruz ve :
-0,794427349=-280,6990144A-1419,970714B+0C
Şimdi 2 bilinmeyenli 2 denklemimiz oldu.
Bu 2 denklemi çözdüğümüzde :
A=0,001549185
B=0,000253225
Buluyoruz.
Birinci denklemde bu değerleri yerine koyup C'yi çekiyoruz ve
C=1,68718E-07
değerini buluyoruz.
Yani bizim kelvin cinsinden sıcaklığımız
T=1/(0,001549185+0,000253225ln(R)+1,68718E-07(lnR)^3)
oluyor.
Santigrad cinsinden sıcaklığımız ise
C=[1/(0,001549185+0,000253225ln(R)+1,68718E-07(lnR)^3]-273,15 oluyor.
Şimdi bu denklemimizin doğruluğunu test edelim.
Datasheetden 40 derece için direnç nedir ona bakalım.
558 Ohm görünüyor.
Dolayısıyla
[1/(0,001549185+0,000253225ln(558)+1,68718E-07(ln(558))^3]-273,15
hesapladığımızda 40 bulmalıyız.
ln(558)=6,324358962
ln^3(R)=252,9586506
Dolayısıyla formülümüz :
[1/(0,001549185+0,001601488+4,26787E-05)]-273,15
Buradan da
1/0,003193352-273,15
=313,1505791-273,15
C=40,00057908 santigrad bulunur.
Görüldüğü gibi 10'da bir değil, yüzde bir değil, binde bir değil, 10binde 5 hata ile sonucu bulduk. (Yukarıda bazı yuvarlamaları yapmış olmasam tam sonuç bulacaktık).
Herkese sevgiler.
Not : Şu formülleri bulmak için ille de yabancı kitapları karıştırmak zorunda kalmamalı insanlar.
Ama bizde bilgi paylaşımı (Bilgi paylaşımı ile hazırcılığı burada ayırmak gerekiyor) korkulan birşey...
Umarım sizler katıldığınız diğer forumlarda bu bilgileri paylaşırsınız...
Dediğiniz gibi kod yazmak işin kolay tarafı siz zor olanı bizimle paylaşmışsınız. İhtiyacı olan istediği dilde bunu kod'a çevirebilir. Teşekkürler
Böyle bir paylaşımda bulunduğunuz için çok teşekkürler. Balığı pişirmeyi bile göstermişsiniz =)
Alıntı yapılan: "picker"Değerli arkadaşlar,
Şimdi, Ln(4829), Ln(2977) ve Ln(1000) (Bu direnç değerlerinin 10 tabanına göre logaritmalarını alıyoruz) değerlerini hesaplayalım.
Bunlar da sırasıyla
8,48
8
6,91 çıktı.
Ln 10 tabanına göre değildir "e" tabanına göre logaritmadır.
Alıntı yapılan: "tayyar"Alıntı yapılan: "picker"Değerli arkadaşlar,
Şimdi, Ln(4829), Ln(2977) ve Ln(1000) (Bu direnç değerlerinin 10 tabanına göre logaritmalarını alıyoruz) değerlerini hesaplayalım.
Bunlar da sırasıyla
8,48
8
6,91 çıktı.
Ln 10 tabanına göre değildir "e" tabanına göre logaritmadır.
Tayyar arkadaşımız doğru söylüyor. Doğal logaritma olan ln(x) e tabanına göredir. e=2,71...
Uyarı için teşekkürler...
picker
açıklamalar için teşekkürler.
Tesekkurler.NTC lerle ılgılı gercekten detaylı bılgıler.Bircok kısıye faydası olacagı kacınılmaz.Bu tur bılgılerın paylasılması dılegıyle herkese kolay gelsın.
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
Kullandığın NTC nin K veya B (beta) olarak anılan bir katsayısı var, bunu bildikten sonra hesaplaması kolay.
NTC yi R direnci ile pull-up yaptığımızı varsayalım. NTC nin bir bacağı GND ye diğer bacağı da 8bit analog-dijital çeviriciye gitsin. ADC sonucunu sıcaklığa şu formul ile çevirebiliriz:
T=(1/( LN( (R*ADC / (255-ADC))/R25 )/K + 1/298 ) ) - 273
Burada R25 25° deki direnç değeri, T nin birimi santigrat, ADC ise 8 bit ADC sonucu. Örneğin ben LMEM marka 5cr22 model NTC kullanıyorum. Bu NTC için K=4038, R25=10k, 3010 ohm ile pullup yapıyorum. Sıcaklık formulü:
T=(1/( LN( (3010*ADC / (255-ADC))/10000 )/4038 + 1/298 ) ) - 273
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
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ış .
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.
R2 ve T2 değeri olarak NTC yi kaynar suya daldırıp ölçtüğünüz değeri kullanabilirsiniz.
formuldeki "exp" expand mi demek hocam ?
exp(x)=e^x= e üzeri x
Bütün programlama dillerinde exp(x) olarak kullanılır.
ş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?
Bir yerlerde yanlışınız var gibi.
Şu (http://www.google.com.tr/url?sa=t&source=web&ct=res&cd=6&url=http%3A%2F%2Fwww.vishay.com%2Fdocs%2F29114%2Fntcalug.pdf&ei=-VbQSoyLMIOEmgOyy9iQAw&rct=j&q=filetype%3Apdf+ntc+table+k&usg=AFQjCNHJqx2bNUipHD6TbRzX4g3fCrJMdw&sig2=w0JK6psiMAYwAF04IV6dSA) 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.
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...
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.
@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 (https://www.mediafire.com/?9qs0q2402qu20ly)
rarlı 17.8 KB, açılınca 192KB
Eksik gördüğünüz veya yanlış olan bir tarafı varsa bildirirseniz sevinirim.
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 :).
cynetron;
program çok başarılı ellerine sağlık,,,
biraz da grafik olsa daha hoş olur.
ç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.
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('};');
cynetron ,
program harika eline sağlık
Asıl ben Herkese Teşekkür Ederim, elinizden geldiğince öğrenmek isteyenlere katkı sağlıyorsunuz,
çorbada ufak da olsa bir tuzumuz olduğunu ümit ediyorum.
Grafiksel olarak üzerinde pek birşey yok haklısınız biraz düzeltme yapılması lazım. Şuan ki yoğunluğumu atlatır atlamaz üzerine eğileceğim.
@FxDev hocam Pullup dirençlerinde genellikle Rp kısaltılması kullanıldığı için hızlıca onu yazdım dikkat çektiğin için teşekkürler =)
@hopehard hocam modbus ile ilgili çalışmanı eğer yayınlayabilirsen nasıl bir geliştirme yapabileceğimizi tartışabiliriz.
Son olarakda kaynak dosyası burda arkadaşlar; http://www.mediafire.com/download/bqn9yrrd3gxbzjk/NTC+Calc+Source.rar (http://www.mediafire.com/download/bqn9yrrd3gxbzjk/NTC+Calc+Source.rar) alternatif link http://www.4shared-china.com/file/GzkW7pd6/NTC_Calc_Source.html (http://www.4shared-china.com/file/GzkW7pd6/NTC_Calc_Source.html)
Herkese İyi Çalışmalar...
cynetron ,
mesajlarına bakarmısın
selam
Konuyu başından beri takip ediyorum. PT100,TC ve IC'ler üzerine bir çok çalışmam olmuştu ama NTC'ler ile yeni yeni tanışmaya başladım.
Açıkcası ilk önce yazılanları pek anlayamadım bunun nedeni B model ve Steinhart-Hart model iki farklı kalibrasyon yöntemini birbirine karıştırmış olmam.
Kendi çapımda özetlemem gerekirse NTC için bir birinden farklı doğrulukda üç farklı kalibrasyon yöntemi var.
1. NTC'nin bir bölgesini özellikle 15-55 gibi dar bir bölgesini +/- 5 derece gibi 25 dereceden uzaklaştıkca hatası artar şekilde birinci dereceden bir fonksiyonla kalibre edilmesi. (y=ax+b)
Bu yöntem daha çok masa üzeri sıcaklık göstergelerinde kullanılıyor genellikle oda sıcaklığı 25 Dereceye yakın olduğu için doğruluk yüksek oluyor.
2. B Model;
Üreticininverdiği yada sonradan hesaplanabilen bir katsayı (B değeri) ile R25 denilen 25 derecedeki direnç değeri kullanılıyor.
RT = R25 exp(B/TT - B/T25)
3.Steinhart-Hart model;
üç farklı sıcaklık ve bu sıcaklıklardaki direnç değerleri alınarak a,b,c isimli üç adet sabit katsayı elde ediliyor ve
T = (1.0/(Ra + Rb*LnRt + Rc*pow(LnRt, 3.0)))-273.15;
yerine konularak sıcaklık değeri bulunuyor.
Not:NTC'nin direnç değerinin nasıl bulundundan bahsetmiyorum!?
Aşağıdaki linkte bulunan program görsel olarak konu ile ilgili görsel iyi bir kaynak.
http://www.thinksrs.com/support/Therm%20Calc/NTCCalibrator/NTCcalculator.htm
Not: Konu ile ilgilenen arkadaşların Orhan Doğa'nın aşağıda linki blunan kitabından epeyce faydalandığını düşünüyorum. Güzel bir kaynak...
http://www.google.com/books?hl=tr&lr=&id=8hOjMFy10yIC&oi=fnd&pg=PR11&dq=Microcontroller+Based+Temperature+Monitoring+%26+Control,+Elsevier+%282002%29&ots=NGP2V0vQ-O&sig=nQEbdvV8T3LDBu_vbjVvl0fcx_0#v=onepage&q&f=false
Saygılarımla,
Ntc ler maksimum kac metre uzaklıkta ve ne tur kablo ile kullanılabilir
eğer kablo direncini kompanze edebiliyorsan , binlerce , onbinlerce hatta milyonlarca kilometre kablo kullanabilirsin. Eğer uzun bir kablo kullanılacaksa blendajlı olmasında faya var.
süper ötesi bir program olmuş çok teşekkürler
hocam çook teşekkürler... bu bilgiler oldukça kıymetli
Alıntı yapılan: xenix - 09 Ekim 2009, 17:05:54
R2 ve T2 değeri olarak NTC yi kaynar suya daldırıp ölçtüğünüz değeri kullanabilirsiniz.
arkadaşlar yalnız dikkatli olun suyun kaynama değeri yükseltiye bağlı olarak değişir. 0m'de 100 de kaynar. 1000 m'de 96 veya 97 de kaynar. hesabınızı ona göre yapın...
verilen bilgiler için tşk ederim arkadaşlar.. programı tekrar yükleyebilirseniz sevinirim..
Kolay gelsin..
S.A.
CCS C ye yeni yeni alıştırmalar yapıyorum program gayet güzel çalıştı elinize sağlık.
Alıntı yapılan: 3L3CTRO - 10 Haziran 2011, 20:45:28
verilen bilgiler için teşekkür ederim arkadaşlar.. programı tekrar yükleyebilirseniz sevinirim..
Kolay gelsin..
S.A.
Sn. Arkadaşım prog bu linkte:
http://www.4shared.com/get/vbyvZQeO/NTC_Calc.html (http://www.4shared.com/get/vbyvZQeO/NTC_Calc.html)
Alıntı yapılan: mert07 - 13 Temmuz 2011, 10:45:44
Alıntı yapılan: 3L3CTRO - 10 Haziran 2011, 20:45:28
verilen bilgiler için teşekkür ederim arkadaşlar.. programı tekrar yükleyebilirseniz sevinirim..
Kolay gelsin..
S.A.
Sn. Arkadaşım prog bu linkte:
http://www.4shared.com/get/vbyvZQeO/NTC_Calc.html (http://www.4shared.com/get/vbyvZQeO/NTC_Calc.html)
Merhaba Mert07 hocam;
Dosyayı baska bir yere upload edebilirmisiniz. İndiremedim.
Teşekkürler
murat07 hocamın büyük katkısıyla ntc ile sıcaklık ölçmeyi başardım yukarıda her şey dogru bir şekilde ele alınmıştır. balık tutması ögretilmiştir.balıgı vermek isterdim ama benim karnım ac.. ;D
S.A.
Yeni linkler:
http://www.upload.gen.tr/d.php/www/7u4v8d66/NTC_Calc.rar.html (http://www.upload.gen.tr/d.php/www/7u4v8d66/NTC_Calc.rar.html)
http://s2.dosya.tc/download/f3pKa5/NTCCalc.rar.html (http://s2.dosya.tc/download/f3pKa5/NTCCalc.rar.html)
konuyu hortlatmak gibi olmasın ama aşağıdaki lik çoğu kişinin işine yarar.
http://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm (http://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm)
S.A.
Sayfa olarak güzelmiş. Yukarıdaki programda çok güzel işe yarıyor aslında.
arkadaşlar bu başlıktaki formülleri kullanarak 16f877 ile bir termostat yaptım. çok güzel çalışıyor. Şimdide ucuz olduğu için 16f716 aldım ancak aşağıdaki formül satırına gelince rom bellek doluyor.
"a segment or the program is too large exp"
T = (1.0/(Ra + Rb*LnRt + Rc*pow(LnRt, 3.0)))-273.15;
pow(LnRt, 3.0)
fonksiyonunu kaldırdığımda rom hatası olmuyor. internetten yaptığım araştırmalara göre bu hata bir fonksiyonun ana programdan büyük olması nedeniyle meydana geliyor. Acaba bu fonksiyonu başka türlü yazma imkanı olabilirmi. pic'imi değiştirmek gerekiyor. önerileriniz nedir?
Alıntı yapılan: ertsen - 21 Ocak 2013, 20:41:27
arkadaşlar bu başlıktaki formülleri kullanarak 16f877 ile bir termostat yaptım. çok güzel çalışıyor. Şimdide ucuz olduğu için 16f716 aldım ancak aşağıdaki formül satırına gelince rom bellek doluyor.
"a segment or the program is too large exp"
T = (1.0/(Ra + Rb*LnRt + Rc*pow(LnRt, 3.0)))-273.15;
pow(LnRt, 3.0)
fonksiyonunu kaldırdığımda rom hatası olmuyor. internetten yaptığım araştırmalara göre bu hata bir fonksiyonun ana programdan büyük olması nedeniyle meydana geliyor. Acaba bu fonksiyonu başka türlü yazma imkanı olabilirmi. pic'imi değiştirmek gerekiyor. önerileriniz nedir?
en tepeye #include <math.h> satırını koyduğunu farzederek diyebilirim ki o fonksiyonu (LnRt*LnRt*LnRt) bununla değiştir.Program hafızası o kütüphane fonksiyonlarına yeterli gelmiyor ya daha geniş ROM lu bir pic kullan ya da yazılımı optimize etmeye çalış ve de math.h kütühanesinden kurtularak diğer fonksiyonları ROM'a yazmasını engelle.
Alıntı yapılan: AsHeS35 - 21 Ocak 2013, 21:01:15
en tepeye #include <math.h> satırını koyduğunu farzederek diyebilirim ki o fonksiyonu (LnRt*LnRt*LnRt) bununla değiştir.Program hafızası o kütüphane fonksiyonlarına yeterli gelmiyor ya daha geniş ROM lu bir pic kullan ya da yazılımı optimize etmeye çalış ve de math.h kütühanesinden kurtularak diğer fonksiyonları ROM'a yazmasını engelle.
math. h'ı kullanıyorum. (LnRt*LnRt*LnRt) yide denedim ancak sonuç aynı. math.h'ı da düzenleyim gereksizleri kaldırayım dedim, oda bayağı karışık. en güzeli biraz daha büyük roma sahip bir pic'le devam etmek galiba. Teşekkür ederim.
bir sürücüden ntc söktüm ama tipi nedir ?bilmiyorum.bu ntc lerin hepsi aynımıdır?üzerinde kod filan yazmıyor.burdaki yazılımları bunun üzerinde uygulayabilirmiyim?
(http://g1302.hizliresim.com/16/7/jvc1j.jpg)
25 derecede ölçtüğünüz değer neyse ntc'nin değeri odur. Yine ölçüm yaparken ısıtın, değeri artıyorsa ptc, azalıyorsa ntc'dir. Bunların dışında kataloğuna ulaşamıyorsanız, önceki sayfadaki yöntemlerle (kaynatma,vs.) uğraşmanız gerekecek. Bilgilerine ulaşabileceğiniz bir ürün alsanız daha kolay olur sanırım :).
Alıntı yapılan: fractal - 07 Şubat 2013, 10:53:32
bir sürücüden ntc söktüm ama tipi nedir ?bilmiyorum.bu ntc lerin hepsi aynımıdır?üzerinde kod filan yazmıyor.burdaki yazılımları bunun üzerinde uygulayabilirmiyim?
(http://g1302.hizliresim.com/16/7/jvc1j.jpg)
Merhaba,
Lug tip diye geçer bu tip ntcler.
http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=lug+type+ntc (http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=lug+type+ntc)
Konuyu hortlatıyorum ama NTCCal. programı için verilen link açılmıyor.Tekrar yükleyebilecek ya da gönderebilecek olan var mı?
FORM SİTELERİNDE BİLGİ PAYLAŞILIR
BAHSEDİKEN PROJENİN KAYNAK KODLAR (SERİ DİREN 10K, NTC 25 DERECEDE 10K ) DEĞERLERİNE GÖRE HESAPLANMIŞTIR >:(
#include <16F88.h>
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)
#define use_portb_lcd TRUE
#define LCD_ENABLE_PIN PIN_B3
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_TYPE 1
#include <lcd.c>
#include <math.h>
// which analog pin to connect
#define THERMISTORPIN A0 // resistance at 25 degrees C
#define THERMISTORNOMINAL 10000 // temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25 // how many samples to take and average, more takes longer
#define NUMSAMPLES 5 // The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3950 // the value of the 'other' resistor
#define SERIESRESISTOR 10000
int samples[NUMSAMPLES];
unsigned int t ,i;
float average;
float steinhart;
void main()
{
lcd_init();
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_32);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
set_tris_a(0xFF);
set_tris_b(0x00);
lcd_putc("\f");
lcd_putc("EVRENSEL ISI KONTROL");
delay_ms(100);
while(1)
{
set_adc_channel(0);
for (i=0; i< NUMSAMPLES; i++)
{
samples = read_adc();
delay_ms(10);
}
for (i=0; i< NUMSAMPLES; i++)
{
average += samples;
}
average /= NUMSAMPLES;
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
steinhart = average / THERMISTORNOMINAL; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15;
lcd_putc("\f");
printf(lcd_putc,"%3.1f 'C",steinhart);
delay_ms(1000);
}
}
10k NTC ile logaritmik hesaplarla uğraşmadan en kolay ve en az yer kaplayacak şekilde 0.2 derece hassasiyetle nasıl sıcaklık okuyabilirim?
Şuan logaritmik hesaplamayla sıcaklığı okuyorum ancak bu bana 2kb hafıza kaybına mal oluyor. Daha ekonomik çözümler nedir? Tablo mu yapayım ?
tablo boyutunuz 11 bit okuma yaparsanız kafa kafaya denk geliyor.
10 bit olursa 1kB kazançtasınız tabi 1C-2C şeklinde görmek yeterliyse
diğer türlü 10 bit kafa kafaya gelir
NTC ile 0.2 derecelik yüksek çözünürlüğe ihtiyaç neden peki ?
Yani virgülden sonrada bişeyler göstermek için aslında çokta kritik değil (Ortam sıcaklığı ölçülecek)
ADC 12bit ama Çözünürlükte çok sıkıntı değil. 1kb kazanç iyi bi değer. Bununla ilgili bir örnek var mıdır? Daha doğrusu hazır yapılmış bir tablo.
önceki sayfalarda PC yazılımı mevcut NTC nin ve pull-up direncinin değerlerini girip istediğiniz tabloyu alabilirsiniz
Ntc_Calc programı elinde olan yükleyebilir mi? Linkler uçmuş.
https://www.mediafire.com/?9qs0q2402qu20ly (https://www.mediafire.com/?9qs0q2402qu20ly)
3 senedir hâla düzenleme yapamamışım =/
Teşekkürler
mesaj birleştirme:: 05 Nisan 2014, 00:52:58
8bit çözünürlük yeterli geldi. Birazda ortalama aldım virgülden sonrası içinde iyi oldu. Programı yapana hayır duası gönderdim.
Yahu konu ile ilgili benimde bu aralar sıkıntılarım var ısı ile kompanze edilen bir sensörün içerisindeki ntc yi okumam gerekiyor.
Neden yapamadığım hususunda araştırmalar yapınca bu konuyu buldum.Buldum fakat temel anlatım biraz bana göre ağır matematiksel işlemler ile dolu dolu bir içeriğe sahip olduğu için işin içinden çıkamadım.
Forumda okuduklarım işin tamamen temelini anlatıyor.Fakat neyi işlemciye hesaplatıp neyi kendimizin hesaplaması gerektiğini anlayamadım.
Protonda yazıyorum bu konuda bu matematiksel işlemleri benim anlayabileceğim şekilde örnekleyebilecek varmı acaba ?
biraz klişe olacak ama hocam programı yeniden upload ederseniz sevinirim uçmuş yine :)
http://www.mediafire.com/download/6uc6z3hxtb3ms9z/NTC_Calc.rar (http://www.mediafire.com/download/6uc6z3hxtb3ms9z/NTC_Calc.rar)
eywallah hocam teşekkür ederim
konuyu hortlatmak gibi olacak ama ben arduino ile ntc dijital termometre yapmam lazım.
ntc 1K
25 Derece için 1000 Ohm
10 Derece için 2500 Ohm
40 Derece için 625 Ohm
link atılan programdan A B C değerlerini A=-1.998388320 B=10.15336182 C=-50.40044718 çıktı.bu değerler bana yanlış gibi geldi yardımcı olursanız sevinirim.
değerler kesin yanlış
bende çıkanlar:
a:-0,00199838831952605
b:0,00101533618200839
c:-0,00000504004471834171
Hata yapmisim.direnç değerlerini yanlış bulmusum.farkli sıcaklıklarda direnç değerini nasıl bulurum kolay bir yolu var mı?
zamanında şu şekilde bir yöntem izledim.
1 - ntc ve direnç ile bir gerilim bölücü yaptım,
2 - birinci avomotrenin termostat probu ile ntc yi aynı ketıla koydum.
3 - ikinci avometre ile gerilim bölücü gerilimini ölçtüm
4 - ketılın tuşuna bastım
5 - aynı anda hem gerilimi ölçen avometreyi hem de sıcaklığı ölçen avometreyi kameraya aldım.
6 - sonra ntc ve termostat probunu derin dondurucuya koyup(ölçü aletlerini dışarıda tutarak) yine sıcaklık ve voltaj değerlerini kameraya kaydettim.
7 - oturup pc başında videoları izleyerek gerilim - sıcaklık tablosunu çıkardım.
endüstriyel bir ürün değildi ve sanırım cihaz halen çalışıyor.
Alıntı yapılan: tekosis - 15 Kasım 2015, 00:39:39
zamanında şu şekilde bir yöntem izledim.
1 - ntc ve direnç ile bir gerilim bölücü yaptım,
2 - birinci avomotrenin termostat probu ile ntc yi aynı ketıla koydum.
3 - ikinci avometre ile gerilim bölücü gerilimini ölçtüm
4 - ketılın tuşuna bastım
5 - aynı anda hem gerilimi ölçen avometreyi hem de sıcaklığı ölçen avometreyi kameraya aldım.
6 - sonra ntc ve termostat probunu derin dondurucuya koyup(ölçü aletlerini dışarıda tutarak) yine sıcaklık ve voltaj değerlerini kameraya kaydettim.
7 - oturup pc başında videoları izleyerek gerilim - sıcaklık tablosunu çıkardım.
endüstriyel bir ürün değildi ve sanırım cihaz halen çalışıyor.
bu düşünce yanlıştır
aynı anda her isi sensörün okuma hızı farklı olacağından o anda not ettiğiniz sıcaklık değerleride farklı olacak
ketıldaki su ısınıyor
multimetrenin probu değeri hızlı okuyacaktır
ama ntc probunun dış metal gövdesinden içerideki sensöre kadar ilerleyen ısı gecikme oluşturacaktır
yani ısınmakta olan suda diyelim multimetre probu 62 derece gösteriyorsa
belkide o anda ntc 58 derece gösteriyordur
nasıl yapıcam peki bir önerin var mı?
Merhaba,
Konuyu okudum ve bir şey merak ettim.
Niçin NTC lerin direnç değerleri çok değişik. Örneğin 100R NTC kullanmakla 100K NTC kullanmak arasında ne fark var?
S.A.
X1000 fark var. Isı kontrollerinde genelde hassas ısılarda 4.7k 10k, orta ısılarda 10k-22k 50 C üzerinde 47k-100k ntc kullanırlar. Klima sistemlerinde böyle.
Teşekkürler.
selamun aleyküm
Arkadaşlar ntc tipi sensöre seri kondansatör bağlayıp kondansatör şarj deşarj zamanı ile ölçme yapamaz mıyız.
dediğiniz yöntemle analog girişleri olmayan mcu'larda yapılan uygulamalar gördüm ama ne kadar sağlıklı olur bilemem.
@temha,TT Technic (https://www.google.com.tr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjsrZDF8KDTAhWmBZoKHT8KDlkQFgiFATAA&url=http%3A%2F%2Fwww.hepsiburada.com%2Ftt-technic-tm-1011-sicaklik-ve-nem-olcer-pm-hrmtvtttm1011&usg=AFQjCNErHYdbt8CxKaU81THCFGcZWf41Eg&sig2=R8qkCH3tNS5aaPmheMKydQ&bvm=bv.152180690,d.bGs) marka sıcaklık nem ölçerin,[/size][/font]
NTC'ye giden kablosunu skopla incelediğim zaman bahsettiğin yöntemle okuduğunu farkettim.Gayette güzel 0.1 derece çözünürlüklü sıcaklık okuyordu..Bir tane alıp sen de inceleyebilirsin.
Bildiğim kadarıyla NTC ve PTC lerin sıcaklığa tepkileri lineer değildi ve farklı fonksiyonlardan geçirilmesi gerekiyordu.
Eğer öyleyse şarj deşarla direk direnç değeri okunur ve lineer bir ölçüm yapılmış olmaz mı?
Direnci doğru okudun ama NTC de sıcaklık ile direnç lineer değişmiyor.
Alıntı yapılan: Allegro - 13 Nisan 2017, 14:19:22
Direnci doğru okudun ama NTC de sıcaklık ile direnç lineer değişmiyor.
Anlamadım.Yukarıda kondansatör deşarjı ile hassas bir NTC ölçüm yapılabileceğini söylemiştiniz?
hassasiyet ve lineerlik farklı kavramlar...
25C şartlarında 0.1 C değişimi anlamak için gerekli direnç değişimi misal 10 ohm olsun.
Bu 10 ohm değişikliği olcebiliyorsan gerekli hassasiyeti sağlayabiliyorsundur...
Ama sıcaklık diyelim ki, 100 derece civarına çıktı ve 0.1 C için direnç değişimi 8 ohm oldu...
Bu da kısaca lineer olmayışın özetidir.
Ölçüm tekniği ise daha farklı bir konu...
Peki o zaman kısaca sorayım.
Arkadaşın bahsettiği yöntem olan kondansatörün deşarjı yöntemi ile NTC kullanarak ısı ölçmek doğru mu?
[size=78%][PDF] Implementing Ohmmeter/Temperature Sensor - Microchip[/size]
[/size]
[/size]http://ww1.microchip.com/downloads/en/AppNotes/00512e.pdf
[/size]
O pinin yukselis degilde dusus zamanini olcmek daha iyi diyordu Microchip...
ADC siz bu işi yapmak bana macera gibi geliyor, bir sürü adc li işlemci var
binlerce üretilecek ürün için belki fiyat avantajı sağlar bu seçenek
Kapasitor doldurup bosaltmak kotu bi yontem degil kesinlikle.
Kapasitorun yavas deger degisiminden etkilenmez.
Beslemenin yavas degisiminden etkilenmez.
Neredeyse sadece Rref direncine bagli bi olcum saglanir.
Her 2 yontemin de ratiometric olma avantaji var. Ve 2 yontemde de olcum araligini genisletmek icin 2. Bir Rref kullanma imkani var.
İlk önce merhaba ben fen lisesinde okuyorum sıcaklık ölçümü ile ilgili projem var ama ben 25A° nedir tam anlamadım
Forum değişikliği yapılırken bazı sembollerde sorun olmuş; 25 santigrad derece: İşte o sembol (https://www.google.com.tr/search?q=centigrade+degree+symbol&num=50&safe=off&client=opera&hs=VEt&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjP_rrYmb7ZAhXrCcAKHRxkArIQ_AUICigB&biw=1880&bih=953#imgrc=_) :) .
Malzemenin cinsi senin etkiye verdiğin tepki ile benim ki bir mi? Senin elektronların çok aktif benimki daha az aktif olabilir....İki tartın var birisi 0-10 gr tartıyor 0.1 hassasiyette diğeri 100-1 kg tartıyor 200 gr hassasiyette....netice şudur ölçme nedir? sorusuna iyi vakıf olmak lazım....8 bit adc ile ölçemediğin değeri sormaz ama bunu sorarsan olmaz..
Merhabalar..
Konuyu biraz diriltelim istedim.Daha önce ntc ile uğraşma niyetinde idim fakat ara vermiştim.Şuan kaldığım yerden tekrar toparlıyım istiyorum.
Biraz üzerinde uğraştım fakat şöyle bir sıkıntı yaşadım..
Device=18F452
Xtal=20
ADCON1 = %10000000
Adin_Res 10 'ADC ÇÖZÜNÜRLÜĞÜ 10 BİT 0...1023
Adin_Tad FRC
Adin_Stime 50
Declare LCD_Type 0
Declare LCD_DTPin PORTB.0
Declare LCD_ENPin PORTB.5
Declare LCD_RSPin PORTB.4
Declare LCD_Interface 4
Declare LCD_Lines 2
TRISC = 0
PORTC=0
TRISA=%00000001 'A0 analog giriş Diğerleri Digital
Dim Rt As Float
Dim steinhart As Float
Dim LnRt As Float
Dim lineer As Float
Dim T As Float
Dim RA As Float
Dim RB As Float
Dim RC As Float
Dim ADC As Float
RA = 0.00115521419927516;
RB = 0.000228409546912507;
RC = 0.00000011773271084379;
BASLA:
Print At 1,1,"ADC: ",Dec LnRt
Print At 2,1,"Rt: ",Dec Rt
Print At 3,1,"ISI: ",Dec T
GoSub NTC_OKU
GoTo BASLA
NTC_OKU:
ADC = ADIn 0
Rt = (10000.0 * ADC)/(1024.0 - ADC);
LnRt = Log(Rt);
T = (1.0/(RA + Rb*LnRt + Rc*pow(LnRt, 3.0)))-273.15;
DelayMS 1000
Return
kodlarım bu şekilde.
(https://i.hizliresim.com/5aELmq.png) (https://hizliresim.com/5aELmq)
başlık altında paylaşılan bir hesaplama programı vardı.Kodu zaten hazır veriyor.Proton'a çevirmesi de çok kolay.
Fakat uygulamada çok farklı değerler gösteriyor.
(https://i.hizliresim.com/V98PvV.png) (https://hizliresim.com/V98PvV)
bunun gibi bir değer okuyorum..
Nerede yanlış yapıyorum ?
http://www.mediafire.com/file/6uc6z3hxtb3ms9z/NTC_Calc.rar
Benim dc motor sürücüsünde kullandığım ntc ölçüm fonksiyonum, işine yarayan olursa :
float GetTemperature(void){
const float multiplier=(float)3300/(float)4096;
float vo=0; //Voltage Divider Voltage
float temp=0; //NTC Calculated Temperature
float r0=10000; //NTC Resistance at 25 C
float r1=0; //NTC Resistance
const float r2=10000; //NTC Series Resistance
const float vi=3300; //input voltage 3300mV
const float b=4050; //NTC coefficent
const float t0=293.15; //room temp 25 C = 293.15K
// 1/T = 1/T0 + 1/B * ln(R/R0)
// T : Temperature
// T0: Room Temperature (293.15K)
// B : NTC Coefficent
// R : NTC Resistance
// R0: NTC Resistance at 25 C
//TemperatureRaw=ADC_DualConvertedValueTab[0];
TemperatureRaw=(tmpTemperatureTotal/ADCSample); //buraya takılmayın birden fazla örnek alıp toplayıp sample sayısına bölüp daha doğru bir sonuç alınması sağlanıyor
vo=TemperatureRaw*multiplier;
r1=r2*((vi/vo)-1);
temp=(1/((1/t0)+(1/b)*log(r1/r0)))-273.15;
flagTemperatureReady=0;
return temp;
}
(https://i.ibb.co/vqyLmVg/ntc.png) (https://ibb.co/vqyLmVg)
Aşağıdaki kod bahsi geçen NTC ile çalışır. C veya F çıkış verir.
Mcu'lar için nispeten hızlı olması için Piecewise Linear Approximation
ile yapılmıştır. Float yerine INT16 optimizasyonu yapılabilir.
// NTC : LM03-103F-B, 3435 Ozdisan
// Pull-Up : 10K %1
// ADC Resolution : 10bit
// Result : float C or F
// Fault Result: 32767
https://www.onlinegdb.com/online_c_compiler
#include <stdio.h>
// NTC : LM03-103F-B, 3435 Ozdisan
// Pull-Up : 10K %1
// ADC Resolution : 10bit
// Result : float C or F
// Fault Result: 32767
float tempC;
// lookup table....
#define NSEG 24
int adc_raw[NSEG] = { 71, 81, 92, 106, 120, 138, 158, 181, 207, 237, 271, 308, 350, 395, 496, 549, 604, 657, 803, 844, 879, 910, 956, 973};
float temp_C[NSEG] = { 110.4, 104.7, 99.3, 93.3, 88.2, 82.4, 76.8, 71.2, 65.7, 60.1, 54.5, 49.0, 43.4, 37.9, 26.7, 21.2, 15.5, 10.1, -6.6, -12.2, -17.7, -23.4, -34.5, -40.2};
float temp_F[NSEG] = { 230.8, 220.5, 210.7, 200.0, 190.7, 180.3, 170.2, 160.2, 150.3, 140.2, 130.0, 120.2, 110.1, 100.1, 80.0, 70.1, 60.0, 50.1, 20.2, 10.0, 0.2, -10.1, -30.1, -40.4};
float NtcRead_NEW2(int wADCVal, char tempType){
char index;
float tmpVal0, tmpVal1;
float tmpValPropAdc;
float result;
if(wADCVal < adc_raw[0]) return(32767);
if(wADCVal > adc_raw[NSEG-1]) return(32767);
for (index=0; index<(NSEG-1); index++){
if( (wADCVal >= adc_raw[index]) && (wADCVal < adc_raw[index+1]) ){
if(tempType == 'F') { tmpVal1 = temp_F[index+1]; tmpVal0 = temp_F[index]; }
else { tmpVal1 = temp_C[index+1]; tmpVal0 = temp_C[index]; }
tmpValPropAdc = (float) (wADCVal - adc_raw[index+1]) / (float) (adc_raw[index+1] - adc_raw[index]);
result = tmpValPropAdc * (tmpVal1-tmpVal0) + tmpVal1;
return (result);
}
}
return(32767);
}
int main(){
tempC = NtcRead_NEW2(973, 'F');
printf("ADC 73 = %f\n", tempC);
return 0;
}