公開日:2021/11/27
title.png

18th Season


#18-10 5Vトレラント入力

 3.3V定格のマイコンやFPGAボード(Sipeed Lichee Tang Primer)に5Vの信号🚥を接続する時は、一般的にはレベルシフタ(L/S)を間に挟みます。

 もう一つの可能性としては、STM32(下図)の様に、搭載されているマイコン(STM32F103C)が「5Vトレラント」と言うI/Oバッファを持っているケースがあります。

ar41_stm32.jpg

 STM32は、ただ「5V信号を入力して良いよ」と言っている、だけではなくて、5V信号を繋いでもマイコンにダメージを与えないような回路が内蔵されています。
 今回はそんな5Vトレラントのお話です。

5Vトレラント

 電流は電圧の高い方から低い方へ流れます。Vcc=5VとVdd=3.3Vを直結すると、VccからVddへ向けて電流が流れます。配線抵抗をR、VccからVddへ流れる電流をIと置くと、以下の関係式が成立します。

  Vcc−Vdd=I×R

 理想的にはR→0Ωなので、理論上はI→∞[A]となります。巨大な電流が流れて、どこかの回路が壊れますね。よって、「電源同士を直結してはならない」、うん、当たり前か……。

 でも抵抗Rを有限な抵抗値にしたらどうでしょうか?

  R=1kΩなら、I=(Vcc−Vdd)/R=1.7mA

 これは良さそう。VccからVddに電流I=1.7mAが流れて、抵抗Rで無駄な電力(I2×R)を消費するけど……。
 消費電力が抵抗器の定格値(例えば1/4Wとか)より小さければ問題なしです。

LSIの入出力回路モデル

 5V定格のLSIから出力した信号を、3.3V定格のLSIに入力した時はどんな回路となっているでしょうか?それを図にしたのが下図です(出し側、受け側ともCMOSロジックの場合)。

a18a_cmosio.png

 簡単化するため、インバータで出力してインバータへ入力する(受ける)モデルとしました。実際の回路では、トライステートバッファ出力と、NANDまたはNOR受け、かもしれません。
 何にせよ本質は変わらないので続けます、CMOSトランジスタのゲート入力端子(A0ノード)には電流が流れません。電流が流れないと逆に、電圧が低下する要素が無いので、出力の5Vが直接3.3V耐圧CMOSトランジスタのゲート端子に掛かってしまいます。CMOSトランジスタのゲートとチャンネルの間には極薄い絶縁膜があるので、ここに意図しない高電圧(5V)が掛かると、絶縁膜が破壊されてLSIが壊れてしまいます。

※故障モードは「ショート」なので、今度は出力側の5V定格LSIに過大な電流が流れて、こちらも破壊に至ります。

 だから、普通の3.3V定格LSIには、入力電圧Vin=−0.3V(ABS.MIN)〜3.7V(ABS.MAX)等と言ったスペックが張られているのです。読み解くと、「入力電圧Vinが−0.3Vを下回ったり、3.7Vを超えるとLSIが破壊する場合がある」です。

※LSIによって定格値は異なるので、使用するLSIのデータシートで確認して使いましょう。

電圧クランプ

 そこで、前節で示した図のD3端子とA0端子の間に、下図の様な電圧クランプ回路を挿入します。

a18a_schem.png

 この回路によって、ダンピング抵抗Rdを通り、クランプダイオードDcを抜けて、5V側から3.3V側へ電流Ifが流れるパスができます。
 3.3V定格LSIの入力端子A0に電流は流れないので、ダンピング抵抗Rdに流れた電流Ifは、全てダイオードDcに流れます。ダイオードDcのI-V特性によって、電流Ifが流れた時のダイオード両端の電圧Vfは決まります。
 この時、3.3V定格LSIの入力端子A0に掛かる電圧A0=3.3V+Vfとなります。

  上図に成立する電流・電圧の関係式:
    D3≒5V
    D3−If×Rd−Vf=3.3V
    A0=D3−If×Rd
    A0=3.3V+Vf

 一般にダイオードのVfは、流れる電流値Ifの関数であり、If→大となると、Vf→大となるので、A0に許容される電圧値に収まる範囲のVf、従ってIfで使う必要があり、そうなるようなRdを適切に決める必要があります。

 現時点では未知数が多すぎてRdの値を決定できないので、次節のシミュレーションへ進みましょう。

シミュレーションしてみよう

 ここからはLTspiceを使ってシミュレーションして行きます。まずは、ダイオードのI-V特性を確認しておきましょう。下図のシミュレーション回路を使います。

a18a_dioiv_schm.png

 定電圧源V1の左側にショットキバリアダイオード(以下単にショットキダイオード)D1、右側に普通のシリコンダイオードD2を接続して、そのままGNDに落としてあります。
 下図は手持ちのダイオード外観図(左:ショットキダイオード1N5819、右:シリコンダイオード1N4007)です。

a18a_schottky.jpgar89_diode.jpg

※並べてみたら、見た目は同じパッケージでした……(1^^;)。


 電圧V1を変化させると、電圧に応じた電流が各々のダイオードに流れるので、その電流-電圧(I-V)特性をプロットしたのが下図となります。

