しつこく *spice

人口知能が流行って、数々の職業が奪われると言われている。ホワイトカラーの代表、 OLの事務処理業務とか、今は仕事にあぶれつつある弁護士とか。医者だって危ないぞ。 ワトスン博士の見立ての方が、町医者よりもずっと確かなものになるだろう。

ならば医者は何する?そりゃ手当てするに決まってるだろ。そう、手を当てて患者を 慰めるのが仕事。それなら若いねーちゃんだって、出来るって。

『昭和の消えた仕事図鑑』(原書房)なんて本をぱらぱらとめくってみた。世は平成28年。 人間で生物学的に言えば、ちょうど一世代。そろそろ平成も時代交代ですかね? いえ、 天皇には引退が無いから大変だなあ。死ぬまで働けって、かわいそうだよ。

話が逸れた。無くなった仕事って言われて、オイラーが真っ先に思いついたのは、赤線 の中で働いていた人。法が、その仕事を強制的に無きものにした。必要悪。トルコから ソープに変わって、しっかり生きています。色々な人の収入源になるので、取り締まる 方も、源が枯れないように注意していますね。(そりゃ、某小説の読みすぎってもんです)

で、赤線内の仕事が無くなって、連鎖的に衰退した職業に、紙漉き職人ってのが有るそうです。 あそこは、チリ紙の一大消費地だったそうですから。

昔の便所の紙は、新聞紙からチリ紙に進化した(当家での話し)。今じゃ、ロール紙、 静岡県のあすこあたりで大量生産される。地震で供給が途絶えても、半年ぐらいは 持ちこたえるように備蓄しておきましょう。

そして、汲み取り業。みんな水に流しちゃうからね。昔は、農家の人が肥料にするとかで、 結構回収業が繁盛してたらしい。田舎の香水は悪臭だ。化学肥料が良いですよって、 農協が儲かる仕組みを作ったんだな。

孫ボード相当

電子実験回路を組み立てていると、機能回路をまとめておいて、それを後で使いたく なる。孫ボードを用意して、それをメインボードに幾つも載せたいという欲求。 孫ボードは、もうブラックボックスで良いって事だ。

ニキシー菅の表示機の時代、10進数のカウンターをトランジスターで組み上げ(勿論、2石で フリップフロップ回路を作って、それを4回路分用意)、それにニキシー菅の ドライブとニキシー菅を付けたボードを用意した。そのボードを4枚なり6枚並べて 時計を組んだなあ。

そのボードがいわゆる孫のボードで、差し込んで使う方が本体基盤になる。アメリカ あたりだと、本体基盤の事をマザーボード、孫ボードの事をドーターボードって呼ぶのが 普通だ。最初、ドーターって何だろう。どーと孫ボードを作るからドーターと言うと 思ってた。で、ある時、ドーターって英語で言う娘の事じゃねぇって気がついた。 英語力のなさに、あきれ返ったよ。

まあ、分かってみればこの名付けの意味は深いね。母娘っていいコンビだものね。 一心同体って言った所でしょうか。

無駄話が過ぎた。ngspiceでも、この孫ボードが扱えるようになっている。孫ボードの 上(中)に孫ボードを差し込む事が可能。内部配線の情報は、外に漏れ出さないように なってるのが、ちとソフトウェアで言う関数と似ている。そう言えば、関数を集めて ある機能を実現したのをモジュールと言うね。ハードウェアでも同義で使ってる。

インバータ(SN7404相当)を孫ボードにしてみた。そして、それをマザーボードに 挿して実験。

Inv 7404

.subckt INV power 0 in out
  Q1 N007 N005 in 0 2SC288
  Q2 N003 N007 N008 0 2SC288
  Q3 P001 N003 N004 0 2SC288
  Q4 out N008 0 0 2SC288
  D1 N004 out D
  R1 power N005 4k
  R2 power N003 1.6k
  R3 N008 0 1k
  R4 power P001 130
  .model D D
  .model 2SC288 NPN(Bf=70 CJC=0.7pF CJE=1.0pF Rb=15 Rc=3 Tr=0.2n Tf=0.2n)
