2018年7月1日日曜日

超音波風速計

 久しぶりに超音波風速計で試行錯誤。
 モノは去年の2月頃に作ったフレームで、受信基板はSTBee F4mini用に新造した(たぶんF4mini用の基板は作ってなかったはず)。

 センサ間距離は15cmで、受信はオペアンプを挟まず、直接マイコンのADCに接続している。受信レベルは240くらいなので、-24dBくらいの電圧レベル。

 送信はGPIO2本で6.6Vppになる。片方は保護抵抗100Ω、もう片方はAC結合0.1uFを挟んでいる。
 受信は片方をGND固定、もう片方を0.1uFでAC結合した後、GNDと3.3Vの間を4.7kΩで分圧しオフセットしている。
 受信素子の回路はもうちょっとやりようがあるはず。

 送信は80kHzでGPIOをトグルし、結果的に40kHzの矩形波が出力される。位相がずれなきゃ良いので、矩形波でも問題ないはず。STMはDACが2本しか無いから、送信素子と受信素子を1対1にして正弦波を6経路用意しようとするとアナログスイッチとかオペアンプとか複雑になってしまう。
 // オペアンプでアイソレーションしてからインピーダンス高めにして送信しないchをマイコンのGPIOに吸わせて、送信するchはマイコンのGPIOをHiZにすれば、必要なchだけ出せるかな? でも1chあたりオペアンプが3回路必要になるからかなり大規模になってしまう。

 受信は1.4Mspsでサンプリングしている。サンプリングは3cycleなので入力インピーダンスはかなり低いはず。

 今の所、マイコンと送受信素子以外には、抵抗が18個、抵抗が12個だけで、回路としてはとても小規模。

 CubeMXになってからTIMやADCやDMAやらの連携がとても楽になった。チップの選択から位相を計測するまで、ガッツリやれば丸一日で作れるくらい。


 計測結果はこの様になる。ディレイを挟まずに100回サンプリングした。7.2秒くらいかかるので、1回あたり72msec、1軸あたり12msec程度かかっている計算。
 FIRが191タップあるし、ADC結果が2048サンプルあるし、ゼロクロスの検出も最適化してないので、結構遅い。FIRはもうちょっと弱くても良いかもしれない。位相の検出も、2048サンプルも必要ないかもしれない。ゼロクロスの検出は明らかにもっと早くできる。ということで、最適化すればもうちょっとどうにかなるだろう。

 このグラフでは3方向から息を吹いている。上の3本線は弱く動いているが、これが正しい反応。
 オレンジと赤はかなり暴れている。内部処理(位相の平滑化)の問題な気がする。位相が0を超えて動くと各々を平滑する際に中途半端な結果になってしまう。位相の平滑ってどうやるんだろうか。sin/cosで2次元空間にしてから平滑して1次元に戻す、って感じなんだろうか? 浮動小数点使うとsin/cosの計算コストが高いので適当なところで整数にしてやる必要がありそう。そもそもfloatの是非云々

 今回も、超音波風速計は位相しか計測できない。とりあえず、当面の目標は何波目かを手動で設定して、そこからクローズドループで波数と位相をトラッキングして気温と風速を計測する、という感じか。そこまでできるようになれば、外部の温度センサとかを使って起動時の波数を推測したりできるようにすれば、自動で計測できるようになる。


 試しにフレームをちょっと押してみると、それなりに位相の変化が見られる。息を吹くと位相が0.1程度変化するが、これは距離にすると0.8mmの変化に相当する。ということは、0.5mm程度歪むと風速の変化として見えるかもしれない。市販の超音波風速計はかなりヤワそうな形だけど、実際の歪みは0.1mm未満程度なんだろう。どんな素材なんだろうか。まぁ、普通は風があたったくらいじゃそんなに歪むもんじゃないだろうが。鳥が乗ったりすると歪むかも。超音波風速計はヘリコプターの乱流を測ったりにも使われてるから、ヘリコプターのダウンウォッシュを至近距離で浴びても歪まない程度の強度はあるんだろうが。

0 件のコメント:

コメントを投稿