トップページ     電子回路のページのトップ

 FFTに関する実験

 画像をクリックすると拡大表示されます。
 拡大画像からはブラウザの「←戻る」ボタンで戻ってください。


1 きっかけ

 以前、仕事で木材の強度(ヤング率)を測定する装置を開発したことがあります。
 その時はPC9821の拡張スロットにメーカー製のA/D変換基板、I/O基板を入れました。
 ソフトはTurboC++を使用し、FFTソフトは基板メーカーのライブラリーを購入ました。
 しかし、設備機械にパソコンを使うとメンテナンスが大変ですし、基板とライブラリーだけで20万円以上しました。
 FFT処理がパソコンを使わずに出来ないかと当時から考えていました。
 パソコンのCPUの場合、性能が高いのでFFTが高速で出来ます。
 しかしながら、一般的な制御用のCPUでは処理に時間が掛かって現実的ではありませんでした。
 木材1本の計測には10秒程の時間が与えられていましたが、大部分をメカの動きにとられます。
 0.3秒位でデータの処理を完了する必要がありました。
 最近になって、CPUの性能が上がり、価格も安くなり、考えていたことが現実味を帯びてきました。
 仕事としてのテーマは既に終了していますが、今回、趣味的にチャレンジしてみました。


2 概論

 木材のヤング率は普通は材の中央に荷重を掛け、たわみ量から求めます。
 これでは、計測に時間が掛かり、下手をすると材を傷めてしまいます。
 そこで木材を軽くたたいて、発生する音(打音)の周波数からヤング率を求める方法が考案されました。
 具体的な数式の説明は省きますが、同じ寸法の材なら周波数が高い程ヤング率が高くなります。
 又、同じヤング率なら長さの短い材ほど周波数が高くなります。
 その他、材の比重もパラメータとして必要になります。
 つまり、ヤング率を求めるために打音の周波数、材の重量、材の寸法(3方向)を知る必要があります。
 重量の測定には専門メーカー製のロードセルと専用のプリアンプを購入するのが現実的です。
 そうすれば、あとはプリアンプの出力をA/D変換するだけですので、電気的にもソフト的にも簡単です。
 しかし、メカ的には生産ライン中で重量測定するのは結構大変です。
 材の寸法を生産ラインの中で測るのは面倒ですが、生産ラインでは同じ寸法のものが連続で流れます。
 従って生産開始前に手入力、又はテーブルから選択します。(寸法の計測はしない)
 今回は打音の測定(FFT)に限定して実験します。

 一般的な3m〜4mの柱で測定される打音の周波数は経験的に500Hz〜1500Hzです。
 これをコンデンサーマイクで拾って増幅し、2KHzカットオフのローパスフィルターに通します。
 これを10KHzでサンプリングしてA/D変換し、512点のFFT演算を行います。
 そうすると19.53Hzの分解能となります。
 計測誤差は最大で10Hz程度になり、これによる誤差は750Hzで2.7%、1KHzで2.0%です。
 (ヤング率は周波数の2乗に比例します)


3 ハードウエア

SH7045基板 マイクアンプ 周波数特性 液晶電源 マザーボード
SH7045基板マイクアンプ周波数特性液晶電源マザーボード