.ends INV

.subckt LOAD power 0 tp clv=15p
  Rl power jp 400
  D1 jp n1 D
  D2 n1 n2 D
  D3 n2 0  D
  D4 jp tp D
  Cl tp 0  clv
  .param clv=50p
  .model D D
.ends LOAD

Vcc pbus 0 5v
Vsg sig 0 PULSE(0v 3v 1ns 2n 2n 100n 200n)
Xdev pbus 0 sig out INV
Xld  pbus 0 out     LOAD clv=150p

.tran 1ns 600n
.end

SPICEによる回路シミュレーション を参考にして、サブルーチンのパラメータ引渡しも入れてみた。

孫ボードとして単独のインバータと、スイッチングスピード評価用の負荷回路を定義。 それを使うにはXで始まる宣言子で、マザーボードに接続する。

負荷回路 Loadの宣言の最後に有る clv=15p は、デフォルト値。宣言部内で .param ってやってるのは、再度、計算とかしてその結果を、設定に反映したい場合に使う。

マザーボード側で定義したXldの宣言のLOADの後ろに、実引数を書いて(当然、複数可) subcktの設定を上書き出来る。

こんな簡単なプログラミングで、シュミレーション出来るとは、良い時代だなあ。 調子に乗って、本物のSN7404を定義しようと思ったけど、あちらは、ピン数が14も あるよ。そういうICを定義しちゃうと、未使用ゲートが有っても、使う時、14pin分の 宣言を書かないと、ngspiceが文句を言ってくるので非常につかいずらい。

上記例を改善するなら。単独ゲートの定義を一つのファイルにまとめておき、それを .inc するのが良さそう。この方法なら、使いたい分だけ、Xxxで配置するだけですから。 だれですか、ゲート1個に付き、必ず電源とグランドを記述しなきゃいけなく面倒だって 言う人。

そこまで頭が廻る人は立派。会社時代、新人トレーニングの講師で、ICを使った電子工作 をやって貰った事がある。すると、必ず何人かは、ICの電源とグランド接続を忘れる人がいる。

そういう輩は昼飯抜き。お腹がへってふらふらになった頃、人間は飯を食わないと 動けない。ICだって同じだよ。ちゃんとICの活力の元、電源を供給してる? 今思えば、 パワハラだなあ。でも、こういう苦労をしておけば、現場に出ても、まずは電源って 事を忘れないだろう。鬼教官もちゃんと考えているのです。

所で、 Xって、eXtend から来てるのかな。それとも未知のXから来てる? 深く考えないで 次行ってみよー。

Ring

鬼教官は、新人をいじめるのであります。サド伯爵であります。

金曜日の夕方、宿題を出します。SN7404の6ヶ入っているゲートのうち、5ヶを使って 数珠繋ぎにし、電源を入れたらどうなるか? 思考して、月曜の朝レポートを 提出しなさい。

回路で言うと

Ring OSC

.inc inv.sub

Vcc pbus 0 5v

Xg1 pbus 0 out g1o INV
Xg2 pbus 0 g1o g2o INV
Xg3 pbus 0 g2o g3o INV
Xg4 pbus 0 g3o g4o INV
Xg5 pbus 0 g4o out INV

Xld  pbus 0 out    LOAD

.tran 1ns 300n
.end

こういうのね。

あらら、答えが書いてあった。周期20ns、振幅3.1Vぐらいで発振しましたよ。 何故か考えてみよう。これが分かれば一人前、免許皆伝です。そして、アドバンスとして、 発振周期の考察が出来れば、サムスンへ就職出来る(かも)。

こういう回路は、きっと糞石の中にも潜んでいるに違いない。ああ、、inv.subは、前記の subcktの部分を切り出したものね。

このリング発振器の回路を、editで開いてみると、それぞれのインバータ回路が、 ソース上でガーと展開されてた。負荷回路でパラメータ化した値も、ソース上で どのようになってるか、確認出来て、これは便利。

