モータ軸に取り付けられている2相エンコーダのパルスカウントを計測して表示します。
参考にしたサイトです。

STM32でロータリエンコーダを読む - 元Web屋のマイクロマウス製作記 Part.19
ししかわです。 社員研修の一環で、自作マウスを作って大会に出場します。 記事一覧 – 元Web屋のマイクロマウス製作記 | RT MicroMouse 今回はロータリエンコーダをSTM32で読み取りました。 車輪の回転を検知するには 前回は...

STM32 +HALでエンコーダモードを使用してみる | Sora's Activity Record
STM32マイコンのペリフェラル関連記事を一覧にまとめました。 STM32のタイマーにはエンコーダモードがあります。使用例として挙げると、距離速度を計測するために使用されているモー...
回路図
DCモータ1717T003SR-3Vのエンコーダ周りの回路図です。コネクタ周りは間違えやすいのでデータシートの画像を抜き出してKiCad回路図に貼り付けておくと、ミスも減りますし、他の人がレビューをしやすいです。
エンコーダは5V駆動ですが、3.3Vでも動くという情報があります。出力される波形は、5VとGNDの矩形波です。
ここでSTM32のポートに接続するときの注意点として、前回のPWMの時と違って、パルスをカウントするタイマーを2つのモータでそれぞれ分ける必要があります。鉄鼠では左モータエンコーダでTIM3、右モータエンコーダでTIM4を使うようにしました。
STM32CubeMX
エンコーダ用のポート設定と、カウントした値の出力にUARTを使います。
TIM3とTIM4のCombined Channelsを、それぞれEncoder Modeにします。
Encoder Modeを、Encoder Mode TI1 and TI2にします。
プログラム
HAL_TIM_Encoder_Start関数を使います。
/* USER CODE BEGIN 2 */ setbuf(stdout, NULL); setbuf(stdin, NULL ); printf("Started!\n\r"); HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL); HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL); /* USER CODE END 2 */
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { printf("Left encordder = %d, Right encordder = %d\n\r", TIM3->CNT, TIM4->CNT); HAL_Delay(100); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */
実行
TeraTermで表示します。
手で回してみた様子。
次は、SPIをつかったジャイロセンサと通信テストします。