STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版 (13) PWMでサーボモーター(SERVO)を動かしてみよう


STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版 (12) ADCを使ってみようの続きです。
https://qiita.com/usashirou/items/e6b5d0529524a140ebaf

今回は、PWMを使ってみます。
なお、今回は、SG90というサーボモーターを使用しますが、CQ出版のトランジスタ技術2020年3月号の別冊にLEDをPWMで動かすテキストがございますので、こちらをお勧めします。
https://toragi.cqpub.co.jp/tabid/924/Default.aspx

*本内容は、Servo motor with STM32を参考にしました。
https://controllerstech.com/servo-motor-with-stm32/

今回は、STM32 F401RE NucleoのPWM出力可能な一番手前にあるD5に接続します。
D5はPB4になります。

配線

SG90の茶色はGNDへ、赤色は、5V へ、黄色がD5へ繋げます
SG90は基本5Vで駆動します。

前回の続きの方はこうなります。

こちらを以下のように設定していきます。

設定する

まずは、ピンをクリックしてTIMを選択します。
TIMとは、タイマーを指します。
今回はTIM3_CH1になります。

するとPB4が黄色なると思います。
右側のTimersのTIM3をクリックし、TIM3 Mode and Configurationの設定をします。
まず、クロックをInternalClockへ変更します。
今回、PWMの出力をしたいのでChannnel1からPWM Generation CH1を選択します。

次に出力内容を変更します。
Prescalerを840へ
CounterPeriodを1000へします。

最後にクロックを変更します。
Clock Configurationをクリックし、最後の周波数を42MHzにします。

これでGenerationします。

ここまでの操作で、PWMが出力されることになります。

ここまでを簡単に説明します。
50Hzの出力をしたいので、内蔵クリスタルの8MHzを使用し、42MHzを生成しています。
ここで50Hzを生成しています。
42MHz/50Hz=Prescaler*CounterPeriod
=840(Prescaler)*1000(CounterPeriod)
という事で上記の値となります。

次は、プログラムを書いていきます。

プログラム

書く内容は以下です。
追加するのは、PWMをスタートするプログラム
出力するPWMを指定する

PWMをスタートするプログラム

HAL_TIM_PWM_Start(htim, Channel)
今回は、htim3のChannel1です。
よって
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
となります。

PWMを設定する

次は、出力するPWMを設定します。
__HAL_TIM_SET_COMPARE()
頭の_ _は_ が2個です。
元はhtim->Instance->CCR1=;
だったものです
引用元:【手抜き】STM32の使い方まとめ 番外. 「私、マクロを使えって言ったよね!?」
https://qiita.com/nabeya11/items/c901c5c0ccd61f9cc01a

今回は、ここにChannel1と、設定する値を入れます。
私のSG90のサーボモーターは、25~120になります。

http://akizukidenshi.com/catalog/g/gM-08761/
・制御パルス:0.5ms~2.4ms
50Hzで0.5ms=25
1.4ms=70
2.4ms=120
になります。

限界を超えて設定すると、キーや、ピュイーンなどインバーターのような音がします。
もし、そんな音がしたら、即座にケーブルを抜いてください。
以下は、プログラムへの追加例です

以下を追加します。

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  /* USER CODE END 2 */
    /* USER CODE BEGIN 3 */
      /*Add Code
      __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,25);
      HAL_Delay(2000);
      __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,70);
      HAL_Delay(2000);
      __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,125);
      HAL_Delay(2000);
      __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,70);
      HAL_Delay(2000);
  }
  /* USER CODE END 3 */

これで、コンパイルすると、サーボモーターが動いていると思います。

プログラムは、こちらにアップロードしています。
https://github.com/taisirou/stm32-cubeide-pwm-servo/tree/master