部品屋根性(50) Microchip、MCP9700リニアアクティブサーミスタIC

Joseph Halfmoon

今回のデバイスは半導体温度センサです。装置に組み込んで基板の温度が上がり過ぎいないかなど、温度監視むけのデバイス。お手頃価格で、簡単接続、温度への換算式もリニアで分かりやすいです。今時のマイコンであれば温度センサを内蔵するものもありますが、「熱くなる」監視対象部分は離れたところにあったりもします。そういうときに活躍?

※「部品屋根性」投稿順Indexはこちら

(実験に使ったArduino用のコード全文を末尾に掲げました。)

MicroChip社のこのデバイスのページは以下に。なお、Low-Power Linear Active Thermistorは(TM)だそうです。念のため。

MCP9700 Low-Power Linear Active Thermistor IC

ぶっちゃけ、アナログ出力の半導体(ダイオード)温度センサです。電源、グラウンドを接続すれば、ほぼほぼ温度に比例する電圧が出力端子に現れるます。それをマイコンのADC端子直結で読み取れば温度が分かるというお手軽さです。

この手のデバイスは各社から多数出されています。もしかするとMicroChip社のこのデバイスはこのカテゴリのデバイスの中では後発品なのかもしれませぬ。それだけ需要があるのでしょう。基板の温度監視。

温度センサといっても大きく2カテゴリあって、温度計的な応用を狙う高精度(当然お値段もお高い)ものと、温度がこのくらいまで上がったらファンを回しますか的な用途のお手頃なものの2つじゃないかと思います。このセンサは後者ですかね。この手のデバイスに高精度を求めることはあまり無いのでお手頃価格が一番でしょうか。

とはいえ、お求めやすい温度センサでも温度レンジなどを限定すれば、校正とソフトウエアで高精度を狙う(手間にお金がかかるけど)こともできます。ただし、手元にあるセンサはプラスチックパッケージ(TO-92というディスクリート・トランジスタのような3本脚のタイプ)です。パッケージの熱抵抗も大きいと思われるので、環境温度(気温)に対してはすばやい応答は望むべくもありません。足を半田付けすればそこから熱伝導があるのでOKかな。しかし量産で使うとしたら、同じデバイスでも表面実装パッケージ品があるのでそちらの方が良いかもです。それであれば基板にピタリなので基板温度を測る、という本来的な目的に一番合致していると思います。今回のブレッドボードに3本脚を差し込むなどという「実装」はあるべき姿ではないでしょう。

しかしながら、対応可能な温度範囲が広く、リニアで扱いやすい特性というのは利点です。また、温度1点で校正かけて使えばそこそこの温度範囲でそこそこの精度を出せるようです。今回はやってないけれど。

さて、同ファミリのデバイスですが、2種類売られていた(秋月電子通商にて)ので、2種類購入してみました。ちょっとアイキャッチ画像の写真はみずらいかもしれませんが、以下の型番です。

    • MCP9700E
    • MCP9700AE

どちらも末尾の ‘E’ は Extended TemperatureレンジのEのようです。-40℃から125℃対応品。Extendedと言われて「いいもの」かと思うと、この製品ではEは普通みたいです。この上に High Temperature品というものがあって150℃対応。

Aつきと、Aなしの差は温度精度の差であるようです。A無は上記の温度範囲でティピカル±2℃、ワースト+6℃ですが、A付きは、同じく上記温度範囲でティピカル±1℃、ワースト+4℃ということでした。

実機で動作させてみた

実機で動作させてみました。Arduino Uno互換のSeeed社Lotusボードを使用です。やたら大量のGroveコネクタを搭載しているIOを繋げやすいボードです。MCP9700だけだと比較対象がないので、Arduino業界標準?の温度湿度センサDHT11をお隣に並べてみました。こんな感じ。

MCP9700DUT動作テストに使ったコードは、末尾に掲げましたが、どちらもダラダラと読み取りを続けるだけの冗長なコードです。

動作させたときの結果出力はこちら。

DHT11 Temperature[C]=27.20
DHT11 Humidity[RH%]=40.00
MCP9700E: CNT=150 Temperature[C]=23
MCP9700AE: CNT=149 Temperature[C]=22

一応、朝の涼しい時間帯、エアコンは入っていましたが22℃とか23℃というのは低く出すぎ。一方DHT11の報告してくる27.2℃はちょっと高すぎ、湿度40%は低すぎじゃないかと思います。手元の温度計(これも精度は信用できないですが)では温度は25℃を超えていての湿度は50%くらい。MCP9700用には+2、3℃くらい「盛ったら」それなりの雰囲気でますかね(ちゃんとやるには、恒温槽と校正済の温度計ないとね。)

添付のサンプルコード、かなりな手抜きですが、それでもなんとかなる感じ。本当にお手軽。西日の当たる屋外に置いた装置がどのくらい熱くなっているのか気になるので、こんど調べてみますか。

部品屋根性(49) Analog Devices、ADAU7002, PDM-I2S変換 に戻る

部品屋根性(51) Kitronik、micro:bit用Breakout Board に進む

テストに使ったArduino環境用プログラム全文
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
#define MCP9700E A2
#define MCP9700AE A3

DHT dht(DHTPIN, DHTTYPE);

// convert ADC count to Temparature. 0.01V=1
int vout2ta(int voutCNT, int v0, int tc1) {
  int vout = map(voutCNT, 0, 1023, 0, 500);
  return (vout - v0) / tc1;
}

void setup() {
  Serial.begin(9600);
  while(!Serial) {}
  Serial.println("MCP9700, DHT11 test");
  dht.begin();
  pinMode(MCP9700E, INPUT);
  pinMode(MCP9700AE, INPUT);
}

void loop() {
  float temp, humi;
  temp = dht.readTemperature();
  humi = dht.readHumidity();
  Serial.print("DHT11 Temperature[C]=");
  Serial.println(temp);
  Serial.print("DHT11 Humidity[RH%]=");
  Serial.println(humi);
  
  int mcp9700e_raw = analogRead(MCP9700E);
  int mcp9700ae_raw = analogRead(MCP9700AE);
  Serial.print("MCP9700E: CNT=");
  Serial.print(mcp9700e_raw);
  Serial.print(" Temperature[C]=");
  Serial.println(vout2ta(mcp9700e_raw, 50, 1));
  Serial.print("MCP9700AE: CNT=");
  Serial.print(mcp9700ae_raw);
  Serial.print(" Temperature[C]=");
  Serial.println(vout2ta(mcp9700ae_raw, 50, 1)); 
  delay(5000);
}