雷様(2)
このNotePCを置いている部屋は、温室のような所。冬は暖かでいいんだけど、夏は 灼熱地獄。熱中症にならないように、水分補給しながら、扇風機を回して頑張って いた。けど、これから暫くの間は、本人及びパソコンの生命保持のため、涼しい所 へ避難する事にした。
光学マウス用のPadは、机に貼り付けてあるんで、パソコンと供に移動する訳にはいかない。 移動先では、適当なPadが無いので、マウスの動きがぎこちない。だったら、USBマウスを 取り外してから、パソコンの移動だな。
寝てるパソコンからUSBのマウスを引っこ抜くと、それが刺激になって、パソコンが目を 覚ますのね。そんな事知らなかったぞ。
それはいいんだけど、オイラーは、マウス嫌い なんで、マウスが無くても、赤ボッチグリグリで用が足りてる。対して女房は、マウスが 無いと使いづらい、使いづらいと抜かす。
で、タッチパッドを生かしてあげればいいんだな。(タッチパッドに触れると、マウスが 明後日の所に行ってしまうので、パソコンを買ってすぐに禁止してた) えと、どうやって、パッドを生かすんだっけ? すっかり、忘却してる。
あちこちつついてみたら、コンパネのハードウェアとサウンドの所のデバイスとプリンターって 項目の所にマウスって項目が有った。そこのウルトラナビって所で、タッチパッドの on/offが出来るのね。全く、分かり難い所に設定が有るものだ。これもGUIの宿命なんですかね。
それはそうと、たまにエアーマウスしちゃう事があるな。マウスを取り外して、右手近傍には マウスが無いはずなのに、右手が勝手にマウスを掴もうとしてしまう。暫くグリグリ しないと、脳内回路が修正されないかな。
エアーマウスで思い出した。友人がWindows10を新調したいので、どのパソコンが お勧めって聞いてきた。今までエーサーのノートPCを使ってたけど、家中モバイルを する必要が無いので、据え置きで画面の広いやつが欲しいらしい。
無責任に、MACの一体型かHPあたりの一体型を勧めておいた。絶対に国産のTVが見られる 一体型は買わないようにアドバイス。いらないチューナーとお試しソフトに金を 払う必要は全くないからね。
後で仕様をちょいと調べてみると、キーボードもマウスもケーブルが無いものに なってるのね。リビングにでも置いて、キーボードは膝上、マウスはサイドテーブル に置くっていう、王侯的な使い方を勧めているのかしらん。
赤ボッチ付きのエアーキーボード付き、一体型なら買ってもいいかな。
ブロッキング発振
前回の雷様の記事の続きで、発振器を作ってみる。参考にしたのは、中華製の蚊取り電撃 ラケット、カトリーヌ ってやつだ。凄い分かり易いネーミング。さすが、漢字を生んだ 国だ事。
Blocking OSC v1 batt 0 3V L1 b rb 100u L2 batt cr 500u K1 L1 L2 1.0 R1 Batt rb 1.5k R2 cr c 1 Q1 c b 0 2SD965 .model 2SD965 NPN .control tran 10us 100m plot v(b) v(c) .endc .end
ngspiceで、実行すると
doAnalyses: TRAN: Timestep too small; time = 0.000232274, timestep = 1.25e-17: trouble with node "rb" tran simulation(s) aborted
こんなエラーを喰らって、グラフが途中までしか表示されなかった。これってどゆ事? Spiceが収束できなくなって破綻 した時に出るエラーらしい。
LTSPICEで実験したら、取りあえず発振してくれた。でも、出力が5GVなんていう、ありえない 電圧になる。表示されたグラフを見ると、電圧がどんどん大きくなって行く。 数学で言う発散って奴だな。内部で発散方程式を一生懸命に解いているのだろう。 そしてリミッターが無いものだから、LHCも羨む高電圧が発生したとな。
LTSPICEに見切りをつけ色々、パラメータを変えたら、ngspiceでもやっと発振してくれた。
Blocking OSC v1 batt 0 3V L1 b rb 100u L2 batt c 100u K1 L1 L2 1.0 R1 Batt rb 20k Q1 c b 0 2SD965 .model 2SD965 NPN .control tran 10us 500u plot v(b) v(c) .endc .end
この定数でも、シュミレーションのステップを1usに変更するとngspiceのシュミレーションが ストップする。エラー内容は、上のものと一緒。微妙なものだな。
シュミレーションのステップが荒いので、コレクタ波形は三角波のようになっているけど、 0-6Vの振幅, 周期20uSが観測できた。
いよいよ昇圧トランス作成
この回路に、巻き数の多いコイルを追加して、高電圧を取り出せばいいのだな。 ちゃんとした普通のトランスは、LLC converterとか こんな風に設計するらしいが、 オイラーは山勘ピューターに頼って、
L3 out 0 400u K1 L1 L2 L3 1.0
こんな風に、第3のコイルを追加して、トランスに組み入れると
Error on line 7 : k1 l1 l2 l3 1.0 unknown parameter (l3)
追加したパラメータなんて知らないと言う。ngspiceからhelpを起動して、circuit elements and models から elemetary devices と辿って
3.1.8. Coupled (Mutual) Inductors General form: KXXXXXXX LYYYYYYY LZZZZZZZ VALUE Examples: K43 LAA LBB 0.999 KXFRMR L1 L2 0.87 LYYYYYYY and LZZZZZZZ are the names of the two cou- pled inductors, and VALUE is the coefficient of cou- pling, K, which must be greater than 0 and less than or equal to 1. Using the 'dot' convention, place a 'dot' on the first node of each inductor.
に辿り着く。helpの階層を辿るのはいいんだけど、土地勘が無いと、迷子になりそう。 Webが発明される前のナビゲーションをそのまま使っているから、ちょっと新鮮な驚き。 まあ、今頃になって、昭和の歌謡曲だとか、昭和のギミック、アナログレコードだとか カセットが持て囃されるのと一緒か。
で、どうも、コイルは2つまでしか結合出来ない仕様のようだ。しょうがないので、
K1 L1 L2 1.0 K2 L2 L3 1.0
こういう裏技(って程の事もないけど)で逃げた。これはこれで分かり易いかな。 トランスK1は発振に必要なものです。トランスK2は、昇圧に必要なものです。 間を取り持つコイルは、L2ですって事で分かり易いか。
なお、間を取り持つコイルに電流が流れていないと、電力の乗り移りが出来ないので
trans check v1 in 0 sin(0v 1v 100khz) R1 rs in 1 L1 0 rs 1m L2 o2 0 1m L3 o3 0 1m K1 L1 L2 1.0 K2 L2 L3 1.0 .control tran 100ns 100u plot v(o2) v(o3) .endc .end
こういう回路を作っても、L3に電圧は誘起されません。
r2 o2 0 1000
仲介するL2に電流が流れるように、適当に抵抗を入れてあげます。すると、L3に電圧が 出てきました。位相がL2の電圧に比べて90度回っています。ああ、L2に電流が流れて それが電磁誘導でL3に電圧が発生するんだなあ、と、トランスが仕組みがよく分かる 理科の実験になりましたよ。
そして、まだまだ思考は続きます。電磁誘導なら、磁力が関係してる。磁石を強くするなら ATだよ。Aすなわち電流を沢山流せばOK。トランスK2のL2に電流が沢山流れる条件。追加 した抵抗を小さくすればいいじゃん。抵抗値を色々変えてみたい。
ngspiceでプログラミング
プログラミングの機能が、一応備わっているんで、使ってみた。
.control echo rx vs. output > log.txt let rx = 500 while rx gt 0 alter r2 rx run tran 100ns 100u let output = o3[911] echo "$&rx" "$&output" >> log.txt let rx = rx - 100 end .endc
結果は、ベクターの特定idxを引っ張り出して、ログ。その結果
sakae@ub:~/z$ cat log.txt rx vs. output 500 1.25306 400 1.56554 300 2.08565 200 3.12329 100 6.21566
予想通りになりました。なお、バークレー由香里なんで、コマンド系はcshを継承 してるっぽい。そこはかとなくそう思っていれば、焦る事は無くなるぞ。
組み合わせる
これで、発振器と昇圧トランスと高電圧積み上げ回路が揃ったので、組み合わせて ビリビリしたい。けど、発振器が綺麗にシュミレーション出来ないので、涙を飲んで パルスジェネレータを使う事にします。
FLYBACK trans ; v1 in 0 sin(0v 3v 100khz) v1 in 0 pulse(0v 3v 3u 2u 0.5u 4u 10u) L1 in rs 10u Rs rs 0 1 L2 0 out 1000u K1 L1 L2 1.0 .control tran 10n 100u plot v(in) v(rs) v(out) .endc .end
何の変哲も無い回路である。ちょっと変わった点と言えばパルスジェネレーターの設定 ぐらいか。立ち上がり時間が2uS、立下り時間が0.5uSって所かな。将来、トランジスタで 駆動する事を考慮して、こんな設定にしておいた。周期は10uSで、平たく言うと100KHz の駆動。周波数が高い程、効率が良くなるはずなので、こんな風にしてる。
実際にこんな周波数で駆動したら、超凄い雑音発生器になるな。まあ、雷様も巨大な 雑音源ですから、はからずしも似てる特性ですよ。
一次コイル側に1オームの抵抗を入れて、エラーの防止にしてる。同時に、この抵抗が 回路に流れる電流の検出抵抗になってる。ここに起電する電圧を即、電流に読み替え られるので便利。目測で平均、1.5A流れていたぞ。
こういう平均電流って、 数値積分すればよいのでしょうか? 式じゃないんだから、平均で良いだろうね。
まてまて、CRの積分回路でも入れればいいじゃん。
Rf rs fo 10k Cf fo 0 10n .control tran 10n 1000u plot v(fo) v(rs) ; v(out) fourier 100k v(in) .endc .end
これで、L1に流れている生電流とそれを平均化した電流が求まる。後は、それらの データをログに落として、平均を数値演算する。そこで普通ならpythonとかの登場と なるんだけど、今回は、超懐かしいawkにその計算をしてもらおう。
$ cat calc.awk { sum += $3 } END { print "sum: ", sum print "avr: ", sum / NR }
データは、101212行分有ったけど、安定期に入ったと思われる最後の5000行を 演算対象にした。
$ awk -f calc.awk in.txt sum: 7964.86 avr: 1.59297 $ awk -f calc.awk rs.txt sum: 7867.98 avr: 1.5736 $ awk -f calc.awk fo.txt sum: 7874.27 avr: 1.57485
生駆動波形、生電流、CR平滑回路を通った平均電流相当を求めてみた。
今度は、L2に500オームの負荷を接続。L2の出力は、-13V - 15V の振幅になった。 この時のL1の平均をログしとく。
負荷を30オームに変えると、出力は、-3.3V - 3.8Vの振幅になった。同様にログしとく。
$ tail -n 5000 fo500.log | awk -f calc.awk sum: 7874.19 avr: 1.57484 $ tail -n 5000 fo30.log | awk -f calc.awk sum: 7873.75 avr: 1.57475
2次側で相応の電力が消費されているはず。その電力は1次側から供給されるはずだから、 1次側電流が変化して当然と思うのだけど。。。変化無しはどゆ理由? 何か誤解してる?
トランスのお勉強
どうも、トランスの事が良く分かっていないっぽいので、 電検対策本らしきものを 見ておく。 DC-DCコンバータ用のトランス なんてのも眼についたので参照。 そして鶏卵問題ならぬ電流が先か電圧が先か問題も面白い。
cockcroft ckt v1 in 0 sin(0v 3v 10000hz) ; v1 in 0 pulse(0v 3v 0n 1n 1n 500u 1000u) L1 in rs 1000u rs rs 0 1 L2 out 0 10000u K1 L1 L2 1.0 v2 cont 0 pulse(0v 3v 1m 1n 1n 250m 500m) s1 out tol cont 0 mysw off rl tol 0 10 .model mysw S(vt=1.35v roff=100g) .control tran 100us 1000ms plot l2#branch l1#branch .endc .end
二次側に負荷抵抗10オームを挿入。それをスイッチでON/OFFしながら、コイルに流れる 電流をモニター。確かに、二次側に電流が流れる時、一次側も増加してる。 なお、xxx#branchってのは、spiceが解析の都合上設けたポイントっぽい。(マニュアルを 調べてみたけど、言及されていなかった)
前の実験で、電流の差が顕著に表れなかったのは、電流比が明確になるような条件出しを やっていなかった為だ。良い勉強になったよ。
一つ疑問。無負荷時に9Vは設計通りなんだけど、負荷時には電圧が低下して5Vぐらいになる。
電流が流れれば電圧が低下するのは分かるんだけど、理想的なLは抵抗が無かったはず。 これ、どう解釈する?
10オームの負荷を付けて、電圧が約半分(5v/9v)になるなら、内部インピーダンスは、負荷 抵抗よりやや低い値になるはず。L2のインピーダンスが相当してるかと思って計算しても、 628オームにしかならない。どういう事だろう? そもそも銅損も鉄損もないので、 理想電源と思ってた。これじゃ、電検受からないな。
思うに、1次側に入れてる電流検出用抵抗が影響してる? http://www2.cc.oshima-k.ac.jp/~ito/lecture/textbook/3_3Trans.doc こちらのdoc見てて思ったね。
この抵抗を1mオームに変更したら、電圧変動は無くなった。適当に入れた抵抗が 2次側にも影響するとは、新しい知見ですよ。
解ってみれば当たり前。二次側に流れる電流は一次側から供給される。一次側の抵抗に より電圧がドロップ。すると一次側コイル両端の電圧が低下。二次側電圧も低下。
シュミレータが有ったればこそ、色々な実験が出来るのだな。思考の検証ツールとしても 最高のものですよ。
エラーを追う
ブロッキング発振器を動かした時に発生した有名なエラーをspice3で追ってみる。
Circuit: Blocking OSC doAnalyses: Timestep too small tran simulation(s) aborted Spice 1 -> where No unconverged node found.
説明書によると、エラー発生時に、それは何処で? って事で、where と尋ねて みるといいよって出てたんだけど、言う事無し と、つっけんどんな返事しか貰えな かった。
だったら、勝手に暴いてやるわい。エラーメッセージを手がかりに、ちょいと探りを 入れてみた。
$ find . -type f | xargs fgrep 'Timestep too small' ./lib/inp/sperror.c:static char *timestep = "Timestep too small"; ./lib/ckt/dctran.c: errMsg = CKTtrouble((GENERIC *) ckt, "Timestep too small");
2つのファイルが候補に挙がったので、最初のファイルを見たら、 SPerror(type)なんて関数で呼び出してるみたい。 ここまで分かれば、 その関数にBPを置いて、私的なwhereが出来るな。
(gdb) bt #0 SPerror (type=106) at /usr/ports/cad/spice/work/spice3f5/src/lib/inp/sperror.c:61 #1 0x081bf054 in INPerror (type=106) at /usr/ports/cad/spice/work/spice3f5/src/lib/inp/inperror.c:26 #2 0x08071a07 in if_errstring (code=106) at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/spiceif.c:404 #3 0x08051b65 in ft_sperror (code=106, mess=0x81fc50c "doAnalyses") at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/error.c:71 #4 0x08070d0a in if_run (t=0x28ceb300 "", what=0x820ad55 "tran", args=0x28cc3720, tab=0x28c1c080 "\300\065\314(`J\314(\003") at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/spiceif.c:191 #5 0x0806df17 in dosim (what=0x820ad55 "tran", wl=0x28cc3700) at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/runcoms.c:248 #6 0x0806d8a1 in com_tran (wl=0x28cc3700) at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/runcoms.c:124 :
frame #5 の中
if ((err = (*(ft_sim->doAnalyses))(ckt, 1, ft_curckt->ci_curTask))!=OK)\ { => ft_sperror(err, "doAnalyses");
っつう事で、今度は
(gdb) b *(ft_sim->doAnalyses) Breakpoint 3 at 0x818d360: file /usr/ports/cad/spice/work/spice3f5/src/lib/ckt/cktdojob.c, line 22.
そして、ここに来た。 cktdojob.c
125 for (job = task->jobs; job; job = job->JOBnextJob) { 126 if (job->JOBtype == i) { 127 ckt->CKTcurJob=job; 128 error = OK; 129 if (analInfo[i]->an_init) 130 error = (*(analInfo[i]->an_init))(ckt, job); 131 if (!error && analInfo[i]->do_ic) 132 error = CKTic(ckt); 133 if (!error) 134=> error = (*(analInfo[i]->an_func))(ckt, reset); 135 if (error) 136 error2 = error; 137 } 138 }
134行目を実行すると、エラー106が帰ってきた。で、BPを設定。
(gdb) b *(analInfo[i]->an_func) Breakpoint 4 at 0x819ad70: file /usr/ports/cad/spice/work/spice3f5/src/lib/ckt/dctran.c, line 22.
この中を見て行けらしい。