この記事はコロナ感染中に執筆しているため、もしかしたらおかしな所があるかもしれません。大目に見てください。
PWMとは
PWMは Pulse Width Modulation の略で、直訳するとパルス幅変調となります。アナログ信号をデジタル信号に変調する方式の一つで、ONとOFFの比率を変化させることで擬似的にその間の値を表現するものです。
- 用語説明
- 周期:繰り返しの現象が一周りしてまた戻ってくるまでの時間。
- 周波数:繰り返しの現象が1秒間に行われている回数。 \[ \frac{1}{\text{周期}} \]
- パルス幅:一周期のうち、ONになっている時間。
- デューティ比:一周期の中でのONの時間の割合。 \[ \frac{\text{パルス幅}}{\text{周期}} \]で計算できる。
- 平均電圧:名前の通り、電圧の平均。 \[ \text{デューティ比}\times\text{ONのときの電圧} \]
- 実行電圧:周期的に変化する電圧の大きさを表すのに使う値。PWMの場合、\[ \text{ONのときの電圧} \times \sqrt{\text{デューティ比}} \] で計算できる。
{height=300}
上の画像はPWMの電圧のグラフですが、電流、電力も同じ形になります。
PWM信号の基本的な作り方
PWMの信号を生成するには、2つの入力が必要になります。1つ目は変換したいアナログ信号(当たり前)、もう一つは変調に使うためのノコギリ波(三角波でも可)です。 変換したい信号とノコギリ波の大小を比較し、変換したい信号の値がノコギリ波より大きいときはON、小さいときはOFFを出力することでPWM信号を生成することができます。言葉で説明するより実際に下のグラフをいじってみたほうがわかりやすいでしょう。赤い線がアナログ信号、オレンジの波がノコギリ波、紫の線がPWM信号、青い線がPWM信号の実効値を表しています。半透明の点はドラッグで動かせます。(若干重いです)
上のグラフを見て分かる通り、変調に使ったノコギリ波の周期と生成したPWM信号の周期は一致し、変調したいアナログ信号の最大値、最小値はノコギリ波の最大値、最小値のなかに収まっていないといけません。 また、連続的に変化する信号を変換することもできます。
変調するアナログ信号の振幅を大きくし、ノコギリ波の範囲を超えると、音割れのような状態になってしまうのがわかるかと思います。
Arduino Uno上での実行
先ほど紹介した方法をArduino Uno上で実行します。 Arduino Unoには タイマー0、タイマー1、タイマー2の3種類のタイマーがあり、役割や特徴が少しずつ違います。この3つの違い等については割愛します。 Arduino Unoではタイマーが16Mhzで(1秒間に16,000,000回)カウンタを一ずつ増やしていき、0~255まで数え、255になったらリセットするというのを繰り返しています(自分で設定すれば変えられます)。これをPWMの変調に使うノコギリ波の代わりにします。
|
|
上のプログラムを実行すると周波数:982Hz、デューティ比:約50%のPWMがArduino Unoの11番のピンから出てくるはずです。これでも十分短いプログラムですが、単にArduinoでPWMを使いたいだけだったら下の一文で使うことができます。
|
|
pin にはPWMを出力したいピンの番号、x には出力したいアナログ信号の大きさを入れるだけでPWMが出てきます。これはArduino側がPWMを使うためにもとから用意してあるもので、これであれば、デューティ比などの小難しいことを考えずに初心者でも扱うことができます。
PWMの使い道
PWMは主にインバータという直流を交流に変換する回路で使用されています。また、鉄道車両の制御にも使われています。 電子工作においてはサーボモーターやステッピングモータといったモーターを制御するのに使っています。また、擬似的にアナログの値を表現できるため、LEDの明るさを変えるのにも使われていたりと、マイコンを使った電子工作には欠かせないものとなっています。
PWM信号からアナログ信号への変換
最後に、PWM信号からアナログ信号へ変換する方法を紹介します。PWM信号はローパスフィルター(ハイカットフィルター)という高い周波数を通さないフィルターを通すことで元のアナログ信号を得ることができます。しかし、LEDの光量を調節する場合やモーターの制御に使用する場合は必要ないので、これを使う機会は少ないかもしれません。
参考資料
PWMの解説 - しなぷすのハード製作記 https://synapse.kyoto/glossary/pwm/page001.html
パルス幅変調 - Wikipedia https://ja.wikipedia.org/wiki/パルス幅変調