STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版(17) エンコーダーモーターを使おう


STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版(16) モーターを回そうの続きです。
https://qiita.com/usashirou/items/a4901fd99940ae65bd8b
今回は、エンコーダーモーターからエンコーダー値を取得します。
エンコーダーモーターはエンコーダーにより回転量を教えてくれます。
移動ロボットなどで移動量を把握する際に使用されています。

参考サイト

今回もいろいろなサイトを参考にしています。
【Nucleo入門】Nucleo-F401でエンコーダ読み取り(STM32CubeIDE、macOS版)
https://www.shujima.work/entry/2019/05/28/221629
STM32 +HALでエンコーダモードを使用してみる
https://garberas.com/archives/244

設定

最初に、設定をしましょう。
エンコーダー値を取得するには、EncoderModeというものを使用します。
今回はTIM3を使用します。
TimersのCombinedChannels:EncderMode
Count Perioad:65535
に設定します。
65535は16進数の最大値FFFFを示しています。

EncoderModeにはT1、T2及びT1andT2があります。
今回のエンコーダーモーターは2つのエンコーダー出力があるのでT1andT2を選択しますが
1つの場合は、どちらか接続する方にします。

これでConfigulationGenerationします。

プログラム

それではプログラムを書いていきましょう。
最初にエンコーダーモードをスタートします。

HAL_TIM_Encoder_Start( &htim3, TIM_CHANNEL_ALL );

次にcntという変数を作ります。

  int cnt= 0;

cntにTIM3の値を入れてUART2へ出力します。

  cnt = TIM3 -> CNT;
  sprintf(scnt, "TIM3 %d\r\n", cnt);
  HAL_UART_Transmit( &huart2, scnt, strlen(scnt) + 1, 0xFFFF);

以上で動作するようになります。

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
  HAL_TIM_Encoder_Start( &htim3, TIM_CHANNEL_ALL ); // encoder start
  char msg[] ="Hello STM32\r\n";

  /* USER CODE END 2 */
  HAL_UART_Transmit(&huart2,(uint8_t *)msg,sizeof(msg),3000);
  int cnt= 0; //
  char scnt[100]; //
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      /*Add Code*/
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
      cnt = TIM3 -> CNT; //
      sprintf(scnt, "TIM3 %d\r\n", cnt);
      HAL_UART_Transmit( &huart2, scnt, strlen(scnt) + 1, 0xFFFF);
      HAL_Delay(2000);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,300);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
      cnt = TIM3 -> CNT; //
      sprintf(scnt, "TIM3 %d\r\n", cnt);
      HAL_UART_Transmit( &huart2, scnt, strlen(scnt) + 1, 0xFFFF);
      HAL_Delay(2000);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,5000);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
      cnt = TIM3 -> CNT; //
      sprintf(scnt, "TIM3 %d\r\n", cnt);
      HAL_UART_Transmit( &huart2, scnt, strlen(scnt) + 1, 0xFFFF);
      HAL_Delay(2000);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
      cnt = TIM3 -> CNT; //
      sprintf(scnt, "TIM3 %d\r\n", cnt);
      HAL_UART_Transmit( &huart2, scnt, strlen(scnt) + 1, 0xFFFF);
      HAL_Delay(2000);
  }
  /* USER CODE END 3 */

TeraTermでの出力の様子


エンコーダーの位置を出力するようになります。

適切なコマンドは

cnt=htim1->Instance->CNTではなく

__HAL_TIM_GET_COUNTER(htim1)

が良いようです。
【手抜き】STM32の使い方まとめ 番外. 「私、マクロを使えって言ったよね!?」
https://qiita.com/nabeya11/items/c901c5c0ccd61f9cc01a

STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版(18) エンコーダーモーターを使おう2に続きます。
https://qiita.com/usashirou/items/8ab2d46c584f63cb353c