16

STM32 ve NTC Sensörü İle Sıcaklık Ölçme

Sıcaklığa bağlı olarak direnci değişen devre elemanlarına Termistör denir. İki farklı çeşidi vardır. “Negative Thermocouple” ifadesinin kısaltması olan NTC  ve “Positive Thermocouple” ifadesinin kısaltması olan PTC . İkisinin de sıcaklığa bağlı olarak direnci değişir. Farkları ise birinin direnci sıcaklık ile artar iken diğerinin azalmasıdır.

  • NTC: Sıcaklık arttıkça direnci azalır.
  • PTC: Sıcaklık arttıkça direnci artar.

Bu direnç değişimleri doğrusal değildir. Bu yüzden sıcaklık hesaplamaları yapılırken bazı formüllerden yararlanılır. Bu formüllerden biri Stein-Hart denklemidir.

Stein-Hart equation

Stein-Hart Denklemi

Bu denklemde “R” değişkeni “T(kelvin)” derecede ölçülen NTC‘nin direnç değeridir. Bu formülü kod içerisinde kullanabilmemiz için A,B ve C katsayılarını bilmemiz gerekir. Bu katsayılar NTC sıcaklık-direnç tablosuna göre hesaplanır. NTC tablosundan 3 farklı derece seçip ve bu derecelerin karşılığı olan direnç değerlerini formülde yerine yazarak 3 adet 3 bilinmeyenli denklem elde edilir. Buradan A,B ve C katsayıları bulunarak formüle yazılabilir. Ben hazır hesaplanmış olan katsayıları kullandım.

NTC Bağlantısı

STM32 ile NTC arasındaki bağlantı yukarıdaki gibi yapılabilir. 10k‘lık NTC yine 10k bir direnç ile pull-down bağlantı yapılarak ADC pinine bağlanmıştır.

Formüle dikkat edilecek olursa sıcaklık değerini hesaplayabilmek için NTC’nin direncini bilmemiz gerekir. Yukarıdaki bağlantıda gerilim bölücü mantığından yola çıkarak NTC’nin direnci rahatlıkla hesaplanabilir. Fakat denklem sadeleştirildiği zaman sadece ADC’den okunan 12 bitlik değeri bilmemiz yeterlidir. Denklem sadeleştiği zaman aşağıdaki fonksiyondaki gibi olur.

NOT: Denklemde dikkat ettiyseniz logaritmik işlem yapılmaktadır. Bunu yapabilmek için “math.h” kütüphanesi “include” edilmelir.

ADC’ den okunan değer bu fonksiyona gönderildiğinde geriye sıcaklık bilgisini derece cinsinden döndürmektedir.

CubeMx Ayarları

STM32-NTC Kodlarının Tamamı

STMStudio programı yardımı ile “temp” isimli sıcaklık değişkeninin değerini gözlemleyebilirsiniz. Eğer daha sağlıklı bir sıcaklık değeri okumak isterseniz basit bir yazılımsal filtre uygulayabilirsiniz. Örneğin; 20 defa ADC değeri okuyup bunun aritmetik ortalamasını alıp Thermistor() fonksiyonuna gönderebilirsiniz.

İyi Çalışmalar…

Mehmet Topuz

Mehmet Topuz