*ld pbus 0 out load
*param clv=50p
r.xld.rl pbus xld.jp 400
d.xld.d1 xld.jp xld.n1 xld:d
d.xld.d2 xld.n1 xld.n2 xld:d
d.xld.d3 xld.n2 0 xld:d
d.xld.d4 xld.jp out xld:d
c.xld.cl out 0   5.00000000000000018e-11
.model xld:d d
*ends load

ああ、listingだと、要約が出てくるな。

ngspice 42 -> listing
  :
    33 : xg5 pbus 0 g4o out inv
    34 : xld pbus 0 out load 50p
    35 : .tran 1ns 300n

subcktの中に記述したパラメータが、外部に表出してる。知らないと焦るな。

PSN

以上、昭和の思い出だったけど、もう一丁行ってみるか。 無線を聞いていると、なにやら、もごもごが聞こえる。SSB通信とか言うらしい。 何やら秘密めいてて面白そう。CQ誌に特集が載ってた。

送信電力のほとんどが搬送波を送るのに使われちゃって、音声情報が乗った電波の 電力は極わずからしい。もったいない。キャリアーを抜いてしまったら、音声電波だけを 強力に発信できるんじゃねえか。それに、音声電波も、キャリアーが有った所を対称に 同じものが送られている。だったら、半分だけ送ってもよくね。SSBの誕生である。

そういう電波を作るには、特別な仕掛けが必要。キャリアーを抜くのは、バランスドミクサー で出来るけど、音声電波を半分にするには、狭帯域のフィルターが必要。国際電気が 作っていた、メカニカルフィルターってのが必要。これが眼の玉が飛び出る程高価なもの。 貧乏学生には手が出ない。

フィルターを使わないでもSSBを作る方法が開発された。詳しくは、 PSNタイプでSSB信号ができるまで を参照。でも、これって割りに現代風なんだよな。オペアンプをふんだんに使ってます。 (もっと現代風になると、DSPでデジタル処理しゃうのがが流行)

レトロなやつを探してみましたよ。そして、やっと見つけた。 昭和の香りが漂う。昔懐かしいPSN方式SSBジェネレ-タ- 抵抗とコンデンサで位相をずらすやつ。当時は、これをやってたのよね。

有り難い事に、このSSBジェネレータを製作するためのプリント版のパターン図や部品表、 回路図、説明書まで含めて公開されている。これぞ、オープン・ハードウェアの見本ですよ。 こうなったら、PSN部分だけでもAC解析してみろ。

回路図からltspice用のテスト回路を作ってみた。単に転記しただけだけど。Q9,10で、 差動AMPを構成。一入力は、マイクアンプを経たもの。もう一入力は、交流的にグランドに 接続。AC特性を測ったら、ゲインが11.8dBぐらいあった。

AoutとBoutの出力は、勿論、位相差が180度ある。そして、ゲインの差が、0.4dB程有ったので、 ボリュームの代わりの抵抗、RavとRbvで調整しておいた。ゲイン特性は、50Hzから100kHz まで、フラットに伸びていた。

AMPの出力は、AoutとBoutだ。それが、位相をシフトする回路(PSN)に導かれる。ブリッジの幹は 2本ある。時定数が小さい方は、ゲインの極が、約1.2KHz。極を中心に大きく位相が 回っている。

10Hzから700Hzぐらいまで、位相が50度から-50度に変化。700Hzから2400Hzぐらいまで、 今度は位相が-50度から50度へと変化。2400Hz以上では、位相が再びマイナス方向に回り、10KHzの点で、 約20度となった。

時定数の大きい方は、ゲインの極が320Hzぐらいの所に有った。位相の回り方は上の説明を そのまま低い方へシフトした形になっている。

音声の第一フォルマントと 第二フォルマントに注目した設定になってるのかな?

一応、ngspiceで動くかも確認しておく