a18a_dioiv_wf.png

 上図シミュレーション結果の通り、普通のシリコンダイオード(PN接合)と、ショットキダイオード(金属-半導体接合)では、電流の立ち上がる電圧が異なります。
 前節で述べた通り、3.3V定格LSIの入力端子A0に掛かる電圧値Vin=3.3V+Vfなので、ダイオードの電圧Vfは、なるべく小さい方が有利です。上図のI-V特性で明らかな様に、同じ電流値ではショットキダイオードの方がシリコンダイオードよりも電圧値Vfが小さいので、クランプダイオードとしてはショットキダイオードの方が優れています。

クランプ回路のシミュレーション

 次に、ショットキダイオードを使って構成したクランプ回路のシミュレーションを実行してみましょう。下図にシミュレーション回路図を示します。

a18a_clamp_schm.png

 高電圧(Vdd=3.3V)側をクランプするダイオードD1に加えて、低電圧(GND)側にもクランプダイオードD2を接続してあるので、上の回路によってVo=0〜3.3[V]にクランプされるはずです。

 下図がシミュレーション結果となります。

a18a_clamp_wf.png

 Vs=−1.85〜5.15[V]範囲の正弦波を入力しました(緑線)。結果、出力Vo=−0.0616〜3.36[V]にクランプされました(青線)。
 Voが0〜3.3[V]範囲から、はみ出した分は上下に約0.06Vで、これがダイオードのVfに相当しています。VfはIfの関数なので、Ifが変わるとVfも変わります。一般に、If→大でVf→大です(前節でシミュレーションしたダイオードのI-V特性)。
 Ifはダンピング抵抗値Rdで決まっているので、Rd→小とすると、If→大となって、Vf→大となる関係です。この関係を使って、はみ出す電圧量VfをRdの抵抗値で調整することになります。
 試しに上で示したシミュレーション回路図で、Rd=1kΩに小さくしてシミュレーションして見ると、Vo=−0.142〜3.44[V]と、はみ出す量Vf≒0.14Vが大きくなりました。

 信号を受け取るLSIの電気的特性(スペック)で許容範囲は変わるので、スペックと相談してRdの値を決定します。

レベルシフタ(L/S)だと、デジタル信号を想定しているため、アナログ波形が歪む場合があります。クランプダイオードだと上図のシミュレーション結果の様に、電圧範囲(0〜3.3[V])を超えない限り、波形の歪みは最小限となります。

実験すべし

 Arduino UNOとLogiscopeを使い、シミュレーションだけでなく実際の回路でも動作を確認しておきましょう。
 下図の回路をブレッドボードなどに構成します。UNOのデジタル5V出力D3端子を3.3Vにクランプして、アナログ端子A0に接続し、AD変換器で電圧レベルを確かめます。

a18a_expr_schm.png

 シミュレーションで確かめた通り、Rd=10kΩ、ダイオードにはショットキダイオード1N5819を使いました。

 実験用に追加した回路は、負荷抵抗Rl (=1kΩ)を3.3V電源とGND間に挿入したことです。UNOのボード上では、3.3V電源端子に負荷回路が全くつながっていません。ボード上に3.3V定格のチップや素子が1個も無い為です。上図の電圧クランプ回路はRd → Dc → 3.3V電源へ電流が流れることが前提なので、3.3V電源に何らかの負荷が繋がってGNDへの電流パスが無いと、期待通りに動作しません。
 負荷抵抗Rlは、消費電力(=(3.3V)2/Rl)が抵抗器の定格(例えば1/4W等)を超えないこと、ダイオードDcに流れる電流よりも十分大きな電流を流せること、流れる電流がUNOの3.3V降圧電源素子の定格電流を超えないこと、等を満たしている必要があります。

※3.3V定格LSIを使っている場合、そのLSIが電流負荷となっているため、通常は負荷抵抗Rlを接続する必要はありません。

 また、3.3V電源の電圧レベルを測定可能な様に、UNOのアナログ入力A1端子を接続しておきます。


 以下図に実験中の様子を示します。

a18a_expr.jpg

 UNOにLogiscopeをコンパイル&書き込みしたら、上で示した回路をD3端子とA0端子に接続して、以下の実験を進めてください。5V出力がちゃんと3.3Vレベルにクランプされているか?確かめます。

  実験サンプル:【 】内はLogiscopeからの送信データ
  【out,3,1】
  OK: digitalWrite(3, 1)

 D3端子にHIGH=5Vレベルを出力しました。

  【ina,0】
  OK: analogRead(0)=746, 3.643V

  【ina,1】
  OK: analogRead(1)=727, 3.550V

 AD変換器で、アナログ入力端子A0の電圧レベルを測定したところ、約3.643Vでした。A1端子に接続したUNOの3.3V電源出力は約3.550Vだったので、その差分からVf≒0.093Vと読めます。
 う〜ん、原因は良く解りませんが、まず、3.3V電源電圧自体が少し高めに出ていますネ……(※)。そこに目を瞑って先に進むと、Vf≒0.093Vと言う事で、シミュレーションで観測した値Vf≒0.06Vに対して少々高めに観測されました。まあ、実験する前から、「ブレッドボードでの実験で、0.06Vなんていう微小な電圧差が観測できるのか?」という疑問も持っていたので、実験誤差の範囲内と思って良いでしょう。

