So-net無料ブログ作成

簡単ファイルシステム評価ボード ALFATを使ってみよう! 其の十一 [ALFAT]

※注意!
これからこのブログを書きながら最終的なハードウエアデバック、アプリケーションソフトウエアの構築に入ります。なので、写真や文章と実際の製品では異なる部分が出る可能性が有ります。その点をご了承下さい。

アプリケーション編2

LM35DZの場合、計測範囲が0℃~であり、0℃以下になっても出力は0に張り付いたままになってしまうので、逆にこの温度センサーICを0℃以下に冷やす事で、回路のオフセット電圧を調べる事が出来ます。
そこでALFATの基板に5分間だけA/D値の記録を取るプログラムを作成し、冷蔵庫の冷凍室に突っ込んで見ました。
結果は2~3のA/D値をサンプリングできましたので、この回路のオフセットは3とします。オフセット調整回路を持たない割りには、なかなか優秀ですね。
さてこの回路は前回も紹介した通り0℃~50℃までの温度を計測します。オフセットが無ければ0℃~50℃に変化した時、LM35DZの出力は0mV~500mV変化します。しかしH8のA/Dのダイナミックレンジは0Vから5Vまでなので、LM35DZの出力をそのまま入れたのではA/Dの性能を有効に使っていない事となり、それは勿体無いのでLM35DZとH8の間にオペアンプを入れて増幅をする話でした。
50℃となった時に、H8に5V入る様に増幅してもいいのですが、上限に若干余裕を持たせて、50℃の時に約4.5V入る様に増幅率を設定します。 オペアンプは非反転増幅回路を構成し、使用するのは1%精度の金属皮膜抵抗です。増幅率を決める二つの抵抗の抵抗値は160KΩと20KΩを予定していましたが、手持ちに162KΩしか無かったので、実際は162KΩと20KΩとなっています。つまり理論上の増幅率は9.1と言う事です。もっとも1%精度の抵抗なので、最大1%の誤差がある訳ですが、0℃~50℃の範囲で小数点以下1位までしか計測しないので、これで十分でしょう。
ところでフルスケールですが、H8/3687Fの場合VREF端子を持たないので、VCCがA/Dコンバータの基準電圧となってしまいます。つまりA/Dコンバータのダイナミックレンジは電源電圧に影響されてしまうので、この基板の電源電圧も求めて置きましょう。
テスターで計ると5.05V有りました。つまりアナログ入力が5.05Vの時にA/Dの最大値の1023となる訳です。という事はA/D値を温度に換算するには以下の式を解く事となります。
増幅率 = 162K ÷ 20K + 1
A/D値のフルスケール = 0.5(V) × 増幅率 × 1024 ÷ 5.05(V)
オフセット = 3
温度 = (A/D値 - オフセット) × 50(℃) ÷ フルスケール
これで読み取ったA/D値を温度に換算してLCDに表示したのが冒頭の写真です。
簡単ですが調整が完了したので、早速温度計測&ロガーとして動かしてみましょう。
H8/3687のRTCを動かし、1秒周期のタイマーを起動します。そのタイマーの値をメイン関数でモニタし、1秒の変化のタイミングでA/Dコンバータを起動、CH4のA/D値をLCDに表示します。また、10秒置きにファイルへも書き込みを行います。
以下がRTCを起動している処理と、割り込みハンドラです。
  /* RTC初期化 */
  RTC.RTCCR1.BIT.RUN = 0;	/*動作停止*/
  RTC.RTCCR1.BIT.RST = 1;	/*リセット*/
  RTC.RTCCR1.BIT.RST = 0;	/*リセット解除*/
  RTC.RTCCSR.BIT.CKSI = 8;	/*32.7678KHz*/
  RTC.RTCCR2.BIT.SEIE = 1;	/*割り込み許可*/
  RTC.RTCCR1.BIT.RUN = 1;	/*動作開始*/
  IENR1.BIT.IENTA = 1;	/*割り込み許可*/
#pragma interrupt(RTC_Int) /*RTC*/
void RTC_Int( void )
{
  IRR1.BIT.IRRTA = 0;
  IO.PDR3.BIT.B6 ^= 1;
  second_count++;
}
続いてループ文の中身
#define	TEMPER_OFFSET  3  /*温度計測回路のオフセット分*/
#define	GAIN  (162 / 2 + 10)  /*AMPのゲイン*/
#define	FULL_SCALE  ((50 * GAIN * 1024L) / 505)
#define	temperature(temp)  ((((long)temp - TEMPER_OFFSET) * 5000L) \
  / FULL_SCALE)
  for( loop = old_count = second_count = 0; loop < 60 * 2; loop++ )
  {
    /*1秒経過待ち*/
    while( second_count == old_count ) ;
    old_count = second_count;

    /*A/D変換の開始 AN4に温度の入力がある*/
    AD.ADCSR.BIT.CH = 4;	/*AN4の選択*/
    AD.ADCSR.BIT.CKS = 1;	/*変換時間は70ステート*/
    AD.ADCSR.BIT.ADST = 1;	/*変換の開始*/
    while( AD.ADCSR.BIT.ADF == 0 ) ;	/*変換完了待ち*/
    AD.ADCSR.BIT.ADF = 0;
    AD.ADCSR.BIT.ADST = 0;	/*変換の停止*/
    temper = AD.ADDRA >> 6;	/*データの引き取り*/

    /*温度をLCD表示用に変換*/
    memcpy( LcdBuf, base_msg, sizeof(base_msg) - 1 );
    itoa4( &LcdBuf[9], temperature( temper ) );
    LcdBuf[9] = LcdBuf[10];
    LcdBuf[10] = LcdBuf[11];
    LcdBuf[11] = '.';
    LcdBuf[13] = ' ';
    /*表示*/
    LCD_Refresh();

    /*10秒に一回ファイルに書き込み*/
    if( (loop % 10) == 0 )
    {
      /*温度をファイルデータに変換*/
      strcpy( buffer, itoa4(temp_buf, loop) );	/*秒*/
      strcat( buffer, "," );	/*カンマ*/
      LcdBuf[13] = '\0';
      strcat( buffer, &LcdBuf[9] );	/*温度*/
      strcat( buffer, "\r\n" );	/*改行コード*/

      /*ファイルへの書き込み*/
      I2CMasterPuts( ALFAT_ADR, file_data_write );	/*WFコマンド発行*/
      do
      {
        I2CMasterGetc( ALFAT_ADR, &rcv_data );
      } while( rcv_data != '"' ) ;
      I2CMasterPuts( ALFAT_ADR, buffer );	/*データの書き込み*/
      prompt_read( 1 );
    }
  }
ファイルへはCSV形式(カンマ区切りのテキスト形式)で記録されますので、記録されたメディアをパソコンに挿し込んで表計算プログラムで読み込めば以下の様なグラフを表示する事が出来ます。

温度が大きく変化しているのはLM35DZを指で摘んで温度変化をさせているからです。
という訳で、温度ロガーの一丁上がりです(*´ー`) フッ。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。