16 Comments

    • Kodda NTC direncinin hesaplandığı kısım şu satırdır.
      temperature = log(((40950000 / analogValue) - 10000));
      burada logaritmanın içerisindeki kısım, (3,3xADC)/4095=(10^4/(10^4+R))x3,3 eşitliğinin sadeleşmiş halidir.Dediğin değişikliği yapar isek bu eşitlikte gerilim bölücüyü ilgilendiren kısım olan 10^4/(10^4+R) hesaplamasını R/(10^4+R) şeklinde düzenlemek gerekir. Burayı düzenleyip denklemi tekrar sadeleştirdiğimizde logaritma fonksiyonun içine yazılacak denklem (ADCx10^4)/(4095-ADC) şeklinde olur. Yani temperature = log(((40950000 / analogValue) - 10000)); satırını temperature = log((analogvalue*10000)/(4095-analogvalue)); şeklinde değiştirince sıcaklık değeri olarak yine aynı sonucu verecektir.

      • Hocam ben bunu picte yapmaya çalışıyorum.Bu formülü kullandığımda sıcaklık değeri 6 derece fazla çıkıyor?Sebebi ne olabilir?

        • Kullandığın PIC’in ADC çözünürlüğü 12 bit olmayabilir. Bu örnekte STM32F103 12 bit ADC ye sahip olduğu için formülde 4095 yazıldı. Hangi PIC’i kullanıyorsun bilmiyorum ama PIC16F877A da ADC çözünürlüğü 10 bittir mesala. Eğer senin kullandığında böyle ise formülde 4095 yazan yere 1023 yazman gerekir. Birde bu örnekte NTC yi 3.3 volt ile besledim senin 5 volt ile beslemen gerekir.

          • Yazıda belirtmeyi unutmuşum ben NTC olarak linkteki NTC yi kullanmıştım. Ayrıca formülde 10k’lık direncin tam 10k olduğunu kabul ederek yazıyoruz. Genelde böyle ölçümler için toleransı düşük dirençler kullanılır. Kullandığın direnç renklerine göre 10k olsa bile ölçtüğünde 10k çıkmayabilir. Tam 10k olmasa bile 6 derecelik bir sapma yapacağını zannetmiyorum gerçi. Bir de direnç değerini ölçüp formüldeki 10000 yerine direnç değerini yaz. Böylece daha yakın sonuçlar alabilirsin fakat çok hassas bir ölçüm bekleme. Hassas bir ölçüm için ekstradan filtre devresi tarzı bir şey gerekebilir. Basitçe NTC ye paralel 100nF kutupsuz bir kondansatör atabilirsin. Bunun haricinde aklıma başka bir çözüm gelmiyor İlker.
            Link: https://www.direnc.net/10k-su-gecirmez-kablolu-ntc-50cm

  1. Mehmet hocam merhabalar
    Stm32f103ct8 kullanıyorum . Hocam NTC sıcaklığı ölçümü gayet güzel fakat bir sorunum. Var + sıcaklık normal. Sıcaklığı eksiye düşürdüğümde ekranda
    . – işaretinin gözükmesin istiyorum örnek – 12 gibi bunu Text olarak nasıl yazdırabilirim

    • Merhaba,
      Ölçtüğünüz sıcaklık değerini aşağıdaki örnekteki gibi bir string e çevirebilirsiniz.

      int value = -12;
      char string[15];
      sprintf(string,”Sicaklik: %d”,value);

      sprintf fonksiyonunu kullanabilmek için string.h kütüphanesini dahil etmeniz gerekir. Bir de Thermistor fonksiyonu double olarak değer döndürür. Double için %d yerine %lf kullanmanız gerek. Daha sonra bu string i ekrana gönderebilirsiniz.

    • math.h kütüphanesindeki log() fonksiyonu doğal logaritmanın karşılığıdır. Yani log(R) demek aslında denklemdeki ln(R) ile aynıdır. Matematikte log10 ifadesini logaritma 10 tabanında 10 diye öğrendik. Kafa karışıklığı buradan kaynaklanıyor. math.h kütüphanesinde ise log(10) fonksiyonu logaritma e tabanında 10 demektir. Onluk tabandaki logaritma için ise log10() fonksiyonu kullanılır.

  2. Mehmet Hocam, evdeki LED aydınlatmaya ait 12VDV 150W 12.5A SMTP de girişteki NTC üzerindeki değer okunamayacak şekilde patlamış.
    Takip eden Köprü diod ve kondansatörlerle beraber değiştireceğim. NTC için ne önerirsiniz?

    • Hocam üzerinde yazan değere eşit bir NTC’nin işinizi göreceğini düşünüyorum. Güç kaynaklarında kullanılan NTC ler akım sınırlama amacı ile kullanılıyordu galiba. NTC lerin siyah yuvarlak kutupsuz kondansatörlere benzeyenlerinden kullanabilirsiniz ama direnç değerinden emin olamıyorum hocam. Güç kaynakları için düşük değerdeki NTC ler kullanılır. Linkteki NTC gibi olanlardan deneyebilirsiniz. https://www.direnc.net/10r-ntc

    • Üzerindeki değer okunmuyor demişsiniz sonradan gördüm. Aynı marka model güç kaynağının üzerinden NTC değerine bakmak lazım hocam kesin bir şey diyemiyorum ama tahminimce düşük değerdedir. 50 ohm dan küçüktür. Belki 1 ohm bile olabilir.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir