psn and Xtal filter

この時期は一年で最も早く、陽が出て来る。梅雨とは言え朝日をまともに浴びての 散歩は勘弁願いたい。そんな訳で、陽が出る前の散歩を心がけている。

散歩を効果的にやるには、緩急のリズムを取り入れると良いらしい。けど、汗をかくのは 御免だ。で、自己流の夏場バージョンを復活させる事にした。

逆さ歩き。逆立ちして歩くのではなく、バク進する歩きかた。バックで前進。

これの何が良いって、普段使っていない筋肉を使うので、いかにも効いたって、自己暗示に 陥る事。そう、やってみると分かるけど、ずっとつま先立ちして歩く事になる。

その場でかかとを上げたり下げたりする運動も、足の筋肉を鍛えるのには良いとTVで やってた。コーヒーを炒れる時のお湯をそそぐタイミングにこのカウンターを使ってる。 湯をそそいで、かかと上げ下げ30回。そして湯をそそぐを何回か実行。これを 午前、午後のお茶の時間にやってる。

中学校の担任の先生は、これをしょっちゅうやってた。そんな昔からの鍛錬法。TVが したり顔で紹介すること無いよな。

で、逆さ散歩、初回の翌日はふくらはぎが非常に痛かった。筋肉に負荷がかかった証拠。 少しずつ歩く距離を延ばして行ったら、かなり長距離やっても平気になった。

やる場所は、車が通らない農道。まあ、早朝だから車も通らないしね。安全。 昔住んでいた関東でやったら、駐車中の車に衝突したぞ。普通は車が人にぶつかって くるものだけど、人が車にぶつかって行くのは(一部の人達を除いて)珍しい事だ。 幸い、双方に怪我も破損もなく無事に済んだけどね。

実行する時は、くれぐれも気をつけましょう。バックミラーならぬ、ウォーキング カメラを頭の後ろに取り付け、ヘッドアップディスプレーで、前方と言うか後方を 確認するかな。こういう時に、ぐぐるのあの眼鏡が良さそうだな。

新しい物に飛びついて、今ほこりを被っているようなものが有ったら、夏の間だけ、 貸してもらえませんか。

ああ、そうそう、この逆さ歩き、田舎者には必須の身を守る武器になる。去年は豊作で 秋に出来るどんぐりとかが豊富だったとの事。そのせいで熊さんも活発化。山の熊さんが 川ぞいに里に下りてくるようになった。

散歩の途中で、熊さんにばったり出くわしたら、絶対に背中を見せて逃げてはいけません。 静かに後ずさりして逃げましょう。ね、必須の技術でしょ。学校で護身術を教えるのも いいけど、体育で逆さ歩きを取り入れろよ。そして、オリンピックで正式種目にならん 事を願っております。

ある人から聞いた話なんだけど、山菜を取りに山に入った人が熊さんとばったり遭遇した そうな。驚いて崖から転げ落ち、両足を骨折したとか。そのせいかどうかは分からないけど、 熊さんは、責任感じて逃亡したらしい。

山菜取りますか? 命取られますか? (By 何たら広告提供機構)

恥ずかしい間違い

前回、BW型のPSNを組んだ時、単一周波数の移相器も組み込んでおいた。それの位相差を

ngspice 2 -> plot ph(r) ph(t) ph(r,t)

として、確認したんだけど、差の位相が予想と外れるものとなった。予想では、 ほぼ全域に渡って90度と思ってた。各点のグラフから差を眼で取ってみると、90度 となるんだけどね。

Index   frequency       ph(r)           ph(t)           ph(r,t)
-------------------------------------------------------------------------
22      6.812921e+02    -9.56441e-01    6.143555e-01    2.401362e-01
23      8.254042e+02    -1.04352e+00    5.272719e-01    4.257068e-01
24      1.000000e+03    -1.12279e+00    4.480062e-01    6.305350e-01
25      1.211528e+03    -1.19315e+00    3.776478e-01    8.279374e-01
26      1.467799e+03    -1.25437e+00    3.164262e-01    9.970754e-01
27      1.778279e+03    -1.30684e+00    2.639544e-01    1.131073e+00
28      2.154435e+03    -1.35132e+00    2.194805e-01    1.233076e+00
29      2.610157e+03    -1.38871e+00    1.820868e-01    1.309665e+00
30      3.162278e+03    -1.41997e+00    1.508244e-01    1.367204e+00

