Arduinoで正確に温度を測定する


10

Arduinoでサーモスタットを構築しようとしています。システム電圧をかなり可変にする携帯電話のバッテリー/充電器を使用して電源を供給したい。今はArduino Unoを使っていますが、完成したらLilypadに移植します。

まず、TMP36温度センサーを使ってみました。これまでのところ、それは完全な失敗でした。センサー自体は非常に安定しているように見えますが、その電圧を正確に測定する方法がわかりません。

内蔵の5v参照をアナログセンサーに使用してもまったく機能しません。USBarduinoの+ 5Vから電力を供給しても、実際には+ 4.8Vです(測定温度が数度シフトします)。ボードがバッテリーから電力供給されている場合、電圧は約4Vまで低下し、測定された温度は急上昇します。また、ボードから+ 3.3Vを基準として使用しようとしました。ボードがUSBから給電されている場合はより安定しているように見えますが、バッテリーがなくなると電圧が低下します。

センサー出力電圧を確実に測定する他の方法はありますか?

第2段階では、サーミスタを使用する予定です。これらの20Kサーミスタをいくつか注文したところです。

私が理解していることから、分圧器を構築し、ADCの基準電圧としてV_inを使用する場合、これらは正確に測定する方が簡単なはずです。

それらについてのいくつかの質問:

  • 精度を高めるために、固定抵抗が異なる少数の分圧器を使用することは理にかなっていますか?
  • プログラム可能なピンをV_inとして使用し、いくつかの異なる電圧レベルを使用して温度を測定できます。これが実際に精度を上げるかどうかは私にはわかりませんが。

温度変換コードを投稿してください。
geometrikal

意味を「正確に」定義してください。どのような温度分解能と絶対精度を達成しようとしていますか?
Joe Hass

1〜2度くらいの解像度が欲しいです。1〜2度の絶対校正誤差も問題ありません。0Cで基準点を取得するのは比較的簡単であると私が理解していることから、センサーをクロスキャリブレーションすることで、室温で2番目(はるかに粗い)の点を取得できると思います。
Usov、

5〜25℃の範囲の温度では1〜2度。
ウソフ

@geometrikal今は手元にありませんが、基本的には他の人と同じです。最初のサンプルをドロップし、数ミリ待って、さらに2、3回サンプリングして、平均サンプルを取り出します。次に、基準電圧が何であるかを考えてスケーリングします。
ウソフ

回答:


2

基準電圧の変化の問題を認識しているようで、TMP36(10mV / degCに固定)のようなデバイスを使用する場合、安定化のためにチップからの電圧基準を使用する以外にできることはありません。

ただし、RTDまたはサーミスタを使用している場合は、問題は発生しません。ADCはレシオメトリック測定を行っています。ADCの入力をその基準電圧BUTと比較します。RTDまたはサーミスタに(適切な抵抗を介して)同じ基準電圧から電力を供給しても、測定値には影響しません。基準が10%上がると、ADCへの電圧も上がります。


4

DS18B20 / DS18S20のようなデジタル温度センサーを使用することを検討する必要があると思います。これは、analog信号の測定がATmega ADCの精度に依存せず、1線式デジタルプロトコルを使用して温度を報告するためです。

次のチュートリアルを参照してください
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino


2
この答えは、OPが別のセンサーに移行する理由を説明しない限り、あまり役に立ちません。その理由はありません。回答にリンクを提供するだけではよい考えではありません。リンクが頻繁に機能しなくなり、回答の内容が失われるためです。
Joe Hass

同じように自分の答えを書くのではなく、ジョーが提起した懸念に対処するためにこのAを編集しました。
RedGrittyBrick 2013

@JoeHass外部の記事にリンクする以外の唯一の選択肢は、返信にコードを添付することですが、自分で添付するコードがないので、同意なしに他の人のコードを添付することは公平ではありません。リンクが機能しなくなった場合でも、GoogleおよびDS18B20をキーワードとして使用すると、Arduinoのライブラリを簡単に見つけることができます。説明については私の間違いでしたが、センサーがデジタルであることに触れれば、私の説明が得られると思いました。
alexan_e 2013

コメントをありがとう。何らかの理由でデジタルセンサーを見つけるのは非常に困難です。地元のサプライヤー(Maplin)も安い(もっと安い)オンラインの人(私はSpiraltronicsを使った)も何も売っていない。£3ポップ+配信は、それでも比較的高価なオプションになります。
ウソフ

@Usovあなたが提供したリンクから判断すると、私はあなたが英国に住んでいると思います。私は通常これらのコンポーネントを中国から安く購入しますが、ebay.ukでも £1.49で見つけました。おそらくあなたに合うかもしれません
alexan_e

3