液晶表示器 ユニットを接続
液晶表示器ユニットを接続

 CPU基板は秋月電子通商のSH7045基板を購入しました。
 SH2は積和演算器をハードウエアで持っているのでFFTが高速で処理出来そうです。
 この基板は32ビット幅でノーウエイトのSRAMが1Mバイト搭載されています。
 端子配列が不規則、シリアルポートのチャンネル0が結線しにくい等の問題はありますが、おおむね良好です。
 直付けのDサブがデバッガ用のシリアルポート、ケーブル先端のDサブが汎用のシリアルチャンネル0です。
 SH2は今回、初めて使うのでシリアル通信をはじめ、いろいろなライブラリを作成しました。

 次はコンデンサーマイクのアンプとフィルターの基板です。
 電圧ゲインは最大で100倍、最大出力は約3.2V P−Pです。
 フィルターはアクティブフィルターでは無く、アンプ+LCフィルター+アンプの構成です。
 5V単電源ですので手持ちのオペアンプでは、この方が問題が少ないと判断しました。
 アクティブフィルターは作成ソフトを使用すれば設計はできますが、手持ちに適当なOPアンプがありません。
 またスイッチドキャパシタフィルタを使えば回路が簡単になるので試したいのですが田舎では手に入りません。
 このアンプ基板はハード的にアナログ信号を検出してSH7045にトリガ信号を送ります。
 (最初にSH7045がスタート信号を送り、その後の最初のアナログ信号を検出する)
 また、タイマーでトリガ信号を遅延させることが出来ます。
 遅延時間は8ビットのディップSWで0.1mS〜25.5mSに設定出来ます。
 絶えずA/D変換してソフトウエアでトリガポイントを探す方法では後処理が大変です。
 又、設備機械ではノイズにより誤動作する可能性があります。
 この方法ではA/D変換のタイミングが細かく取れるので、その間機械を止める事もできます。

 グラフはアンプの周波数特性を実測したものです。
 サンプリング周波数が10KHzですので5KHz以上の信号成分が、あってはなりません。
 見た通り、素晴らしい特性とは言い難いのですが我慢する事にします。

 3枚目の小さな基板はドットマトリクス液晶の電源です。
 5Vから−4V〜−11Vを発生します。(液晶個々のばらつきに合わせ調整する)

 次はマザーボードです。
 古いSTDバスのユニバーサル基板を流用したのでカードエッジが有りますが不要です。
 2種類のシリアルROM(24LC256、M93C46)と5Vレギュレーターが載っています。
 シリアルROMはライブラリ作成の為に取り付けましたが今回は使用していません。

 上側の液晶表示器は一般的な16文字×2行のキャラクタタイプの液晶表示器です。
 下側が今回使用したドットマトリクス液晶表示器(セイコーインスツルメンツG1213)です。
 画面サイズは縦32ドット、横128ドットです。
 波形を精細に観察するには貧弱ですが、今回の用途ではピーク点の周波数さえ解れば良いので十分です。
 (周波数を求めるには波形表示は不要ですが、動作状態を確認するには表示が必要です。)
 この液晶はデータバスが8bit、制御線が5bit、合計13点のポートを必要とします。
 電源は制御部が5V、液晶が−4V〜−11V(液晶のばらつきに合わせ調整)の2電源です。
 キャラクタ液晶と異なり表示データは全て作成してやらなければなりません。

 最後に全部を接続した状態を示します。
 この中でキャラクタ液晶はライブラリ作成の為に取り付けましたが、今回は使用していません。


4 開発ツール

 前述したようにSH2は初めてなのでアセンブラ、コンパイラ、デバッガを用意しなければなりません。
 秋月のCPU基板にはフリーのGCCコンパイラが付属していましたが、面倒くさそうで使う気になりません。
 たまたまイエローソフトのホームページを見ていたらSH2の開発ツールの評価版が有ることを知りました。
 イエローソフトは以前、H8用の開発ツールを購入した関係で知っていました。
 とりあえず評価版を使わせてもらう事にしました。
 開発ツールは慣れるまでは大変ですが、H8用で使い方を覚えていたので問題ありませんでした。
 評価版はコードサイズの制限(24Kバイト)がありますが、他に制限は無さそうです。
 24Kバイトあれば、そこそこの実験は出来そうです。
 さらにイエローソフトには秋月の基板用のデバッグモニタとスタートアップルーチンが用意されていました。
 それから、サンプルとしてFFT関係の関数も用意されていたので、そのまま利用させて頂きました。

 アンプ基板に載っているPIC16F84AのソフトはCCSのPCMコンパイラを使用しました。
 スタート信号を作成するだけなので、わずか数十行の短いソースです。

 回路図の作成とスパイスシミュレーションにはプロテル99SEを使用しました。


