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