トップ «前の日記(2008年08月26日) 最新 次の日記(2008年08月30日)» 編集

のろのろのろ雑記


2008年08月27日 [ColdFire] ColdFire×P2P地震情報(2) 地震計としてのColdFire基板

_ [ColdFire] ColdFire×P2P地震情報(2) 地震計としてのColdFire基板

 Interface 9月号付録基板を使い,P2P地震情報のサービスを作ってしまう(かもしれない)勝手な企画です.過去の記事は,タイトルのColdFireカテゴリからどうぞ.

前回のおさらい

  • 『ガル(gal)』は加速度の単位で,センチメートル毎秒毎秒(cm/s^2)を指します.
  • 気象庁の震度は,3軸加速度センサの値から計算した計測震度をもとにしています.
  • ColdFire基板では計測震度の計算は困難であることから,バンドパスフィルタを掛けた最大加速度『5HzPGA』っぽいものの計算を目指すことにしました.

ColdFire基板の加速度センサ "MMA7360L"

 ColdFire基板には,3軸加速度センサとしてMMA7360Lが実装されています.感度として ±1.5 g,±6 gの2種類が選択可能で,1.65 Vを0 gとし,±1.5 gモードの時は800 mV/g(1 gあたり800 mV)の直線変化を示すようです.

 ただし,これらはTypicalの値で,0 gの電圧は1.485 V〜1.815 Vの間,1 gあたりの感度は740 mV/g〜860 mV/gの範囲で変動することに注意しましょう.

1   G = 9.80665 m/s^2 = 980.665 cm/s^2 =  980.665  Gal であるから,
1.5 G =                                  1470.9975 Gal
6   G =                                  5883.99   Gal

 前回紹介したガル換算ではこのようになります.岩手・宮城内陸地震で4022 Gal(3成分合成)が観測されたことを考えると「±1.5 gモードじゃ足りないかな」と思いますが,このような値を示すことは極めて稀です.中〜小規模の揺れに対する精度を確保するためにも,±1.5 gモードが適切と言えるでしょう.

 なお,観測点の位置関係も考えると正確な比較は出来ませんが,新潟県中越地震の余震で2515 Gal(3成分合成),阪神淡路大震災で818 Gal(南北成分)が観測されています.

ColdFire基板のColdFire "MCF52233"

 ColdFire基板には,ColdFireとして(?)MCF52233が実装されています.

 データシートを見る限り,12bit A/Dコンバータを8チャネル持っているようです.入力電圧は0 V〜3.6 V,応答速度は最小1.125 μsとなっています.

 例えば,入力電圧を0.85 V〜2.45 Vと設定すれば,±1.5 gモードに設定した状態では-1 g〜+1 gまでの区間が4096段階で読み取れる計算になります.

ColdFire基板のA/Dコンバータはどう設定されているか

 Interface 9月号の付録基板 "CQ-FRK-MCF52233" では,A/Dコンバータがどのように設定されているでしょうか.

 回路図や仕様はあまり読めない人なのでテキトーな解釈ですが,入力電圧の設定にはV_RL(V_REFL)とV_RH(V_REFH)が関係していて,V_RLはグランドと接続,V_RHは入力電源と接続されているようです.

 つまり,入力電圧は0.0 V〜3.3 Vに設定され,±1.5 gモードにおける加速度の範囲と出力値の関係はたぶん次のようになります.

電圧 (V)加速度 (G)加速度 (Gal)12bit 出力値
0.00-2.06-2022.620
0.05-2.00-1961.3362
0.45-1.50-1471.00558
0.85-1.00-0980.671054
1.25-0.50-0490.331551
1.65*0.00+0000.002047
2.05+0.50+0490.332543
2.45+1.00+0980.673040
2.85+1.50+1471.003536
3.25+2.00+1961.334032
3.30+2.06+2022.624095

 もちろん,±1.5g モードですから,+2.06 Gなんて値は出ないでしょうが.

SilentCにおける,加速度センサのデータ

 さて,SilentCでは加速度センサの値をどう扱っているのでしょうか.次のようなプログラムで実験してみましょう.

main()
{
InitAd(0x70);
#stop 0
for(;;) {
  if(Getc(0)!=0)break;
  PrStr("x:");PrNum(GetAd(4));
  PrStr(", y:");PrNum(GetAd(5));
  PrStr(", z:");PrNum(GetAd(6));
  PrStr("\r\n");SystemSleep();
}
}

 初期化して,おまじないをかけて,3軸の値をひたすら出力し続けます.何かキーを押すと止まります.

 なお,数サンプルごとにまとめて受信・表示されますが,これはNagleアルゴリズムと遅延ACKによる仕様です.

x:2006, y:2089, z:2816
x:2001, y:2114, z:2818
x:1992, y:2078, z:2807
x:1996, y:2088, z:2819
x:1990, y:2079, z:2811
(ここでキー入力)
OK

 ネギ以上に思いっきり振ると0〜4086あたりで変動することや,それぞれの軸に対して重力を掛けるとだいたい表の通りに変動することから,± 1.5gモードでA/Dコンバータを通った値がそのまま入るようです.±1.5 gモードなのに±2 g近く出ていることになりますが,「±1.5 gまでは正確に測定するけど,それ以上は知らないよ」という性質のものとしておきましょう.

 まっすぐ置いた状態では,z軸に1 G,他は0 Gですから, "x:2047, y:2047, z:3040" となるのが理想です.しかし,「加速度センサ・A/Dコンバータの仕様の範囲内で」それぞれズレていますし,揺らぎ(ノイズ)もあるようです.

とにかくGal表示をやってみたい!

 A/Dコンバータを通った値をそのまま表示しても面白くないので,簡単なコードでGalの近似値を出力してみましょう.

main()
{
long i;
InitAd(0x70);
#stop 0
for(;;) {
  if(Getc(0)!=0)break;
  // "PrNum((GetAd(4)-2048)*80/81);" が動かない為,途中経過を入れる
  PrStr("x:");      i=(GetAd(4)-2048)*80;PrNum(i/81);
  PrStr(" Gal, y:");i=(GetAd(5)-2048)*80;PrNum(i/81);
  PrStr(" Gal, z:");i=(GetAd(6)-2048)*80;PrNum(i/81);
  PrStr(" Gal\r\n");SystemSleep();
}
}
x:-31 Gal, y:47 Gal, z:750 Gal
x:-46 Gal, y:58 Gal, z:742 Gal
x:-50 Gal, y:60 Gal, z:745 Gal
x:-47 Gal, y:54 Gal, z:749 Gal
x:-36 Gal, y:49 Gal, z:740 Gal
(ここでキー入力)
OK

 やはりズレとノイズが気になります.

"地震計" としてのColdFire基板

 さて,A/Dコンバータの値を読み取り,Galに換算することが出来ました.しかし,これだけでは問題があります.

  • 理想の値とズレが生じています.
    • 加速度センサによる0 gの電圧差は約±200 Galの差として現れることがあります.
    • 加速度センサによる1 gあたりの感度差は約±75 Galの差として現れることがあります.
  • ノイズがあります.
  • サンプリングをなるべく等間隔に行う必要があります.
    • ネットワークとの通信やSilentCの処理などにより,実行時間が変動することを考慮しなくてはなりません.

 次回以降,この辺りを考えていきます.

今回のまとめ

  • 加速度センサの値0〜4095と,加速度-2022.62 Gal〜+2022.62 Gal(重力加速度-2.06 G〜+2.06 G)が対応しています.SilentCでも同じです.
  • 地震計として使うためには,「ズレ」「ノイズ」「サンプリング間隔」の3点を考える必要があるようです.

参考