Micom Car Rally NET
MCR - Micom Car Rally
2015大会 マイコンカーラリーとは? 今から始めるマイコンカーラリー 技術情報 大会記録 MCRファン倶楽部 お問い合せ
マイコンカーラリートップへ マイコンカーラリートップへ
技術情報 >> R8C/M12A 技術情報
技術情報
アプリケーション
R8C/M12A 技術情報
上位入賞マイコンカー
参加者レポート
よくある質問(FAQ)
ダウンロード
R8C/M12A 技術情報
液晶を使った温度計
2012.08.14プログラム差し替え

計算方法を変えて、プログラムを変更しました。プログラムが「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

出力電圧

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

オペアンプの非反転回路を下図に示します。

LM60

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Ωとします。
今回の回路を下記に示します。

LM60

増幅率は、下記のようになります。
 (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
         
 

※電源電圧でA/D値は変わります。

温度をUART0でパソコンに出力したり、圧電サウンダーをつないで設定温度以上になったら音を鳴らすなど、いろいろと改造してみましょう!!


BACK