前回(「#6-1 オペアンプ、の、前に香辛料」で)は、LTspiceと言う回路シミュレータを導入して終了だったので、今回はいよいよ、オペアンプのシミュレーションに進みたいと思います。
オペアンプと言うのは、電子回路図の中で、以下の様なシンボルを持つ素子です。
シンボルはシンプルですが、内部にはトランジスタを複数組み合わせた増幅回路が入っています。内部の回路構成に興味がある方は以下より検索してみてください。
オペアンプの内部回路図を検索(別ウインドウが開きます)
オペアンプには、定型の応用回路例(別ウインドウが開きます)が沢山あるので、それに習って必要な回路を組めば使える、ハズでした。ところが、そこは「アナログ回路」、甘くは無かったのです。実回路を組んで、アナログ信号を当たりながらデバッグするのは、ものすごく大変。
そこで前回(「#6-1 オペアンプ、の、前に香辛料」では)、実回路を組む前にシミュレーションで動作を確認するため、LTspiceを導入しました。
今回購入したオペアンプは、LM358という型番の8ピンDIP ICで、中に2つのオペアンプが入っているタイプです。
LM358のデータシートを検索(別ウインドウが開きます)
オペアンプを使うのは初めてで、正直、「オペアンプなら何でもいいや」と、通販で購入できた一番安いものを選びました(1^^;)。想定している用途に足りると良いのですが……。
さて、LTspiceを使って、オペアンプのシミュレーションを実行して行きたいのですが、インストールした時に含まれていたオペアンプモデルの中にLM358の名前はありません。「オペアンプなら、どれも同じ」でしょうか??
否。オペアンプには色々な特徴・特性を持った種類があり、型番によってシミュレーション結果は異なります。
アナログ回路をLTspiceのような回路シミュレータを使ってシミュレーションしながら設計するのは既定路線なので、LM358のspiceモデルがメーカから提供されているはずです。検索してみましょう。
LM358のspiceモデルを検索(別ウインドウが開きます)
今回検索した範囲では、以下4社のモデルが見つかりました。
すべてダウンロードして中身を確認したところ、筆者には馴染みのネットリストでした。「.SUBCKT〜.ENDS」の間に回路のネットリストが記述されています。LM358のトランジスタレベルネットリストそのもの、ではなく、恐らくシミュレーション用の等価回路だと思われます。
どのモデルが良いのかわからないので、一旦、全てのモデルをLTspiceに組み込んでみることにします。
LTspiceに、前節で検索してダウンロードしたLM358のspiceモデルを組み込む手順を説明します。他の素子でも、spiceモデルが見つかりさえすれば自分で組み込めるように、説明してみます。
これで、「LM358_XX」という素子が使えるようになっているはずです。
※4社すべてのモデルを組み込んだので、この時点でLM358_TI/LM358_NS/LM358_OS/LM358_STの4つがライブラリに登録されました。
同じ型番でも、当然、メーカ毎にチューニングが異なるはずなので、本来であれば、購入したチップのメーカが提供するモデルを使うのが正解です。しかし、今回購入したチップは、4社のいずれでもなく、知らない(不明な)メーカの物で、モデルも見つかりませんでした。よって、型番が合っていれば良しとします。後は使い勝手:
上述の様に、回路シミュレータ(ここではLTspice)との相性も重要なファクタなので、NS(National Semiconductor)版またはST(STMicroelectronics)版のモデルを使用することにしました。
※利用可能なモデルが2つ確保できたのは良かったです。一方で動作を確認後、念のため、他方で追確認することができます。
オペアンプの応用回路例の中から、「反転増幅回路」を組んでみます。
この回路の増幅率を求めてみましょう。
Vi→Rs→Rf→Voと流れる電流をIと置くと:Vo=Vi−(Rs+Rf)×I
オペアンプの増幅作用より:Vo=Av×(Vp−Vn)
入力端子の電位:Vp=Vb,Vn=Vi−Rs×I
上3式より: …… Voの式を結合する
Vi−(Rs+Rf)×I=Av×(Vp−Vn) …… Vp,Vnを代入
Vi−(Rs+Rf)×I=Av×(Vb−Vi+Rs×I) …… 両辺Avで除す
(Vi−(Rs+Rf)×I)/Av=Vb−Vi+Rs×I …… Av→∞なので
0=Vb−Vi+Rs×I …… Iについて解く
I=(Vi−Vb)/Rs …… これをVoの関係式に代入する
Vo=Vi−(Rs+Rf)×I
=Vi−(Rs+Rf)×(Vi−Vb)/Rs
=Vi−(1+Rf/Rs)×(Vi−Vb)
=Vi−Vi−Rf/Rs×Vi+Vb+Rf/Rs×Vb
=Vb−Rf/Rs×(Vi−Vb)
∴Vo=Vb−Rf/Rs×(Vi−Vb)
まず、簡単のため、バイアス電位Vb=0だった場合を考えます。
Vo=Vb−Rf/Rs×(Vi−Vb) …… Vb=0を代入
Vo=−Rf/Rs×Vi
入力電圧Viが−Rf/Rs倍に増幅されて、出力Voに現れる。すなわち、抵抗値の比によって増幅率を決定できる、反転増幅回路となっていることがわかります。
ここで、具体的にRf=10kΩ、Rs=1kΩと設定してみましょう。オペアンプを単電源(Vcc=5VとGND)で使用する場合、例えばVi=0.1Vに対して、Vo=−Rf/Rs×Vi=−10/1×0.1=−1Vの電圧(負の電圧!)を出力できるか?というと、それは無理です。オペアンプに供給する電源電圧範囲、0〜5[V]の信号しか出力できないからです。
オペアンプには、両電源タイプのものがあり、正電源(Vcc)と負電源(Vee)を供給することで、0Vをセンタとする、正負電圧の交流信号を増幅できるようになります。そのように使った場合には、−1Vの電圧を出力可能です。
Arduinoの周辺で使用する場合、単電源の方が使い易いので、正電源にVcc、負電源にGNDを繋いで使いたいですよね。そうすると、必ず増幅率がマイナスになってしまう反転増幅回路は、単電源では使えないのでしょうか?
答えは否。ここでバイアス電圧Vbの出番です。元のViとVoの関係式で、Vb=2.5V(Vcc=5Vの中央値)に設定してみると、どうなるでしょうか?
Vo=Vb−Rf/Rs×(Vi−Vb) …… Vb=2.5を代入
Vo=2.5−Rf/Rs×(Vi−2.5)
Viが2.5Vを超えた部分(Vi−2.5)が、Rf/Rs倍されて、2.5Vより下側に振幅が出る。逆に、Viが2.5Vを下回った部分が、Rf/Rs倍されて、2.5Vより上側に振幅が出るような増幅作用になる、そういう式ですね。
あ、忘れてました。そのためのLTspiceでした。シミュレーション波形をご覧に入れます。その方が一目瞭然。
Vb(=2.5V)を中心として、上下に反転&増幅されていることがわかりますか?
三度、反転増幅回路のVoとViの関係式に戻って、Rs→∞(開放と同じ)、Rf→0(ショートと同じ)として見ます。
Vo=Vb−Rf/Rs×(Vi−Vb) …… Rf/Rs → 0/∞ = 0
Vo=Vb
Vo=Vbとなり、Vp(V+)端子に入力された電圧Vbが、そのままVoに出力される式になってしまいました。この時の回路図は以下の通り。
この回路をボルテージフォロアと呼びます。一応シミュレーションしてみますが、入力電圧Vbがそのまま出力に伝搬するだけです。
入力した電圧波形をそのまま、出力に伝搬する回路で、一瞬、「何の意味があるの?」と考えてしまいますが、オペアンプの入力インピーダンスは、ほぼ無限大(open、開放と同じ)と考えることができるので、オペアンプを駆動する側は、そこに何もつながっていないのと同じに考えることができます。それでいて、しっかり、出力側に入力側の電圧を伝えることができるので、入力(Vb)側の回路が、出力(Vo)側に接続した回路に影響されないよう、分離するような用途で使います。
実際、その用途でArduino UNOの回路図にも、登場しています。以下、該当部分の抜粋です。
※Arduino HPより、Arduino UNO回路図の抜粋
UNOのD13端子(上の回路図では、SCKと表記されています)にはオンボードLED(LED_BUILTIN)がつながっていますが、D13とLEDの間にボルテージフォロアが挿入されています。LEDは、結構電流を流す「重たい負荷」なのですが、このようにしておくと、電流を流すのはオペアンプであって、UNOのD13ではなくなります。お陰で、D13に他の負荷回路を接続した時に、LEDの電流駆動に邪魔されずに使うことができるのです。
※よく見ると、素子名が「LMV358xxx」になってますね。LM358のパッケージ違い品とか、でしょうか?
オペアンプには、単電源タイプのものと両電源タイプのものがある様です。
単電源とは、GNDとVccの様に、通常のロジックで使うようなDC電源で使用するタイプです。対して、両電源とは、高い側に+Vcc、低い側に−Veeという正・負両側の電源を接続して使用するタイプとなります。
ちなみに、今回入手したLM358は単電源でも両電源でも使用可能なタイプでした(検索して見つけたデータシートより)。
先程と同じ反転増幅回路を使って、単電源と両電源の違いを見てみましょう。
違いは、LM358の電源端子(VccとVee)に繋ぐ電源の種類のみ。あと、肝心な、入力信号(それに伴って出力信号)に差があります。それは、シミュレーション波形で確認して行きましょう。
見た目(波形)は同じですね。縦軸に注目してください。
両電源(上側)では、0Vをセンタとして正・負両側に電圧が振れる交流波形を増幅しているのに対して、単電源では、2.5Vをセンタとして上下に振れる直流波形を増幅しています。
通常、論理回路を作る時は負電源を持っていないので、Arduinoの周辺に使用する場合には単電源で使用することが多くなると思います。
今回も、中国から配送されてくるショップを使ってみました。ただし、「#4-1 中国から配送されるネットショッピング」で利用したのとは異なる、「FashionableGNJPyoung」というショップを利用。こちらのショップも配送料は無料。これで採算が取れているなんて、驚きです。
10連休(2019年GW)序盤の5月1日にポチって、届いたのは5月14日と、14日間かかりましたが、船便&通関を考えると妥当な日数ではないでしょうか?……中国のショップなので、10連休は関係なかったようです、ポチった次の日には「発送完了」通知が届きました。
10個入りのLM358はビニル袋にゴソっと入って、エアクッション付きの封筒に入っていました。8ピンDIPの足は何本か曲がっていましたが、矯正すれば問題なく使用可能です(金属疲労で折れてしまうほどのダメージは無いということ)。商品名LM358Nですが、マークはLM358Pとなっていました。メーカが不明なので、型番NとPの違いは分かりません。一応、ボルテージフォロアとしては機能したので、まあ、OKとしておきます。
購入したオペアンプのモデルを使って、回路シミュレーションができるようになりました。シミュレーション上では、想定通りに動かせたし、そろそろ実回路……。