ADCの変換タイミングを外部(Timer)で決めてやる

時間測定が、

STM32での実行時間測定(DWT機能を使う)

でできるようになったので、次は今までfree runだったADCとDMA転送に対してADCの変換タイミングをTimerで決めてやることにします

ただ、この場合に内部のRC発信器使うのでは精度も安定性も確保できないので、幸いNucleoではST-Linkボード上の水晶発信器(8MHz)を取り込むことが可能なので、その信号を基準値として使います

<実行環境>

・M4 MacBook Pro Tahoe

・CubeIDE 1.19.0

・STM32F401re

 

<まずはペリフェラルクロックだけ変えてみた>

クロックの切り替えは単純でMXのClock Configulationの設定を変えるだけ、System Clock MultiplexerでHSIからHSEを選択するだけ

ちなみにこの状態で同じ条件(128ワードのDMA転送実施)すると、HSI使ってたときにはおよそ94μsが、

504μsに変化、system clockは変化してないのでDMA転送とかは高速のままだろうから10倍遅くはならない

 

<ADCの変換タイミングにtimer 3を使う>

timer2は時間測定用に使っているのでTGO(ADCにトリガーかける機能)があるtimer3を使う

・ADCの設定

変換タイミングExternal Trigger ConversionをTimer3のTGOにするのと、後で述べますがContinuous Conversion ModeをDisabledにするのが大切

 

・Timer3の設定(サンプリング周期を10KHzにするようにしたのとADCの起動用にTrigger Event SelectionをUpdate Eventにする)

・ソースコード(該当部分)

ADCスタートするのと合わせてtimer3もスタートする

 

<実行結果>

なんか変だよね、これが先ほどのContinuous Conversion ModeをDisabledと関連していて、ADCにタイマーで変換タイミング作ってもADCのMXで以下の設定変更しないと機能しない

Continuous Conversion = Disable

実はタイマーでサンプリング周期決めたいのに、これがEnableだと以降のタイマートリガは無視してADCは勝手に変換実行してDMA転送してしまうからこのような値になった訳

でDisableにすると、

128wordsで100μs間隔のサンプリングだと、これで正しい

STM32は多機能で設定次第で如何様にも動作させられるから、それゆえはまりどころも多いということ

 

admin

コメントを残す