STM32F303K8 エンコーダ
開発環境
評価ボード | Nucleo STM32F303K8 |
IDE | System Workbench for STM32 (SW4STM32) |
Library | Hal Library |
OS | windows 10 pro |
TIMを使ってエンコーダを読みます。
CubeMXの設定
左ツリーTIM3のCombined Channels: Encoder Mode
を選択します。これでPA4とPA6が緑色になると思います。
TIM3の設定
Configurationタブ→TIM3→TIM3 Configuration→Parameter Settings
Prescaler: 1
Counter Period: 59999
Encoder Mode: Encoder Mode T1 and T2
Parameter for Channel 1
Polarity: Falling Edge
Input Filter: 2
Parameter for Channel 1
Polarity: Falling Edge
Input Filter: 0
Configurationタブ→TIM3→TIM3 Configuration→GPIO Settings
PA4, PA6ともにGPIO mode: Alternate Function Open Drainに変更しました。これでgenerateします。
SW4STM32の設定
main.c
TIM3設定用の構造体宣言
/* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ TIM_Encoder_InitTypeDef sConfig; TIM_MasterConfigTypeDef sMasterConfig; /* USER CODE END PV */
エンコーダ用の変数宣言
/* USER CODE BEGIN 0 */ uint32_t uwDirectionCount = 0; /* USER CODE END 0 */
エンコーダの初期化とスタート
/* USER CODE BEGIN 2 */ if(HAL_TIM_Encoder_Init(&htim3, &sConfig) != HAL_OK) { Error_Handler(); } HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_1); HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_2); TIM3->CNT=10000; /* USER CODE END 2 */
デバッグ
PRIu32(uint32_tをprintfで引数にとるためのやつ)を使うためには
/* USER CODE BEGIN Includes */ #include <inttypes.h> /* USER CODE END Includes */
をする必要があります。
/* USER CODE BEGIN 3 */ uwDirectionCount = TIM3->CNT; printf("%" PRIu32 "\n", uwDirectionCount); HAL_Delay(100); } /* USER CODE END 3 */
これでビルドします。(デバッグ用のsemihostingを使用しています。)
赤色で値が変化しています。しかし、これうまくいってません。なぜか、回していなくてもカウントアップが止まらなく、これの原因を解消することができません・・・。
いろいろと設定をいじったりクロックを変えたり、GPIOの設定やフィルターの設定などもいじったのですが、うまくいかずひとまず断念です・・・。
ちなみにクロック設定はこんな感じ。入力8MHzの最大設定はこんな感じでは?
こちらを参考にしました。
blog.livedoor.jp
20170822の記事