LTspice:シミュレーションの実行回数を最小限に抑え、最も厳しい条件で回路を解析する方法
回路の設計を行う際には、各種コンポーネントの許容誤差がもたらす影響について評価する必要があります。例えば、オペアンプ回路において、理想的ではない抵抗(製造ばらつきを伴う現実の抵抗)が原因で生じるゲイン誤差を確認するといった具合です。このような検証には、LTspiceによるシミュレーションが役に立ちます。但し、適切な結果を得るためには、各種パラメータの値を変更しながら、何度もシミュレーションを繰り返さなければなりません。では、シミュレーションの実行回数を最小限に抑え、最短の時間で適切な結果を得るにはどうすればよいのでしょうか。本稿では、そのための手法をいくつか紹介します。
パラメータの変更
LTspiceには、パラメータの値を変化させる方法がいくつか用意されています。代表的なものとしては、以下のような関数が挙げられます。
- .step param:ユーザが定義した変数の値のスイープ
- gauss(x):シグマがxのガウス分布に基づく乱数
- flat(x):-xとxの間の一様分布に従った乱数
- mc(x,y):x*(1+y)とx*(1-y)の間の一様分布に従った乱数
これらの関数は非常に便利なものです。分布の観点から結果を確認したい場合には特に有用です。しかし、最も厳しい条件における結果だけを知りたい場合、恐らくこれらは最速の方法とはならないでしょう。例えば、gauss(x)、flat(x)、mc(x,y)を使用すると、統計的に意味のある回数に到達するまでシミュレーションを繰り返さなければなりません。その後、分布を確認すれば、標準偏差の観点から最も厳しい条件の値を計算することができます。しかし、シミュレーションに要する時間の観点から、最も厳しい条件に対する分析に、分布によるアプローチを使いたくないケースもあるはずです。そのような場合には、各種コンポーネントの公称値からの最大偏差を使用して計算を行えばよいでしょう。
シミュレーションの実行回数を最小化する
許容誤差が1%、値が22.5kΩの抵抗R1について、最も厳しい条件の影響を調べたいケースを考えます。その場合、実際にシミュレーションで確認したいのは、R1 = 22.5kΩ * (1 - 0.01)という条件とR1 = 22.5kΩ * (1 + 0.01)という条件における結果だけです。もちろん、理想値である22.5kΩという値を使用した3回目の実行結果も存在するべきでしょう。そうすると、以下のような記述を使ってシミュレーションを実行すればよいということになります。
.step param R1 list 22.5k*(1-.01) 22.5k*(1+.01) 22.5k
このように、1つの抵抗の値を変化させるだけであれば、.step paramを使う方法は非常にうまく機能するはずです。しかし、より多くの抵抗に注目しなければならない場合はどうでしょうか。例えば、図1に示すような典型的な差動アンプでは4つの抵抗を使用します。このように、ディスクリート構成で差動アンプを実現する場合、各抵抗には1%、5%といった許容誤差が存在することに注意しなければなりません。

図1. 差動アンプの構成(LT1997-3のデータシートから抜粋)
図2に示した回路は、高精度アンプ「LT1997-3」のデータシートの最初のページから抜粋したものです。これと同等の回路をLTspice上で構成し、そのシミュレーションを実施するケースについて検討してみましょう。シミュレーション用の回路は、高精度オペアンプ「LT6015」といくつかの非理想的な(ばらつきを伴う現実的な)ディスクリート抵抗によって構成することにします(図3)。

図2. LT1997-3のデータシートの1ページ目に掲載されている回路

図3. LT6015と非理想的な抵抗によって構成した差動アンプ回路。LTspiceによるシミュレーションの対象とします。
図3の回路では、抵抗R1、R2、R3、R4の値を関数呼び出しwc(nominalvalue, tolerance, index)で置き換えています。この関数は、シミュレーションにおいては、以下のような.func文として機能します。
.func wc(nom,tol,index) if(run==numruns,nom,if(binary(run,index),nom*(1+tol),nom*(1-tol)))
これは、以下の関数binary(run, index)と共に機能します。
.func binary(run,index) floor(run/(2**index))-2*floor(run/(2**(index+1)))
その結果、各コンポーネントのパラメータを最大値と最小値の間で変化させると共に、最後には公称値を使ってシミュレーションが実行されます。binary関数によって、シミュレーションの対象となるインデックス付きの各コンポーネントの切り替えが行われます。そして、nom*(1+tol)とnom*(1-tol)がとり得る全組み合わせでシミュレーションが実行されます。なお、各コンポーネントのインデックスは0から始まる必要があることに注意してください。次の表は、binary関数の動作を説明するためのものです。各インデックスと実行条件の組み合わせについてまとめています。この表において、1はnom*(1+tol)を表し、0はnom*(1-tol)を表します。
実行 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
インデックス 0 (R4) | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
インデックス 1 (R1) | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
インデックス 2 (R2) | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
インデックス 3 (R3) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
この場合、シミュレーションの実行回数は2N + 1で決まります(Nはインデックス付きのコンポーネントの数)。また、シミュレーションでは、コンポーネントがとり得る最大値と最小値のすべての組み合わせと公称値が網羅されます。図3の回路の場合、17回のシミュレーションを実行する必要があります。これについては、以下に示すように.stepコマンドと.param文を使用して定義することができます。
.step param run 0 16 1
.param numruns=16
更に、.param文によって、シミュレーションで使用するtolaとtolbの値を以下のように定義します。
.param tola=.01
.param tolb=.05
.func、.step、.paramの詳細については「F1」キーを押すことによって表示されるヘルプをご覧ください。なお、.paramのセクションには、if(x,y,z)関数、floor(x)関数に関する詳細も記載されています.
.Step'edの結果のプロット
本ページの右欄にある「リソース」からダウンロードできる「WorstCase_LT6015.asc」を使用すれば、過渡解析のシミュレーションを実行できます。ここでは、その実行結果を確認しましょう(図4)。テストに使用する電流が250mAの場合、V(out)の電圧は250mVに落ち着くと予想されます。しかし、wc関数を使用すると、その値が235mV~265mVの値をとるということがわかります。