PSN
.model 2SC1815 NPN(Is=2.04f Xti=3 Eg=1.11 Vaf=6 Bf=400 Ne=1.5 Ise=0 Ikf=20m Xtb\
=1.5 Br=3.377 Nc=2 Isc=0 Ikr=0 Rc=1 Cjc=1p Mjc=.3333 Vjc=.75 Fc=.5 Cje=25p Mje=\
.3333 Vje=.75 Tr=450n Tf=20n Itf=0 Vtf=0 Xtf=0)
Vcc N001 0 12v
Vin N004 0 AC 0.1v
Q9 Aout N005 N007 0 2SC1815
Q10 Bout N006 N007 0 2SC1815
R1 N001 Aout 1k
R2 N001 Bout 1k
R3 N001 N006 330k
R4 N001 N005 330k
R5 N007 0 510
C1 N005 N004 10u
C2 0 N006 10u
R6 N002 Ao 330k
R7 N003 Bo 330k
R8 Ao Bout 400k
R9 Bo Bout 400k
C3 Aout N002 500p
C4 Aout N003 2000p
C5 Bo Bout 1000p
C6 Ao Bout 250p
Rav Aout 0 5k
Rbv 0 Bout 6k

.ac dec 12 10 100k
.end

dB表示とか位相差の表示とか、差分の表示とか。

ngspice 2 -> plot db(bo) ph(bo)
ngspice 2 -> plot ph(ao,bo)
ngspice 2 -> plot db(ao,bo)
ngspice 2 -> plot ph(aout,bout)

また、plot ph(Aout) した時、びっくりする事が起きた。で、printしてみたら

35      8.254042e+03    -3.14135e+00
36      1.000000e+04    -3.14146e+00
37      1.211528e+04    -3.14154e+00
38      1.467799e+04    3.141584e+00
39      1.778279e+04    3.141532e+00
40      2.154435e+04    3.141484e+00

ラジアン表示で、ほぼπの近辺。180度は、遅れて行っても、進んで行っても、行き着く 場所は同じ。午前12時と言うか、午後0時と言うかの違いみたいなものか。

位相の引き算ph(ao,bo)をやってるんだけど、期待したほぼ90度ってのには、ならないなあ。 何か、勘違いしてる?

Ra Aout ta 400k
Ca ta Bout 500p

Cb Aout tb 500p
Rb tb Bout 400k

Rc Aout tc 200k
Rd tc Bout 100k

ちょっといたずらで、2種のCRによる回路を追加してみた。信号源をAoutとBoutから 貰ってきているけど、仮にBoutをGNDと想像すれば、回路Aは、出力点をtpとするローパス フィルターと看做せる。回路Bは、ハイパスフィルターとなる。

もう一つ、参考に抵抗だけの分圧器も付けておいた。

これで、ta,tbの位相をモニターすると、どの周波数でも、位相差が180度出ている。 分圧器の出力位相は、分圧比、Rc/Rdが、1より小さければ、Aoutの位相になり、1より 大きければ、Boutの位相になる。差動の信号(位相差180度)って信号を、分圧するって 、なかなかのアイデアだなあ。

なお、蛇足になるけど、ラジアン表示じゃいやだって場合、

ngspice 206 -> plot 180 * ph(tb) / 3.14159
ngspice 207 -> plot 57.3 * ph(tb)

すれば良い。1radの度 換算ぐらいは、覚えておこう。ついでに、spiceの関数も 調べてみた。

mag(vector)     ベクトルの振幅
ph(vector)      ベクトルの位相
j(vector)       ベクトルを i (sqrt -1)倍する
real(vector)    ベクトルの実部
imag(vector)    ベクトルの虚部
db(vector)      20 log10(mag(vector))
log(vector)     ベクトルの常用対数(底が 10)

とか、複素数が必須で、使えるようになってるのね。

ngspice 2 -> set units=degrees
ngspice 2 -> set filetype=ascii
ngspice 2 -> write ph(ta)
ngspice 2 -> set width=132
ngspice 2 -> print  ph(ta) ph(tb) ph(ta,tb) > fuga.dat

こんな事をやると、ラジアン表示が度表示に切り替わったり、ASCIIファイルに出力出来たり、 カラム幅を拡げて表示(リダイレクト)出来たりする。E表示を止めて、素人受けする123.45みたいな 表示に切り替える方法って無いかな。

