温度センサのMCP9700/MCP9701は安価で温度データの取得も簡単な温度センサですが、少し精度に不安があります。
精度が最大で±4℃ですので、正確な温度測定には全く向かないセンサでしょう。
ただやっぱり「安価」というのは魅力的で重要だと思うのです。
1個だいたい30円ですよ?
1000円くらいする温度センサを何個買えるんですか...
でも実はMCP9700は補正すると±0.5℃まで精度を高められるらしいので、実際にやってみました。
スポンサーリンク
通常の温度データ取得
MCP9700とMCP9701を紹介していますが、両者の違いは係数とオフセットだけです。
- MCP9700:温度係数10.0mV/℃、オフセット500mV
- MCP9701:温度係数19.5mV/℃、オフセット400mV
どちらもアナログ電圧で出てくるのでそれを計算するだけなので簡単ですね。
マイコンであればADCを使えますので、非常にシンプルです。
ADCから実際の電圧を測定するには以前書いた記事が参考になります。
上記の記事のADCのデータから電圧を求める数式を簡単に書くと、センサ電圧 = 基準電圧 / 分解能 * 取得したデータ です。
そして係数とオフセットで温度に換算するには、温度 = (センサ電圧 - オフセット) / 係数 という式で求まります。
ArduinoとかでMCP9700の値を取得するのであれば以下のようなプログラムになるでしょうか。
#define SENSOR_COEFF 0.01 #define SENSOR_OFFSET 0.5 #define TEMP_SENSOR_IN A0 void setup() { analogReference(INTERNAL); Serial.begin(115200); } void loop() { float v_temp = 1.1 / 1024.0 * analogRead(TEMP_SENSOR_IN); float t_sensor = (v_temp - SENSOR_OFFSET) / SENSOR_COEFF; Serial.print("Sensor Voltage[V]:"); Serial.println(v_temp); Serial.print("Temperature[C]:\t "); Serial.println(t_sensor); Serial.println(); delay(1000); }
基準電圧を内部(INTERNAL)の1.1Vにしているのは、通常利用で60℃は超えないだろうということで使っています。
60℃を超える場合は基準電圧を外部(EXTERNAL)にして3.3Vを使うと良いと思います。
温度の補正をする
MCP9700/MCP9701の補正方法はマイクロチップからドキュメントとして出ています。
以下にそのリンクを貼っておきます。
スポンサーリンク
でもこのドキュメント難しいじゃないですか、結構長いですし...
どこの数式使ったらいいのって最初に思ってしまったので使うところだけを抽出しました。
式は上のプログラムの変数が使えるようにしています。
MCP9700の補正式
float t_error = 244e-6 * (125.0 - t_sensor) * (t_sensor - -40.0) + 2e-12 * (t_sensor - -40.0) - 2.0;
MCP9701の補正式
float t_error = 200e-6 * (125.0 - t_sensor) * (t_sensor - -15.0) + 1e-3 * (t_sensor - -15.0) - 1.5;
これらが補正用の数式で、実際の使用方法としては取得した温度(t_sensor)から補正値(t_error)を引けば高精度な温度が取得できます。
式を1つ追加するだけで高精度になるならやらない手はありません。
というわけで補正後のプログラムは以下のようになります。
#define SENSOR_COEFF 0.01 #define SENSOR_OFFSET 0.5 #define TEMP_SENSOR_IN A0 void setup() { analogReference(INTERNAL); Serial.begin(115200); } void loop() { float v_temp = 1.1 / 1024.0 * analogRead(TEMP_SENSOR_IN); float t_sensor = (v_temp - SENSOR_OFFSET) / SENSOR_COEFF; float t_error = 244e-6 * (125.0 - t_sensor) * (t_sensor - -40.0) + 2e-12 * (t_sensor - -40.0) - 2.0; float t_comp = t_sensor - t_error; Serial.print("Sensor Voltage[V]:\t "); Serial.println(v_temp); Serial.print("Temperature[C]:\t\t "); Serial.println(t_sensor); Serial.print("Corrected Temperature[C]:"); Serial.println(t_comp); Serial.println(); delay(1000); }
実験
私自身、これだけで高精度になるか不安だったので実際に高精度になるか試してみました。
ちなみに出力には0.1uF程度のコンデンサを入れて安定させたほうがいいです。
もっと安定させるならボルテージフォロア+ローパルフィルタとか...
そのあたりはデジタルフィルタでもいいかもしれませんがね。
補正が入っているプログラムを動かすとこんな感じになりました。
色々言っといてアレなんですけど、補正前と補正後の温度があんまり変わってないんですよね...
ドライヤーを当てて40℃ぐらいまで上げても見ましたが、あまり大きくは変わりませんでした。
これで精度が良くなったのでしょうか、よく分かりません。
不安になったので一応計算してみると、補正した数値はゆるやかな2次関数になります。
0℃(補正前)で約0.8℃の補正、30℃(補正前)あたりでは約0.3℃の補正、とあまり大きくは変わらないようです。
これで精度が良くなったとは現時点でははっきりと言えないですが、補正しているので良くなっているはずです。
ちょっとでも安価に高精度の温度データを取得したい場合は試してみてはいかがでしょうか。
スポンサーリンク
5年以上前の記事についてで済みませんが、コメントいたします。
Microchipのアプリケーションノートの記述に従うと、次のようにするのが正しいのでは?
t_error = -244e-6 * (125.0 - t) * (t - -40.0) + 2e-12 * (t - -40.0) + 2.0;
つまり、
(1) 244e-6にはマイナス符号を付ける
(2) 2.0にはプラス符号を付ける
ということです。
もしかしたら、この記事のやり方では誤差を増やすことになっていたのかもしれません。
以上、実験して確認したわけではなく、あくまでもMicrochipのアプリケーションノートの記述に従うとこうなるのではないか、という意見です。