マイコンでLEDの明るさを変えたり、モーターの回転速度を調整したりするときによく使われるのが、PWMです。
PWMは、デジタル信号のHIGHとLOWを高速に切り替えることで、LEDの明るさやモーターへ与える電力などを調整する方法です。
PWMを理解するために重要なのが、次の3つです。
- 周期
- 周波数
- デューティ比
この記事では、PWMとは何かという基本から、デューティ比や周波数の意味、LEDの明るさを変えられる理由、マイコンでPWMを使う方法まで順番に解説します。
PWMとは?
PWM(Pulse Width Modulation)は、日本語では「パルス幅変調」と呼ばれる制御方法です。
マイコンのGPIOから出力できるデジタル信号は、基本的にHIGHとLOWの2つの状態です。
たとえば3.3V系のマイコンであれば、概念的には次のようになります。
| 状態 | 電圧のイメージ |
|---|---|
| HIGH | 約3.3V |
| LOW | 約0V |
通常のデジタル出力だけを見ると、「ON」と「OFF」しかありません。
しかしPWMでは、このHIGHとLOWを高速に繰り返し、HIGHになっている時間の割合を変化させます。
これによって、LEDの明るさやモーターの速度などを段階的に制御できます。
PWMの基本波形
PWMでは、HIGHとLOWを一定の周期で繰り返します。
そして、1周期の中でHIGHになっている時間の割合をデューティ比(Duty Cycle)と呼びます。
デューティ比とは?
デューティ比は、1周期のうち信号がHIGHになっている時間の割合です。
次の式で求められます。
デューティ比(%)= HIGHの時間 ÷ 1周期の時間 × 100
たとえば、1周期の半分がHIGH、残り半分がLOWなら、デューティ比は50%です。
| デューティ比 | 状態 |
|---|---|
| 0% | 常にLOW |
| 25% | 1周期の25%がHIGH |
| 50% | HIGHとLOWが半分ずつ |
| 75% | 1周期の75%がHIGH |
| 100% | 常にHIGH |
このHIGHの時間を変えることが、PWM制御の基本です。
周期と周波数とは?
PWMではデューティ比だけでなく、周期と周波数も重要です。
HIGHとLOWの一連の動作を1回繰り返す時間を周期(T)と呼びます。
そして、1秒間にこの周期を何回繰り返すかを周波数(f)と呼びます。
周期と周波数には、次の関係があります。
f = 1 ÷ T
たとえば周波数が1kHzの場合、1秒間に1,000回PWM波形を繰り返します。
このとき周期は、
1 ÷ 1000 = 0.001秒 = 1ms
となります。
PWMでLEDの明るさを変えられる理由
PWMの代表的な使用例が、LEDの明るさ調整です。
LEDを十分に速い周期でON・OFFすると、人間の目には1回ずつ点滅しているのではなく、連続して点灯しているように見えます。
そこでONになっている時間、つまりデューティ比を変えることで、LEDの明るさが変化しているように見せることができます。
| デューティ比 | LEDの見え方 |
|---|---|
| 0% | 消灯 |
| 25% | 暗い |
| 50% | 中程度 |
| 75% | 明るい |
| 100% | 常時点灯 |
ただし、デューティ比と人間が感じる明るさは完全な比例関係ではありません。人間の視覚特性やLEDの特性によって、見え方は変化します。
PWMはアナログ出力なの?
PWMを初めて学ぶと、「PWMはアナログ電圧を出力しているのでは?」と思うかもしれません。
しかし一般的なPWM出力では、GPIOそのものが中間の電圧を出しているわけではありません。
実際にはHIGHとLOWのデジタル信号を高速に切り替えています。
たとえば3.3Vの信号をデューティ比50%で出力しても、GPIOから常に1.65Vが出ているわけではありません。
3.3Vと0Vを高速に切り替えた結果として、時間平均では1.65V相当になります。
用途によってはPWM信号をローパスフィルタに通し、より滑らかな電圧に変換することもできます。
PWMは何に使われる?
PWMは、マイコンを使ったさまざまな制御に利用されています。
- LEDの明るさ調整
- RGB LEDの色調整
- DCモーターの速度制御
- ブザーや音の生成
- ヒーターなどの電力制御
- 電源回路の制御
特にLEDやモーターは、PWMを学ぶための代表的な題材です。
PWMでモーターの速度を変える仕組み
PWMはDCモーターの速度制御にもよく利用されます。
デューティ比を小さくするとモーターへ電力が供給される時間が短くなり、デューティ比を大きくすると電力が供給される時間が長くなります。
これによってモーターの平均的な回転速度を調整できます。
ただし、モーターをマイコンのGPIOへ直接接続してはいけません。モーターはGPIOが供給できる電流を大きく超えることがあるため、通常はトランジスタ、MOSFET、モータードライバICなどを使用します。
PWMの周波数はどう決める?
PWMでは、デューティ比だけでなく周波数の設定も用途によって変わります。
周波数が低すぎると、LEDではちらつきが見えたり、モーターでは音や振動が気になったりする場合があります。
一方で、単純に周波数を高くすればよいわけでもありません。マイコンのPWM機能では、周波数とデューティ比の分解能が関係する場合があります。
使用するマイコン、負荷、PWM周辺回路の仕様を確認して適切な周波数を選択します。
PWMの分解能とは?
マイコンのPWMでは、デューティ比をどれだけ細かく設定できるかを分解能で表すことがあります。
たとえば8bitの分解能であれば、一般的には0~255の256段階でデューティ比を設定できます。
値が0なら0%、最大値ならほぼ100%または100%に相当する、といった形でPWM出力を制御します。
分解能が高いほど、LEDの明るさやモーターの速度などを細かく調整できます。
KUMITATE-C3でPWMを試してみる
PWMは、実際にLEDの明るさを変えてみると非常に理解しやすい機能です。
KUMITATE-C3はESP32-C3を搭載した学習用ボードで、GPIOやPWM、I2C、SPI、UARTなど、組み込み開発で使われる機能を実際に動かしながら学習できます。
まずはLEDをPWM制御して、デューティ比によって明るさがどのように変化するか確認してみましょう。
たとえば、デューティ比を
- 0%
- 25%
- 50%
- 75%
- 100%
と順番に変えてみると、PWMの仕組みを視覚的に確認できます。
ESP32-C3ではPWM出力にLED PWM Controller(LEDC)などのハードウェア機能を利用できます。Arduino環境では使用しているESP32 Arduino CoreのバージョンによってAPIが異なる場合があるため、使用環境に合った方法で設定してください。
PWMとGPIOの違い
通常のGPIO出力とPWM出力の違いを整理すると、次のようになります。
| 通常のGPIO出力 | PWM | |
|---|---|---|
| 出力 | HIGH / LOW | HIGH / LOWを周期的に切り替える |
| 主な制御 | ON / OFF | 出力の割合を調整 |
| LED | 点灯 / 消灯 | 明るさを調整 |
| モーター | 回転 / 停止 | 速度制御に利用できる |
GPIOそのものについては「GPIOとは?マイコンの入力・出力の仕組みを初心者向けに解説」で詳しく解説しています。
PWMがうまく動かないときの確認ポイント
PWMが期待どおりに動作しない場合は、次の点を確認してみましょう。
- 使用しているGPIOがPWM出力に利用できるか
- PWMの周波数設定が適切か
- デューティ比が正しく設定されているか
- PWMの分解能が想定どおりか
- LEDの向きや電流制限抵抗が正しいか
- モーターなどをGPIOへ直接接続していないか
また、PWMの設定方法はマイコンや開発環境によって異なります。使用しているマイコンのデータシートやSDK、ライブラリの仕様も確認しましょう。
まとめ
PWMは、HIGHとLOWを高速に切り替え、その時間の割合を変化させることで出力を制御する方法です。
- PWMはPulse Width Modulation(パルス幅変調)の略
- 1周期のうちHIGHになっている割合をデューティ比と呼ぶ
- 周波数は1秒間にPWM波形を繰り返す回数
- デューティ比を変えることでLEDの明るさを調整できる
- DCモーターの速度制御などにも利用される
- PWMは中間電圧を直接出しているわけではなく、HIGHとLOWを切り替えている
PWMはGPIOの次に理解しておきたい、マイコン制御の基本機能の1つです。LEDだけでなく、RGB LED、ブザー、モーターなどへ応用すると、PWMの使い方がさらに理解しやすくなります。

