ESP32のDAコンバーターの特性調査
◆まえがき
ESP32でオシロを作るための準備としてADコンバーターの特性についていろいろ調べてきました。一番気になっていた不可解な挙動はGPIO36を使わなければ回避出来ることが判ったので一安心です。最後に残ったのは、入力感度特性に大きな不感帯(オフセット)があって、約80mV以下の電圧は出力に現れてこないという問題です。片電源のアナログ回路なのでゼロボルト付近の特性が怪しくなるのは仕方ないのですが、そうは言ってもちゃんとしていない電圧範囲が大きすぎです。
不感帯が大きいと、ソフト的にレンジ切り替えを行う時に大きな問題になるので、対策が必要になります。簡単な対策として強制的にオフセット電流を注入してゼロ点を引っ張り上げてしまう手があります。
◆オフセットキャンセル回路

ADCの入り口を抵抗(Rp)でプルアップし、入力電圧がゼロの時でもADCの入力を僅かにプラスにする方法です。こんなことをやると、入力端子に僅かに電圧が発生してしまう(入力残留電圧)ので好ましく無いのですが、背に腹は代えられません。作ろうとしているのは簡易オシロなので、この手で妥協したいと考えています。
まえがきが長くなるのはいつものことなのですが、ここからが本題です。
オフセットをキャンセルする電圧をDAコンバーターで作れば、オフセット量の調整をソフトから行うことが可能になります。また、AC測定ではADCの入力レベルを1/2 Vdd まで引っ張り上げないといけませんが、このための回路と共用することが出来るので一石二鳥になります。
◆DAコンバーターの特性を調べる
ESP32にはDAコンバーターが二つ用意されていますが、上に書いたようなことに使っても大丈夫か、特性を確認してみることにしました。
・測定回路

プログラムでDACから電圧を発生させ、オシロで確認するだけの回路です。負荷をかけた時の挙動を見るために、10kΩの負荷抵抗を電源あるいはGNDに接続することが出来るようにしました。
プログラムは以下の通りです。
◆測定結果
1)下限側(bottom)

0Vから始まって欲しいのですが、実際には83mVから始まっていました。つまり、DACの出力のオフセット電圧は83mVあることになり、これは予想外に大きな電圧でした。なお、刻みは素直なステップになっているので、端部で感度が変化するようなことは起こっていないようです。
話を戻すと、ADCと比べればDACは簡単な回路で作れるのでオフセット電圧もそれなりに小さいのではなかろうか、と期待していたのですが、実際に測定してみるとそうでもありませんでした。ピンのアサインを変更するマトリックス回路が最後にあるので、ひょっとしたらそこの特性が見えているのかも知れません。
出力を10kΩの抵抗でGND側に引っ張っても電圧はほとんど変化しませんでした。逆に+3.3V側に引っ張ると、なんと出力電圧は約2Vに上昇し、更に波形の振幅は15mV程度まで減少しました。電気的に言うと、ソースは強いがシンクは弱いということでした。
2.上限側 (top )

電源電圧付近の小振幅波形なのでACカップルで測定しています。
上限は3.15Vでこの時の電源電圧3.32に対して0.17V低い電圧になっていました。ぴったり電源電圧まで上がるのが理想ですが、GND側と比べてこっちはぴったり合っていなくてもほとんどの場合で問題は無いと思います。刻みは等間隔なので、端の方で感度が変化したりはしていないようです。
10kΩでGNDに引っ張ると、僅かに(約5mV)電圧が低下、逆に+3.3Vに引っ張った場合はほとんど変化しませんでした。この電圧を出力している時の内部抵抗は低そうです。
3.中間
せっかくなのでDACの設定値のど真ん中も調べてみました。

