概要
前回はアナログ入力を説明しました。今回はアナログ出力ですが、前回であまり説明できなかったところを補足しつつすすめたいと思います。
アナログ出力とは?

上記のように時間経過とともに出力する電圧が変化させることができる出力になります。デジタルからアナログに変換するという意味でAnalog to Digital ConverterでDACと呼ぶことが多いです。ADCとDACは対になる考え方ですので覚えておきましょう。
時間軸
上記だと1秒間に10マスありますので10Hzになります。1マスあたり0.1秒ですね。一般的に音声を再生するときには8,000Hz以上の周波数が必要になります。CDの場合は44,100Hzです。時間軸の解像度は高い方がいいのですが、高すぎると出力するデータの量が多くなるのでバランスを取る必要があります。
サイン波など計算して出力できるものであれば周波数が高くてのよいのですが、音声データなどであれば保存容量の他に読み出し速度が間に合うのかを考慮する必要があります。
電圧軸
こちらも縦の電圧軸が10マスあります。一番上が3.3Vなので1マスあたり0.33Vになります。一般的には8ビットで256段階か、16ビットで65,536段階あることが多いです。CDの音声は16ビットで65,536段階です、最低限の音質にするためには8ビットの256段階程度必要となります。
利用用途
スピーカーを接続して音をだす用途に使う事が多いですが、LEDに接続して明るさを変更することも可能です。ただし、スピーカーに接続してもノイズの影響を受けやすいのであまり音質はよくありません。
一般的に音質が必要な場合には外部の部品にデジタルデータで通信をして、音を出力する事が多いです。あとで取り上げる可能性もありますが、気になる人はI2Sなどのキーワードで検索してみてください。
PWM出力
さて、アナログ出力はノイズの影響を受けやすいのと、制御が難しいのであまり使われていません。LEDの明るさを制御する場合などはこのPWM出力がよく使われています。

さきほどの出力に比べるとシマシマの出力になっています。PWM出力では出力のオンとオフをつかって 擬似的に出力をコントロールする制御方法となっています。
上記の場合には時間あたりで考えると半分オンなので、50%の出力となります。LEDを接続するとピカピカと光りますが、ずーっと光っているときよりと比べると半分の明るさになっているはずです。

ngspiceで分析してみます。このままだとあまりアナログっぽくないのでキャパシタ成分を増やしてみます。

最初は充電するまで電圧が低いですが、どんどん電圧が上がっていき1.65V前後のところに落ち着きました。このときのPWMの周波数は5Hzになります。横マスは10マスあるのですが、PWMの制御としては1波形がオンとオンの2マスになり、1秒間に5波形入っているので5Hzです。つまり波形の解像度も周波数に影響してきてしまいます。
1波形あたりの解像度
アナログ出力を何段階で制御したいかによって、波形あたりの解像度を決定する必要があります。

上記の場合には1波形あたり5マスです。出力は3/5になるので60%になります。1秒に2波形あるので2Hzになります。
PWM制御とアナログ出力の差

アナログ出力の場合には電圧を8段階で表現した場合、実は縦7マスしかありません。0があるため、0から7までの8段階になります。

PWMの場合には0が特殊で、さらに1から8まであるので9段階で出力をコントロールします。
この差はアナログ出力は0-7までの8段階での管理になり縦のマスは7マスになります。PWMは波形を横8マスで制御するので、実は0-8までの9段階になります。PWMの最大をアナログ出力と同じ値だと思っていると微妙に出力が抜けている場所があるので注意しましょう。
PWMの周波数について
さてPWM制御での周波数の考え方ですが、横方向の解像度と制御したい解像度の両方を考える必要があります。

サーボモーターという角度を制御できるモーターではPWM信号を使います。基本となるPWMは50Hzで1波形あたり20ミリ秒になります。そこにDuty Cycleと書かれている出力の横幅を変化させることで角度をしていします。横幅を256段階で制御したい場合には20ミリ秒 / 256の0.078ミリ秒(78マイクロ秒)単位で制御をする必要があります。周波数ですと50 x 256ですので12,800Hz単位の制御になります。
ESP32の場合には処理単位の上限が80MHzになります。256段階のPWM制御をしようとすると、0.31MHzですので約310kHzまでのPWM信号を出力可能です。
Bit | 分解能 | 最大周波数 |
---|---|---|
16 | 65536 | 1,220.70Hz |
15 | 32768 | 2,441.41Hz |
14 | 16384 | 4,882.81Hz |
13 | 8192 | 9,765.63Hz |
12 | 4096 | 19,531.25Hz |
11 | 2048 | 39,062.50Hz |
10 | 1024 | 78,125.00Hz |
9 | 512 | 156,250.00Hz |
8 | 256 | 312,500.00Hz |
7 | 128 | 625,000.00Hz |
6 | 64 | 1,250,000.00Hz |
5 | 32 | 2,500,000.00Hz |
4 | 16 | 5,000,000.00Hz |
3 | 8 | 10,000,000.00Hz |
2 | 4 | 20,000,000.00Hz |
1 | 2 | 40,000,000.00Hz |
あまり意味がない資料なのですが、上記の関係になっています。一般的にPWMは256段階ぐらいあれば問題ないと思います。PWM周波数もLEDなどの場合50Hzなどでは光ったり、消えたりがチカチカ見えてしまうので遅すぎるのですが、1,000Hz以上であればほぼ問題がないと思います。
ADCの場合
アナログ入力の場合には横軸の時間分解能と、縦軸の電圧分解能で性能が決まります。横軸の時間あたりに取得回数のことをサンプリング周波数と呼びます。これはセンサーの能力で決まります。サンプリング周波数が大きくなってくると、データの転送量も増えてくるので闇雲に早ければいいというものではありません。
縦軸の電圧分解能ですが、こちらもセンサーによりかなり違います。ESP32内蔵ADCは12ビットですが、14ビットや16ビット、24ビットなどといろいろなADCがあります。データ自体は8ビット単位で転送をするため、12ビットの場合には上位4ビットが常に0になった16ビットデータとして通信をすることが多いです。
まとめ
アナログ入力と出力はあまり回路が出てきませんでした。次回からはもう少し回路を利用したものを説明していきたいと思います。
コメント