Arduino ile sıcaklığı doğru bir şekilde ölçme


10

Arduino ile termostat yapmaya çalışıyorum. Sistem voltajını oldukça değişken hale getiren cep telefonu pili / şarj cihazı kullanarak güç vermek istiyorum. Şu anda Arduino Uno kullanıyorum, ancak tamamlandığında Lilypad'e taşıyacağım.

Önce TMP36 sıcaklık sensörünü kullanmaya çalıştım . Şimdiye kadar tam bir başarısızlık oldu. Sensörün kendisi çok kararlı gibi görünse de, voltajını doğru bir şekilde ölçmenin bir yolunu bulamıyorum.

Analog sensörler için dahili 5v referansı kullanmak hiç işe yaramıyor - USB arduino'nun + 5V'sinden güç bile + 4.8V (ölçülen sıcaklığı birkaç derece kaydırıyor). Kart aküden beslendiğinde, voltaj yaklaşık 4V'a düşer ve ölçülen sıcaklık gökyüzü roketleri. Ayrıca referans olarak panodan + 3.3V kullanmaya çalıştım. Anakart USB'den beslendiğinde daha kararlı gibi görünüyor, ancak pili bitirirken voltajı düşüyor.

Sensör çıkış voltajını güvenilir bir şekilde ölçmenin başka bir yolu var mı?

İkinci aşamada termistörleri kullanmayı planlıyorum. Sadece bu 20K termistörlerin birkaçını sipariş ettim .

Anladığım kadarıyla, voltaj bölücü oluşturursam ve AD_ için referans voltajı olarak V_in kullanırsam, bunların doğru bir şekilde ölçülmesi daha kolay olmalıdır.

Onlar hakkında birkaç soru:

  • Doğruluğu artırmak için farklı sabit dirençli birkaç voltaj bölücü kullanmak mantıklı mı?
  • V_in olarak programlanabilir pimi kullanabilir ve birkaç farklı voltaj seviyesi kullanarak sıcaklığı ölçebilirim. Bunun doğruluk artırıp artırmayacağı net değil.

Lütfen sıcaklık dönüşüm kodunuzu gönderin.
geometrikal

Lütfen ne demek istediğinizi "doğru" olarak tanımlayın. Ne tür bir sıcaklık çözünürlüğü ve mutlak doğruluk elde etmeye çalışıyorsunuz?
Joe Hass

Yaklaşık 1-2 derece çözünürlük almayı umuyorum. Mutlak kalibrasyon hatası 1-2 derece de iyi olmalıdır. Anladığım kadarıyla 0C'de bir referans noktası elde etmek nispeten kolaydır ve sanırım çapraz kalibrasyon sensörleri kullanarak oda sıcaklığında ikinci (çok daha kaba) bir nokta alabilirim.
Usov

5-25C aralığındaki sıcaklıklar için 1-2 derece.
Usov

@ geometrikal Şu anda elinizde yok, ama temelde herkesinkiyle aynı: ilk örneği bırakın, birkaç milis bekleyin, birkaç kez daha örnekleyin ve ortalama örnekler. Sonra referans voltajınızın olduğuna inandığınız şeyle yeniden ölçeklendirin.
Usov

Yanıtlar:


2

Referans voltaj değişimi ile ilgili sorunun farkındasınız ve TMP36 (sabit 10mV / degC) gibi bir cihaz kullanıyorsanız, şeyleri stabilize etmek için bir çipten voltaj referansı kullanmak dışında yapabileceğiniz hiçbir şey yoktur.

Ancak, bir RTD veya bir termistör kullanıyorsanız, sorun ortaya çıkmaz. ADC orantılı bir ölçüm yapıyor - ADC girişini referans gerilimi AMA ile karşılaştırıyor, eğer RTD veya termistöre (uygun bir dirençle) aynı ref voltajından güç verirseniz, okumaları etkilemez. Eğer ref% 10 artarsa, ADC'ye giden voltaj da artar.


4

