2017年6月13日火曜日

STM32F4のADC(DMAと連続変換)


 1kHzの正弦波をADCに通してみた、の図。
 横軸の単位はミリ秒、縦軸の単位は電圧Vで、3000サンプル取っている。サンプリングレートは2Mspsのようだ。
 今回はADC1のみで変換している。デュアルADCをやりたいんだけど、うまく動いてくれないので、とりあえずシングルADCでどこまで取れるかを試した次第。
 入力自体は単純な正弦波だが、サンプリング開始直後の波形は結構乱れている。おそらくCR LPFの特性やDACの出力インピーダンス、それからADC変換を行っていない時と変換を行っている時の入力インピーダンスの違い、といった点の関係だと思う。コレ自体はF1超音波風速計の時にインピーダンスの差から波形が乱れる事はわかっていたので、ある程度は想定内。風速計の場合、波形の高さは問題ではなく、位相が正しければ充分なので、インピーダンス変換等は必要ないはず。
 システムクロックは12MHzの水晶を12分、240倍、2分で120MHzにし、PCLK2はさらに2分周して60MHzが供給されている。ADCはさらに2分周した30MHzが供給されている。解像度は12bitで、1回の変換が15クロックなので、30MHz/15=2Mspsということになる。
 ADCの変換は3サイクルのサンプリング+15サイクルの変換で計18サイクルが必用なのかな、と思っていたけど、そういうことではないようだ。

 超音波風速計は位相が取れれば充分なので、ビット数を減らしてサンプリングレートを上げることもできるかもしれない。とはいえただでさえ弱い圧電素子の出力を、さらに分解能を下げてしまうと、正常に位相を計測できないかもしれない。このあたりは実際に試してみないとわからないな。
 本当は外に10倍か100倍くらいのオペアンプを1段付けておけば楽なんだが、手持ちに40kHzが通るオペアンプがないので、とりあえず直結で。


 超音波風速計ではどれくらいのサンプリングレートが必用か。
 風速で0.05m/s、気温で0.1degCの分解能を得ようとすると、位相差を60ナノ秒くらいの分解能で測る必要があるらしい。20Mspsくらい必用ってことか。シングルADCだと2Mspsまでなので、何らかのフィルタリングで時間分解能を稼ぐか、等価時間サンプリングで時間分解能を稼ぐか。
 僕が使ってるオシロスコープは100Mspsだが、まぁ大体これくらいの性能があれば充分、って感じか。DSO Touchで10Msps、市販のポータブルオシロスコープで40Mspsくらい、らしい。DSO Touchだとちょっと分解能足りないなー、くらいかな。
 やっぱりアナログ回りはしっかり作る必要ありそうだなぁ。メンドクサイ回路は嫌だなぁ。耐ノイズ性とか考えると受信素子の直近にオペアンプを1個入れるのが良いんだろうけど、そうすると相当面倒なことになりそうだなぁ。


追記:2017/06/13
 現行のバージョン(2017年4月版)のHALではデュアル(orトリプル)ADCは使えないようだ。D/T ADCではデータの読み込みはADC1->DRではなく、ADC123_COMMON->CDRを使う必要があるらしい。しかしHALではCDRを使う関数(orマクロ)は存在しない。
 LLではCDRのアドレスを探す関数が有ったりするので、D/T ADCがどうしても必用ならそっちを使う必要がある。
 HALはこういうところが作り込まれてない。真面目に作れよ、とも思うが、デュアルや、特にトリプルADCだと対応するマイコンが少ないはずなので、抽象化という意味ではあんまりやらないほうが良いのかも。

0 件のコメント:

コメントを投稿