|
液晶を使った温度計 |
|
|
計算方法を変えて、プログラムを変更しました。プログラムが「r8cm12a_ lcd_temperature_100.zip」の場合、お手数ですが、再度ダウンロード、差し替えをお願い致します。
|
|
内容
LM60BIZという温度を電圧で出力するICがあります。R8C/M12AのA/D変換器で電圧を読み込み、温度に変換して液晶に表示します。
ワークスペース
r8cm12a_lcd_temperature_200.zip
ファイルを解凍し、フォルダを「c:\worksapce」に入れてください。
回路
回路を下図に示します。
※液晶の1ピンと2ピンのVcc、GNDは、液晶によって違うことがあります。必ず付属の説明書を参照してください。
ブレッドボード実装図
ブレッドボードの実装を下図に示します。
※液晶の1ピンと2ピンのVcc、GNDは、液晶によって違うことがあります。必ず付属の説明書を参照してください。
※液晶の14ピンコネクタ部分は半田づけが必要です。また単線も足りませんので各自でご用意ください。
追加する部品
「R8CM12Aブレッドボードセット」の他に追加する部品を下表に示します。
部品 番号 |
名称、メーカ |
数量 |
|
LCDキャラクタディスプレイモジュール(16×2行バックライト無) SC1602BS-B(-XA-GB-K) 販売先:(株)秋月電子通商など |
1 |
U2 |
NJU7032 新日本無線(株) 販売先:(株)秋月電子通商など |
1 |
U3 |
LM60BIZ ナショナル セミコンダクター ジャパン(株) 販売先:(株)秋月電子通商など |
1 |
R4 |
抵抗1kΩ |
1 |
R5 |
抵抗4.7kΩ |
1 |
|
温度センサ
今回使用する温度センサ
今回は、(株)秋月電子通商などで販売されているナショナル セミコンダクター ジャパン(株)製の「LM60BIZ」(以下、LM60)を使用して、温度を液晶に表示します。
LM60はプラス、温度出力、マイナスの3端子型のICで、プラス−マイナス端子間に+2.7〜+10Vの電圧を加えると温度に応じて電圧を出力します。
出力電圧
LM60は、2番ピンから温度に応じて下記の電圧を出力します。
温度℃ |
出力電圧[mV] |
-40 |
174 |
-25 |
268 |
0 |
424 |
25 |
580 |
100 |
1049 |
125 |
1205 |
|
LM60のデータシートより、1℃あたり6.25mVの電圧となります。
0℃のとき424mVなので、上表の出力電圧を424で引くと、0℃のとき0mVになります。100℃のときは1049-424=625mVとなります。625mVで100℃なので、次のように変換することができます。
温度=(電圧-424mV)/625×100 [℃]
※100℃のとき、「(電圧-424mV)/625」で1です。100を掛けることによって100になります。
電圧に直すと、下記のようになります。
電圧−424=温度×625/100
電圧=温度×625/100+424 [V]
マイコンで温度を計算する
A/D変換器は、5V(電源電圧)が入力されたとき1023になります。想定される最高温度のときに5Vが入力されるようにすると、A/D変換値を精度よく使うことができます。(※A/D値1あたり、5/1023=4.888mV)
今回は温度計として使用するので、真夏で締め切った室内を想定すると60℃くらいでしょうか。
60℃のときの電圧=60×625/100+424=799[mV]
60℃のときの出力電圧は799[mV]です。できれば5000[mV]に近い値にしたいので、オペアンプを使って電圧を増幅します。今回は60℃のときに5Vが入力されるようにします。オペアンプの増幅率を下記に示します。
増幅率=オペアンプから出力させたい電圧[mV]/入力電圧[mV]
=5000/799
=約6.25
オペアンプの非反転回路を下図に示します。
Vinが入力電圧、Voutが出力電圧です。VoutとVinの関係式を下記に示します。
Vout=(Rs+Rf)/Rs×Vin
増幅率は6.25なので「(Rs+Rf)/Rs」が約6.25になるRsの抵抗、Rfの抵抗を選びます。
Rs=1kΩとすると、Rfは5.25kΩになります。E6系列で5.25に近い値は4.7なので、今回はRf=4.7kΩとします。
今回の回路を下記に示します。
増幅率は、下記のようになります。
(Rs+Rf)/Rs
=(1+4.7)/1
=5.7
オペアンプの出力電圧を下記に示します。
温度℃ |
LM60の出力電圧[mV] |
オペアンプの出力電圧[mV] |
-40 |
174 |
991.8 |
-25 |
268 |
1527.6 |
0 |
424 |
2416.8 |
25 |
580 |
3306.0 |
100 |
1049 |
5979.3 |
125 |
1205 |
6868.5 |
|
0℃のとき2416.8mVなので、2416.8で引くと、0℃で0Vになります。100℃のときは5979.3-2416.8=3562.5mVとなります。3562.5mVで100℃なので、温度を求める式は次のように変換することができます。
温度=(出力電圧-2416.8)/3562.5×100 [℃]
出力電圧は、下記の計算で求まります。
出力電圧(vtmp)=A/D値/1023×5000(電源電圧[mV]) … ※
次の計算で、温度が求まります。
温度(tmp)=(vtmp - 2416.8)/3562.5×100 [℃]
FPU(浮動小数点演算装置)を搭載していないマイコンが小数点を扱う計算(float型やdouble型)を実行すると速度が遅くなります。またFPU内蔵の有無に関わらず、メモリを大量に消費してしまいます。R8C/M12Aには不向きなので、今回は出力電圧を100回取得して、式全体を100倍して扱うことにします。
温度=(vtmp(100回取得した合計値)−241680)/356250×1000
最後に1000をかけているのは、100℃を1000として扱い(「×1000」が無ければ100℃=1になります)、表示するときに10で割り、少数第一位まで表示します。
今回、温度を計算する変数の型はlong型なので、小数点は切り捨てられ整数しか扱うことが出ません。「(vtmp−241680)/356250」の結果は、1以下です(1=100℃)。先に割り算をすると、小数点を切り捨ててしまうので0か1にしかなりません。そのため、かけ算をしてから割り算をするようにします。最終的な計算は次のようになります。
温度=(vtmp(100回取得した合計値)−241680)×1000/356250
※上記計算は、電源電圧が5000mV(5.000V)のときの計算です。実際の電源電圧をテスターで測り、「5000」部分を実際の電圧[mV]で計算し直してください。
プログラム「lcd_temperature.c」の説明
「lcd_temperature.c」で、A/D変換値の取得、温度に変換、液晶に表示をしています。
ヘッダファイルの登録
液晶を使うので「lcd_lib.h」を登録して、液晶を使えるようにします。
#include "sfr_r8m12a.h" /* R8C/M12A SFRの定義ファイル*/
#include "lcd_lib.h" /* 液晶制御ライブラリ */
main関数
vtmp変数、temp変数をlong型で確保します。この変数に100回分のA/D値を代入し、温度を計算します。
また、液晶の(0,0)に「タダイマノオンドハ」と表示します。
※変数の型は、計算途中を含めて範囲以上にならないか必ず調べてください。今回のvtmp変数の最大は、「電圧の最大値5000×100回=500,000」です。long型の範囲(-2,147,483,648〜2,147,483,647)に収まっているので、使用可能です。
void main( void )
{
long vtmp, temp;
int i, j;
init(); /* 初期化 */
lcd_init(); /* 液晶初期化 */
// 文字列の表示
lcd_position( 0, 0 );
lcd_put_str( "タダイマノオンドハ" );
温度のA/D値を電圧に変換して、100回読み込む
get_ad7関数でA/D値を読み込み、電圧(0〜5000mV)に変換し、vtmp変数に代入します。get_ad7関数はAN7(P1_7)端子の電圧を読み込む関数で、今回はLM60からの出力をオペアンプで5.7倍にした電圧を読み込みます。今回はfor文で100回分読み込んで、vtmp変数には100回分の電圧を保存します。A/D値を100回読み込むだけなら数ms程度で終わってしまうので、1回A/D変換するたびに約5msのウエイトを入れて、100回読み込むのに約0.5秒かかるようにしています。
※今回の計算は、電源電圧が5000[mV]のときの値です。電源電圧をテスターで測り、プログラムの「vtmp = vtmp + (long)get_ad7() * 5000 / 1023;」の『5000』部分を電源電圧[mV]にしてください。
while( 1 ) {
// 温度を100回取得
vtmp = 0;
for( i=0; i<100; i++ ) {
// 電圧変換(5000mVなら、vtmp = 5000)
vtmp = vtmp + (long)get_ad7() * 5000 / 1023;
for( j=0;j<5000; j++ ); /* ウエイト 約5ms */
}
電圧を温度に変換
電圧を温度に変換します。
電圧は100回分の値なので、その他の値も100倍します。
かけ算の「1000」は、100℃を1000に変換するための乗数です。
// 温度変換(100℃のとき、1000に変換)
temp = (vtmp - 241680) * 1000 / 356250;
A/D値の確認表示
A/D値を温度データに変換する前に、A/D値を確認するために、液晶に表示します。確認が不要なら、この部分は削除して構いません。
// 確認用にA/D値を表示
lcd_position( 9, 1 );
lcd_put_str( "A/D=" );
lcd_put_num( get_ad7(), 3 );
符号の表示
温度が0℃以下なら、液晶に表示する符号を「−」してtemp変数の値を正の数に変換します。温度が0℃以上なら、液晶に表示する符号を「+」にします。
// 0℃以下か確認
lcd_position( 0, 1 );
if( temp < 0 ) {
temp = -temp;
lcd_put_str( "-" );
} else {
lcd_put_str( "+" );
}
温度の表示
例えば23.4℃なら、temp変数の値は「234」になっています。
まず、値を10で割って整数部分を計算して3桁分表示します。temp変数が234なら「023」が表示されます。
次に、値を10で割った余りを計算して1桁分表示します。C言語で余りは「%」で求めることができます。temp変数が234なら、「4」が表示されます。
// 上位3桁+"."+下位1桁表示
lcd_put_num( temp / 10, 3 );
lcd_put_str( "." );
lcd_put_num( temp % 10, 1 );
lcd_put_str( "゚C" );
温度が23.4℃のときの液晶への表示例を下記に示します。
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
|
タ |
タ |
゛ |
イ |
マ |
ノ |
オ |
ン |
ト |
゛ |
ハ |
|
|
|
|
|
+ |
0 |
2 |
3 |
. |
4 |
゜ |
C |
|
A |
/ |
D |
= |
6 |
6 |
5 |
|
※電源電圧でA/D値は変わります。
温度をUART0でパソコンに出力したり、圧電サウンダーをつないで設定温度以上になったら音を鳴らすなど、いろいろと改造してみましょう!!
|
|