Sanırım DS18B20 / DS18S20 gibi bir dijital sıcaklık sensörü kullanmayı düşünmelisiniz çünkü bir anaolg sinyalini ölçmek için ATmega ADC'nizin doğruluğuna bağlı değildir, sıcaklığı bildirmek için 1 telli dijital protokol kullanır.

Aşağıdaki eğiticilere bakın
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino


2
Bu yanıt, OP'nin neden farklı bir sensöre geçmesi gerektiğini açıklamıyorsanız ve bunun için bir gerekçe belirtmedikçe çok yararlı değildir . Bir cevapta sadece bağlantı sağlamak iyi bir fikir değildir, çünkü çoğu zaman ölürler ve cevabın içeriği kaybolur.
Joe Hass

Aynı satır boyunca kendi cevabımı yazmak yerine, bu A'yı Joe tarafından dile getirilen kaygıyı gidermek için düzenledim.
RedGrittyBrick

@JoeHass Harici makalelere bağlantı daha tek seçenek cevap kodu eklemek olduğunu ama eklemek için kendi kodum yok ve rızası olmadan başkasının kodu eklemek için adil değişir olmaz. Bağlantılar kesilse bile, anahtar kelime olarak google ve DS18B20 kullanılarak Arduino için bir kütüphane kolayca bulunabilir. Açıklamaya gelince, bu benim hatamdı, sensörün dijital olduğunu belirtmenin benim açımdan açıklayacağını düşündüm.
alexan_e

Yorum için teşekkürler. Bazı nedenlerden dolayı dijital sensörlerin bulunması oldukça zordur. Ne yerel tedarikçiler (Maplin) ne de ucuz (er) çevrimiçi adamlar (Spiraltronics kullandım) hiçbir ürün satmıyor. £ 3 pop + teslimat hala nispeten pahalı bir seçenek haline getiriyor.
Usov

@Usov Sağladığınız bağlantılardan yola çıkarak İngiltere'de yaşadığınızı varsayıyorum. Bu bileşenleri genellikle Çin'den ucuza alıyorum ama aynı zamanda ebay.uk'ta da 1,49 £ karşılığında buldum , belki size
uyuyorlar

3

Ölçümünüz ADC için referans voltajı kadar iyi olacaktır. Arduino varsayılan olarak besleme voltajını referans voltajı olarak kullanır, ancak sizin durumunuzda bunu yapmanın doğru yolu arduino'nun Aref pinini kullanmak olacaktır. "Voltaj referansı" adlı özel bir yonga almanız ve Aref pinine bağlamanız, ardından ADC'yi Arduino kodunda harici referans kullanacak şekilde ayarlamanız gerekir ( analogReference(EXTERNAL))

Referansın voltajı, sıcaklık sensörünüzün tam salınımının referans voltajına uyacak şekilde seçilmesi gerekir. TMP36 100C'de ~ 1.5V çıkacaktır, bu nedenle 100C'ye kadar sıcaklığı ölçmek için 1.5V'un üzerinde referans kullanmanız gerekir. Mümkün olduğunca fazla çözünürlük elde etmek için referansınızın mümkün olduğunca ölçülen maksimum voltaja yakın olmasını istiyorsunuz.

Atmega328p, harici bileşenler olmadan kullanılabilecek iki dahili referansa sahiptir. Biri 1.1V, diğeri 2.56V. Genellikle harici özel bileşen kullanarak elde edebileceğinizden biraz daha kötü doğruluktadır. Dahili referans doğruluğu için analogReference ve Atmega328p veri sayfasındaki Arduino belgelerine bakın .

Gerçekten farklı aralıklara sahip fındık almak istiyorsanız, birkaç harici referans kullanabilir ve 74hc4051 gibi bir analog anahtar kullanarak değiştirebilirsiniz. Veya iki dahili referans arasında geçiş yapabilirsiniz.

Termistörlerle, aptal bir direnç kullanmak yerine sabit bir akım kaynağı ayarlarsanız daha iyi sonuçlar elde edersiniz. Diğer yandan - kararlı voltaj referansından güç alan aptal bir direnç iyi çalışır.

Harici bir referans seçerken, pillerden güç alırken ve piller bitmişken voltajının düşmesi için yeterli voltaja sahip olduğunuzdan emin olun. Vref + Vdropout <Vbat-dak.


