電子工作 with *spice

『疾風ロンド』なんて言う東野圭吾の本を読んでいる。オイラーが読みたくて借りて きたものでは無い。女房が図書館から借りた本。オイラーの借りた、『田中角栄』だとか 『数学21世紀の7大難問』とか『日本人には2種類いる』だとかを、既に読破して 手持ち無沙汰になったから。

日本人の2種類説は、1960より前に生まれたか後に生まれたかで二分出来るという 主張。その根拠をああでもないこうでもないと事例を挙げて説明してくれている。 よく、細かい事まで調べたものだと思ったら、調査とか統計をやってる方によって 書かれたものだった。

ロンドの方は、あっと言う間に読んじゃった。時間潰しにもならない。軽い本。 とある大学から、たんそ菌の強力なやつが盗み出される。生物兵器に転用できると いうやぱい物。それをネタに返して欲しかったら3億円払えと脅迫状が大学に届く。

隠し場所は、雪の中。それと分かる写真が添付されてた。警察に届ければよいだろうと 思うけど、秘密裏に研究してたものだから、そうもいかない。 金を払うか2日猶予をやる,その間に検討するんだな。

大学側は、犯人の目星が付いていた。内部犯行。ところが、その犯人が交通事故で 死んでしまう。万事休すか?

写真のわずかな手がかりから、埋められた場所は、長野県の里沢温泉スキー場と 目星をつけ、犯人の直接の上司は、スノボの上手な息子を連れて探索に乗り出す。

当世のスキー事情が垣間見れて、面白かったぞ。なんせオイラーは60年以前の人間。 一人前にスキーブームを体験した世代だからね。今は、当時の賑わいが信じられない ぐらいになってるらしい。日本人スキー人口が減ったのの穴埋めを外人に頼って いるみたい。平日は、日本人より外人スキーヤーの方が多いそうな。

里沢温泉とは、東野さんの隠語で、正しくは長野県の野沢温泉村スキー場です。 私も昔、行った事があるけど、パウダースノーで、とっても素敵な所でした。 こういう素晴らしい所だと、コースを外れて、林の中の処女雪が有る所で、 滑りたいものです。今はそんな事、固く禁止されてますけどね。

探索に出かけた親父はレンタルショップで、スキー用具一式を借りるんだけど、 その申込書がちんぷんかんぷん。

スキー靴がスキーブーツになってるぐらいは分かる。スキーポールって、競技でも やるんですかいと思っちゃうぞ。これがストックの事とは世代ギャップだな。

スキー板、カービングスキー、ファットスキー、スキーボード、ツインチップと 種類が有りますってさ。贅沢になったねぇ。オイラーはどんな物なのか、さっぱり 分からんけどね。

まあ、30年もスキーの現場から離れていれば、世代交代するわな。これでも昔は、 乗鞍とか月山とかへ板をかついでビールを飲みに行った世代ですからね。

ユーミンの曲がかかってた苗場は敬遠してましたよ。まあ、人それぞれって事ですな。

電子工作

オイラーが幼少の頃の電子工作と言えば、ゲルマニウム検波のラジオだったなあ。 それから、トランジスタの実験キットかな。親に無理言って買ってもらったやつ。 抵抗、コンデンサ、トランジスタ、クリスタル・マイク、イヤホンそれに光センサー類が付いていたかな。 それぞれにバナナチップが付いていて、蛇の目基盤に差し込んで、回路を作るやつ。

マルチバイブレータの時定数を決める抵抗部分を光センサーに取り替え、光量で 発振周波数が変わるって言って、楽しんだものだ。

今、電子工作と言うと、ラズパイ一色って感がする。それって、大変すぎないか? ARMの石は結局ブラックボックスで、手出しをしようとすると、とんでもなく 大変。まあ、やった積もりになるだけでもいいか。

ltspiceって、仮想電子工作にうってつけって、感触を得た。蛇の目基盤と言うか、 今風に言うとブレッドボードが1枚付属。孫ボードは無制限で、そこに機能ブロックを 作り上げて、自分だけの秘密兵器を持っておける。

電子部品や電源、それに各種波形発生器完備。秋葉原の某所みたいに、人に気兼ね する事なく使いたい放題。勿論、幾ら使ってもただ。

そして白眉は、最新鋭の波形観測装置付き。こういうのは、もっと取り上げられても いいと思うのだけど、どうだろう? >日経Linux及び日経ソフトウェア編集長殿

SN7404

前回やったSN7404のシュミレーション。どうも理屈通りにトランジスターが動いて いなかった。

もう一度、整理してみる。初段の石は、トランジスターと言うより、ダイオードと して働いている。spice系のトランジスタモデルでは、複数のエミッターいわゆる マルチエミッターをサポートしていないけど、もしそんな機能が有れば、ダイオード によるAND回路が実現出来たはず。(だから、SN7404のインバーターで実験してる んだけど)

次の段は、最終段のトーテムポールをドライブする回路だ。コレクターとエミッターでは 逆相の電圧が得られるので、それを最終段のスイッチの制御信号に使っている。

最終段は、モーメンタリー・スイッチとして働く。上段の石がONなら下段の石はOFF。 結果的にHiの電圧が得られる。逆に上段がOFFなら下段はONになって、Lowの電圧が得られる。

最終段の石が、両方共OFFになる機能を付け加えたならば、Busラインのドライバー 回路に使える、3ステートなICになる。H,L,Zと3つの出力状態が有るので、3ステートって 言うんだった。

前回の実験では、入力信号の周期が非常に早かった。でも、回路が動き始めたというか オシロの波形観測では信号の始まりの所では、まともに回路が動いていた。 それから、もう一つ気になる事があった。ドライバーの石がサチッているよって事。

オペアンプを使う時は、サチらせるなってのが鉄則。飽和させちゃうとリカバリーして 正常動作に戻るまで、べらぼうに時間がかかるからだ。

そんな訳で、入力信号の周期をうんとゆったりしたものにしてみる事にした。

昔修理をやってた頃、たまに誤動作するってのに悩まされた事があった。速い信号を 扱っていたので、オシロの掃引レンジは、100nsとかそんなレンジで見てた。 ある時、いらいらして、掃引レンジを1sぐらいにし信号の基線を見てたら、時たま フラフラが観測された。このフラフラは何? 追いかけて行ったら、電源がフラフラ してる事を発見。

それ以来、いの一番で、電源がおかしくなってないか確認するって癖が付いた。 電源確認はテスターだけじゃ分からんから、オシロのプローブを当てて、ゆっくり 掃引で確認しろとね。

今回は、リカバリータイムが気になるんで、ゆっくり目で波形観測をしてみたよ。

そしたら、Tplhが何と、487usも有ったぞ。それに対して、Tphlは2ns。 なお、時間差とか電圧差は、グラフ上で簡単に測定出来る。差の基点になる 所で左クリックし、そのままマウスをドラック。もう一方まで行く。 その時、グラフの枠外に、dx=xxx dy=xxxx って出てくるので直読出来る。

昔のアナログオシロで言うA掃引とB掃引も多用したな。B掃引ってのは波形拡大の事。 これを使う同僚は余りいなくて、結構珍しがられた。デジタルオシロが出る頃には 現場から足を洗っちゃったけど、あのデジタルオシロって、オイラーには味気なかったな。

写るんですってカメラが流行ってブームが起きたけど、デジタルオシロって、さしずめ 見えるんですかな。プローブを当てるだけで、それなりに波形が出てくるんですから。 今の世代のオシロだと、本体は小さな箱が有るだけ。表示系はipadで実現してたり して。

波形は綺麗なipadで確認。B掃引は、指で波形を拡げるんかな。きっとそんな風に 進化してるに違いない。どうでっしゃろ? >ソニーテクロさん。ああ、合併が 解除されて、ソニーは撤退したってのを聞いた事があるぞ。そんな業界事情も 知らない、旧世代になっちゃいました。

んな訳で、波形観測ツール兼グラフ書きツールであるltspiceの使い方は、 LT社の方が自ら説明書 を公開されているので見ておこう。見ないと後悔するぞ。

それはそうと、何でサチる? ドライバー段へのIbを見ると、入力がHからLへ変化した 時に、大きな逆電流(-45mA)も流れてるなあ。

こういう時は、レファレンスと比較するのに限る。7404のspice解析を探してみたけど、 こういう事に言及された方は見つからなかった。 LTspiceで7414 ってのは有った。この石はシュミットトリガーらしい。こんな型番のICは知らなかった けど、回路図と言うハード屋さん御用達の言語が分かれば、大いに助けになるな。

確認したら、ドライバー段のCBE端子は理論通りの波形レベルだったぞ。まあ、マクロに 見てだけどね。物理学者さん達は、ニュートン力学が適用出来ない、微細な世界に 入り込む時に、量子力学の世界を構築したけど、TTLでもミクロ世界に入ると どうなるか? 前段にあるシュミット回路を取り除いて、インバータだけに してみるかな。そして、加える波形も、三角波をやめて方形波にする。

扱う世界を秒の世界から、nsの超高速領域に変更してみた。

V2 in 0 PULSE(0V 5V 0s 1ns 1ns 100n 200n)
.tran 0ns 500ns

具体的には、こんな世界。振幅0-5V、遅れ無し、Tr/Tfは供に1ns、周期200nsでディティー50%の 入力波形。それに対して、0-500nsまでの範囲で解析してって指示。

出力がHiにならなければいけない領域が、一端0.7vぐらいまで落ちて、30nsぐらいから だらだらと出力上昇、50nsぐらいな所で、3.5vになって後は100nsまで3.5vが続いている。 そして出力がLowを期待される領域へ突入するんだけど、ずっと3.5V近辺をうろうろ。 Low期待でついにLowとなる期間な無し。 これってltspiceの解析の癖? こういう場合はセカンド・オピニオンだな。

身近な例だけど、60歳の人が心臓疾患で救急搬送された。入院先の医師から余命1月と 告げられたとか。納得いかない息子は、主治医と大喧嘩の末、別の病院へ転院させたとか。 そこで、新たな治療を受け、今ではすっかり元気になっているそうな。セカンドオピニオンで、 命拾いしたって事だな。でかしたぞ、我が息子と言ったかどうかは聞きそびれましたけどね。

viewメニューに有るspice netlistから、回路データを表示させ、それをコピペで ウブに持って行く。デバイスモデルは、適当に2SC1815あたりのデータを用意して おいて、.incで読み込んで代用。過度解析の0nsは受け付けてくれないので1nsに 変更。

見立ては、ltspiceと違ったものになった。Hiが出て欲しい所で、先頭から30nsぐらいの 期間が3.5vの正パルスになるって具合。さあ、どうする?

理想を追って

使っている石は現実のものをモデル化した。ltspiceの場合は2N2222であり、ngspice側は 2SC1815になっている。これを理想のものにしたら、どうなる?

ltspiceでは一旦設定したモデル名を解除出来ないみたい。よって、ascファイルに 立ち戻り、

SYMATTR InstName Q3
SYMATTR Value 2N2222

このようなペアの部分の2N2222の行を全部削除する。ダイオードも理想系にした方が良い だろうけど、取りあえず無視。

これで実験したら、理想波形になったぞ。ngspiceの方はどうか。焦る気持ちを抑えて、 転院時のストレスでDOA(おっと、思わず業界用語が出た。Dead on Aliveの略ね)に なっていないか、下記の設定で確認する。

SN7414 for ngspice
D1 0 in 1N4148
D2 N007 in 1N4148
Q1 N006 N007 N008 0 2N2222
Q2 N003 N006 N008 0 2N2222
D3 N003 N004 1N4148
Q3 N002 N004 N009 0 2N2222
Q4 N001 N002 N005 0 2N2222
D4 N005 out 1N4148
Q5 out N009 0 0 2N2222
R1 VCC N007 6.8k
R2 VCC N006 2.2k
R5 N004 0 3.3k
R6 N009 0 1k
R7 VCC N002 1.5k
R3 N008 0 470
R4 VCC N003 1.5k
R8 VCC N001 100
V1 VCC 0 5V

.inc device.cat

V2 in 0 PULSE(0V 5V 0s 1s 1s 1ms 3s)
.tran 10ms 2s 0

.end

こちらは、デバイス情報が書かれた、device.cat ファイル。

.model 1N4148 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n)

.model 2N2222 NPN(IS=1E-14 VAF=100
+   BF=200 IKF=0.3 XTB=1.5 BR=3
+   CJC=8E-12 CJE=25E-12 TR=100E-9 TF=400E-12
+   ITF=1 VTF=2 XTF=3 RB=10 RC=.3 RE=.2)

上記の組み合わせで、取りあえず動く事を確認しておいて、そこから改造を 施して行く。一応、動いている時の証拠を事前に取得しとく。

ngspice 80 -> asciiplot in out
                                  sn7414
               Transient Analysis Wed May 25 05:56:33  2016

Legend:  + = in               * = out
--------------------------------------------------------------------------
 time       in      -1.00e+000.00e+001.00e+002.00e+003.00e+004.00e+005.00e+00
----------------------|-------|-------|-------|-------|-------|-------|
   :
 3.100e-01  1.550e+00 .       .       .   +   .       .      *.       .
 3.200e-01  1.600e+00 .       .       .   +   .       .      *.       .
 3.300e-01  1.650e+00 .       .       *    +  .       .       .       .
 3.400e-01  1.700e+00 .       *       .    +  .       .       .       .
 3.500e-01  1.750e+00 .       *       .     + .       .       .       .
    :
 1.770e+00  1.155e+00 .       *       .+      .       .       .       .
 1.780e+00  1.105e+00 .       *       +       .       .       .       .
 1.790e+00  1.055e+00 .       *       +       .       .       .       .
 1.800e+00  1.005e+00 .       *       +       .       .       .       .
 1.810e+00  9.550e-01 .       *      +.       .       .       .       .
 1.820e+00  9.050e-01 .       .      +.       .       .      *.       .
 1.830e+00  8.550e-01 .       .     + .       .       .      *.       .
 1.840e+00  8.050e-01 .       .     + .       .       .      *.       .
    :

そして、Q3のバイタル・サインと言うか、シュミレーション後の状態。

ngspice 81 -> show q3
 BJT: Bipolar Junction Transistor
     device                    q3
      model                2n2222
         ic           0.000525372
         ib          -3.43936e-05
         ie          -0.000490978
        vbe              0.629174
        vbc              -3.41391
         gm              0.014635
        gpi           7.09622e-05
        gmu           1.25855e-09
         gx                   0.1
         go           3.66564e-06
        cpi           4.43098e-11
        cmu           4.54386e-12
        cbx                     0
       csub                     0

健康診断の結果表示には、詳しい説明が付いてきたと思うんだけど、spiceには 無い。マニュアルには書いてあるのだろうか?

ngspiceは動的に波形拡大出来ないので(旧式のA掃引しかないオシロ)、都度、editで編集する。編集結果は 残らない。こんな風に編集する。Tphlの近傍部分。

.tran 1ns 106ns 98ns 0.2ns

0.1nsって欲張ってみたら、そりゃ小さすぎますぜって怒られたぞ。無茶するな。 そんなに小さいもの扱うなって。その割りには、フェムトなんて単位を受け付ける そうだけど、それはコンデンサ用かな。ピコの1/1000だからね。扱えても 不思議じゃないか。

理想のモデルはどんな物? On抵抗ならZERO、Off抵抗なら無限大。接合容量はZERO。 Hfeは無限大ぐらいしか、思い付かないなあ。

一応、関係資料を集めておいた。 LTspiceを使った回路設計手法 4、バイポーラトランジスタの定数設定詳細

トランジスタを飽和領域で使わない方が良い理由とは

2SC1815 spec

トランジスタをスイッチとして使う

バッジテスト

これから、バッジテストを実施します。

えと、スキー業界でバッジテストと言えば、インストラクターとか準指とか1級とかの 資格を取る為の試験。晴れて試験に合格すると、バッジが貰える。

国会議員の方は、4年に一回だかのバッジテストが有る。安倍ちゃんとかは、抜き打ち 試験をやる権限を持ってる。晴れて合格すると、証書とバッチが貰えて、ふんぞり返って 街中を歩ける訳だ。だから、試験前は、試験官におべっかとか実弾をばら撒いたりする んだな。

今回は、そのようなバッジテストじゃなくて、感応性の試験ね。突然、鼻ピアス入れたい、 へそピアスしたいって時は、金属アレルギーのバッジテストを受けて、自分に取っては 禁居の金属を知っておくべき。そうじゃないと、鼻が腫れて大変な事になったりする。

ああ、また話が違った。使うトランジスターのパラメータが沢山指定されているので、 どのパラメータが波形を乱す原因になってるか探るんだ。

単純に、パラメータを消去すれば、そのパラメータはデフォのものが使われる。 バイナリーサーチなりで、絞り込むも良し、一つづづ消去してくも良し。 但し、複合しておかしくなる可能性があるので注意ね。 そういう苦労は、iPS細胞の山中教授の物語を読むと、克明に書いてあるので、 一読したら良いと思われる。

バッジテストの結果は

+   CJC=8E-12 CJE=25E-12 TR=100E-9 TF=400E-12
         to
+   TF=400E-12 

こうなった。意味する所は、CJC,CJE,TRの3項目が波形の乱れに強い影響を与えて いるって事。これらの項目はどういう意味が有るの? 医学書ならぬソースを ひっくり返してみたら、解説が載ってるかな?

上記は、spice3で実験したんだけど、Window7上のltspiceで行うには、どうする? メニューバーの一番右側にあるボタン(SPICE directive)を押し

.model 2N2222 npn(CJC=5p CJE=10p TR=50n)

に設定してから、回路図の適当な場所に貼り付ければよい。コメントの記入と兼用に なってるので、diretiveを選んでおく事。

FreeBSDの、/usr/ports/cad/spice/work/spice3f5/src/lib/dev/bjt/bjt.cに 解説が有った。

IFparm BJTpTable[] = { /* parameters */
    :
 IOPA("cjc",  BJT_MOD_CJC,  IF_REAL, "Zero bias B-C depletion capacitance"),
 IOPA("cje", BJT_MOD_CJE,  IF_REAL,"Zero bias B-E depletion capacitance"),
 IOPA("tr",  BJT_MOD_TR,   IF_REAL, "Ideal reverse transit time"),
    :

こうやって、ここを手がかりにして、bjtmask.c経由でbjtsetup.cで、下記のように 初期値を設定していた。

        if(!model->BJTcapCSGiven) {
            model->BJTcapCS = 0;
        }
        if(!model->BJTtransitTimeRGiven) {
            model->BJTtransitTimeR = 0;
        }

理想系は、ソース中に決め打ちされてるんですな。

それにしても、実デバイスの値を改めて眺めてみると、B-E間の容量が25pF、ライズタイムが 100nSって、オイラーが想像してたより、随分大きいな。こんなものなのかな?

理想に近い石を探してみると、2N4124 とかかなあ? 目grepより、データを DB化して、コマンド一発で探して欲しいぞ。何処かにそういうDB無いかしら。

ソース探検

折角spice3のソースが有るんで、例によってソース探検。

インタラクティブ中に、editコマンドで、editorを呼び出して今ロードされているソースを 編集出来る。環境変数 SPICE_EDITOR にemacsを設定すれば、emacsが使えるように なるんだけど、ソースファフィル名が渡って行かないため、spice-modeに切り替わって くれない。このあたりがどうなっているか見てみる。

ソースファイルは、 spice3f5/src/lib/fte/inp.c のあたり。mainは、src/bin/main.c に有るけど、 ちょっとぐちゃぐちゃしてるんで、編集コマンドとの連携を追うには不便。 commandのテーブルが、src/lib/fte/spcmdtab.cに有るんで、ここを拠点にして、 観光すると効率が良いぞ。観光するには、佳き地図が必要です。

ニューヨークの5番街みたいに(そんな所へ行った事無いので札幌に訂正)、コマンドが 整然と並んでる。com_run とか、com_edit のように名前が付いているので、grep一発で 目的地に到達出来るよ。

どこで、コマンド待ちになってるか? replの所在地だな。これぞ動的な解析。

(gdb) bt
#0  0x285bce0f in _select () from /lib/libc.so.7
#1  0x0807cf70 in X11_Input (request=0xbfbfdbb0, response=0xbfbfdba8)
    at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/x11.c:959
#2  0x0804f109 in Input (request=0xbfbfdbb0, response=0xbfbfdba8)
    at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/display.c:369
#3  0x081b5287 in input (fp=0x285d54f8)
    at /usr/ports/cad/spice/work/spice3f5/src/lib/cp/lexical.c:358
#4  0x081b4292 in cp_lexer (string=0x0)
    at /usr/ports/cad/spice/work/spice3f5/src/lib/cp/lexical.c:104
#5  0x081ac937 in cp_parse (string=0x0)
    at /usr/ports/cad/spice/work/spice3f5/src/lib/cp/cshpar.c:78
#6  0x081aff7d in getcommand (string=0x0)
    at /usr/ports/cad/spice/work/spice3f5/src/lib/cp/front.c:832
#7  0x081ada0a in cp_evloop (string=0x0)
    at /usr/ports/cad/spice/work/spice3f5/src/lib/cp/front.c:113
#8  0x0804bf09 in main (ac=2, av=0xbfbfe874)
    at /usr/ports/cad/spice/work/spice3f5/src/bin/main.c:591

これで一つの謎が解けた。spiceを起動する時、Xが使えるように準備しておかないと、 Displayが見つからんと文句を言われるんだ。Xでの描画、helpやplotをまだ実行 していないのにも関わらず準備不足であるってね。spiceは純然たるGUIなプログラムです。 キー入力すら、X関係者に頼っているのですから。

editコマンド発行の様子です。

(gdb) bt
#0  com_edit (wl=0x0) at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/inp.c:603
#1  0x081b0fbf in docommand (wlist=0x28cc4780) at /usr/ports/cad/spice/work/spice3f5/src/lib/cp/front.c:780
#2  0x081b098e in doblock (bl=0x28cf5610, num=0xbfbfe234) at /usr/ports/cad/spice/work/spice3f5/src/lib/cp/front.c:573
#3  0x081ae922 in cp_evloop (string=0x0) at /usr/ports/cad/spice/work/spice3f5/src/lib/cp/front.c:306
#4  0x0804bf09 in main (ac=2, av=0xbfbfe86c) at /usr/ports/cad/spice/work/spice3f5/src/bin/main.c:591

後は、じっくりご観賞ください。