アナログで出力?


また茶色の積み木「入出力端子」という関数の項目を見てみると、

fig.1 出力関数には、デジタルとアナログの2種用意されている
fig.1 出力関数には、デジタルとアナログの2種用意されている

「デジタルで出力する」ものと、「アナログで出力する」ものがあった。

デジタルで出力する積み木をプログラムの記述領域に持ってきて、値のあたりをさわると、

▲デジタル出力は、論理値「真=1」または「偽=0」を出力する。
fig.2 デジタル出力は、論理値「真=1」または「偽=0」を出力する。

スライドバーの右端にして1(逆に左にすると0)を出力できることとなっているが、実際にどんな電圧が出力されるのかを[ 前のページ ]で観察した。

 

もう一方のアナログ出力するものでは、

▲デジタル出力関数では、最小0から最大1023までの整数が設定できる
fig.3 デジタル出力関数では、0から1023まで設定できる

スライドバーの右端は1023である。こちらの関数では、0から1023までのどの値でも出力できることとなっている。

ところが、ここで見ている関数の端子名はどちらもP0であり、このP0は、デジタル・コンピューターのデジタル・出力端子GPIO(*1)に接続されていて、デジタル信号(真または偽)しか出せないはずだ。そこで、どのような波形が出力されるか見ていこう。

───

(*1)GPIO : general-purpose input/output 多目的入出力(端子)

───

そこで、マイクロビットにアナログ出力させるためのプログラムを作くる。

P0から63、127、255、511と出し続ける。P1はシーケンスの先頭、P2は値の切り替わり
fig.4 P0から変数[アナログ出力]を出し続けるプログラム

このプログラムで、変数[アナログ出力]は、どのような値をとるか?

棒グラフを表示する関数は、変数[アナログ出力]の値の記録もできる
fig.5 変数のグラフ表示関数は、その値の記録もできる

fig.4で行う計算の進行にあわせてfig.5のプログラムにて変数[アナログ]出力を記録したものをfig.6に図示した。

変数[アナログ出力]のとる値のグラフ
fig.6 変数[アナログ出力]のとる値のグラフ

変数[アナログ出力]の値は、プログラムの進行時間とともに63, 127, 255, 511となっていた。

さて、いよいよプログラムfig.4を実際にマイクロビットへインストールして、実行したときのP0の電圧波形を観測する。

fig.7 アナログ出力で出力する端子P0の電圧波形
fig.7 アナログ出力で出力する端子P0の電圧波形 ( 青線、0.1秒/div、2V/div )

青い線がP0の電圧をあらわしています。このグラフの横軸が時間、単位は秒、縦軸が電圧、単位がボルト。0Vと3.3Vとの間をカチカチと切り替わるような波形を示していることが見えました。この波形をパルスと呼びます。pulseは、心臓のドキドキをあらわすようなことばです。また、この波形は、前に見たデジタルで出力した場合と同じようなものです。

この波形の電圧が高い(high)部分をHレベルと呼びます。Hレベルの継続時間をパルス幅[秒]と呼びます(ここでは、角かっこ[と]で単位を記します)。アナログ出力の値が63、127、…増えると、パルス幅が大きくなっています。

逆に低い(low)部分をLレベルと呼びます。HレベルとLレベルの継続時間と合わせて周期[秒]と呼び、これはアナログ出力の値が増えてもかわりません。パルス周期を設定する積み木(関数)もありますが、このプログラムfig4 では、引用を省きましたので、あらかじめ設定されていた20[ms]となっています。このような値をデフォルト(default)の値と呼びます。

fig.8 パルスの周期を設定する積み木(関数)
fig.8 パルスの周期を設定する積み木(関数)

 

ここで、アナログ出力の積み木(関数)の値の欄に設定できる最大の値が1023となっていたのを思い出してください。この関数の仕組みのなかで、周期を1023に刻み、これに対して、アナログ出力関数の値は、何刻みのパルス幅を出すかを指示するものだったわけです。つまり周期にしめるパルス幅の割合(duty ratio)を示していることになります。

                63   127   255   512

アナログ出力関数の値 = { ─────、─────、─────、───── } … 第1式

               1023   1023   1023   1023

という分数の形に書ける比率を出力すると考えることができます。

パルス波形(fig.7)から「繰り返し」ループごとのパルス幅を測定すると、1.2、2.5、5.0、10[ms]でしたので、周期20[ms]で割ると、それぞれ、6%、12%、25%、50%ですので、第1式と合うことが確認できました。

このような方法は、パルスの幅に出力したいアナログ値を託するということから、パルス幅変調(Pulse Width Modulation)と呼ばれます。

また、デジタル計算から得られる数値を周辺機器へアナログ変換して送るという意味では、『デジタル・アナログ変換する』と言うこともあります。この言い方の場合、その分母にあたる1023は、量子化ビット数と言い、機器設計上の基本的な検討事項となります。

 

ところで、赤い線はトリガー信号と呼びます。triggerはものごとのきっかけという意味ですが、ここでは、アナログ信号を63, 127, 255, 512と出力する「ずっと」ループの開始を知るために発生させました。

また、緑色の線は、アナログで出力する値の変化させる「繰り返し」ループの開始を知るために発生させました。P0の波形を観察するときに、これらの信号を併せて使うことでプログラムとの対応がわかりやすくなりますので、このような実験を行うときには、併せて出力できるように仕組んで置くようにいたしましょう。 

このあと、このプログラムで生成した信号波形でLEDを点灯します。

  • 明るさはどうなるか?
  • そのときの回路図を示します。
  • LEDに流れる電流を考えます。
  • その他…

このプログラム(fig.4)では、出力する値の計算をする変数を「明るさ」と命名してありました。もしこの信号波形で白熱電灯の点灯ができれば、それにより「明るさ」をじょじょに増やしていくことができるからです。でもポートにはそのような重たい負荷は駆動できません(データーシート上は、全ポートの合計で100mA未満)ので、電力増幅器を介する必要があります。まだそのじゅんびが無いので、ここでは直接点灯できるLEDを負荷(約2mA)として観測します。

明るさをだんだん変えるように、dutyを6%、12%、25%、50%と変更してみたのだが、ビデオ映像ではむずかしいようだ。LEDを通過する電流値に変わりは無く、したがって、同じ光量で点滅する。直接観察するときにはそれを視覚が明るさの変化として感ずることができる。もっと応答速度の遅い負荷、例えば、小型の直流モーターの速度はこのようなパルス幅変調(PWM)で調節できる。

 

fig.9 LEDドライブ回路図
fig.9 LEDドライブ回路図

実験した回路について、ポートP0を理想電圧源3.3Vで置き換え回路図にするとこんなかんじになる。ノードN2の電圧が1.2V程度であったので、LEDを流れる電流はつぎのような式で計算できる。

1.2/470

約2.6mAである。

 

最後にデジタルポートに直接スピーカー(イヤーホーンにペットボトルのラッパを付けたもの)を鳴らす実験を見てほしい。真偽しか出さないポートでも平城山を歌っているのがなんとか聞き取れる。

───本項は、これでおしまいです。 2021/6/3───


コメント: 0