前回は、マイコンとモータードライバを使ってDCモーターを正転・逆転させる方法を紹介しました。
DCモーターはHIGHとLOWを切り替えるだけでも動かせますが、それだけでは基本的に「回す」「止める」という制御になります。
そこで今回は**PWM(Pulse Width Modulation)**を使って、DCモーターの回転速度を変えてみましょう。
この記事では、
- PWMとは何か
- PWMでモーターの速度が変わる仕組み
- デューティ比とは何か
- マイコンからDCモーターの速度を制御する方法
- 正転・逆転と速度制御を組み合わせる方法
を解説します。
DCモーターの速度を変えるには?
DCモーターは、加える電圧によって回転速度が変化します。
しかし、マイコンのGPIOから出力する信号を自由に0V~3.3Vのように変化させてモーターを制御するわけではありません。
そこでよく使われるのがPWMです。
PWMでは、出力を高速で
ON → OFF → ON → OFF……
と繰り返します。
このONになっている時間の割合を変えることで、モーターへ供給するエネルギーを調整し、回転速度を制御します。
PWMとは?

PWMは「Pulse Width Modulation」の略で、日本語ではパルス幅変調と呼ばれます。
たとえば一定時間の中で、
- ずっとON
- 半分だけON
- 少しだけON
という信号を考えてみましょう。
PWMではONとOFFを高速に切り替えるため、モーターは1回ずつのON/OFFに合わせて停止するのではなく、連続して回転します。
そしてONになっている時間を長くすると速く、短くすると遅く回転させることができます。
デューティ比とは?
PWMを理解するうえで重要なのが**デューティ比(Duty Cycle)**です。
デューティ比とは、PWMの1周期のうちHIGHになっている時間の割合です。
たとえば、
| デューティ比 | HIGHの時間 | イメージ |
|---|---|---|
| 0% | なし | 停止 |
| 25% | 1/4 | 遅い |
| 50% | 1/2 | 中間 |
| 75% | 3/4 | 速い |
| 100% | すべて | 最大出力 |
となります。
たとえばデューティ比50%なら、
ON → OFF → ON → OFF
を同じ時間ずつ繰り返します。
一方、75%ならONになっている時間の方が長くなります。
この割合をプログラムから変更することで、モーターの速度を調整できます。
このほかLEDの明るさ調整にもPWMは使われたりします。
PWMの周波数とは?
PWMには、デューティ比とは別に周波数という設定があります。
周波数は、1秒間にON/OFFを何回繰り返すかを表します。
たとえば1kHzなら、1秒間に1000回の周期を繰り返します。
モーター制御では、デューティ比だけでなくPWM周波数も動作に影響します。
周波数が低すぎると音や振動が気になることがありますし、使用するモーターやモータードライバによって適した周波数も変わります。
そのため、実際の回路では使用するモータードライバの仕様も確認しましょう。
モータードライバにPWMを入力する
前回の記事では、
マイコン → モータードライバ → DCモーター
という構成でDCモーターを制御しました。
PWMを使う場合も基本的な構成は同じです。
違うのは、マイコンからモータードライバへ単純なHIGH/LOWだけではなく、PWM信号を入力するところです。
たとえば2入力タイプのモータードライバで正転させる場合、
入力A:PWM
入力B:LOW
とします。
すると入力Aのデューティ比によって、正転方向の速度を調整できます。
反対に、
入力A:LOW
入力B:PWM
とすれば、逆転方向の速度を調整できます。
つまり、正転・逆転の制御とPWMによる速度制御を組み合わせることができます。
マイコンからPWMで速度を変えてみよう
Arduino環境では、対応するGPIOに対してPWM出力を行えます。
ここでは例として、
- MOTOR_A:GPIO 7
- MOTOR_B:GPIO 6
へモータードライバを接続しているものとします。
const int MOTOR_A = 7;
const int MOTOR_B = 6;
void setup() {
pinMode(MOTOR_A, OUTPUT);
pinMode(MOTOR_B, OUTPUT);
}
void loop() {
// 低速で正転
analogWrite(MOTOR_A, 80);
analogWrite(MOTOR_B, 0);
delay(2000);
// 中速で正転
analogWrite(MOTOR_A, 160);
analogWrite(MOTOR_B, 0);
delay(2000);
// 高速で正転
analogWrite(MOTOR_A, 255);
analogWrite(MOTOR_B, 0);
delay(2000);
// 停止
analogWrite(MOTOR_A, 0);
analogWrite(MOTOR_B, 0);
delay(2000);
}
analogWrite()に指定している数値によってPWMのデューティ比を変えています。
0なら出力なし、255なら最大出力となり、その間の値を指定することで出力の割合を変更できます。
たとえば、
analogWrite(MOTOR_A, 128);
なら、およそ50%のデューティ比になります。
正転・逆転の速度を変える
PWMと前回学習した正転・逆転を組み合わせてみましょう。
const int MOTOR_A = 7;
const int MOTOR_B = 6;
void forward(int speed) {
analogWrite(MOTOR_A, speed);
analogWrite(MOTOR_B, 0);
}
void reverse(int speed) {
analogWrite(MOTOR_A, 0);
analogWrite(MOTOR_B, speed);
}
void stopMotor() {
analogWrite(MOTOR_A, 0);
analogWrite(MOTOR_B, 0);
}
void setup() {
pinMode(MOTOR_A, OUTPUT);
pinMode(MOTOR_B, OUTPUT);
}
void loop() {
forward(100);
delay(2000);
forward(255);
delay(2000);
stopMotor();
delay(1000);
reverse(100);
delay(2000);
reverse(255);
delay(2000);
stopMotor();
delay(2000);
}
これで、
低速で正転
↓
高速で正転
↓
停止
↓
低速で逆転
↓
高速で逆転
↓
停止
という動作になります。
関数に速度を渡す形にしておくと、今後モーターカーなどへ発展させるときにも扱いやすくなります。
PWMを50%にしても回転速度が半分になるとは限らない
ここは注意したいところです。
デューティ比を50%にしたからといって、DCモーターの回転数が必ず最大回転数の50%になるわけではありません。
実際の回転速度には、
- モーターの特性
- 電源電圧
- モーターにかかる負荷
- モータードライバでの電圧降下
- PWM周波数
などが影響します。
また、デューティ比をかなり小さくすると、モーターが回転しないこともあります。
これはDCモーターが回り始めるために一定以上のトルクが必要になるためです。
PWMの数値と実際の回転速度が完全に比例するわけではないことを覚えておきましょう。
2つのモーターの速度を変えると車を曲げられる
PWM制御ができるようになると、モーターカーの制御にも応用できます。
左右にDCモーターを1個ずつ搭載した車を考えてみましょう。
両方を同じ速度で回せば直進します。
一方、
左モーター:高速
右モーター:低速
とすると、左右の車輪に速度差が生まれるため車体が曲がります。
前回紹介した単純な、
片方を回す・片方を止める
という旋回よりも、左右の速度を細かく調整できるようになります。
ここまで来ると、
正転・逆転
↓
PWM速度制御
↓
左右のモーターを独立制御
↓
モーターカー
というつながりが見えてきます。
KUMITATE-MOTORでPWM制御を試してみよう
PWMの仕組みを理解したら、実際のモーターで動きを確認してみましょう。
クミタテでは、KUMITATE-C3と組み合わせてDCモーター制御を学習できるKUMITATE-MOTORを用意しています。
KUMITATE-MOTORでは、左右のDCモーターを使って、
- 正転・逆転
- 停止
- PWMによる速度変更
- 左右モーターの独立制御
などを実際に試すことができます。
PWMの数値を変えて、
「どのくらいの値からモーターが回り始めるのか?」
「PWMを半分にすると実際の速度はどう変わるのか?」
などを実機で確認してみるのも面白い実験です。
▶ KUMITATE-MOTORの詳細はこちら
https://kumicla.tatepro.com/asp-products/kumitate-motor/
まとめ
今回は、PWMを使ってDCモーターの速度を制御する方法を紹介しました。
ポイントは、
- PWMはON/OFFを高速に切り替える制御方法
- HIGHになっている割合をデューティ比という
- デューティ比を変えることでモーターへの出力を調整できる
- 正転・逆転とPWMを組み合わせることができる
- PWM値と実際の回転速度は必ずしも比例しない
- 2つのモーターを個別にPWM制御するとモーターカーの旋回にも利用できる
というところです。
DCモーター1個の速度を変えられるようになったら、次は2つのDCモーターを独立して制御して、モーターカーを動かしてみましょう。