図4. 差動アンプの過渡解析を行った結果
.Step'ed .Meas文のプロット
上記の時点で結果を拡大すれば、ピークtoピークで結果がどのような広がりを持つのかを確認することができます。ただ、LTspiceの別のブログを参照すれば、1つの教訓を得ることができます。ぜひ、「LTspice:Plotting a Parameter Against Something Other Than Time (e.g. Resistance)(LTspice: 抵抗など、時間領域以外のパラメータのプロッティング)」をご覧ください。このブログでは、シミュレーションを数回実行し、時間以外のパラメータを軸としてプロットを行う方法を紹介しています。本稿の例の場合、シミュレーションの実行インデックスに対してV(out)をプロットできると便利です。その方法については、「WorstCase_LT6015_meas.asc」のファイルをご覧ください。
このファイルを見ると、以下に示すように.meas文を追加して、出力電圧の平均値を計算していることがわかります。
.meas VoutAvg avg V(out)
実行時に使用するパラメータに対してV(out)をプロットするには、「Ctrl」+「L」キーを押して、「SPICE Error Log」を表示します(図5)。そして、右クリックにより、「Plot .step'ed .meas data」を選択します。

図5. SPICE Error Logのインターフェース
「.step'ed .meas」の結果のプロットは図6のようになります。

図6. シミュレーションを実行するたびに変化する出力電圧
このプロットを見ると、最も厳しい条件の最大265mV(X軸の値は9)から最小235mV(X軸の値は6)まで、約±6%の誤差で出力が変化していることがわかります。許容誤差が1%、5%の抵抗を使用していることから、この結果はある程度直感的に理解できるでしょう。最後の実行時(X軸の値は16)には、理想的な抵抗による理想的な結果(250mV)が得られています。LTspiceは、.meas文の結果をPWL(Piecewise Linear)のグラフとして描いています。
この回路については、迅速に結果を得るためにもう1つのアプローチを利用することができます。それは、.tranの代わりに.opを使用し、DC動作点解析を実行するというものです。その場合、.step'ed .measの結果が直接プロットされます。
マッチングのとれた抵抗がもたらす価値
差動アンプを設計する場合には、適切なオペアンプを選択しなければなりません。それだけでなく、マッチングのとれた抵抗を選択することも重要になります。以下に挙げるのは、この話題(および関連する数学)について詳細に解説した優れたドキュメントです。
- LT5400 (Quad Matched Resistor Network) Datasheet(マッチングのとれたクワッド抵抗ネットワーク「LT5400」のデータシート)
- デザイン・ノート「DN1023」
- デザイン・ノート「DN502」
実際、適切にマッチングのとれた抵抗を使用しなければ、優れた同相ノイズ除去比(CMRR:Common Mode Rejection Ratio)は得られませんし、ゲイン誤差を抑えることもできません。
Linear Technology(現在はアナログ・デバイセズに統合)は、マッチングのとれた抵抗を内蔵する数多くの高精度アンプ製品を提供しています。例えば、LT1997-3は、広範な電圧に対応することとゲインを選択できることを特徴とする高精度アンプです。この製品の重要な仕様としては以下の2つが挙げられます。
- ゲインが1の場合のDC CMRRは最小で91dB
- ゲインが1の場合の最大ゲイン誤差は0.006%(60ppm)
これらの仕様は非常に優れたものだと言えます。DN1023によれば、(オペアンプが理想的なものだとして)許容誤差が1%の抵抗を使用した場合、CMRRは34dBに制限されてしまいます。ゲイン誤差も、LT1997-3が達成する値と比べて桁違いに悪くなります。
まとめ
本稿で紹介した方法を採用すれば、複数のパラメータの最小値/最大値を使用して、最も厳しい条件における解析を迅速に実施することができます。本稿では、典型的な差動アンプを例にとり、抵抗の許容誤差の影響を確認しました。また、LT1997-3が内蔵するマッチングのとれた抵抗の価値についても解説を加えました。
著者について
この記事に関して
{{modalTitle}}
{{modalDescription}}
{{dropdownTitle}}
- {{defaultSelectedText}} {{#each projectNames}}
- {{name}} {{/each}} {{#if newProjectText}}
-
{{newProjectText}}
{{/if}}
{{newProjectTitle}}
{{projectNameErrorText}}