8
13

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 日本語版 (13) PWMでサーボモーター(SERVO)を動かしてみよう

Posted at

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になります。
image.png

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

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

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

##設定する
まずは、ピンをクリックしてTIMを選択します。
TIMとは、タイマーを指します。
今回はTIM3_CH1になります。
image.png
するとPB4が黄色なると思います。
右側のTimersのTIM3をクリックし、TIM3 Mode and Configurationの設定をします。
まず、クロックをInternalClockへ変更します。
今回、PWMの出力をしたいのでChannnel1からPWM Generation CH1を選択します。
image.png

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

最後にクロックを変更します。
Clock Configurationをクリックし、最後の周波数を42MHzにします。
image.png
これで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 */

image.png

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

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

8
13
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
8
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?