Yorumun için teşekkürler. Bu temelde bugün aldığım aynı yorum - zener diyot üzerinde kendi ref voltajımı inşa et veya AREF için özel düşük voltaj regülatörü al.
Usov

Sabit akım ve bir termistör ile neden daha iyi sonuçlar?
geometrikal

2

Kararlı bir ADC referansına sahip olmamak aslında devrenizdeki başka bir sorunun belirtisidir: panoya yeterince yüksek bir voltaj sağlamazsınız. Bu, 5V beslemesinin 4V'ye düşmesi ve 3.3V'un düşmesi ile gösterilir.

Arduino kartındaki voltaj regülatörünün (MC33269D-5.0 IIRC) ~ 1.0V'lık bir çıkış voltajı vardır, bu nedenle kararlı bir 5V çıkışı elde etmek için en az 6V ile beslemeniz gerekir. AA piller 1,5-1,6V'da başlar ve 1,1V'de neredeyse ölür, bu nedenle tüm pil ömrü boyunca sabit bir çıkış için kartı en az 6 AA pille çalıştırmanız gerekir.

Doğru şekilde güç verildiğinde, dahili ADC referansını veya 5V veya 3.3V hatlarını kullanabilirsiniz. Sıcaklık sensörü Celcius derece başına yaklaşık 10mV kadar değiştiğinden, referans voltajını beklenen maksimum sensör çıkış voltajına eşdeğer olarak ayarlamak için bir voltaj bölücü kullanabilirsiniz (örn. 50 derece C için). Bu daha kesin bir ölçüm verecektir.

6'dan az AA pil kullanmak istiyorsanız, bir DC-DC boost dönüştürücü deneyin, örn. Https://www.sparkfun.com/products/10968 . Bağlantılı örnek 1V - 4V alır ve 5V yapar. Çıkış, regülatörünü atlayarak doğrudan Arduino'nun 5V pinine beslenir.

Kartın piller üzerinde daha uzun süre çalışmasını sağlamak için MCU'yu sensör okumaları arasında uyku moduna geçirin. Rocketscream düşük güç kütüphanesi bu amaç için mükemmeldir. Ancak standart Arduino regülatörü sadece kendi başına 10mA kullandığından verimli bir regülatör / DC-DC dönüştürücü kullanırken gerçekten yararlıdır!


1

Sorunun cevabı Sensör çıkış voltajını güvenilir bir şekilde ölçmenin başka bir yolu var mı?

ADC, analogdan dijitale dönüştürme için referans voltajını kullanır. Yani referans voltajında ​​bir değişiklik varsa, dönüştürülen değerler (yani dijital değer) değişecektir. Referans voltajı değişirse, dijital değer aynı analog giriş için farklı olacaktır.

Kolay bir seçenek, Arduino'nun içindeki dahili referans voltajını kullanmaktır (yani Atmega kontrolörü).

Dahili ADC'yi kullanmak için örnek kodun sağlandığı aşağıdaki bağlantıya bakın (Arduino işlev adı - analogReference (DEFAULT))

http://tronixstuff.com/2013/12/12/arduino-tutorials-chapter-22-aref-pin/

Bunun sorununuzu çözeceğini ve termistörlere geçmeye gerek olmadığını düşünüyorum.


"Hacker Wifi bulucu" ne kadar alakalı emin değilim - orada alaka ile ilgili bir şey bulamıyorum. Dahili ADC referansıyla ilgili - Ben yazdım. Arduino'ya USB'den güç verildiğinde bile çalışmıyor. Ve tahta cep telefonu pilinden (3.7 - 4.5V) güç aldığında daha da kötü.
Usov

Üzgünüm bu bir kopyala / yapıştır hatası. Bağlantıyı yakında düzeltir!
robomon

@Usov bağlantısı düzeltildi!
robomon

1.1V dahili, atmega328 spesifikasyonuna göre% 10'un üzerinde yüzebilir. Bu da çok güvenilir bir referans gibi görünmüyor.
Usov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.