30

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. Ayrıca linkteki siteden NTC sıcaklık-direnç tablosundan seçeceğiniz üç farklı değer için kendiniz A,B ve C katsayıları hesaplatıp kullanabilirsiniz.

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.

Yukarıdaki denklemde görüldüğü gibi gerilim bölücüden yola çıkarak NTC nin direnci hesaplanabilir. Burada görüldüğü gibi ADC referans voltajı ve NTC nin besleme voltajı birbirini götürürür. 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 projeye dahil edilmelidir.

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

30 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.

  3. ben ntc ile daha önce hiç çalışmadım. Projenizi birebir uyguladım fakat stmstudio da main.c içindeki temp seçeneğini seçiyorum 140 ile 170 arası değişen sürekli durmadan hareket eden sonuçlar ortaya çıkıyor. Acaba nerede yanlış yapıyorum. ölçtüğüm değerleri nerede okuyabilirim. Yardımcı olursanız sevinirim

    • ADC’den yanlış ölçüm yapıyor olabilirsiniz. NTC’ye verdiğiniz gerilimi ve stm’in gerilimini ölçü aleti ile kontrol edin. Stm’in gerilimi 3.3 volttan düşük ise adc ölçümü hatalı çıkar. NTC ve seri bağlı olan direnc 10k olması gerek aksi takdirde formülde değişiklik yapılması gerekir.

  4. Merhaba, öncelikle çok teşekkürler. Ben bu ölçtüğümüz değeri LCD ekrana yazdırmak istiyordum. Bununla ilgili bir çalışmanız var mı acaba ?

    • Merhaba, Bu çok genel bir soru. LCD ekran ile bir çalışmam oldu ama bu ekranların farklı farklı modeli var. Kullanıcağınız ekranın haberleşme arayüzüne göre( I2C, SPI vb.) veya diğer özelliklerine göre farklılık gösterecektir. Bazı LCD ekranların kendine özel arayüz tasarım programları oluyor( Nextion). Eğer sorunuz sadece LCD ekrana sıcaklık değerini yazdırıp yazdırmamam ise evet öyle bir çalışmam oldu.

  5. Hii

    You did a great work you have explained the topic very nicely but I have an question have you ever tried to implement VRMS to accurate the ADC readings

    If yes please guide me how to do it

    Thanks

    • Hi Pankaj,
      Thanks for the comment. I have never tried to implement VRMS. I can’t help you with this issue. I’m sorry.

  6. Merhaba Lm35 ısı sensörüyle derecelere göre 4, 5 tane led yakmaya çalışıyoruz ama başaramadık yardımcı olabilir misiniz?

    • Merhaba, yapmak istediklerinizi açık bir şekilde ve mümkünse geldiğiniz aşamanın kodlarıyla birlikte mehmettopuz127@gmail.com adresine mail atabilirseniz elimden geldiğince yardımcı olabilirim.

  7. Merhaba sicakligi ölçüp belli bir dereceye ulaştığında led yakan ama lcd de gostermeyen bir kod icin vermis oldugunuz kodlarda ne gibi degisiklikler yapabilirim teşekkürler

    • Merhaba, buradaki örnekte kulllanacağınız tek yer Thermistor fonksiyonu olacak. Aslında bu fonksiyonun adı get_temperature() gibi bir şey de olabilir. Şimdi siz bu fonksiyonu LED’i nerede kontrol etmek istiyorsanı orada çağırabilirisiniz ( main fonksiyon içinde veya başka bir fonksiyon içinde). Örneğin;
      if(get_temperature() > 25.0){

      LED_ON();

      }
      gibi bir kullanım olabilir. LCD de göstermeyen derken ne kastettiğinizi tam anlamadım. LCD ye sıcaklık değerini göndermezseniz ekranda görünmeyecektir zaten.

  8. Hocam meraba ledi kontrol etmek icin temp degiskenini if(temp>50) seklinde aldim bus ekilde olmasi dogru mudur sizce

  9. ADC üzerinden NTC okuma ile ilgili bulduğum en iyi kaynak, hem ingilizce hem türkçe olarak. Hem açıklayıcı hem de detaylara fazla boğulmadan verilmiş. Kariyerinizde başarılar dilerim 🙂

  10. Hocam merhabalar adımlrı tek tek izliyorum lakin debug ettikten sonra
    Thread #1 [main] 1 [core: 0] (Suspended : Breakpoint)
    main() at main.c:83 0x8000e46
    bu satırda ” HAL_Init();” bulunuyor ve bir türlü verileri alamıyorum yardımcı olabilirmisiniz tüm driverlar ve libraryler güncel ve tanımlı

Mehmet Topuz için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak.