circuit simulator
前回やったipython notebook 又は jupyter note book 関連の資料を見ていて 回路シュミレーション の例に行き当たった。ウブに入れたipythonでは、すんなり動いたけど、fedoraに入れた jupyterでは、エラーを喰らってしまった。
エラー内容から、import関係がipythonと同一になっていない事に気がつき、冒頭に
%matplotlib inline import numpy as np
を挿入したら、無事に動いてくれた。やれやれ。で、終ってしまっては非常に もったいない。このスクリプトがどのようになってるか、分解して理解してこそ、 こういう素晴らしいものをおしげもなく公開してくだすった作者さんへの敬意と 言うものだろう。
コメントから仕組みを読み解いてみると、各ジャンクション(接続点)に流れる 電流の総和はゼロである。キルヒホッフの第一法則だな。勿論、流れ込む電流をプラス、 流れ出す電流をマイナスって(勝手に決めてるんだけどね)。魔法は何も無いと いう当たり前の事が法則になってる。
後は、デバイスが電圧源なら電圧値を、受動素子ならインピーダンスをVかKの 配列にセットする。そして、K.X=VをXに対して解く。それぞれの端子の電流は、 単位電流(1A)に選んでいるので、結局、オームの法則をマトリックス上で 解いている事になる。
2番目の例にLCRの並列共振が出てきた。グラフから容易に共振周波数を読み取れる けど、無線家として、正確に計算してみる。
In [19]: f = 1.0 / ( 2.0 * np.pi * np.sqrt(1.0e-2 * 1.0e-6) ) In [20]: f Out[20]: 1591.5494309189535
ああ、グラフと合ってた。まだボケていないね。良かった、良かった。
電子回路シュミレータ
上記のシュミレーションは、非常に簡単な2端子の部品に限定されてた。しかも 扱うのは、抵抗、コンデンサ、コイル、定電圧源、定電流源だ。まてまて、オイラー、 3端子の抵抗が有る事知ってるぞ。それは、扱えないの? なんじゃい、それ?
ええ、アッテネーターに使うため、精密に調整された組抵抗です。普通の人は、まあ そんなの知らんわ。これを知ってる人は、その筋の人に限られます。えっへん!!
それはさておき、能動素子も扱える、機能豊富な電子回路シュミレータを ちょっと探してみた。
回路シミュレータ ADIsimPE- SIMetrix/SIMPLIS採用 -
spice3
まずは、回路シュミレータの元祖 spice3をやってみる。FreeBSDだと、/usr/ports/cadの 下に置いてある。シュミレータなら、それと分かる/usr/ports/emulators の下じゃないの? ここには、以前やったlinuxの真似も有ると言うのに。
cadって、コンピュータ支援の設計って意味。回路を設計して、それのプリント板配線を 作る類のツールが置かれている。それと同列でシュミレータが有るって事は、設計した 回路の虫取りにどうぞって事だ。
説明書は、 The Spice Page だ。バークレーって、BSDの故郷じゃないですか。1986年生まれ。先進的な事を やってたのね。で、いささか英語だけじゃ疲れるので、 SPICEの使い方なんてのを参考にする。
$ cat rc.cir Basic RC circuit r 1 2 1.0 *l 1 2 1.0 c 2 0 1.0 vin 1 0 pulse (0 1) ac 1 .tran 0.1 7.0 *.ac dec 10 .01 10 .plot tran v(2) i(vin) *.plot ac vdb(2) xlog .end
サンプルに有ったRCの積分回路。r 1 2 1.0 ってのは、抵抗が有る。抵抗値は、1.0オーム。 端子に1番、2番って名前を付けるよって意味。以下、コンデンサと電源を用意。 同じ端子番号同士は、よじって半田付けして結合。こういう表をネットリストって言う。
昔々、現役の頃、隣の席の同僚は、cadで回路図を書いて、それをプリント版屋に 送って基盤を作って貰うってのをやってた。その時に提出するのは、回路図じゃ なくてネットリストってのが決まりだった。懐かしいな。
$ spice3 rc.cir Program: Spice, version: 3f5, patchlevel: 2 Date built: Sun Apr 3 13:43:14 UTC 2016 Type "help" for more information, "quit" to leave. Circuit: Basic RC circuit Spice 1 -> run Warning: vin: no DC value, transient time 0 value used
上記のネットリスト(に若干のシュミレート命令を追加)を引数にして、spice3を 起動。そして、runでシュミレートを実行。
Spice 2 -> display Here are the vectors currently active: Title: Basic RC circuit Name: tran1 (Transient Analysis) Date: Sat May 14 14:00:50 2016 V(1) : voltage, real, 85 long V(2) : voltage, real, 85 long time : time, real, 85 long [default scale] vin#branch : current, real, 85 long
これで、各点の測定結果が得られる。V(2)ってのは、抵抗とコンデンサが接続 されている所の電圧って意味だ。
Spice 3 -> plot V(2) Spice 4 -> quit Warning: the following plot hasn't been saved: tran1 Basic RC circuit, Transient Analysis Are you sure you want to quit (yes)? yes Spice-3f5 done
後は、このポイントをプロット。大体6秒ぐらいで、印加した電圧まで上昇した事が 読み取れる。これが、基本的な使い方だ。
schmitt ckt - ecl compatible schmitt trigger .width in=72 .opt acct list node lvlcod=2 .tran 10ns 1000ns vin 1 0 pulse(-1.6 -1.2 10ns 400ns 400ns 100ns 10000ns) vee 8 0 -5 rin 1 2 50 rc1 0 3 50 r1 3 5 185 r2 5 8 760 rc2 0 6 100 re 4 8 260 rth1 7 8 125 rth2 7 0 85 cload 7 0 5pf q1 3 2 4 qstd off q2 6 5 4 qstd q3 0 6 7 qstd q4 0 6 7 qstd .model qstd npn(is=1.0e-16 bf=50 br=0.1 rb=50 rc=10 tf=0.12ns tr=5ns + cje=0.4pf pe=0.8 me=0.4 cjc=0.5pf pc=0.8 mc=0.333 ccs=1pf va=50) .print tran v(1) v(3) v(5) v(6) .plot tran v(3) v(5) v(6) v(1) .end
こちらは、先の秒単位のゆっくりしたものじゃなくて、4石で組んだ、ECLレベルコンパチの シュミットトリガー回路。ECLはその名の通り(エミッター・カップルド・ロジック) 2石を1素子として扱う豪華方式なので、普通の人が思い浮かべる2石の回路と同等。
シュミレート結果にリンギングがちら見出来て、なかなかリアル感が有るな。
ここで使われているトランジスターってどんな型名? オイラーが良く知ってるのは、 2SC372。汎用の石。米粒って呼んでた石もあったな。確か、2SC215だったか。白い セラミック封止で、3本の足がリード線じゃなくて、いかにも高周波まで使えますって 感じの板状になってた。懐かしい。触ってみたいな。
ECLが出てきたなら、その対抗馬はTTLだ。石を組み合わせてTTLの等価回路を組んでみたいな。 今なら、トーテムポール出力の駆動段の波形も観測し放題だぞ。まてまて、入力段に 使われている、マルチ・エミッターはspiceの部品に登録されてるんか? あるいは、新規部品を組み込めるんか?
ngspice
たとえ、そういう事がspiceで出来なくても、新世代のspiceである、 ngspiceが実現してくれているに違いない。
fedoraに入れてみた。tclspiceも同時に入れておいた。膨大なページのマニュアルが 付いていて、これ決定版だと思うよ。emacsから操りたかったので、下記もいれた。
マニュアルの例を実行してみる。
[sakae@fedora xspice]$ ngspice xspice_c1.cir ****** ** ngspice-26 : Circuit level simulation program ** The U. C. Berkeley CAD Group ** Copyright 1985-1994, Regents of the University of California. ** Please get your ngspice manual from http://ngspice.sourceforge.net/docs.html ** Please file your bug-reports at http://ngspice.sourceforge.net/bugrep.html ** Creation Date: Sat Oct 10 04:37:47 UTC 2015 ****** Circuit: a berkeley spice3 compatible circuit ngspice 11 -> listing a berkeley spice3 compatible circuit 1 : a berkeley spice3 compatible circuit 2 : .global gnd 10 : .tran 1e-5 2e-3 12 : vcc vcc 0 12.0 13 : vin 1 0 0.0 ac 1.0 sin(0 1 1k) 14 : ccouple 1 base 10uf 15 : rbias1 vcc base 100k 16 : rbias2 base 0 24k 17 : q1 coll base emit generic 18 : rcollector vcc coll 3.9k 19 : remitter emit 0 1k 21 : .model generic npn 24 : .end
listingで、ソースを確認出来るとな。
ngspice 12 -> run Doing analysis at TEMP = 27.000000 and TNOM = 27.000000 Initial Transient Solution -------------------------- Node Voltage ---- ------- vcc 12 1 0 base 2.07461 coll 7.00346 emit 1.29397 vin#branch 0 vcc#branch -0.00138042 %100.00 No. of Data Rows : 208 ngspice 13 -> display Here are the vectors currently active: Title: a berkeley spice3 compatible circuit Name: tran1 (Transient Analysis) Date: Sat May 14 14:48:55 2016 V(1) : voltage, real, 208 long base : voltage, real, 208 long coll : voltage, real, 208 long emit : voltage, real, 208 long time : time, real, 208 long [default scale] vcc : voltage, real, 208 long vcc#branch : current, real, 208 long vin#branch : current, real, 208 long
runすると、初期状態が出てくる。同時にこの変数に結果が蓄積されていく。よって、 わざわざdisplayで確認する必要は無い。
ngspice 14 -> plot coll emit
コレクターとエミッターの波形を同時に観測して、逆相になっている事を確認。
ngspice 15 -> ac dec 10 0.1 100 No. of Data Rows : 31 ngspice 16 -> plot coll
次はAC特性の確認。周波数を変化させた時の、コレクタ出力状況を確認する。 変化のさせ方は、0.1Hzから100Hzまで、一桁毎(例えば、1Hzから10Hzまでと言う事)に 10ポイント測定するって意味。ここは、通なら10ポイントなんてやめて、6ポイントとか 12ポイントってのを推したい。だって、エンジニアなら、 E6系列 E12系列 E24系列 E48系列 E96系列 E192系列 ってのに慣れてるでしょ。
結果は、1Hzのポイントで-6dBぐらいゲインが落ちる。10Hz以上でフルスイングの 出力が得られるって事が分かった。結合コンデンサとバイアス回路の抵抗で、 ハイパス・フィルターになっているんだな。
ngspice 17 -> plot db(coll) ph(coll)
今度は、有名なボード線図。ゲインと位相回りが直視出来る。近頃のオシロスコープは こういう機能が標準装備なのかな?
ngspice 18 -> dc vcc 0 15 0.1 Reference value : 0.00000e+00 No. of Data Rows : 151 ngspice 19 -> plot emit base coll
最後は、電源電圧を0Vから15Vまで、0.1V刻みで振った時の、トランジスタの 各電極電圧。5V以上で大体回路がまともに動き出す。それ以下だと、コレクタ電圧の 直線性が無いので、アンプ出力が歪んでしまい、聞くに堪えない音となるだろう。 いやー、ここまで簡単に調べられるって、とっても素敵。
先ほどの1ディケード当り12分割ってのを確認しておく。
ngspice 22 -> ac dec 12 1 10 No. of Data Rows : 13 ngspice 23 -> print coll a berkeley spice3 compatible circuit AC Analysis Sat May 14 15:27:25 2016 -------------------------------------------------------------------------------- Index frequency coll -------------------------------------------------------------------------------- 0 1.000000e+00 -1.93733e+00, -1.89237e+00 1 1.211528e+00 -2.29436e+00, -1.84983e+00 2 1.467799e+00 -2.62379e+00, -1.74609e+00 3 1.778279e+00 -2.90829e+00, -1.59750e+00 4 2.154435e+00 -3.14027e+00, -1.42376e+00 5 2.610157e+00 -3.32072e+00, -1.24271e+00 6 3.162278e+00 -3.45603e+00, -1.06753e+00 7 3.831187e+00 -3.55471e+00, -9.06304e-01 8 4.641589e+00 -3.62523e+00, -7.62908e-01 9 5.623413e+00 -3.67490e+00, -6.38335e-01 10 6.812921e+00 -3.70953e+00, -5.31849e-01 11 8.254042e+00 -3.73349e+00, -4.41827e-01 12 1.000000e+01 -3.75000e+00, -3.66298e-01
下記は、大学の実習用に載ってた 発振回路を、ngspiceで動くように編集したもの。
OSC Ckt .tran 0.1m 30m 0.5m .tran 0.001m 30m 27m Vcc vcc 0 dc 11 Rc vcc coll 2.2k Re emit 0 820 R1 vcc base 68k R2 base 0 18k Ce emit 0 100u C1 i1 base 0.022u C2 i2 i1 0.022u C3 coll i2 0.022u R3 i1 0 2.2k R4 i2 0 2.2k Q1 coll base emit qmod .model qmod npn Vt t 0 pulse(0 1 0 10u 10u 100u 1) Ct t i2 10p .option tnom=19 .end
spice3では、端子番号に数字しか受け付けずにシュミレーション出来なかった。 また、オリジナルなファイルには、全角スペースが入っていて、coreしちゃった。 やはり、あちゃら製のソフトは日本語が嫌いですなあ。
GUI版に gspiceui ってのが有るけど、どうやって使うんだろう?
他にもサンプルが沢山置いてある。どうやらロジック回路のシュミレションも出来る みたいだ。あれ? ロジックのシュミレーションと言えば、かのSICPにも簡単な 例が出てたな。
折角思い出したので、再読してみた。make-wireって手続きで、線を作る。それを 使って、各ロジックゲート(andとかorとかnot)を接続する。線の名前がそのまま 信号名になってるのが、目から鱗ですよ。
シュミレーションは、アジェンダ(進行表)というので管理される。ロジック回路は、 それぞれのゲート固有な伝播遅延時間を持っている。それを考慮して、シュミレーションが 進行していく。
最初に宣言した線にシュミレーションの要が隠されている。なかなか、良く考えて あるな。
ahkab
spice3のソースを取り寄せて見たけど、何処から手を付けて良いやら? どうせ読むならC語よりpython語の方が楽かな。
a SPICE-like electronic circuit simulator written in Python
入れてみた。
ahkab.noarch : A SPICE-like electronic circuit simulator written in Python python3-ahkab.noarch : A SPICE-like electronic circuit simulator written in : Python
実行するとエラッた。何が気に入らないのだろう?
sudo pip3 install ahkab
で、最新版を入れてみるかな。
qucs
GUIで操作出来るって触れ込みだったので、FreeBSDに入れてみた。
qucs: 0.0.18 qt4-gui: 4.8.7_1 xdg-utils: 1.1.1 qt4-corelib: 4.8.7_2 qt4-script: 4.8.7 qt4-svg: 4.8.7 qt4-xml: 4.8.7 qt4-qt3support: 4.8.7 qt4-sql: 4.8.7 qt4-network: 4.8.7 The process will require 88 MiB more space. 39 MiB to be downloaded.
描画とマウスの応答が悪くて使い物にならない。残念。まあ、重いqtが使われていて そんなGUIをWindows7上のXmingでやろうってんだから、土台無理な話ですな。 決して、qucsに罪はございませんです。
etc
行き着く所は、Windows機にltspiceを入れて、 Ayumi's Lab.: オーディオ 真空管野郎になってみるかなであります。
Evolve Power Amplifiersを見ると、 石と球の自作アンプが載ってるけど、やるなら暖かい球だよな。しばし球屋に なってみたいぞ。