· 

Pythonで回路計算(3)

まずはレゾネータらしく1portで測定した感じにします。

Xtalはこういう測定するのに、同じレゾネータなのになんでSAWレゾネータは2port測定なのか、、、まぁ世の中には理解しがたいこともよくあります。

回路記述はport2をgndに変えてノード5を消せばいいだけです。結果のグラフ表示もすでに適当にいじっています。1portなので、グラフに表示するデータの選択(m=なんたら, n=かんたら)は不要です。

import skrf as rf
import matplotlib.pyplot as plt

freq = rf.Frequency(start=314.3, stop=315.7, unit='MHz', npoints=1001)
tl_media = rf.DefinedGammaZ0(freq, z0=50)
C1 = tl_media.capacitor(2.53e-15, name='C1')
L1 = tl_media.inductor(101.09e-6, name='L1')
R1 = tl_media.resistor(16.73, name='R1')
C0 = tl_media.capacitor(4.25e-12, name='C0')
gnd = rf.Circuit.Ground(freq, name='gnd')
port1 = rf.Circuit.Port(freq, name='port1', z0=50)
port2 = rf.Circuit.Port(freq, name='port2', z0=50)

cnx = [
    [(port1, 0), (L1, 0), (C0, 0)],
    [(L1, 1), (C1, 0)],
    [(C1, 1), (R1, 0)],
    [(gnd, 0), (R1, 1), (C0, 1)]
]
cir = rf.Circuit(cnx)
ntw = cir.network

fig=plt.figure()
fig.add_subplot(2,1,1)
ntw.plot_s_smith(lw=2)
fig.add_subplot(2,1,2)
ntw.plot_z_mag(lw=2)
fig.tight_layout()
plt.show()

はい、インピーダンスの絶対値のグラフが気に入らないですよね。わかります。縦軸対数にするにはplot_z_dbとかplot_z_db10とか使えばいいらしいですが、目盛への表示が値そのものではなくなるのが不満です。で、このplotなんたらは、自分がわけわからん引数が与えられた場合はmatplotlibに垂れ流すようなので、matplotlibの引数を与えてあげればいいわけです。が、matplotlibはaxに対してset_yscale('log')とすることでY軸を対数化するので、、、まぁ能書きはいいですか、、、subplotしたときにaxを取得しておいて、そのaxにplotなんたらして、そのあと、そのaxでset_yscale('log')するんです!

fig=plt.figure()
ax1=fig.add_subplot(2,1,1)
ntw.plot_s_smith(ax=ax1,lw=2)
ax2=fig.add_subplot(2,1,2)
ntw.plot_z_mag(ax=ax2,lw=2)
ax2.set_yscale('log')
ax2.set_ylabel('Impedance($\Omega$)')
fig.tight_layout()
plt.show()

はい。よくできましたー。

拡大していくと、インピーダンスの最小値が16.4Ωくらいで、データシートの16.73Ωより小さくなっているのがわからんところですが、ほぼ一致しているので、ポートの基準インピーダンスも考慮してくれていることがわかります。

次はインピーダンスの最小と最大のところにマーカーっぽいものを付けます。ただ点を打つんですけど。見ればわかるので解説はありません、、、いつものことですが。

import skrf as rf
import matplotlib.pyplot as plt

freq = rf.Frequency(start=314.3, stop=315.7, unit='MHz', npoints=1001)
tl_media = rf.DefinedGammaZ0(freq, z0=50)
C1 = tl_media.capacitor(2.53e-15, name='C1')
L1 = tl_media.inductor(101.09e-6, name='L1')
R1 = tl_media.resistor(16.73, name='R1')
C0 = tl_media.capacitor(4.25e-12, name='C0')
gnd = rf.Circuit.Ground(freq, name='gnd')
port1 = rf.Circuit.Port(freq, name='port1', z0=50)
port2 = rf.Circuit.Port(freq, name='port2', z0=50)

cnx = [
    [(port1, 0), (L1, 0), (C0, 0)],
    [(L1, 1), (C1, 0)],
    [(C1, 1), (R1, 0)],
    [(gnd, 0), (R1, 1), (C0, 1)]
]
cir = rf.Circuit(cnx)
ntw = cir.network

#インピーダンスが最大最小となるデータインデックスを取得する
z_min_pt=ntw.z_mag.argmin()
z_max_pt=ntw.z_mag.argmax()

fig=plt.figure()

ax1=fig.add_subplot(2,1,1)
ntw.plot_s_smith(ax=ax1,lw=1)
ntw[z_min_pt].plot_s_smith(ax=ax1,marker='o',markersize=2,show_legend=False)
ntw[z_max_pt].plot_s_smith(ax=ax1,marker='o',markersize=2,show_legend=False)

ax2=fig.add_subplot(2,1,2)
ntw.plot_z_mag(ax=ax2,lw=1)
ntw[z_min_pt].plot_z_mag(ax=ax2,marker='o',markersize=2,show_legend=False)
ntw[z_max_pt].plot_z_mag(ax=ax2,marker='o',markersize=2,show_legend=False)
ax2.set_yscale('log')
ax2.set_ylabel('Impedance($\Omega$)')

fig.tight_layout()
plt.show()

はい。ぽっちがつきました。わけわからん引数がmatplotlibに渡されることを利用しています。

ちなみに、レゾネータはおおむねインピーダンス最大最小となる周波数で位相が0となる(スミスチャートの横軸と交わる)ことがわかりますが、位相ゼロのほうがインピーダンス最小よりちょっと高い周波数になります。なので、発振器を作るとインピーダンス最小となる周波数よりもちょっと高い周波数で発振することが多いです、、、どうでもいいか。

 

PCを新しくしました。DELL Inspiron 5415(AMD Ryzen7 5700U, 16GB)です。これまで使っていたのが、東芝R822(Core i5-3317U, 8GB)だったので、戦闘能力は約3000から約16000への劇的な向上です。体感的には言うほどかわらんのですが、、、。生涯で何代目のPCだろ、、

 

EPSON PC-486NAS(80486SX 25MHz)

EPSON PC-486HX(80486DX 66MHz)<-クリスタル付け替えてオーバークロックしてたけど

ショップブランド AMD K6

自作 Celeron 466 (当時流行ったDual Celeron)

CASIO CASSIOPEIA FIVA

自作 Athlon64 <-あとでX2に載換え

東芝 R822

DELL Inspiron 5415

ということで8代目。家族の分も合わせると、、、これまでに16台購入したらしい、、、なんと!振り返るんじゃなかった、、、