マイコン時代の電子回路入門 その3 デジタル出力

概要

前回はデジタル入力をやったので、今回は出力になります。単純なようで今後の通信の基本となりますので丁寧に紹介したいと思います。

出力ピンの状態

出力ピンの状態には3種類ありますので、個別に説明していきたいと思います。

HIGH出力

ざっくりとしたイメージ図です。ESP32の場合には3.3V出力を40mA流せます。

https://keisan.casio.jp/exec/system/1172565307

40mA流すためには82.5Ωの抵抗が必要です。これでスイッチをONにすれば3.3Vが40mA流れる出力となります。

LOW出力

同じくLOW出力では28mA流せますので抵抗値は118Ωぐらいになります。

https://keisan.casio.jp/exec/system/1172565307

ここがハマりポイントなのですが、LOW出力はGNDに接続するという意味になります。なので出力となっていますが、吸い込む方向で電流は流れます。

ハイインピーダンス

最後に重要なのがハイインピーダンスです。インピーダンスは直流と交流の抵抗成分を合成したものになります。直流回路の場合にはほぼ抵抗成分になると思います。ハイインピーダンスだとは抵抗値が高いという意味で、ボードと接続していないとの意味になります。

ESP32だと入力状態にすると、このハイインピーダンスになり出力用の回路とは分離されている状態となります。厳密には出力していませんが、ハイインピーダンス状態も出力として認識したほうがあとの説明がわかりやすいです。

3種類のまとめ

ざっくりとイメージ図にまとめると、3又スイッチがあって3.3Vに接続するか、GNDに接続するか、どこにも接続しないかを選択していることになります。

あと重要なのはHIGH出力は40mA、LOW出力は28mAと状態によって電流値が異なります。

https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf

データシートで確認します。IOHがHigh-level source currentとあります。HIGH出力をした場合の電流値で、この外に出す方向をSourceと表現します。ピンによって40mAと20mAがありますがSDカード系の1.8V出力が使えるピンが20mA、大多数のピンが40mAと異なります。

IOLがLow-level sink currentとあります。LOW出力をした場合の電流の値で、この中に引き入れる方向をSinkと表現します。どのピンも28mAですね。

LEDを直接接続する場合には2種類の接続方法があります。HIGH出力でLEDにGPIOから出力した3.3Vで光らせる方法と、LOW出力で外部からの3.3VでLEDを光らせる方法です。一般的にArduino UNOでは外部の3.3Vを利用してLOW出力で光らせるパターンが多かったと思います。その影響でESP32でもこの形をよく見ます。

これはボードによってSourceとSinkの電流差があるためになります。ただし、ESP32の場合にはHIGH出力のSourceの方が電流が多いため、HIGH出力で接続したほうが適しているように思えます。このへんは電源とボードによって違うので、実際のボードのデータシートを調べながら設計をする必要があります。

また、ピン単体の電流値とボード全体の電流値は違うので注意してください。とくにEPS32の場合には5Vからレギュレーターを使って3.3Vに変圧している場合があり、ESP32自体の性能ではなくて利用しているレギュレーターの性能によって、電流上限が制限されることが多いです。

あと40mA以上を流したい場合には他の方法がありますので、今後に紹介したいと思います。

出力モード

実際に出力するときのモードになります。

通常出力モード(プッシュプル)

通常出力モードにするとHIGHで3.3V、LOWでGNDに接続される状態となります。

イメージですが、上記の方向になります。

先程のLEDを光らせる回路の場合などはこちらになります。HIGHにするとLEDが光、LOWにすると光りません。

LOW出力の方を見ていると、HIGHにするとLEDに逆電圧をかけているので光りません。LOWにすると外部からの3.3VがGNDに接続されてLEDが光ります。このときHIGHで出力している3.3VはLEDに対して逆電圧になりますし、無駄な出力に思えますよね。これには解決方法があります。

オープンドレイン出力

オープンドレイン出力ではHIGHにすると、ハイインピーダンスの未接続になります。

つまり、上記の回路の場合にはHIGHにするとなにも出力しないのでLEDは光りません。LOWにすると外部の3.3VからLOWの先のGNDに接続されてLEDが光ります。

オープンドレイン出力はどちらかというと小型のICなどでよく使われています。Source方向での出力は小型ICなどでは難しいので、Sink方向にGNDに落とす方法が採用されています。

プルアップ・プルダウン回路

先程の3種類の出力の他に、プルアップとプルダウン回路が付きました。実際にはもう少し複雑なのですが、出力の主要な回路はこんな感じだと思います。

出力をする場合には、通常の出力なのかオープンドレイン出力なのかを選択し、オプションとしてプルアップかプルダウンを選択できます。一般的には通常出力のみか、オープンドレイン出力に内蔵プルアップをよく使うと思います。

オープンドレインでの通信

通常出力はこれまでの信号の伝搬とあまり変わらないので、オープンドレインの注意点を説明したいと思います。I2CやUARTなどがオープンドレインでの通信になり、非常に問題が起こりやすいです。

ざっくりと上記のイメージ図になります。内蔵プルアップは45KΩで、LOWは118Ωです。OUTをみるとHIGH出力のときにはプルアップの3.3Vがそのまま出力され、LOW出力にするとGNDに接続されますのでOUTもLOWになります。

spiceでの実験

