2015年11月18日水曜日

STM32F1 タイマの同期

STM32F1では、それ以外のマイコンと同じように複数のタイマを使用することができる。そして複数のタイマを同期して使用することができる。この同期とは、例えばTIM2のPWM立ち上がりエッジでTIM3を開始する、といったことが可能になる。

今回はTIM3のエッジでTIM2を開始するための方法。

まずはTIM3とTIM2を適切な設定で初期化する。今回はTIM3のOC2を使用するので、それらの設定も必要。

次にTIM3をマスタとしてトリガを出力できるようにする。
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref);

そしてTIM2をスレーブとして設定する。
TIM_SelectInputTrigger(TIM2, TIM_TS_ITR2);
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Trigger);

TIM_TRGOSource_OC2RefはOC2をトリガ出力として使用するための設定。TIM_TS_ITR2はITR(内部トリガ)2をソースとして使用する。TIM_SlaveMode_Triggerはタイマをスレーブモードとするための設定。

それと今回はTIM2を TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single) でワンパルスモードに設定した。これはTIM3のトリガでTIM2を1回だけ動作させるため。

あとはTIM_Cmdで開始すればマスタが出力したトリガでスレーブが動作する。マスタのトリガやスレーブの設定はRM0008を参照すれば良い。ただしStdPeriphLibはヘッダファイルを読んでも何が何だかわからないのが難点。RM0008で欲しい機能を探して、StdLibのソースを読んで、それっぽい関数を探す、という作業が必要。


それから、OnePulseModeでPWMを出力したい場合、大抵は望んだ動作をしないはず。ワンパルスモードでは「PWMを1回出力して、ポートを非アクティブ化した状態で終了する」ということを望んでいると思うが、そうはならない。というのは、OPMでは「タイマ更新イベントでタイマを停止する」という動作になっているから。タイマ更新イベントでは「ポートをアクティブ化する」と、「タイマを停止する」が同時に行われる。
本当はもっとスマートな処理方法があるはずなんだけど、まだ見つけられていない。OCをPWM1で初期化した場合、カウンタがしきい値を超えたら停止する みたいな動作がほしいんだけど。

0 件のコメント:

コメントを投稿