6段目の階段がDACの設定値が 0x7F から 0x80 に変わるところ。つまり最上位のビットが立つ瞬間で一番アラがみえてくる場所です。階段の段差がここだけ1.5倍くらい大きくなっています。この絶対値について議論できる知識は持ちませんが、1/2Vdd付近を出力する場合に直線性誤差が大きくなりそうです。
10kΩでGNDに引っ張った場合の電圧変化は無し。しかし、3.3Vに引っ張った場合は、平均値が1.75V付近まで上昇し波形の振幅は20mVまで圧縮されました(元は平均1.58V、振幅130mV)。やはりソース側は強いけどシンク側は弱いようです。
◆まとめ
ESP32のDACの出力には約80mVのオフセットがあることが判りました。つまり、DACの設定値がゼロでもこの値の電圧が出力されるので注意が必要です。
DACの出力インピーダンスについては今回の測定結果から定量的なことは言えませんが、正負で挙動が異なっていて、GND側に引っ張った場合のインピーダンスは低そうですが、逆にVdd側にi引っ張った場合はあまり踏ん張らなくてすぐに電圧が上昇してしまいました。例えが変ですが、石ころが地面に落ちている感じで、押し付けると抵抗するけど簡単に持ち上がる、という感じです。どういう回路になっているのか興味深いです。ハイサイドにはp-MOSのトランジスタがあって、ローサイド側は数十kΩの抵抗で引っ張っているだけという感じではないかと思います。
DACの出力には大きめのオフセット電圧が出ているものの、これ以外の特性に大きな問題は無さそうです。シンクには弱いので使い方を注意する必要がありますが、ESP32で作るオシロはこの記事の最初に出てきた回路の考え方、つまりDAコンバーターの出力を使ってADコンバーターのオフセットを除去する方向で検討を進めて行こうと思います。
ESP32でオシロを作るための準備としてADコンバーターの特性についていろいろ調べてきました。一番気になっていた不可解な挙動はGPIO36を使わなければ回避出来ることが判ったので一安心です。最後に残ったのは、入力感度特性に大きな不感帯(オフセット)があって、約80mV以下の電圧は出力に現れてこないという問題です。片電源のアナログ回路なのでゼロボルト付近の特性が怪しくなるのは仕方ないのですが、そうは言ってもちゃんとしていない電圧範囲が大きすぎです。
不感帯が大きいと、ソフト的にレンジ切り替えを行う時に大きな問題になるので、対策が必要になります。簡単な対策として強制的にオフセット電流を注入してゼロ点を引っ張り上げてしまう手があります。
◆オフセットキャンセル回路

ADCの入り口を抵抗(Rp)でプルアップし、入力電圧がゼロの時でもADCの入力を僅かにプラスにする方法です。こんなことをやると、入力端子に僅かに電圧が発生してしまう(入力残留電圧)ので好ましく無いのですが、背に腹は代えられません。作ろうとしているのは簡易オシロなので、この手で妥協したいと考えています。
まえがきが長くなるのはいつものことなのですが、ここからが本題です。
オフセットをキャンセルする電圧をDAコンバーターで作れば、オフセット量の調整をソフトから行うことが可能になります。また、AC測定ではADCの入力レベルを1/2 Vdd まで引っ張り上げないといけませんが、このための回路と共用することが出来るので一石二鳥になります。
◆DAコンバーターの特性を調べる
ESP32にはDAコンバーターが二つ用意されていますが、上に書いたようなことに使っても大丈夫か、特性を確認してみることにしました。
・測定回路

プログラムでDACから電圧を発生させ、オシロで確認するだけの回路です。負荷をかけた時の挙動を見るために、10kΩの負荷抵抗を電源あるいはGNDに接続することが出来るようにしました。
プログラムは以下の通りです。
// ESP32 DAコンバーターのテスト挙動を詳しく見たいので、bottom(); mid(); top(); の関数で、DACの出力の下限、中間、上限を出力する仕掛けになっています。下から始めて、階段を10段登るような波形が出力されます。なお一度に全部動かすと測定が難しくなるので、実際に使うのは一つだけです。(コメントアウトで無効化する)
#define TestPin 25 // 測定するピンを指定
void setup() {
}
void loop() {
bottom(); // 0V付近の挙動
// mid(); // 中央(128)付近の挙動
// top(); // Max付近の挙動
}
void bottom() {
for (int i = 0; i < 11; i++) { // 0-10まで11ステップ
dacWrite(TestPin, i);
delay(1);
}
delay(1);
}
void mid() {
for (int i = 122; i < 133; i++) { // 122-133まで11ステップ
dacWrite(TestPin, i);
delay(1);
}
delay(1);
}
void top() {
for (int i = 245; i < 256; i++) { // 245-256まで11ステップ
dacWrite(TestPin, i);
delay(1);
}
delay(1);
}
◆測定結果
1)下限側(bottom)

