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 を一度呼ぶと、同じピンに対して analogWrite、digitalWrite、digitalRead を呼ぶまで、 一定の 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 です。