測定は、ADCの基準電圧と同じくらい良好です。Arduinoはデフォルトで供給電圧を基準電圧として使用しますが、あなたの場合、正しい方法はarduinoのArefピンを使用することです。「電圧リファレンス」と呼ばれる特別なチップを入手してArefピンに接続し、Arduinoコードで外部リファレンスを使用するようにADCを設定する必要があります(analogReference(EXTERNAL)

基準の電圧は、温度センサーのフルスイングが基準電圧に適合するように選択する必要があります。TMP36は100Cで約1.5Vを出力するため、100Cまでの温度を測定するには1.5Vを超えるリファレンスを使用する必要があります。できるだけ多くの分解能を得るために、リファレンスを測定された最大電圧にできるだけ近づけることが必要です。

Atmega328pには、外部コンポーネントなしで使用できる2つの内部リファレンスがあります。1つは1.1V、もう1つは2.56Vです。これらは通常、外部の専用コンポーネントを使用した場合よりも精度がやや劣ります。内部リファレンスの精度については、anaduReferenceとAtmega328pデータシートのArduinoドキュメントを確認してください。

本当に異なる範囲のナットを取得したい場合は、いくつかの外部参照を使用し、74hc4051のようなアナログスイッチを使用してそれらを切り替えることができます。または、2つの内部参照を切り替えることもできます。

サーミスタを使用すると、ダム抵抗を使用する代わりに定電流源を設定した方が良い結果が得られます。一方、安定した基準電圧から電力を供給されるダム抵抗は問題なく動作します。

外部リファレンスを選択するときは、バッテリーから電力を供給していてバッテリーが切れている場合、ドロップアウト電圧に対応できる十分な電圧があることを確認してください。Vref + Vdropout <Vbat-min。


コメントをありがとう。これは基本的に今日得たコメントと同じです。ツェナーダイオードに独自の基準電圧を構築するか、AREF専用の低電圧レギュレータを取得します。
Usov

定電流とサーミスタの方が良い結果が得られるのはなぜですか?
geometrikal

2

安定したADCリファレンスがないことは、実際には回路の別の問題の症状です。ボードに十分に高い電圧を供給していません。これは、5V電源が4Vに低下し、3.3V電源も低下することで示されます。

Arduinoボードの電圧レギュレータ(MC33269D-5.0 IIRC)のドロップアウト電圧は約1.0Vであるため、安定した5V出力を得るには、少なくとも6Vを供給する必要があります。単三電池は1.5-1.6Vで起動し、1.1Vでほとんど死んでいるので、電池寿命全体にわたって安定した出力を得るには、少なくとも6つの単三電池でボードに電力を供給する必要があります。

正しく給電されている場合は、内部ADCリファレンスまたは5Vまたは3.3Vラインのいずれかを使用できます。温度センサーは摂氏1度あたり約10mV変動するため、分圧器を使用して、基準電圧を予想される最大センサー出力電圧(50℃など)に設定できます。これにより、より正確な測定が可能になります。

単三電池6個未満を使用する場合は、DC-DCブーストコンバーター(https://www.sparkfun.com/products/10968など)を試してください。リンクされた例は1V-4Vを取り、5Vを作ります。出力は、レギュレーターをバイパスして、Arduinoの5Vピンに直接供給されます。

バッテリーでボードをより長く動作させるには、センサーの読み取りの合間にMCUをスリープ状態にします。rocketscream低消費電力ライブラリは、この目的のために素晴らしいです。ただし、標準のArduinoレギュレーターだけで10mAを使用するため、効率的なレギュレーター/ DC-DCコンバーターを使用する場合にのみ、これは本当に役立ちます。


1

質問への回答 センサー出力電圧を確実に測定する他の方法はありますか?

ADCは、アナログからデジタルへの変換に基準電圧を使用します。そのため、基準電圧が変化すると、変換された値(デジタル値)が変化します。基準電圧が変化すると、同じアナログ入力に対してデジタル値が異なります。

簡単なオプションの1つは、Arduino(つまりAtmegaコントローラー)内の内部基準電圧を使用することです。

内部ADCを使用するためのサンプルコードが提供されている下記のリンクを参照してください(Arduino関数名-analogReference(DEFAULT))

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

これで問題が解決すると思います。サーミスタに切り替える必要はありません。


「ハッキングWifiファインダー」がどのように関連しているかはわかりません。関連性のあるものが見つかりません。内部ADCリファレンスについて-私はそれについて書きました。ArduinoにUSBから電力が供給されている場合でも機能しません。また、ボードが携帯電話のバッテリー(3.7-4.5V)から給電されている場合は、さらに悪化します。
ウソフ

申し訳ありませんが、コピー/貼り付けの間違いです。すぐにリンクを修正します!
robomon 2013

@Usovリンクが修正されました!
robomon 2013

内部1.1Vは、atmega328仕様に従って10%以上フロートする可能性があります。これも非常に信頼できるリファレンスではないようです。
ウソフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.