AVRにはADCの内部入力として温度センサが搭載されているものがある。シリコンダイオード方式ゆえに製造工程で特性がばらつくため、個体毎に面倒な校正作業が必要となっていた。
新しいmegaAVR-0やTinyAVR-1、AVR-DAはXMEGAの系譜なので、内蔵温度センサの校正係数があらかじめSignature ROW領域に記述されている。これを読みだしてキャリブレーションを行う手順がデータシートに記述されていたので試してみた。
Arduino Nano Everyで試せるサンプルスケッチ。
https://github.com/kentN/samplecodes/tree/main/Arduino/NANOEVERY-TEMPSENSE
IDE付属のシリアルプロッタでモニタしてみると温度グラフが現れる。ホットエアでダイ温度が100℃になるほど炙ってしまったが、そのまま動作しつづけていた。
手元にあった二つのArduino Nano Everyはそれぞれ校正値を読み出すと次のようになっていた。
DEBUG: 305k, offset :-31 gain :142
DEBUG: 305k, offset :-6 gain :144
実機で比較テスト
tinyPDUテスト基板 |
実際に温度を調節して試験してみよう。比較対象として、tinyPDUに接続してあるパルス温度センサLMT01の一つ(CH2)をQFNパッケージに張り付けた。
LMT01は高精度ADC内蔵、2端子カレントループ、温度データを約100ms毎にパルス数で出力するという面白いセンサ。-20度~90℃範囲で±0.5℃の測定精度とあるので、用途的には十分すぎる。(ただし割り込み管理が甘いとパルスカウントの取りこぼしで正確な温度を示さないことがある)
緑色はLMT01で、青緑が内蔵センサ出力。内蔵センサ出力は1℃刻みなので階段状に遷移していく。
庫内が冷え切る前に冷却を停止し、庫内に置いた5Wのヒーターと、小さな空冷ファンを作動させながら様子を見た。 空気による対流を作っているし、恒温動作はしていないので熱容量の差がオフセットや追従速度の変化として出ている。
この温度範囲では温度変化の傾向はよく一致した。 基板温度を知りたい分には何の問題もないだろう。
その他
新しいAVRのSIGROWは、XMEGAでいうProduction Signature ROW領域。XMEGAのものと比較するとシンプルに整理されているが、10バイトのシリアル番号(ユニークID)が取得できるので、いろいろと使い道が考えられる。