これ、グラフ用のデータをプリントしたもの。例えばIndex 24の1KHzを見ると、 暗算と言うか筆算を妄想して

    -1.13
 -)   .48
-----------
    -1.51    

4.48e-1なんで、一桁ずらして計算。アバウトでπの半分。度に直すと90度ぐらい。 Pythonで計算させると、引き算の結果は、-1.57(ラジアン)で、度に直すと89.6度 となって、目視と合ってる。

しかし、ngspiceの計算結果は、0.63で、これまた、差のグラフと一致してる。 こういう場合は、大体自分に非があるんで、間違いの急所を探ってみる。

2分で分かるというコンビニな、複素数の四則計算 をみると、和と差は、実部同士、虚部同士の演算をしなさいって定義になってる。 商の計算には、分母側の虚部を消すために、分母側の共役を、分子と分母に掛けて から計算しろとな。

分母が誘導性なら容量性なものを作用させて打ち消せ。分母が容量性なら誘導性なものを 作用させろ。これって、電子業界で言う、共振だな。

まあいい、定義に則って、まじめに計算してみるか。極座標系では計算出来ないので、 実部と虚部の複素数を print

Index   frequency       r                               t  
-------------------------------------------------------------------------------
24      1.000000e+03    1.876357e-02,   -3.90421e-02    8.123643e-02,   3.904209e-02

面倒なので、1KHzだけね。後はPythonで

In [5]: from cmath import *
In [6]: r = complex(1.876357e-02,   -3.90421e-02)
In [7]: t = complex(8.123643e-02,   3.904209e-02)
In [8]: phase(r - t)
Out[8]: -2.2455802792747135

あれ? 計算が合わないなあ。 ええぃ、全部計算させちゃえ

In [48]: for l in open('LOG','r'):
    a = l.split()
    r = complex(float(a[2]), float(a[3]))
    t = complex(float(a[4]), float(a[5]))
    z = phase(r - t )
    print(z)

まだ、何処か勘違いしてるんだろうか?

ngspice 2 -> plot r t polar

これで、極座標表示出来るのね。丸く収まれば良いのですが。。。なかなかそうもいかない。 smithさんに登場願うのは何時の事になるやら。

このpolar表示の意味を考えるのが、次のステップだな。

pythonで極座標表示

出来るはず。と思って、調べたらちょっと修飾が必要みたい。 こちらの方は、物理屋さんぽくて、グラフのカタログを例付きで提示されてた。 ありがたいことです。

そして、なんとまあ、 直交座標 to 極座標変換と言う、直球勝負球を 投げている方もおられました。オイラーと同じ悩みを抱えて、ここに到達されたんで しょうか? 是非、聞いてみたいものです。

直球勝負の方は、分かりやすいように点を打つようにされてますが、何も指定しない 更に直球があり、それだと、各点を線で結んでくれます。

振幅と位相の配列、magとphを用意して、下記に代入すると、ngspiceが描いてくれる plotと同様になりました。表示上では、度のラベルが付きますが、与えるデータは、 ラジアンです。

In [10]: mag = []

In [11]: ph = []

In [12]: for l in open('LOG','r'):
    a = l.split()
    mag.append(float(a[2]))
    ph.append(float(a[3]))
from pylab import *

polar(ph, mag)
grid(True)
show()

ph(r,t)

気になったので、spiceで ph(r,t) した時に、何が起こっているか追ってみた。

Spice 25 -> let x=ph(r,t)

printでもいいんだけど、今回は、右の式を評価して変数(配列)に代入するのを 実験材料にした。

letはコマンドとして登録されてるので、そこから追って行くと、本質部分の、ft_evaluateだ。 に行き着いた。そこから丹念に追っていくと

