2014年4月16日水曜日

ペリフェラルの絡み合い

シューティングタイマーとは別のプロジェクトで、超音波を扱う装置を作っています

超音波距離計と似ていますが、アナログはもっと簡単で、タイミングはシビアです

40kHzのパルス作成とADCによる1Mspsでの読み込みを並列して行いたかったので、ハードウェアで処理してみました


イメージとしては上のような感じです
TIM3で40kHzのパルス作成(GPIO2本から正負の出力)
TIM4で1MHzのADCトリガ作成
TIM5で1Hzのソフトウェア割り込み作成
ADC1で波形のキャプチャ
DMA1でADCのデータを転送

TIM5の割り込みでTIM3とTIM4を有効化
しばらく放置するとDMA転送終了割り込みがかかるので、それでTIM3および4を無効化
その後TIM3とTIM4のカウンタをクリア
そしてフラグをセットし次の転送に備えてDMAを初期化

という動作です
タイマ3と4のカウンタをクリアしているのは、次回も確実に同じタイミングで動作するように という目的です  これは1uSecのズレも問題となるためです(ならソフトウェアでタイマ有効化とかするな という話ですが…)


40kHzのパルスを出しつつ、1MspsでAD変換しつつ そのデータをメモリにコピーしつつ
という処理ですが、ソフトウェアで行っているのはタイマ2本の有効化/無効化と細々とした設定だけです
STM32のペリフェラルはCPUを介さずに連動させることができるので、複雑なことでも簡単に処理できます(初期化が面倒ですが。。)


この方法で読みだしたデータですが
このようにタイミングのズレも無く綺麗に読み取ることができます

ただ、40kHzを1MHzでサンプリングすると1周期25サンプルなので、波形としてはある程度形が出ますが、タイミング精度はあまり良くありません
できれば1ケタほどサンプリング周波数を上げたいですが、さすがにマイコン内蔵ADCだと難しいですね

次はこの波形をどうやって処理しようか を考えてみようと思います


各ペリフェラルの初期化は(気が向いたら)近いうちに書きます

0 件のコメント:

コメントを投稿