A-Dコンバータ その7 16ビットI2C MCP3425-(2)

  MCP3425のデータシートのアプリケーション例にあるように、サーミスタをつないで温度を測ります。入手したサーミスタはNXFT15XH103FA 10kΩです。小さな形状なので、温度の変化に敏感です。

接続

 サーミスタには直列に抵抗Rを入れ、抵抗Rとの接続点の電圧を測ります。サーミスタは25℃で10kΩなので、直列に入れた抵抗値と同じであれば、接続した電圧の半分の電圧(ここでは約1.65V)が接続点で得られます。MCP3425は最大2.048Vまでを測れます。サーミスタは、温度が上がると抵抗値が減少する特性をもった抵抗です。0℃付近で約2.2V、50℃付近で約0.55Vと低温を測るには向いていません。Rの抵抗値を増減して、測りたい温度範囲を決めます。

スケッチ

 ラズパイで利用したときに求めた式もとに、測定した電圧から温度を求めます。

T =1/(1/(To+273.15)+ln( (((-R*Vo)/(Vo-Vref) )/Ro)) /Bth) - 273.15


 T;求める温度、To;カタログに掲載されている基準温度25℃
 R;直列に入っている抵抗、Ro;カタログに掲載されている基準温度の抵抗値
 Vo;測定した電圧、Vref;抵抗Rにつながっている電源の電圧
 Bth;カタログに掲載されているB定数

#include <Wire.h>
#define MCP3425_address 0x68
#define configRegister 0b10011000 //16bit 15sps PGA x1
#define clockFrequency 100000
#define Vref 2.048
#define Bth 3380
#define Ro 10000 // 10k
#define R 9992.3 // 10k実測値
#define V3 3.30953  // 実測値
#define To 25

void setup() {
Wire.begin();
Wire.setClock(clockFrequency);
Serial.begin(9600);
Wire.beginTransmission(MCP3425_address);
Wire.write(configRegister);
Wire.endTransmission();
}

void loop() {
float Volts = (int)readADC() * Vref / 32767.0 ;
float Temp = 1/(1/( To + 273.15) + log( ( ( (-R * Volts)/(Volts - V3 ) ) / Ro )) / Bth ) - 273.15 ;
Serial.println(String(Volts,5)+ " temp="+ String(Temp,2));
delay(1000);
}

float readADC() {
Wire.requestFrom(MCP3425_address, 2);
return ( (Wire.read() << 8 ) + Wire.read() );
}

 実行している様子です。

 直列に入っている金属皮膜抵抗の温度係数は大変小さいです。サーミスタの25℃の抵抗値およびB定数は±1%です。カタログ値のまま利用したときの有効桁数は±1.0℃程度ですが、16ビットA-Dコンバータの分解能は高いので、校正すれば、小数点以下の有効桁数を得られると思います。

参考URL 村田製作所 なぜサーミスタが選ばれるのか?

前へ

A-Dコンバータ その6 16ビットI2C MCP3425-(1)

次へ

Blinkから始まるArduino入門 その8 AC100VのON/OFF