北の国から

忘れたことを思い出す為の記録

STM32F3 HALでエンコーダ入力

はじめに

エンコーダのカウントをしたくなった時に割と設定とか忘れがちなのでまとめときます.

CubeMx上での設定

Pinoutタブ

基本的にエンコーダでA,B相をカウントするときはCH1とCH2を使うはずです.(それ以外知らない)

なのでCH1,CH2どちらも揃っているタイマを選びます.

左側ツリーよりTIMx(xは任意の数字.TIM1とかTIM4とかいろいろあるよね)を展開し,“Combined Channels"以外を"Disable"に設定.

その後,“Combined Channels"を"Encoder Mode"に設定します.


設定すると右側のICの絵で対応しているピンが緑に変わります.

CH1はA相,CH2はB相に繋ぎます.(当然ですが逆だと値も逆になります)

Configuratinタブ

“Control"欄のTIMx(さっき設定したタイマ)を開き,"Parameter Settings"タブへ行くと,エンコーダ入力に関する諸設定ができるようになっているはずです.

僕はいつも

Period : 65535 (16bitカウンタの最大値)

Encoder Mode :Encoder Mode TI1 and TI2 (4逓倍)

の部分だけ変更しています.

プログラム上での扱い

エンコーダカウントの開始

HAL_TIM_Encoder_Start(&htimx,TIM_CHANNEL_ALL);

エンコーダカウントの停止

HAL_TIM_Encoder_Stop(&htimx,TIM_CHANNEL_ALL);

カウント値の読み込み(iは適当な変数とする)

i = TIMx -> CNT;

このようにするとエンコーダの値を取得できます.

もしかしたらもっといい値の読み方あるかもしれないので知ってる方、教えてください…

追記

値取得用関数の定義

毎回TIMx->CNTで読み込むのは見た目気持ち悪い&ぱっと見わかりにくいので

int getTIMxCNT(){
   return TIMx->CNT;
}

(xは適宜変える)
とか定義しておけば少し見やすく、わかりやすくなりますね.