H8 Tiny Series BB64E Evaluation Board を使用した音の計測について

はじめまして、こんにちは。

現在、研修の一環として組み込みマイコンの勉強をしており、首題のキットを使用して音の大きさをLEDに表示させようと考えております。

そこで、実際にコーディングをしてみると得られた結果が明らかにおかしいため、質問致します。

内容としては、マイクの有無に関わらずいくらかの値が計測され、その値が少しずつ上昇し続けている、というものです。

レジスタの値を確認してみると、測定のループを重ねるごとに少しずつ増えていることがわかりました。

しかし、なぜそのような現象が起きているのかわかりません。

基板自体は正常な動作をしております。ただ、AD変換入力の中点調整をする半固定抵抗の値は不確かです。

原因の分かる方、対策を教えてください、宜しくお願い致します。

なお、途中の計算式については、得られた値に関して正しく計算できております。

コード

*********************************************************************************************************************************

/* マイクからの入力信号をLEDに表示させるプログラム */

#include<stdio.h>
#include"iodefine.h"
#include<math.h>

void init_ad(void);
void init_io(void);
void ad(void);

void main(void)
{
   init_ad();    // A/Dコンバータの初期化
   init_io();    // I/Oポートの初期化

   while(1){
      ad();    // A/Dコンバータ実行
   }
}

void init_io(void)
{
   IO.PCR6 = 0xFF;    // ポート6の全端子を出力
   IO.PDR6.BYTE = 0;    // 全LED消灯
}

void init_ad(void)
{
   AD.ADCSR.BYTE = 0x01;    // 割り込みなし、単一モード AN1
}

void ad(void)
{
   unsigned long SP=0; //Sound Pressure
   unsigned long SUM_SP2=0; //SUM of SP^2
   unsigned long AVG_SP2=0; //Average of SP^2
   unsigned long E_SP=0; //Effective value of SP
   unsigned short i;
   unsigned long j;

   for(i=0;i<1000;i++){    //試行回数
      AD.ADCSR.BIT.ADST = 1;    // A/Dコンバータスタート
      while( !AD.ADCSR.BIT.ADF )    // 終了を待つ
      ;
      AD.ADCSR.BIT.ADF = 0;
      SP = AD.ADDRB >> 6;

      SUM_SP2 += pow(SP,2);    //2乗
}

   AVG_SP2 = SUM_SP2 / 1000;    //2乗平均値(試行回数で割る))
   E_SP = sqrt(AVG_SP2);    //実効値

   if( E_SP > 0 && E_SP < 128){    //LED光り方
      IO.PDR6.BYTE = 0x01;
   }
   else if( E_SP >= 128 && E_SP < 256){
   IO.PDR6.BYTE = 0x03;
   }
   else if( E_SP >= 256 && E_SP < 384){
   IO.PDR6.BYTE = 0x07;
   }
   else if( E_SP >= 384 && E_SP < 512){
   IO.PDR6.BYTE = 0x0F;
   }
   else if( E_SP >= 512 && E_SP < 640){
   IO.PDR6.BYTE = 0x1F;
   }
   else if( E_SP >= 640 && E_SP < 768){
   IO.PDR6.BYTE = 0x3F;
   }
   else if( E_SP >= 768 && E_SP < 896){
   IO.PDR6.BYTE = 0x7F;
   }
   else if( E_SP >= 896 && E_SP < 1024){
   IO.PDR6.BYTE = 0xFF;
   }
   else{
   IO.PDR6.BYTE = 0xAA;
   }

   for(j=0;j<2000000;j++){    //光っている時間
   ;
   }
   IO.PDR6.BYTE = 0x00;    //消灯
}

*********************************************************************************************************************************

参考

http://japan.renesas.com/products/mpumcu/h8/h8300h_tiny/h83687_h83687n/index.jsp

http://www.hokutodenshi.co.jp/7/BB64E-H8Tiny.htmhttp://www.hokutodenshi.co.jp/7/BB64E-H8Tiny.htm

Parents
  • いもけんぴー さん

    こんにちは、

    A/D変換結果が変換回数をおう毎に増えるということでしょうか?

    その場合、AN1には何が接続されていますか?

    AN1に接続されている信号源のインピーダンスは5kΩ以下でしょうか?

    インピーダンスが高いと一回のサンプリングでは電圧をサンプリング出来ない場合があります。

    ルネサスサイトに以下のようなFAQがありました。

    japan.renesas.com/.../MPUMCU_H8300H_019_J.jsp

    確認してみては如何でしょうか?

  • SAさん

    こんにちは、回答ありがとうございます。

    インピーダンスは2.2kΩなので問題ないと考えられます。

    しかし、たしかに参考URL先のコンデンサ容量が原因であるような挙動をしている気もします。

    その付近をもう一度洗いなおしてみようと思います。

Reply
  • SAさん

    こんにちは、回答ありがとうございます。

    インピーダンスは2.2kΩなので問題ないと考えられます。

    しかし、たしかに参考URL先のコンデンサ容量が原因であるような挙動をしている気もします。

    その付近をもう一度洗いなおしてみようと思います。

Children
No Data