5 ソフトウエアの作成

 肝心な部分はイエローソフトから頂戴したので、それほど苦労しませんでした。
 少し面倒だったのはドットマトリクス液晶に波形やキャラクタを表示するライブラリーの作成でした。

 最初にルネサスからSH7045のハードウエアマニュアルとソフトウエアマニュアルをダウンロードします。
 イエローソフトからSH2開発ツール(評価版)をダウンロードしてインストールします。
 ついでにFFTライブラリ、その他のサンプルもインストールしておきます。
 まず、デバッガ(イエロースコープ)のモニタを若干、修正します。
 秋月SH7045用のモニタのプロジェクトフォルダがそのままインストールされているので簡単です。
 DTCベクタの記述を追加し、アドレス信号A20、A21をポートに変更してメイクします。
 出来上がったモニタのオブジェクトをSH7045に書き込みます。
 スタートアップルーチンも同様の変更をしておきます。
 今後、デバッグするソフトはモニタによって外部RAM上にダウンロードされ、実行されます。
 ただし、外部RAMは2ステートアクセスの為、内部ROMに比べて遅くなります。
 そのかわり、デバッグ時の書き込みは早くなり、書き込み回数の心配は無くなります。
 次に全てのSFR(周辺機器の設定を書き込むレジスタ)のアドレスを定義したヘッダファイルを作成します。
 このファイルに若干の型定義を追加します。
 DTCレジスタ情報を書き込む構造体とメモリをバイト、ワード、ダブルワードで参照する共用体等です。
 この後、アセンブラやCで各種のライブラリーとライブラリーの試験プログラムを作成しておきます。
 ただし、今回は、そのうちの一部しか使用しません。
 今回、A/D変換にDTCを使用しましたが、DTCは初期設定以外のコードの記述をしません。
 512点のA/D変換はハードウエアが自動で行います。
 その為、うまく行かない時のデバッグは大変です。
 DTCの起動要因を設定するレジスタは値を書き込む前に読み出さなければなりません。
 これを守らなかった為、1日無駄にしました。
 タイマーがA/Dを起動しA/D完了がDTCを起動するのですが、どの割り込みを記述するのか悩みました。
 結論として512回サンプル後のA/D割り込み処理のみ(1回だけ)を記述します。
 ここで割り込みフラグをクリアしてタイマーを停止するだけです。
 M16Cは、自動で割り込みフラグをクリアしてくれるのですが、日立系のCPUは記述しなければなりません。
 これを忘れると無限に割り込みを繰り返してしまいます。

 FFTに関する3つの関数は使い方を覚えれば問題ありません。

 (注:DTCはデータトランスファーコントロールの略でDMAに似た機能を持っています。)


6 結果

表示1 表示2 表示3 表示4
表示1表示2表示3表示4

表示5 表示6
表示5表示6

 表示1はスタート釦を待っている状態です。(砂時計のつもり)
 表示2は正弦波を入力した時のパワースペクトルです。
 表示3はピーク点の周波数を数値表示したものです。
 表示4はこの時の入力波形です。

 表示5は歪んだ波形を入力した時のスペクトルです。
 高調波が出ています。
 基本周波数は同じです。
 表示6は、その時の入力波形です。

 以上、信号発生器によるダミーの打音での実験ですが、マイクロフォンでトリガが掛かることも確認しました。
 木材やメカを用意出来ないので、実験はここまでです。
 処理時間は計測していませんが、0.5秒の遅れ時間があれば感覚的に判るので大丈夫だと思います。
 実際に使用するには重量計測や材の寸法入力(データテーブルやスイッチ等で)を追加します。
 製造ラインに組み込むには、ポートやシリアルポートを使ってシーケンサーやパソコン等と通信します。
 そして木材に結果を印字したりします。


トップページ  「電子回路」のトップ