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