こんな回路で実験してみました。通常は内蔵プルアップの45KΩで3.3Vにプルアップされています。本当はコイル成分もあるはずですが省略しています。

ちなみにオープンドレインを再現するのは上記の回路になっていて、V2のパルスを受けてQ1でGNDに流すスイッチにしています。ここの回路は参考程度なので今回は解説しません。重要なのはGNDに引き込むときの抵抗が118Ωということになります。

こんな出力になりました。ちょっとなまっている信号ですが、まずまずの形だと思います。ここで重要なのはLOWのときの値です。0Vまで下がっていないのがわかると思います。

LOWの実験

簡易化すると上記のような回路になります。3.3Vには45KΩで接続され、GNDには118Ωで接続されている形です。

分析をしてみると8.6307mVになりました。これはGNDに接続していますが、3.3Vにも接続されているので完全には電圧が下がっていないことを意味します。これは抵抗の比で計算することができます。

118(シンク抵抗) ÷ 45000(プルアップ抵抗) = 0.002622222
0.002622222
 × 3.3(V) = 0.008653333(V) = 8.653(mV)

上記のようにプルアップ抵抗がある程度大きくて、シンク抵抗が小さい場合にはほとんど問題にはなりません。

プルアップ抵抗が小さすぎると?

I2Cデバイスを接続した場合に、デバイス側でもプルアップされている場合があります。この場合には上記のR2のようにプルアップが増えた形になります。

このときのLOWの電圧は46.9167mVまで上がりました。

ESP32の場合には825mVまではLOWの判定なので、まだまだ大丈夫です。

デバイスを10個に増やしてみました。

ちょっと信号がばたついていますが355mVまでLOWの電圧が上がってしまいました。まだ許容範囲ですが、プルアップ抵抗が小さすぎるとこのようにLOWの電圧が上がる現象が起こります。

最初の実験回路に戻って、プルアップ抵抗値を触ったところ2.3KΩにしたところ793mVになって既定値ぎりぎりになりました。実際の回路だと他の要因もありますのでこの数値通りにはならないと思いますが、プルアップ抵抗が少なすぎるとLOWの電圧が上がるので注意しましょう。

キャパシタ成分が多すぎると

今度は配線などのキャパシタ成分を2nFまで増やしてみました。かなり信号がなまっています。これまでの波形と違うのは電圧が下がるところはストンと下がっていますが、電圧の上がり方がのんびりです。これはプルアップ抵抗とシンク抵抗の差になります。

今回プルアップ抵抗は45KΩですのであまり電流が流れません。そのためキャパシタに充電する速度が遅くなります。

今回の実験回路では8nFにしたところ、HIGHが2.4VぐらいになりましたのでESP32のHIGHの制限値ぎりぎりになってしまいました。

さて、キャパシタ成分はわざわざ追加しているわけではなく、配線などに由来するものになります。このような成分を寄生容量と呼びます。対策ですが、配線を変えるのが一番なのですが、通常できないと思いますので、充電速度を早くします。

プルアップ抵抗を触って、20KΩにしました。約半分の抵抗値にしたところ、信号がかなり回復しました。I2Cで長い配線などを使うと寄生容量が大きくなり、なかなか通信できなくなるのでプルアップ抵抗を調整する必要があります。このときプルアップ抵抗が足りないと表現することが多いですが、抵抗値を増やすのではなく、並列のプルアップをすることにより充電速度を早くする意味になると思います。ESP32の内蔵プルアップの45KΩはI2Cにはちょっと大きすぎる抵抗値のようです。

シンクが足りない

こんどはESP32だとあまり発生しないのですが、小さいICだとシンクの能力が低いものがあります。シンクの抵抗を30KΩに設定したのが上記ですが、LOWに下がる場合の放電能力が低下します。実際の通信をみてみると上記のようにストンと電源が移動するよりは、徐々に電圧が変化していく波形の方が多いはずです。

この辺は通信速度に影響されます。通信速度が大きいとキャパシタの充放電をより短時間で行う必要があるので、よりシビアな回路にする必要があります。一般的にオープンドレインでの通信は高速にするのが難しいので数Mbpsぐらいまでが限界なことが多いです。

クロストーク?

https://www.nxp.com/docs/ja/user-guide/UM10204.pdf

上記がI2Cの仕様書になります。非常に難しい内容も書いてあるので全部見る必要はありませんが、上記の配線パターンを紹介します。10cmを超えるケーブルでは信号線同士は離す必要があります。

ここにI2Cなどでよく使われることがある有名なケーブルがあります。黒がGND、赤が電源、白と黄色が信号線になります。ケーブルの長さはいろいろありますがこれは20cmになります。。。

つまり、、、この手のケーブルを利用するI2Cはクロストークの影響を受けやすいです!

まとめ

オープンドレイン出力は一度はハマると思います。オシロスコープを使って通信波形を調べることである程度確認することができますが、持っていないと解決するのはかなり難しいです。

この記事では実際にプルアップ抵抗をいくつにすればいいのかは取り扱いません。たぶん検索すればいろいろ出てくると思うので、検索するための基礎知識のみを紹介したいと思います。

今回までの内容が基礎の基礎になると思います。キャパシタ成分がかなりのくせ者で、これを意識していないと痛い目にあいます。ここまでの内容を頭の片隅において、次回以降はもう少し応用した回路を学んでいきたいと思います。

続編

コメント