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変換を有効にする設定だ。
詳しくは下記のサイトを見るのが手っ取り早いかもしれない。
変換される電圧は前述した通り、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セグへ表示するだけだ。
無事に成功!
実はドハマリしてた
なぜか上手く温度が取得出来なくて、あーだこーだと試行錯誤していた。
原因はマイコン右側ポートのAVCCとGNDを接続していなかったことだ。
内部基準電圧を使うから必要ないと思っていたが、内部基準電圧はAVCCとGNDから確保されるらしい…。
今回の温度を測るコードはこちら
pontago/avr-7SegLedTemp · GitHub