STM32資料 基礎編 4
サーボモーターを動かしてみよう
今回はPWMという新しい機能を使ってサーボモーター動かしてみる
今回から少しだけ配線が必要になるので、不安なら先輩に確認してもらおう
今回やること
作業の流れ
- ピンを割り当てる
- wrapper.cppにコードを書き込む
- サーボモーターとSTM32を配線でつなぐ
- STM32にプログラムを書き込み実行する
- サーボモーターの動きを眺める
ピンの割り当て
今回はPWMという機能を使います
(プロジェクト名).iocからPA8を選択し、TIM1_CH1を割り当てよう
左側のTimersからTIM1を選択し、上側のModeと下側のConfigurationを写真のように設定しよう
TIM1の設定からChannel1にPWM Generation CH1を割り当てよう

下のConfigurationからParameter Settingsを開き詳細な設定をしよう
Parameter Settings
各項目を以下のように設定してね
- Prescaler
83 - Counter Mode
UP - Counter Period
2499

この設定でやっていること
- タイマー設定
サーボモーターは、決まった周期で送られてくるパルス信号のオンとオフの比率(デューティ比)によって角度を決めている
この設定をすることで、STM32のクロックをサーボモーターに送りたい周期に変換している
ここで周期を決め、後で紹介する関数でデューティ比を変更している/p>
回路
サーボモーターとSTM32をジャンパー線を使ってつなぐ
配線を間違えるとサーボモーターが壊れてしまうことがあるので気を付けてください
真ん中の5Vだけは絶対に間違えないようにしよう!
配線図
用途 | STM32 | サーボモーター |
---|---|---|
信号線 | D7(PA8に対応) | 黄色 |
5V線 | 5V | 赤色 |
GND線 | GND | 黒色 |

プログラム
今回はタイマーのスタートと値の設定の2つの関数を使用します
TIMのスタート
指定したタイマーを起動するための関数
HAL_TIM_PWM_Start(&htimx, TIM_CHANNEL_y);
この関数の引数
引数名 | 変数型 | 内容 |
---|---|---|
&htimx | TIM_HandleTypeDef* | TIMのポインタ(xはTIMの番号) |
TIM_CHANNEL_y | uint32_t | yはChannelの番号 |
TIMの設定
起動したタイマーの値を設定するための関数
__HAL_TIM_SET_COMPARE(&htimx , TIM_CHANNEL_y, Value);
この関数の引数
引数名 | 変数型 | 内容 |
---|---|---|
&htimx | TIM_HandleTypeDef* | TIMのポインタ(xはTIMの番号) |
TIM_CHANNEL_y | uint32_t | yはChannelの番号 |
Value | uint16_t | PWMのデューティ比を変更 |
TIMを止める関数
今回は使用しないが、安全装置などの設計をする上で止める関数が使えるので紹介しておく
HAL_TIM_PWM_Stop(&htimx, TIM_CHANNEL_y);
引数はスタートの関数と同じなので頭の片隅においておくといいかも?
サンプルコード
実際にサーボモータを回し続けるコードを作成した
0~2500の好きな値を指定できるので、色々な値を試してみよう
(CounterPriodを2500にしたので、0~2500の間で調整することになっている)
#include "wrapper.hpp"
#include "tim.h"
void init(){
//タイマーの起動
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_Delay(500);
}
void loop(){
//値の設定
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 1000);
HAL_Delay(1000);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 1500);
HAL_Delay(1000);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 2000);
HAL_Delay(1000);
}
終わりに
今回は、タイマーを使ってサーボモータを動かしてみました
ほかのモーターも同じように動かすことができるので、機会があったらやってみてね