web-dev-qa-db-ja.com

PT100 RTDセンサーを搭載したarduino unoボードを使用して温度を読み取る方法は?

私はArduinoプログラミングが初めてです。そして、ほとんど経験の浅い。

Arduino Unoボードをプログラムして、PT100 RTDセンサーの2/3/4ワイヤー構成を読み取ります(少なくとも0.5°Cの精度レベル)。温度範囲は0〜400°Cおよび-50〜100°Cです。

私はこの分野に完全に慣れていないので、回路と画像とコードを含むかなり記述的な情報をいただければ幸いです。

私はこの問題について多くのことを研究しましたが、私の問題を解決するのに役立つものや実質的なものは何もありませんでした。

さらに、RTDがインストールされているマシンにはPIDがあるため、サーミスタやICを使用して温度を読み取ることはできませんが、コンピュータ自体で温度を取得できるデータロガーを作成したいと考えています。

7
Mayur Agarwal

クリス、あなたの解決策は機能しますが、いくつかの改善の余地があります。

1)220オームのプルアップが小さすぎます。 pt100には絶え間なく流れる顕著な電流があり、精度に影響を与える可能性があります。非常に最小限のアプローチは、プルアップを増やしてこの電流を減らし、分圧器の電圧を増幅することです。次を参照してください http://www.avrfreaks.net/sites/default/files/pt100.JPG

2)注目すべきケーブル配線があり、標準的な産業環境になったら、標準的な測定ブリッジレイアウトを選択することができます。これは4本のワイヤを使用し、そのうち2本は定電流源として使用されます。 (pollup抵抗器とは異なり、定電流源は全範囲で安定した読み出しを保証し、より優れた温度安定性を備えている必要があります。単純なプルアップ自体が大きなドリフトを持つ可能性があります。他の2本のワイヤは差動入力として使用されます。これらのワイヤには電流が流れません、したがって、センサーの実際の配線距離は精度に影響しません。このアプローチを次に示します: https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/4wire2.svg/286px -4wire2.svg.png そして実際、すべての産業用センサーはこの原理で機能します。

3)独自のアナログ回路を使用するのではなく、アナログフロントエンドを使用することをお勧めします。 AD7714 http://www.seekic.com/circuit_diagram/Measuring_and_Test_Circuit/Temperature_measurement_circuit_composed_of_the_AD7714_and_Pt100.html と、ここでより多くの専門的なソリューション: http://www.ti.com/europe/downloads /2-%203-%204-Wire%20RTD%20Measurement.pdf

5
Gee Bee

PT100は、熱が加えられると抵抗が増加します。温度対抵抗特性は pt100抵抗表 で説明されています

Arduinoはアナログ入力の電圧を読み取ることができます。摂氏の測定値を取得するには、次のことを行う必要があります。

  1. アナログ入力を電圧として読み取る
  2. 抵抗値を計算する(分圧器)
  3. 抵抗に基づいてテーブルから摂氏度を検索する

voltage divider

Vinはarduinoから5ボルトですR1は私のプログラムで既知の値の抵抗です220Ω実際にはR2はpt 100 Voutはarduinoアナログ入力ピン(たとえばA0)に接続する必要があります

R2 = R1 * 1 /(Vin/Vout-1)

回路は上図に基づいて行うことができ、かなり簡単です。

私が書いたスケッチには、0C〜80Cの抵抗データが含まれています(簡単に拡張できます)抵抗値から度数を取得するには、私のバージョンのMultiMap関数を使用します。抵抗値として1つの浮動小数点配列を使用し、線形補間を使用して正確な次数を計算します

float in[] = { 100.00, 100.39, 100.78, 101.17, 101.56, 101.95, 102.34, 102.73, 103.12, 103.51,
               103.90, 104.29, 104.68, 105.07, 105.46, 105.85, 106.24, 106.63, 107.02, 107.40,
               107.79, 108.18, 108.57, 108.96, 109.35, 109.73, 110.12, 110.51, 110.90, 111.29,
               111.67, 112.06, 112.45, 112.83, 113.22, 113.61, 114.00, 114.38, 114.77, 115.15,
               115.54, 115.93, 116.31, 116.70, 117.08, 117.47, 117.86, 118.24, 118.63, 119.01,
               119.40, 119.78, 120.17, 120.55, 120.94, 121.32, 121.71, 122.09, 122.47, 122.86,
               123.24, 123.63, 124.01, 124.39, 124.78, 125.16, 125.54, 125.93, 126.31, 126.69,
               127.08, 127.46, 127.84, 128.22, 128.61, 128.99, 129.37, 129.75, 130.13, 130.52 };

// known resistance in voltage divider
int R1 = 217;

float MultiMap(float val, float* _in, uint8_t size)
{
  // calculate if value is out of range 
  if (val < _in[0] ) return -99.99;
  if (val > _in[size-1] ) return 99.99;

  //  search for 'value' in _in array to get the position No.
  uint8_t pos = 0;
  while(val > _in[pos]) pos++;  

  // handles the 'rare' equality case
  if (val == _in[pos]) return pos;

  float r1 = _in[pos-1];
  float r2 = _in[pos];
  int c1 = pos-1;
  int c2 = pos;

 return c1 + (val - r1) / (r2-r1) * (c2-c1);
}

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);

}
void loop() {
  // put your main code here, to run repeatedly:
   int pt100 = analogRead(A0);


   float Vout = pt100 * (5.0 / 1023.0);
   float R2 = R1 * 1/(5.0/Vout - 1);

float c =  MultiMap(R2,in,80);

Serial.print("Resistance: ");
Serial.print(R2);
Serial.println(" Ohm");

Serial.print("Temperature: ");
Serial.print(c);
Serial.println(" C");


delay(400);
}
5
Chris