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


STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版(17) エンコーダーモーターを使おうの続きです。
https://qiita.com/usashirou/items/c3868582a114bfe3f70f
前回は、エンコーダーモーターのエンコーダー値を取得できました。
ただ、このままではどの位移動しているかも回転方向もわかりません。
今回は、回転量と、方向を取得してみましょう。

変更箇所

今回は、cntをcnt_newという関数にし、 元の値をcnt_oldと置換します。
そして、この差分を計算します。
この結果、前進するとその差分が後退した場合-の差分になります。

TeraTermの出力の様子


それではプログラムを見てきましょう。

  cnt_old = cnt_new;
  cnt = cnt_new - cnt_old;

cnt_newをcnt_oldにし、引き算をしています。
これでエンコーダーモーターの移動量を把握することが可能になりました。

プログラム全容

プログラムは図の通りです

  /* 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";
  HAL_UART_Transmit(&huart2,(uint8_t *)msg,sizeof(msg),3000);
  int cnt= 0; //
  int cnt_new= 0; //
  int cnt_old= 0; //
  char scnt[100]; //
  /* USER CODE END 2 */

  /* 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_old = cnt_new;
      cnt_new = TIM3 -> CNT; //
      cnt = cnt_new - cnt_old;
      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_old = cnt_new;
      cnt_new = TIM3 -> CNT; //
      cnt = cnt_new - cnt_old;
      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_old = cnt_new;
      cnt_new = TIM3 -> CNT; //
      cnt = cnt_new - cnt_old;
      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_old = cnt_new;
      cnt_new = TIM3 -> CNT; //
      cnt = cnt_new - cnt_old;
      sprintf(scnt, "TIM3 %d\r\n", cnt);
      HAL_UART_Transmit( &huart2, scnt, strlen(scnt) + 1, 0xFFFF);
      HAL_Delay(2000);
  }
  /* USER CODE END 3 */

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