今から始める電子工作 ⑨ アナログ出力 その1 PWM
Arduino UNO 3には、いわゆるアナログ出力はありませんでしたが、ディジタル出力の記号のところに~(チルダ)がついているポートはPWM出力に対応していて、疑似的にアナログ出力ができました。
チルダのついている端子は、D3、D5、D6、D9、D10、D11です。
Arduino UNO 4は、そのPWM出力に加えて、D-Aコンバータによるアナログ出力を一つもっています。
●PWM出力をアナログ値とみなす
PWMは、0と5VをON/OFFする信号で、周波数とデューティ比がそのパラメタになります。D3にアナログ出力をした波形を下記に示します。
波形の周波数などはまったく同じです。いずれのピンの周波数は、489.7Hzです。下記の資料には490Hzと書かれています。
公式のドキュメント https://docs.arduino.cc/language-reference/en/functions/analog-io/analogWrite/
UNO 3では、D3、D9、D10、D11が490Hz、D5、D6は 980 Hzでした。
<Pin3(上)、Pin5(下)>
<Pin3(上)、Pin6(下)>
Pin6の波形はじわじわと移動しています。
<Pin3(上)、Pin9(下)>
Pin9の波形はじわじわと移動しています。
<Pin3(上)、Pin10(下)>
Pin10の波形はじわじわと移動しています。
<Pin3(上)、Pin11(下)>
Pin11の波形はじわじわと移動しています。
●いずれもデューティ50%
上記の波形を出しているスケッチです。 アナログ出力は analogWrite(ピン番号, デューティ比) で、デューティ比を0~255で指定します。128はちょうど真ん中の値です。これをテスタの電圧レンジで測ると、電源電圧の半分の電圧になります。
void setup() { Serial.begin(9600); while (!Serial) delay(10); } void loop() { analogWrite(D3, 128); analogWrite(D5, 128); }
実際に測ります。テスタは測定頻度が少ないので、PWM出力の平均値を測っていることになります。
- 5Vピン 4.49V
- D3ピン 2.246V
ディジタル・マルチメータで測っても同じく2.246Vでした。
●アナログ電圧値で出力するスケッチ
電源電圧5V端子を測ると4.5Vでした。1.05Vを出力しようとしています。
const float Vref = 4.5; void setup() { Serial.begin(9600); while (!Serial) delay(10); } void loop() { float val = 1.05; int out_voltage = (val / Vref ) * 255; Serial.println(out_voltage); analogWrite(D3, out_voltage); analogWrite(D5, out_voltage); }
実行結果です。テスタの表示値は1.036Vでした。
波形です。