フタなしカンヅメ

徒然なるままに @happytar0

温度センサーとA/D変換

7セグも使うことが出来たので、次は温度センサーを使っていくことに。
これで無事に温度が表示出来れば、ほぼ完成したようなものだ。

温度センサーはLM60というものを使う。
このセンサーには3つの足が付いていて、それぞれVs、Vout、GNDとなる。
Vs(VCC)は電源、GNDにマイナスを接続すると、Voutに現在の温度を表す電圧が出力される。

AVRにはA/D変換の機能が標準で付いているので、これを利用することで現在の温度を取得できる。

A/D変換とは

そのまんまなのだけど、アナログ値をデジタル値として変換することだ。
変換するには、マイコンの変換用ポートPD0〜5を利用する。
変換するために使う基準電圧は、内部基準電圧使うか、外部電圧を使うか選択できます。
ATMEGA328Pの場合、内部基準電圧は1.1Vです。

LM60のデータシートを見る

まずはLM60の仕様を把握することにした。

データシートはこちら
http://akizukidenshi.com/download/LM60.pdf

  • 40度〜125度まで測定出来るらしく、DCオフセット424mV、6.25mV/℃ということらしい。

使用する電圧の範囲は174mV〜1205mVとなる。

基準電圧は出力される電圧以上なければいけないので、1.1Vだと以下になる。
(1100mV - 424mV) / 6.25mV = 108.16度
内部基準電圧だと108度くらいまでしか計測出来ないが、今回は良しとした。(108度を越える環境で使わないし…)

A/D変換を使って温度を取得

まず配線は、マイコンのAREFとGND間に0.1μFのコンデンサ、GNDとAVCCは電源に接続する。
PC0には温度センサーのVoutを接続する。

続いてコードだが、A/D変換を利用するには、ADMUXとADCSRA、ADCH、ADCLレジスタなどを使う。
ADMUXの7ビットと6ビット目で基準電圧を指定する。両方「1」にすることで内部基準電圧となる。
5ビット目は、左揃えにするか右揃えにするかという設定だが、これは取得できる電圧が0〜1023の10ビットの値なので、レジスタ2つ分使うことになる。
その際に上位ビットをどのように格納するかの設定が、この5ビット目になる。

0〜4ビット目は接続しているポートを表すビットを指定する。

ADCLは変換した値の下位ビット、ADCHは上位ビットになる。
ADCSRAで実際にA/D変換を有効にする設定だ。
詳しくは下記のサイトを見るのが手っ取り早いかもしれない。

A/D 変換でボリューム(可変抵抗)値を読む

変換される電圧は前述した通り、0〜1023の範囲で変換されて返される。
174mV〜1205mVを1.1Vの基準電圧を使って、0〜1023の範囲で変換されて返されるのだけど、この精度のことを分解能と言うらしい。

1.1V / 1024 = 0.001
3.0V / 1024 = 0.002

基準となる電圧によって精度も変わってくるようだ。

A/D変換された値を使って温度を求める計算式は下記のようになる。

(A/D変換された値 * 基準電圧 / 1024 - 0.424) / 0.00625 = 温度
(500 * 1.1V / 1024 - 0.424) / 0.00625 = 18.0975度

あとは計算して出てきた値を7セグへ表示するだけだ。
無事に成功!
f:id:happytar0:20130204061212j:plain

実はドハマリしてた

なぜか上手く温度が取得出来なくて、あーだこーだと試行錯誤していた。
原因はマイコン右側ポートのAVCCとGNDを接続していなかったことだ。
内部基準電圧を使うから必要ないと思っていたが、内部基準電圧はAVCCとGNDから確保されるらしい…。

今回の温度を測るコードはこちら
pontago/avr-7SegLedTemp · GitHub