PWM と Arduino でのアナログ出力

Arduino では PWM によるアナログ出力 (任意の出力値) をサポートしています。

すなわち、デジタル信号として HIGH (5V とか 3.3V) と LOW (0V) だけではなく、2V などの中間の値も出力できます。

これによって、例えば LED の明るさを少しずつ変えたりできます。

PWM とは?

PWM (Pulse Width Modulation) は、電圧を制御する方法の一つです。出力のオンとオフのスイッチを行うことで、 パルス幅に比例した電圧を得ることができます。

例えば次の例では波の1周期の間で、25% の時間、ON になっています。

こうすることで平均的に ON の時の電圧の 25% の電圧 (すなわち、5[V]*25[%]=1.25[V]) を得ることができます。

尚、この場合 ON である時間をデューティー・サイクル (Duty Cycle) といいます。これがすなわち、最大電圧に対する出力電圧の割合になります。

Arduino の PWM 出力

Arduino Uno ではデジタル出力の 3, 5, 6, 9, 10, 11 の 6 個のピンが PWM に利用できます。 ピン番号の前に ~ 記号が付記されており、PWM が利用可能であることがわかります。

基本的に PWM の周波数はおよそ 490Hz ですが、Uno では 5 番と 6 番ピンは 980Hz です。

周波数が 2 倍になったということは、波長が半分になることです。 しかしながら、デューティーサイクルが同じであれば出力電圧は同じです。

周波数が大きい方がきめ細かく ON/OFF が切り替わっていますが、ON の時間 (水色の面積) は同じですね。

analogWrite の使い方

Arduino では PWM 出力には analogWrite 関数を利用します。analogWrite 関数は第一引数にピン番号、第二引数にデューティーサイクルを受けとります。

デューティーサイクルは、残念ながら % での表示ではなく、0 (0%) から 255 (100%) の値をとります。

従って、出力したい電圧を v としたら、5V の動作電圧のときには 255/5 = 51 より (電圧) * 51 (として、さらに整数に丸めた値) を analogWrite の第二引数に渡します。

analogWrite を一度呼ぶと、同じピンに対して analogWritedigitalWritedigitalRead を呼ぶまで、 一定の PWM 波を出力します。

analogWrite を呼ぶために pinMode を事前に呼ぶ必要はありません。

PWM 波の計測

では実際に、次の方法で analogWrite による PWM 出力の状態を確認してみましょう。

Arduino スケッチは次の通り。3 番ピンにて 2 V 出力しています。

const int PIN_PWM = 3;
const float V_OUT = 2;

void setup() {
  int i = (int) V_OUT * 51;
  analogWrite( PIN_PWM, i ); 
}

void loop() {
}

マルチメータでの計測は次のように、確かに約 2V となります。

またこの時、オシロスコープを用いて出力波を確認すると次のようになります。

周波数は 490Hz、デューティーサイクル 40.0%、平均電圧 2.03V であることがわかります。

ここでピンを 5 番ピンにしてみます。上記スケッチは PIN_PWM を 5 にするだけです。この結果、オシロスコープの測定結果は次のようになります。

周波数が確かに変わり 976Hz となっています。デューティーサイクルは同様の 40.2%、平均電圧も同様の 2.04V です。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 基礎からの IoT 入門