MOSFETとマイコン (2) LEDの輝度を変化
■Arduinoにはアナログ出力がある
コンピュータはディジタルの値しか扱えません。センサなどのアナログ値を扱うためにA-Dコンバータを使ってディジタル値へ変換します。演算した結果を外部にアナログ値で出力するために、D-Aコンバータが使われます。
組み込み用マイコンの何割かには、D-Aコンバータを搭載したアナログ出力があります。Arduinoにも「~」が書かれたI/OポートはPWM(Pulse Width Modulation)のアナログ出力です。D-Aコンバータが本当にアナログの電圧を作っているのに対して、PWMは平均的にアナログ電圧を発生します。
ここでは、Micro:bitをArduino IDE で開発しています。
実際にMicro:bitの9番ピンの信号をオシロスコープ(Analog Discovery2)で見ます。スケッチは次のようにします。この9番ピンにアナログ・メータ(直流電圧計)を取り付けます。ほんの少し電圧が出ています。
void setup() {
}
void loop() {
analogWrite(9, 52);
delay(5000);
}
オシロスコープで見たPWM波形です。周期は489kHz=2.04msです。ONしている時間は約0.43msです。デューティ比は、次のように計算します。
D = 0.43 / 2.04 = 21 [%] |
Analog Discovery2の測定値(Measurements)では20%と表示されています。
●Micro:bitにはアナログ出力はない?
Micro:bitの各端子でスケッチを動かして、PWM出力が得られるかどうかを調べました。analogWrite(1, 127);は、1番ピンにONとOFFがある一定比率のパルス波を出力します。
void loop() {
analogWrite(1, 127);
delay(1000);
}
0番から20番ピンまで(17,18番の電源を除く)、PWM出力が出ました。
次に、9番ピンで、デューティ比を変化させました。下記のパラメータがほぼ20%単位に対応しています。値自体は1024まで入力できます。
引数 | 1 | 52 | 104 | 155 | 206 | 252 |
---|---|---|---|---|---|---|
デューティ比[%] | 1 | 20 | 40 | 60 | 80 | 99 |
void loop() {
analogWrite(9, 1);
delay(5000);
analogWrite(9, 52);
delay(2000);
analogWrite(9, 104);
delay(2000);
analogWrite(9, 155);
delay(2000);
analogWrite(9, 206);
delay(2000);
analogWrite(9, 252);
delay(2000);
}
●PWM出力をアナログ出力とみなす理由
オシロスコープの計測値にVrmsを追加します。① はanalogWrite(9, 52);の出力時、② はanalogWrite(9, 206);の出力時の波形です。RMSはRoot Mean Squareの略で、飛び出ている部分を低いところにもっていってならしたときの電圧です。プラス側のピーク電圧を√2で割ると求められると説明されることが多いのですが、サイン波だけに適用されます。サイン波以外では、積分して表示しているようです。
アナログ電圧計で、analogWrite(9, 52);の出力時、0.3Vぐらいと読めます。
analogWrite(9, 206);の出力時、2.2Vと読めます。
直流電圧計なので、あくまでも目安ですが、デューティ比が上がる(100%に近づく)ほど、高いアナログ電圧が出力されていることがわかります。
●入力値に応じてLEDの明るさを変化
前回、3色のLED、合計9個をMOS FET(2SK2796 )で点灯しました。Vccは12V、R3,R4,R5は47Ωです。
明るさをコントロールするために、10kΩのボリュームを用意し、A0(0番)につなぎました。A0の値を見て、LEDの明るさを変えようとするスケッチです。
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println(analogRead(A0));
delay(100);
}
スケッチを動かし、ボリュームを回したときの、シリアルプロッタの結果です。
アナログ入力は0~1023の値が得られますが、アナログ出力は0~1024の間で、上がったり下がったりを4回繰り返します。なので、4で割った値を9番ピンに出力します(※この処理は間違っていますが)。
void setup() {
}
void loop() {
analogWrite(9,(analogRead(A0)/4));
delay(100);
}
ボリュームを回すとLEDの明るさが変わります。電流計は、0.52~42.8mAと変化しました。
PWMのメリットは、無駄に電力を消費する部分が少ないことです。上記のLEDを光らせる回路では、電流制限用抵抗(R3,R4,R5)が熱を発生しています。MOS FETはONもしくはOFFというスイッチとして動作していますが、高速になると、立ち上がりと立ち下がりで発熱が起こります。このMicro:bitでは498kHzという低速なので、ほとんど発熱はないです。