時間測定が、
でできるようになったので、次は今まで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








