2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-07

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を示しています。
image.png

EncoderModeにはT1、T2及びT1andT2があります。
今回のエンコーダーモーターは2つのエンコーダー出力があるのでT1andT2を選択しますが
1つの場合は、どちらか接続する方にします。
image.png
これで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での出力の様子
4.jpg
エンコーダーの位置を出力するようになります。
###適切なコマンドは
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

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?