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端子の抵抗が有る事知ってるぞ。それは、扱えないの? なんじゃい、それ?

ええ、アッテネーターに使うため、精密に調整された組抵抗です。普通の人は、まあ そんなの知らんわ。これを知ってる人は、その筋の人に限られます。えっへん!!

それはさておき、能動素子も扱える、機能豊富な電子回路シュミレータを ちょっと探してみた。

LTspiceIVをLinuxで使う

回路シミュレータQucs

QUCSを使ってみた

LTspiceをUbuntuで動かしてみた

やさしい電子回路、回路シミュレータの入門サイトまとめ

CIRCUITLABでお手軽に回路シミュレーション

回路シミュレータ 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から操りたかったので、下記もいれた。

spice-mode

マニュアルの例を実行してみる。

[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

抵抗の値はなぜ中途半端なの?(E系列の話)(1)

下記は、大学の実習用に載ってた 発振回路を、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を見ると、 石と球の自作アンプが載ってるけど、やるなら暖かい球だよな。しばし球屋に なってみたいぞ。