#0  doop (what=44 ',', func=0x8088650 <cx_comma>, arg1=0x28cf9740, arg2=0x28cf9760) at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/evaluate.c:636
#1  0x08051eff in op_comma (arg1=0x28cf9740, arg2=0x28cf9760) at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/evaluate.c:110
#2  0x08051d27 in ft_evaluate (node=0x28cf9780) at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/evaluate.c:69
#3  0x0805422e in apply_func (func=0x820f9e4 <ft_funcs+16>, arg=0x28cf9780) at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/evaluate.c:488
#4  0x08051cab in ft_evaluate (node=0x28cf97a0) at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/evaluate.c:63
#5  0x0806483b in com_let (wl=0x28cfa3b0) at /usr/ports/cad/spice/work/spice3f5/src/lib/fte/postcoms.c:136
 :

該当するソースをちょい見しておく。

106struct dvec *
107op_comma(arg1, arg2)
108    struct pnode *arg1, *arg2;
109{
110    return (doop(',', cx_comma, arg1, arg2));
111}
 :
621static struct dvec *
622doop(what, func, arg1, arg2)
623    char what;
624    char *(*func)();
625    struct pnode *arg1, *arg2;
626{
627    struct dvec *v1, *v2, *res;
628    complex *c1, *c2, lc;
629    double *d1, *d2, ld;
630    int length, i;
631    char *data;
632=>  bool free1 = false, free2 = false, relflag = false;
633
634    v1 = ft_evaluate(arg1);
635    v2 = ft_evaluate(arg2);
 :
759    /* Now pass the vectors to the appropriate function. */
760=>  data = (char *) ((*func) ((isreal(v1) ? (char *) d1 : (char *) c1),
761                  (isreal(v2) ? (char *) d2 : (char *) c2),
762                  (isreal(v1) ? VF_REAL : VF_COMPLEX),
763                  (isreal(v2) ? VF_REAL : VF_COMPLEX),
764                  length));
 :

arg1にrがarg2にtが入った状態で、複素数演算が行われるとな。cx_commaは、 spice3f5/src/lib/fte/cmath3.c:85 に入っていた。

 75/* Should just use "j( )" */
 76/* The comma operator. What this does (unless it is part of the argument
 77 * list of a user-defined function) is arg1 + j(arg2).
 78 */
 79
 80char *
 81cx_comma(data1, data2, datatype1, datatype2, length)
 82    char *data1, *data2;
 83    short datatype1, datatype2;
 84{
 85    double *dd1 = (double *) data1;
 86    double *dd2 = (double *) data2;
 87    complex *cc1 = (complex *) data1;
 88    complex *cc2 = (complex *) data2;
 89    complex *c, c1, c2;
 90    int i;
 91
 92    c = alloc_c(length);
 93    for (i = 0; i < length; i++) {
 94        if (datatype1 == VF_REAL) {
 95            realpart(&c1) = dd1[i];
 96            imagpart(&c1) = 0.0;
 97        } else {
 98            realpart(&c1) = realpart(&cc1[i]);
 99            imagpart(&c1) = imagpart(&cc1[i]);
100        }
101        if (datatype2 == VF_REAL) {
102            realpart(&c2) = dd2[i];
103            imagpart(&c2) = 0.0;
104        } else {
105            realpart(&c2) = realpart(&cc2[i]);
106            imagpart(&c2) = imagpart(&cc2[i]);
107        }
108
109        realpart(&c[i]) = realpart(&c1) + imagpart(&c2);
110        imagpart(&c[i]) = imagpart(&c1) + realpart(&c2);
111    }
112    return ((char *) c);
113}

正体があらわになりました。実質、演算対象が実数だと意味が有る差を取ってくれるけど、 複素数だと、なんじゃらほいって演算になっちゃってる。ソースを見て、自分の愚かさを 知るという恥ずかしい事になりました。

こんな事にならないよう先に、include/fteext.h を見て、概要を把握しておくべきだった。 今更、遅いけどね。

RCポリフェーズシフター

PSNの回路を求めてさ迷っていた時、ポリフェーズシフターってのに遭遇した。 これは、今注目の的のようで、さかんに特許関係に引っかかる。 抵抗とコンデンサだけで、シフターを作れるって事で、IC化しやすいんでしょうかね。

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

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

RCポリフェーズフィルタの解析と設計

解析は、けっこう難しいようで、ぼんくら頭では理解不能。でも、回路は起こせるよ。 やってみた。

pori psn
.inc opamp.sub

Vsig vin 0 ac 1v dc 0v

Xfol   vin    a      a     opamp
Xinv   0      rj     b     opamp
rin    a      rj     10k
rf     rj     b      10k

r5a    a      ea     10.44k
c1a    a      1      31.42e-9
r1a    1      ea     1.69k
r6a    b      ea     20.00k
c2a    b      2      1.77e-6
r2a    2      ea     3.23k

r5b    a      eb     10.44k
c1b    a      3      7.55e-9
r1b    3      eb     1.69k
r6b    b      eb     20.00k
c2b    b      4      425.27e-9
r2b    4      eb     3.23k

* plot cph(ea) cph(eb)

.ac dec 10 10 90k
.end

入力信号をオペアンプのフォロワーで受け、正相信号 a を作る。それを反転回路に 入れて、逆相信号 b を作る。後は、RCの回路に入れるだけ。90度すれた信号が、 ea,eb間に得られるはずなんだけど、どうもうまくいかない。何か勘違いしてる? 昔から鬼門ぽかったからなあ。

クリスタルフィルター

昔々、米軍放出のクリスタル発振子を、梯子型に組み上げて、SSB用のクリスタル フィルターを作るのがCQ誌に出てた。

現代でも、水晶発振子は、ある所にはあるもので、いっぱい手に入ったから、ラダー フィルター作ってみましたってのが、浦和アマチュア無線クラブのHPに掲載されてる。 コールサインから、歳が想像つきますなあ。他にも面白い技術記事が載ってて、飽きない。

ltspiceで実験されてる方がおられた。 セラミック・水晶振動子とラダー型フィルター に資料が有り、相当するファイルもDL出来る。

C:\Users\sakae\Documents\CKT\resonator>ls
XC455A.asy  cer-filter.asc  cer-reso.asc
XC455A.sub  cer-filter.plt  cer-reso.plt

ASCファイルはメインボード、XC455A.subは、孫ボード。XC455A.asyは、アイコンファイルだな。 cer-reso.pltって何? 何やらXMLファイルみたいなんだけど。どういう役目をおっている?

調べるのは簡単。そのファイルが無かったらltspiceがどう動くか観察すれば良い。 で、同ファイルをdirの外に出すと、ascファイルをダブルクリックして起動しても、 自動的にrunしてくれない。存在すると、起動と同時に、シュミレーションが実行されて 結果グラフが表示される。

ああ、アイコンの作成とかは、 サブサーキットの使用法 に載ってた。(これで何回目の参照になるんだろう? 興味が無いと読み飛ばして しまうからなあ)

他に水晶のパラメータが無いか? きっと、ltspiceの例に有るだろう。随分沢山あるな。 めげずに探していったら、Pierce.ascがそれだった。FETを使ってコルピッツ発振器を 作っている。で、パラメータは? サブサーキットに書いてあるのだろう。

実行中に、pierce.ascを見ると、pierce.netとそのログが見える。回路図上では、Y1って 言う部品名になってるけど、相当するものは無い。それらしいのは、

C・1 N002 N001 0.25p Rser=0.1 Lser=0.001 Cpar=5e-011

クリスタルマークを右クリックすると、コンデンサーの仲間って出てきた。 容量が0.25p、派生の直列抵抗0.1オーム、L分が1mH、直列容量が50pってスペックだな。 色々見るなら、標準のcapを見ろとな。見ようとしたら、バイナリーファイルになってる。 LとかCは色々有りすぎて収拾がつかないので、DBにしてるんだ。値から絞れるように 検索機能を付けてくれ、って、欲張りすぎ?(項目名をクリックすると、ソートは してくれるけどね)

まあ、コンデンサのパラメータが判明したから佳しとするか。ああ、helpの所で、 ltspice - circuit elements と辿ると、部品の等価回路の説明が出てくるのね。

コンデンサの等価回路ったら、いままでは容量に直列につながったコイルと思ってた。 そのコイル分は、リード線のL分ね。これって、高周波をやる人の等価回路か。

電源屋が考える等価回路ったら、複雑怪奇。ここまでしないと、正確にシュミレーション 出来ないの? まあ、LTSPICEは、電源屋が設計した電源屋のためのシュミレータですから、 こういう所にちからが入るのさ。

コンデンサーのメーカーは、どういう等価回路を提供しているのだろう? メーカーの HPに行けば、資料が公開されているだろう。 コンデンサを作っているメーカーったら、セラコンのムラタぐらいしか 思い付かないな。

電解コンのメーカーったら何処で作ってる? そういうのは、公正取引委員会に聞いてみるといいぞ。 昔、主だった電解コンのメーカーが、闇カルテルやって挙げられていたはずだから、 その記録が残っているだろう。ああ、有った。 コンデンサー販売でカルテル 公取委、70億円課徴金へ おいらの記憶も満更ではないな。

で、等価回路、ニチコン製

アルミニウム電解コンデンサの概要

ざっと見、tanδなんて懐かしいのが出てきたぞ。アレニウスの式は、寿命と温度の 所に載ってるのかな。

コンデンサ大事って事で、トラ技にも出てた。 コンデンサの重要な特性「インピーダンス」

日本ケミコンさんは、 SPICEモデル/等価回路を、皆様のお役に 立てるように提供致しております。 ムラタさんも負けじと、コンデンサのインピーダンスESRの周波数特性とは? から、spiceモデルの提供ページへ行けるようです。

純粋なspiceの方は、コンデンサの等価回路にそこまでの親切心は無い。けど、半導体で コンデンサを作る場合のパラメータが特別に用意されてる。これを使って、DRAMの 情報記憶用コンデンサの設計をするんだな。半導体屋のためのシュミレータってのが 明確に現れていて面白い。

ダイナミックメモリーに使われている、情報記憶用のキャパシタンスってどれぐらいの 容量なんだろう?検索してみたけど見つからず。 電子材料の記事 に、静電容量10pFのMOSキャパシタを作ってみましょうなんて例題だ出てた。突拍子も ない容量を例にする事は無いだろうから、案外、こういう値が利用されてるのかも。

でも、この例だと、一辺が170umってなってて、大き過ぎるようにも思える。実際の所 どれぐらいだろう。狭い所で容量を確保する為、井戸を掘って、そこに容量を 確保するみたい。こういう発想は、アメリカ人には無いだろうな。

土地が広いんだから、平屋でいいじゃんのテキサスとかカリフォーニアの人達には。 立体構造で有効利用しましょって考えは、香港出身の中国系アメリカ人が考えついた 技だろう。 ビクトリアピークから、下界を見ると、にょきにょきビルに圧倒されたよ。

元メモリー屋のお膝元広島では、 半導体メモリー っていう事業(授業)が行われていた。そして、 トレンチキャパシタセルとは なんて記事も面白い。容量を増やすには、電極の面積を確保するのも大事だけど、 電極間の絶縁体が持つ比誘電率を大きくするのも有効。で、NECさんも頑張りました。 NEC大容量DRAM用HSG-Siキャパシタンスの開発 後は、電極間の距離を小さくするってのも有るんですけど。。。と、昔授業で習った 事を思い出しております。

大分横道に逸れた。ltspiceの 例を色々実行すると、ログファイルとかが大量に溜まる。それがイヤなら、 Control PanelのOperationタブを開いて、Automatically delere xxx の所を変更 すれば良い。

ngspiceでクリスタル

Xtal

* fs = 1/(2*pi*sqrt(Lm*Cm)) = 439550.
* fp = 1/(2*pi*sqrt(Lm*Cm*Cs/(Cm+Cs))) = 455000.
* fp-fs = 15450.
.subckt XTAL 1 2
L1 1 P001 6.78802m
C1 P002 P001 19.3144p
R1 2 P002 10
C2 1 2 270p
.ends

vin 1 0 ac 1v dc 0v
x1  1 2 XTAL
r1  2 0 100

.ac lin 200 400k 500k
* plot v(2) xlimit 430k 450k linear

電流源を指定するとエラーになっちゃうので、電圧源を使って、抵抗入れて端子電圧を測ってみた。 そのせいか、位相特性が平坦になっちゃった。

以下、vinをiinに変更した時のエラー。定電流源なので、直流でも回路が繋がって いないと、飽和しちゃうって事?

Warning: Dynamic gmin stepping failed
Note: Starting source stepping
Supplies reduced to   0.0000% Warning: singular matrix:  check nodes 1 and 1


Trying gmin =   1.0000E-02 Note: One successful gmin step
Trying gmin =   1.0000E-03 Note: One successful gmin step
 :
Trying gmin =   1.0000E-12 Note: One successful gmin step
Note: One successful source step
Supplies reduced to   0.1000% Warning: singular matrix:  check nodes 1 and 1

Supplies reduced to   0.0000% Warning: singular matrix:  check nodes 1 and 1

Warning: source stepping failed

AC operating point failed -
 :

ええい、こうしてやる

iin 1 0 ac 1v
x1  1 0 XTAL
r1  1 0 10000

これで、ちゃんとシュミレーションするようになった。しかし、相変わらず、位相は 平坦だなあ。

共振点で、9000Vもの電圧が観測された。同調回路恐い、高周波恐い。 そう言えば、昔無線の先輩が1.2GHzなんて、とんでもない電波をやってて、電波出してる 時、 絶対にパラボラ(と言う、中華鍋)の前に立つなって言われた。脳が沸騰して、眼が 焼けるって脅かされたな。

先輩も貧乏学生。1.2Gをやろうとすると、430MHz帯の電波をガン・ダイオードだかで、 3逓倍し、1.2Gのキャビティー回路で同調させて、取り出すしかなかった。1.2Gで増幅 なんて言う贅沢は、それ用の石が手に入らないので却下。よって、出て来る出力も、 多分、蚊の鳴くような微弱なものだったろう。

キャビティーは、銅板で箱を作り、箱の底に太い電線を半田付け。これがコイルですと。 棒の反対側に丸く切り取った銅版を取り付け。その銅板の近くにネジを取り付け。ネジを 回して、バリコンの代わりをさせる。今までの電気の常識がぶっとぶような仕組みに なってた。こういうの分布定数回路と言うんかな。

また、話が逸れた。 あんた、騙されていないか。いくらなんでも、9000Vの電圧が出てくる訳ないだろう。 真面目に調べてみる。電圧源を電流源に変えるには、部品名をvからiに変えるだけ。 後ろに付いているパラメータの1vはそのまま。

spiceでは、電圧とか電流とかを表す、値の最後に付加する文字は無視される。よって、 1アンペアを指定した事になる。共振点では、端子間のインピーダンスが高くなるので、 1アンペアの電流を10kオームの抵抗に流そうとすると、電圧は急上昇しなければ ならない。そう、1万ボルトまでね。

コンプライアンス電圧、いわゆる、どこまで電圧が高くなっても良いってリミットが 無いものだから、オームの法則通りの高い電圧になるんだ。 企業で、コンプライアンスが無視されると、暴走するのと一緒。

spiceも言われた通りに計算するんで、現実にはありえない事になっても、そのまま 素通りしちゃう。クリスタルに1Aの電流流したらどうなるか、実際に誰かやってみれ。 そして、10kの抵抗に1Aの電流が流れたとしたら、そりゃ10KWですぜ。普通の家3軒分 ぐらいな電力消費。ありえない! こういう所まで、気配り出来ないとね。

ノイズ

以前に見つけた金沢文庫の所から、時折資料を借り出して読んでいる。今回借りた物に ノイズ解析 なんてのが出てきた。最初から読むのがいやな人は、ページ25-26あたりに出てる。

回路が発生する雑音は困りものです。遠くから伝わってくる微弱な電波を解析する ような場合、パラボラアンテナで電波を集約し、アンテナの焦点に置いたプリアンプで 増幅する。

そのプリアンプには低雑音が要求だれる。熱雑音を排除するために、しばしばガリヒ素で 出来た石を使い、アンプ自身を-270度ぐらいにカリカリに冷却する。これで、回路の出す ノイズを押さえようという作戦。

こういったパラボラを使うアマチュアと言ったら、月に電波をぶつけて反射してくる 電波で通信しましょってのがある。EME通信。アース ムーン アースの略称。 金のあるアマチュアは、冷却してるのだろうか?

ltspiceの例にも、ノイズ解析が有ったんで、クリック猿になって、あちこちを つついてみよう。