DCマウス研修(移行中)

マイクロマウス研修(kora編)[30] タイマ割り込みの実装

DCマウス研修(移行中)

こんにちは。koraです。

今回はタイマ割り込みを設定します。
以前HM-StarterKitを使ったときも実装していましたが、一定周期でセンサ値の取得と車体の制御ができるようになります。

タイマ割り込みの設定

マウス本体は1kHzで制御する予定ですが、この中で4つの光センサと1つの電源電圧のAD変換を行いたいので、1kHzの5倍の5kHzで割り込ませたいと思います。

CubeMXの設定

まず、CubeMXのClock Configurationタブを開いて、クロックを確認します。
STM32には複数のタイマがありますが、今回はGeneral-purpose timersの1つであるTIM2を使います。
STM32F72x/3x Reference Manualの5章によると、APB1 Timer clocksがのTIM2に供給されるようです。

次に、Pinout&Configurationタブを開いて、タイマを設定します。
左側のタブからTimersをクリックし、TIM2を選択して、TIM2 Mode and Configurationウィンドウを表示します。

  • 上段のModeの”Clock Source”を”Internal Clock”に変更します。
  • 下段のConfigurationのParameter Settingsタブを開いて割り込み周波数を設定します。
    割り込み周波数 = クロック周波数 / ((Prescaler + 1) * (Counter Period + 1))
    APB1 Timer clocksが108MHzですので、”Prescaler”を200-1に、”Counter Period”を108-1にすれば、割り込み周波数が5kHzになります。
  • NVIC Settingsタブを開いて”TIM2 global interrupt”にチェックを入れることで、割り込みが可能になります

タイマ割り込みのプログラム

割り込みが発生したときに呼び出される関数は、CubeMXで生成されるファイルのstm32f7xx_it.cにある、TIM2_IRQHandler()です。ここから各モジュールを呼び出すようにします。
5kHzで発生する割り込みに対し、前回設定したADCを順番に実行し、全体を1kHzで更新します。また、ジャイロとの通信、エンコーダとの通信、現在位置の計算(未実装)、目標軌道の計算(未実装)、モータの制御(未実装)も順番で実行し、これも1kHzで更新します。
なお、実際にタイマ割り込みを開始するには、main関数内に次の行を追加しておく必要があります。

HAL_TIM_Base_Start_IT(&htim2);

次回

センサが一通りそろって、タイマ割り込みもできるようになりましたので、次から現在位置の計算をさせてみます。最終的には目標軌道に追従させるような制御をさせるつもりです。

タイトルとURLをコピーしました