そんなの、どう書くPythonで真っ先に取り上げられる話題だろうに。調べてみれ!

run hoge とかってやると、がーとシュミレーションの生データがファイルに落ちる。 事前にfiletypeでasciiとかって指定しておけば、pythonでも読めるんだろうね。

平成時代の広帯域位相シフター

AF PSN

移相器

広帯域 90 度位相差のRC回路網

90度移相器の設計とシミュレーション

位相シフト回路

RCポリフェーズ・フィルタ

RCポリフェーズフィルタでIFの90°成分を作る

ngspiceでオペアンプ

spiceに慣れてくると、Windows上のltspiceって、常にマウスを手放せないので不便。 そんな訳で、linux上のngspiceを主戦場に決めたんだけど、オペアンプって部品は有るの?

オペアンプ回路

JRC NJU7061

どこかの大学の実習資料とおぼしきものに行き当たった。ありがたく使わせて貰おう。 だけじゃ、気持ちが悪いのOPAMPをどう実現してるか、spiceの資料と比べてみた。

電圧制御線形電圧源 がそれなのね。増幅度10万倍の制御源と1倍増幅度の出力源を 組み合わせて、全体でオペアンプにしてる。なんか、送信機とかオーディオアンプ みたいで面白いな。今度、初段を回路図に落としてみるか。昔は、プリント基板の リバースエンジニアリングをよくやったからな。思い出しちゃうよ。 裏と表が有って、その間がスルーホールで結ばれていたりして、それを見落とした ものだから、おかしいなー、回路がぶちきれているって悩んだものだ。

* Ideal Operational Amplifier  . . .  K. Mochizuki  2002.3.19
*                +  -  out
.subckt   opamp  50 51 55
rin    50    51    1G
cin    50    51    5p
e1st   52  0  50  51  100000
r53   0   52  1g
r51  52  53  100k
c51   0  53  53n
d51  56  53 d1s2075
d52  53  57 d1s2075
v51  56   0   -13.7V
v52  57   0   13.7V
r52  53  54  1k
c52   0  54  53p
d53  58  54  d1s2075
d54  54  59  d1s2075
v53  58   0   -13V
v54  59   0   13V
eout  55 0  54  0  1
rpow  55    0    1G
.model d1s2075   D
.ends
test opamp
.inc opamp.sub

.tran 30u 60m 0 30u
V1 1 0 sin(0V 1V 50Hz)
R1 1 2 3k
V2 10 0 pulse(-1V 1V 0 1ms 1ms 19ms 40ms)
R2 10 2 1k
Rf 2 3 1k
* opamp pin is +in -in out
X1 0 2 3 OPAMP
.probe
.end

演算増幅器で、サイン波と方形波の足し算を実行。Rfの値を大きくして、Ampをサチ らせたら、13Vでクリッピングしたよ。電圧リミッター回路が、ちゃんと動作してるな。 電流リミットは、どうかな? 早く回路図を起こせ。> オイラー。

この演算増幅器は、仙人が作ったほぼ理想的なもの。演算増幅器自身の電源は不要で 配線し易い。えっ、いくら仙人でも霞を食べて生きて行ける訳ではないでしょう。 ははは、演算増幅器自身は、電源なんじゃ。理想OPAMPの特性の一つに、出力インピーダンスが ゼロってのがある。

平たく言えば、幾ら電流を取り出しても、出力電圧が低下しないって事。そう考えれば、 OPAMPは、理想的な(プログラマブル)電源じゃ。と、新人君への講義風に、まとめてみました。

etc

マイクロソフトはなぜWindows 10へのアップグレードを“強制”するのか

Windows 10 へのアップグレードを抑止する方法

GUIなOSで遅れ、インターネットには乗り遅れ、ブラウザーでも乗り遅れ、ネットショップも 開店遅延、世界の検索も覇者になれず、気付けば、世はスマホの世界。今後パソコンOS なんて使ってもらえるのかと焦るメーカー。

ここで挽回しておかないと先が見えたぞと、焦って脅迫してんだな。