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