※実際の回路で実験してみると、中々シミュレーション通りには行かないものですね……m(1x_x)m。


 続いて、デジタル波形(PWM)がクランプされる様子も確かめてみましょう。

  【ana,3,128】
  OK: analogWrite(3, 128)

 D3端子にデューティ50%のPWM波形を出力しました。

  【osc,0,4,4,0】

a18a_expr_wf.png

 上図は、Logiscopeのデジタルオシロスコープ機能を使い、A0端子のアナログ電圧値を測定して波形表示したものです。
 出力は確かにUNO(5V定格)のデジタルD3端子なので、0〜5[V]フルスイングのPWM波形ですが、A0端子で観測された電圧値は、約3.5V程にクランプされています。

※期待値としては、3.3Vにクランプされるべきところ┌(1x_x)┐。A1端子の測定より、そもそも3.3V電源電圧が上昇してしまっているので、3.5V程の値になってしまった。原因不明。そもそも、校正されたテスタなどで測定したら、ちゃんと3.3Vなのかもしれない。そのような装置を所有していないので、UNOのAD変換器で測定していることに留意。


 以上で、電圧クランプ回路の動作を実機で確認することができました。実験を終了します。

FPGAボード(EG4S20BG256)

 最近、オリジナル16ビットCPUコアMoscoviumマイコンを焼き付けて遊んでいる、FPGAボードに搭載されているFPGAチップEG4S20BG256には、クランプダイオードが内蔵されています。

 下図は、Sipeed社HPから入手したデータシートからの引用です。

a18a_eg4s20_cdio1.png
※「Anlogic Technology EAGLE Series FPGA Data Sheet (V.2.8)」から引用

 TD IDEの「Toolsメニュー ⇒ I/O Constraint」ウインドウで、I/Oポート毎に内蔵クランプダイオードのON/OFF設定ができます。デフォルトONになっています。

 上図の通り、内蔵されているのはクランプダイオードだけです。外付けに適切なダンピング抵抗(上図中の抵抗R)を接続しなければ、クランプ回路としては機能しません。以下の様にして、抵抗値Rの値を決定します。

 同データシートより、クランプダイオードのI-V特性表を以下に引用します。

a18a_eg4s20_cdio2.png
※「Anlogic Technology EAGLE Series FPGA Data Sheet (V.2.8)」から引用

 0.6Vを超えた辺りで急激に電流値が増えていますので、普通のシリコンダイオードです。LTspiceでシミュレーションしてみた通り、シリコンダイオードはショットキダイオードよりVfが高いので、クランプ電圧を低く抑えることは難しくなります。
 本ページの記号と対応を取っておくと、Vd⇔Vf、Imax⇔If、R⇔Rd、Vcc⇔Vcc、Vccio⇔Vddです。
 データシートからもう一つ読み取ったのが、FPGAチップに入力可能な電圧値Vin=3.7V(ABS.MAX)です。

 以上で、必要な情報が全て集まりましたので、FPGAボードに5V信号を接続するためのダンピング抵抗値Rdを計算してみましょう。

 ダンピング抵抗として、FPGAボードの外側にRd>75kΩの抵抗を挿入すると、内蔵クランプダイオードとの合わせ技で5Vトレラント入力が可能となります。一応、Vin=3.3V+Vf=3.5V<3.7V(ABS.MAX)でスペック内使用です。
 それでも、3.3V定格LSIに3.5Vを印可するのはちょっと気が引けるかもしれませんね。もっと電圧値を低く抑えるためには、Vf→小、従ってIf→小、Rd→大とする必要があり、Vf<0.1Vを目標とするなら、If<9.2μAなので、Rd>174kΩとなります。

 前節でショットキダイオード1N5819を使ったシミュレーションでは、Rd≒10kΩでVf≒0.06Vに抑え込めたのですが、シリコンダイオードではRd≒174kΩまで電流値を絞っても、Vf≒0.1Vですから、やはり不利ですね。面倒でなく、可能であるなら、内蔵クランプダイオードには頼らずに、ショットキダイオードを外付けに接続した方が、特性としては良いですよ。

 その場合、内蔵クランプダイオードをわざわざ「OFF」にする必要は無く、そのまま放置しても悪さはしません。

今回のお買い物

 今回のお買い物は、以下の通りです。

 かなり昔、ATmega328P-PU等を購入した時に、「いつか使い道があるだろう」と思って一緒に購入しておいた部品です。
 0/1のデジタル信号で、かつ、複数本接続する場合には、レベルシフタ(L/S)を使ってしまった方が楽なので、今まで使うチャンスがありませんでした。


 ショットキダイオードは逆方向のリーク電流が大きいので、整流器として使うには適しません。一口にダイオードと言っても、用途によって大きく向き/不向きがあるのですね。


btn_arduino.png

btn_prev.png btn_next.png

home