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になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b5db4b85-b3f2-e2ed-e5c7-a0c4e88b9223.png)

## 配線
SG90の茶色はGNDへ、赤色は、５V へ、黄色がD5へ繋げます
SG90は基本5Vで駆動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/87f32a41-65dd-7c55-2376-a7304080feaf.png)

前回の続きの方はこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ffa12e43-7b8b-cce0-7893-58a49e1c5162.png)

こちらを以下のように設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/17649f48-5fb5-f3a7-66a3-7978527ef6f0.png)



## 設定する
まずは、ピンをクリックしてTIMを選択します。
TIMとは、タイマーを指します。
今回はTIM3_CH1になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4b43d440-f034-412d-dd7b-1349221f9125.png)
するとPB4が黄色なると思います。
右側のTimersのTIM3をクリックし、TIM3 Mode and　Configurationの設定をします。
まず、クロックをInternalClockへ変更します。
今回、PWMの出力をしたいのでChannnel1からPWM Generation CH1を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/04a97114-e8ce-34db-9286-8bbaa4208e96.png)

次に出力内容を変更します。
Prescalerを840へ
CounterPeriodを1000へします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f73fe696-972e-f225-745c-ec345cea1bd7.png)

最後にクロックを変更します。
Clock Configurationをクリックし、最後の周波数を42MHzにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3b1c569c-98ff-9e9f-5c24-d5a2e9a88d19.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=<Duty>;
だったものです
引用元：【手抜き】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://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a552df2d-dcc0-cf83-c320-e19418b6a44a.png)

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

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