0Vから始まって欲しいのですが、実際には83mVから始まっていました。つまり、DACの出力のオフセット電圧は83mVあることになり、これは予想外に大きな電圧でした。なお、刻みは素直なステップになっているので、端部で感度が変化するようなことは起こっていないようです。
話を戻すと、ADCと比べればDACは簡単な回路で作れるのでオフセット電圧もそれなりに小さいのではなかろうか、と期待していたのですが、実際に測定してみるとそうでもありませんでした。ピンのアサインを変更するマトリックス回路が最後にあるので、ひょっとしたらそこの特性が見えているのかも知れません。
出力を10kΩの抵抗でGND側に引っ張っても電圧はほとんど変化しませんでした。逆に+3.3V側に引っ張ると、なんと出力電圧は約2Vに上昇し、更に波形の振幅は15mV程度まで減少しました。電気的に言うと、ソースは強いがシンクは弱いということでした。
2.上限側 (top )

電源電圧付近の小振幅波形なのでACカップルで測定しています。
上限は3.15Vでこの時の電源電圧3.32に対して0.17V低い電圧になっていました。ぴったり電源電圧まで上がるのが理想ですが、GND側と比べてこっちはぴったり合っていなくてもほとんどの場合で問題は無いと思います。刻みは等間隔なので、端の方で感度が変化したりはしていないようです。
10kΩでGNDに引っ張ると、僅かに(約5mV)電圧が低下、逆に+3.3Vに引っ張った場合はほとんど変化しませんでした。この電圧を出力している時の内部抵抗は低そうです。
3.中間
せっかくなのでDACの設定値のど真ん中も調べてみました。

6段目の階段がDACの設定値が 0x7F から 0x80 に変わるところ。つまり最上位のビットが立つ瞬間で一番アラがみえてくる場所です。階段の段差がここだけ1.5倍くらい大きくなっています。この絶対値について議論できる知識は持ちませんが、1/2Vdd付近を出力する場合に直線性誤差が大きくなりそうです。
10kΩでGNDに引っ張った場合の電圧変化は無し。しかし、3.3Vに引っ張った場合は、平均値が1.75V付近まで上昇し波形の振幅は20mVまで圧縮されました(元は平均1.58V、振幅130mV)。やはりソース側は強いけどシンク側は弱いようです。
◆まとめ
ESP32のDACの出力には約80mVのオフセットがあることが判りました。つまり、DACの設定値がゼロでもこの値の電圧が出力されるので注意が必要です。
DACの出力インピーダンスについては今回の測定結果から定量的なことは言えませんが、正負で挙動が異なっていて、GND側に引っ張った場合のインピーダンスは低そうですが、逆にVdd側にi引っ張った場合はあまり踏ん張らなくてすぐに電圧が上昇してしまいました。例えが変ですが、石ころが地面に落ちている感じで、押し付けると抵抗するけど簡単に持ち上がる、という感じです。どういう回路になっているのか興味深いです。ハイサイドにはp-MOSのトランジスタがあって、ローサイド側は数十kΩの抵抗で引っ張っているだけという感じではないかと思います。
DACの出力には大きめのオフセット電圧が出ているものの、これ以外の特性に大きな問題は無さそうです。シンクには弱いので使い方を注意する必要がありますが、ESP32で作るオシロはこの記事の最初に出てきた回路の考え方、つまりDAコンバーターの出力を使ってADコンバーターのオフセットを除去する方向で検討を進めて行こうと思います。