STM32 + LL でエンコーダモードを使用する
STM32マイコンのペリフェラル関連記事を一覧にまとめました。
HALでエンコーダの入力の方法は書きましたが、今回はLLライブラリを使用してTIM1でエンコーダの入力を行っていきたいと思います。"STM32 +HALでエンコーダモードを使用してみる"の記事と説明が被るところは省略します。
↑STM32 +HALでエンコーダモードを使用してみるの記事
リファレンスマニュアルを確認する
エンコーダモードについて確認する
レジスタの設定はこの文章の通りにすればよさそうですね。
STM32CubeMXで生成してもらったソースコードでどこまで設定をしてくれているか確認をして、設定をしていない点を各自でやれば大丈夫そうです。
続いて、ここに書いてあるレジスタを確認していきます。
レジスタを確認する
SMCRレジスタ
エンコーダモードの設定をするためには、SMCRの下位3ビット(SMS)に値を設定してあげればできそうだということがわかります。レジスタの初期値0x08になっているため、起動時にはエンコーダモードの設定をされていないことも同時にわかりました。
CR1レジスタ
DIR方向はエンコーダモードの設定されているときは読み出し専用になると書いてあるため設定は不要ということが読み取れます。また、ビット0のCENレジスタの初期値は0のため、エンコーダモードでカウントを始める前にビットを立ててあげる必要があるということがわかりました。また、CENビットはタイマのカウンタをイネーブルにするため、TIMの他の機能を使うときにも、設定をする必要がありそうだということがわかりました。
STM32CubeMXの設定
今回は、エンコーダを回して得られた数値のデータをPCで確認したいため、printfを使っていきます。USARTの設定ができていない方はprintfまで動作をできるようにしてあげてください。
設定方法はSTM32 + LL のUSARTでprintf(float)を実装するをご覧ください。
プロジェクト名やClock Configurationの設定は、STM32 + LL でGPIO 機能を使用すると同じです。設定画面は以下の通りになりました。
LLAPIを使用したいので、GENERATE CODEをする前にProject ManagerのAdvanced SettingsからTIMの使用APIをLLに変更しておきましょう。
ソースコードを実装する
生成されたソースコードを確認して、実装する
タイマの有効化以外の設定はすべて行ってくれていることがMX_TIM1_Init関数から読み取れます。したがって、追加しなければならないソースコードはCENのビットをたててあげるだけでよいということがわかりました。
LLAPIには、CENのビットを立てる関数が用意されているので、実装したソースコードは次のようになりました。
void TIM1_Encoder_Start(void)
{
LL_TIM_EnableCounter(TIM1);
}
また、エンコーダのカウント取得プログラムは以下の通りです。
uint16_t TIM_ENCODER_CNT_GET(TIM_TypeDef *TIMx)
{
uint16_t cnt = LL_TIM_GetCounter(TIMx);
LL_TIM_SetCounter(TIMx,0);
return cnt;
}
CNTレジスタから値を取得したのちにレジスタの値をクリアしています。
正転、逆転の取得方法は前回の記事に書いてあるため省略します。
おわりに
LLAPIでエンコーダモードを使うのはHALよりもわかりやすいような気がします。次回は、LLAPIを使用したPWMの出力を書いていきたいと思います。
参考文献