こんにちは!はしもとです。
前回は、STM32F446を使って、DCモータの動作確認をしました。
今回は同様にSTM32F446を使って、DCモータのエンコーダ値の確認を行っていきます。
使用する部品
今回使用した部品は前回のブログで紹介した部品と同じです。
ピン機能を設定
今回は、前回のブログで設定したピン機能に加えて、エンコーダ用のピン機能を追加します。
- Pinout & ConfigurationからTIM2を選択
- Combined ChannelsをEncoder Modeに設定
- Counter Periodを10000に設定
カウンタ値が10000を上回ると値がクリアされます。
こちらは最大で4,294,967,295(32bitの最大値)まで設定できます。 - Encoder ModeをEncoder Mode TI1 and TI2に設定
これらを設定後、ピン機能にTIM2_CH1とTIM2_CH2が自動的に割り振られます。
回路
先輩のブログの回路図を参考にしました。
実際に配線してみたのですが、写真のようにひと目ではかなり分かりにくくなっています。
前回のDCモータを回したときの回路図に加えて、Nucleoにエンコーダの信号を受け取る用の信号線を2つつなげたのと、エンコーダ用の電源をNucleoから供給するようにしました。
コード
まず前述したピン機能の設定が終われば、コードを自動生成します。
その後、以下のコードを追記します。
前回のDCモータを回したときのコードに、エンコーダ値を__HAL_TIM_GET_COUNTER関数を使って出力する部分を追記しました。printfをする方法はこちらの記事を参考ください。
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_WritePin(GPIOB, Direction_Pin, 1); // 回転方向指示 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1,25); // デューティー比を設定 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // Read Encoder count = __HAL_TIM_GET_COUNTER(&htim2); printf("Encoder Value: %d\n\r", count); HAL_Delay(100); } /* USER CODE END WHILE */
動作確認
最後にNucleoに書き込みすると、動画のようにモータがゆっくりと回り続けて、エンコーダの値もカウンタ値が10000を上回ると値がクリアされていることが確認できました。
まとめ
今回は、以下の内容についてまとめました。
- 今回使用する部品の紹介
- STM32にエンコーダ値を確認するためのピンを設定
- 配線を済ませ、プログラムを追記・実行することで、エンコーダの値をPC上で確認することができた
今回は以上です!
次回からは、回路設計、ハードウェア設計に着手できればと考えています。
それでは!