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

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

https://qiita.com/usashirou/items/8d83daa6a9ea384b3f79

##参考サイト
今回もいろいろなサイトを参考にしています。
__【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__
に設定します。
６５５３５は16進数の最大値FFFFを示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ad2efe5a-c7f2-4d2f-0d80-57d53bf4de63.png)

EncoderModeにはT１、Ｔ２及びＴ１andＴ２があります。
今回のエンコーダーモーターは2つのエンコーダー出力があるのでT1andT2を選択しますが
1つの場合は、どちらか接続する方にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/27a87699-0157-f62b-c4b4-a4c6b88d930f.png)
これでConfigulationGenerationします。
##プログラム
それではプログラムを書いていきましょう。
最初にエンコーダーモードをスタートします。

    HAL_TIM_Encoder_Start( &htim3, TIM_CHANNEL_ALL );

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

      int cnt= 0;
cntにTIM3の値を入れてUART２へ出力します。

      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での出力の様子
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9644deb8-f413-22af-05b2-f878fa09595e.jpeg)
エンコーダーの位置を出力するようになります。
###適切なコマンドは
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