CCWO

挫けそうになるブログ

STM32F303K8 エンコーダ

開発環境

評価ボード Nucleo STM32F303K8
IDE System Workbench for STM32 (SW4STM32)
Library Hal Library
OS windows 10 pro

TIMを使ってエンコーダを読みます。

CubeMXの設定

f:id:CCWO:20170822063524p:plain
左ツリーTIM3のCombined Channels: Encoder Mode
を選択します。これでPA4とPA6が緑色になると思います。

TIM3の設定

Configurationタブ→TIM3→TIM3 Configuration→Parameter Settings
f:id:CCWO:20170822063752p:plain
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
f:id:CCWO:20170822064057p:plain
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を使用しています。)
f:id:CCWO:20170822064613p:plain
赤色で値が変化しています。しかし、これうまくいってません。なぜか、回していなくてもカウントアップが止まらなく、これの原因を解消することができません・・・。
いろいろと設定をいじったりクロックを変えたり、GPIOの設定やフィルターの設定などもいじったのですが、うまくいかずひとまず断念です・・・。
ちなみにクロック設定はこんな感じ。入力8MHzの最大設定はこんな感じでは?
f:id:CCWO:20170822064822p:plain
こちらを参考にしました。
blog.livedoor.jp