マイクロストリップライン の変更点

更新


[[ソフトウェア/OpenFDTD]]

* 概要 [#vba9af76]

50Ω のマイクロストリップ線路を計算で再現する。
うまく行ったらその上に部品を置いてみたい。

#contents

* 計算による設計 [#b19836e5]

https://keisan.casio.jp/exec/user/1223892753

4層基板を想定して、

- パターン幅 0.35 mm
- パターン厚 15 um
- 基板厚み 0.19 mm
- 比誘電率 4.3

としたところ、

- 0.1GHz 50.24Ω
- 1GHz 50.25Ω
- 2GHz 50.27Ω
- 5GHz 50.35Ω
- 10GHz 50.55Ω
- 20GHz 51.08Ω
- 50GHz 53.06Ω

を得た。

 make/o zin_th={50.24, 50.25, 50.27, 50.35, 50.55, 50.74, 51.08, 51.38, 52.04, 53.06}
 make/o zin_thf={0.1,      1,     2,     5,    10,    14,    20,    25,    35,    50}
 setscale d,0,1,"Hz",zin_thf
 setscale d,0,1,"Ω",zin_th
 zin_thf*=1e9

&ref(impedance_theory.png,,15%);

入力インピーダンスの特性:
- 周波数に依存して変わる
- 高周波数では徐々に増加する

に注意が必要。
* 本家の MSL.ofd [#kc9c5719]

http://emoss.starfree.jp/OpenFDTD/index.html

の「 6.8 マイクロストリップ線路」や「7.6 マイクロストリップ線路の特性インピーダンス」に計算例がある。

マイクロストリップ線路に信号を導入するには、
トレースの端をグランドプレーンに太さゼロの完全導体線で落とし、
その中心付近に給電点を設定して導入していた。

また、トレースを系の境界へ接続することで無反射で終端できるようだ。
OpenFDTD の吸収境界条件 PML (L = 8, M = 3, R0 = 1e-8) が使われていた。

「7.6 マイクロストリップ線路の特性インピーダンス」でも議論されていたけれど、
メッシュが粗いと全然精度が出ない。

逆にメッシュを細かくすると時間がかかるだけでなく、入力部分のインダクタンスが悪さをするようだ。

以下これを見る。



* サイズを合わせ、メッシュを細かくした [#nb5c3543]
#ref(mslA_repetition.png,around,right,50%);

&attachref(microstrip-A.ofd);

セルサイズを小さくしないと精度が出ず、
かなりの反復回数が必要になった。
最大反復回数と出力間隔を大幅に大きくしてある。

> === cpu time [sec] ===
>   part-1 :     859.429
>   part-2 :       0.209
>   --------------------
>   total  :     859.638

手元のノートPCで15分ほどで計算が終わった。

信号入力用の導線の周りでセルを細かく切るとインダクタンスが増加して、高周波領域で大きな影響が出てしまう。そこで導線を太くしたくなるのだが、太い導線の端面を向かい合わせてしまうと今度はキャパシタンスの影響が見えてくる。そこで、図のように薄板を互い違いに配置して、間に給電点(赤線)を入れる形にした。

青がトレースの断面、2つの黒枠が給電点とグランド、給電点とトレースを繋ぐための導線だ。

&ref(input_structure.png);

この図からもわかる通り、電場が集中する「トレースの角」の部分で非常に細かくメッシュを切るようにしてある。

ここまでしてようやくそこそこの精度が出るようになった。

&ref(mslA_impedance.png,,15%);&ref(mslA_impedance2.png,,15%);

&ref(mslA_impedance3.png,,15%);&ref(mslA_reflectance.png,,15%);

&ref(mslA_smith.png,,15%);

スミスチャートを見ると、30GHz くらいまではインダクタンス的な応答が見えていて、それ以降は・・・キャパシタンス的な影響なのかな? 何か違う影響が見えている。

とはいえ、

|周波数|理論値|計算値|
|0.1GHz|50.24Ω|49.69Ω|
|10GHz|50.55Ω|50.17Ω|

なので、かなりの精度で計算できている。

10GHz 以降でインピーダンスの実部が 30GHz まで上昇し、その後下降する理由は分からない。

断面に沿った電場の分布はこんな感じ。

&ref(mslA_yz2.png,,15%);&ref(mslA_yz3.png,,15%);

左はログスケール、右はリニアスケール。特にリニアで表示すると、電場がトレースの角の部分に局在していることが分かる。この部分のメッシュを細かく切らないと入力インピーダンスは低下して見えるようだ。これは実質的に線が太くなっているということなのかもしれない。

信号入力部の電場はこんな感じ。

&ref(mslA_xy.png,,15%);&ref(mslA_zx.png,,15%);&ref(mlsA_yz.png,,15%);


** 入力ラインの影響1 [#o9d47864]

&attachref(microstrip-B.ofd);

信号源を太さゼロの導線でつなぐとインダクタンス成分が大幅に増加する。

セルサイズを小さくすればするほど、実質的な給電線の太さが細くなって、
インダクタンスが増加するので、この影響が強く表れるようになる。

やってみたのがこれ。インダクタンス成分が 50GHz で 30Ω を超えている。

&ref(mslB_input_structure.png);

&ref(mslB_impedance.png,,15%);&ref(mslB_reflection.png,,15%);

&ref(mslB_smith.png,,15%);

&ref(mslB_zx.png,,15%);&ref(mlsB_yz.png,,15%);

** 入力ラインの影響2 [#m5e9ca39]

&attachref(microstrip-C.ofd);

上では厚さゼロのシート2枚で接続したが、これに厚みを持たせたところ、
さらに特性が改善した。

&ref(mslC_impedance.png,,15%);&ref(mslC_impedance2.png,,15%);
&ref(mslC_reflection.png,,15%);

&ref(mslC_smith.png,,15%);

もうインダクタンス成分はほとんど見えていないと言ってよさそう。

インピーダンスの実数成分が上がって、下がっているのはどこの影響なのか。
まだ調べ切れていない。
** トレースの厚さ [#b6f9c16c]

&attachref(microstrip-E.ofd);

トレースの厚さを 7.5 um (セル高さ込みで 15 um) にしてみたところ、インピーダンスはほぼ理論値をとった(50.21Ω @ 0.1GHz)。~
もしかすると、こちらの方が正しいのかもしれない???

&ref(mslE_impedance.png,,15%);&ref(mslE_eyz.png,,10%);

実際、始めにやったように導体厚さを 15 um に設定したとき、セル高さ込みだと 22.5 um になって、
この厚さで理論値を求めて比べるとほぼぴったり合う。

&attachref(microstrip-D.ofd);

試しに導体の厚さをゼロにしてみたところ、インピーダンスが理論値を上回った。
このときも、セル高さ 7.5 um で理論値と比べるとピッタリになる。

&ref(mslD_impedance.png,,15%);

&attachref(microstrip-F.ofd);

導体の厚さ 7.5 um (セル高さ込みで 15 um) について、周りのセルを少し細かくしてみたところ
低周波ではほんのわずかだが理論値を上回ってしまった。(50.29Ω @ 0.1GHz)
これ、セル数を増やしたおかげで計算に 1371s もかかった。

&ref(mslF_impedance.png,,15%);

ふむぅ。

* 給電点を複数置いてみた [#f9cb9f7b]

給電「点」から供給しようとするから大きなインダクタンスが問題になると考えて、
給電点を集めて給電「線」を作れないかとやってみた。

10個の0.1V 5Ω信号源を直列にすれば、長さを持つ 1V 50Ω 信号源を作れるはず!

&ref(multiple_source.png,,66%);&ref(multi1_impedance.png,,50%);

なんか、むちゃくちゃな値が出たよ?!

ええと???

efeed.c
 LANG:c
 		const int     i = Feed[ifeed].i;
 		const int     j = Feed[ifeed].j;
 		const int     k = Feed[ifeed].k;
 		const double dx = Feed[ifeed].dx;
 		const double dy = Feed[ifeed].dy;
 		const double dz = Feed[ifeed].dz;
 
 		// V
 		const double v0 = vfeed(t, Tw, Feed[ifeed].delay);
 		double v = v0 * Feed[ifeed].volt;
 
 		// E, V, I
 		double c = 0;
 		if ((Feed[ifeed].dir == 'X') &&
 		...
 		else if ((Feed[ifeed].dir == 'Y') &&
 		...
 		else if ((Feed[ifeed].dir == 'Z') &&
 		         (iMin <= i) && (i <= iMax) &&
 		         (jMin <= j) && (j <= jMax) &&
 		         (kMin <= k) && (k <  kMax)) {  // MPI
 			c = dy * (HY(i, j, k) - HY(i - 1, j,     k    ))
 			  - dx * (HX(i, j, k) - HX(i,     j - 1, k    ));
 			c /= ETA0;
 			v -= rFeed * c; // 抵抗で下がる分
 			if ((IEZ(i, j, k) == PEC) || (fabs(v0) > eps)) {
 				// 電圧かけてないときはハインピーダンスになる?
 				EZ(i, j, k) = -(real_t)(v / dz);
 			}
 		}
 
 		// V/I waveform
 		const int id = ifeed * (Solver.maxiter + 1) + itime;
 		VFeed[id] = v;
 		IFeed[id] = c;

zfeed.c
 LANG:c
 		for (int ifeed = 0; ifeed < NFeed; ifeed++) {
 			double *fv = &VFeed[ifeed * (Solver.maxiter + 1)];
 			double *fi = &IFeed[ifeed * (Solver.maxiter + 1)];
 			for (int ifreq = 0; ifreq < NFreq1; ifreq++) {
 				const int id = (ifeed * NFreq1) + ifreq;
 
 				// Zin
 				const d_complex_t vin = calcdft(Ntime, fv, Freq1[ifreq], Dt, 0);
 				const d_complex_t iin = calcdft(Ntime, fi, Freq1[ifreq], Dt, -0.5);
 				Zin[id] = d_div(vin, iin);


うーんと、ここかな?

 			if ((IEZ(i, j, k) == PEC) || (fabs(v0) > eps)) {
 				// 電圧かけてないときはハインピーダンスになる?
 				EZ(i, j, k) = -(real_t)(v / dz);
 			}

給電点には PEC を配置していないと電圧のかかっていないときにハイインピーダンスになる気がする?

給電「線」に重ねて太さゼロの PEC を配置したところ、まともになった。

&attachref(microstrip-G.ofd);

全てを足し合わせて表示したのがこのグラフ。

&ref(multi2_impedance.png,,15%);&ref(multi2_smith.png,,10%);

給電線が細い場合には、給電「線」にもインダクタンスの影響が出るようだ。

これを太くするには給電点の配置を自動化することに加えて、
vfeed や ifeed の計算で一連の給電点の結果を直列・並列して合算する機能を付け加えたくなる?

さしあたりは配置の自動化だけして、合算は後からやるか???
出力ファイルが無駄に大きくなることに目をつぶることになるけれど・・・


念のため、上記の計算結果でも給電点位置に金属を置いてみたけれど、なぜかこちらは結果が変わらなかった。
何が違うんだろう???

&attachref(microstrip-F2.ofd);

* 給電点の配置を自動化するには [#x5c82844]

- 形状は座標に沿った直方体に限る
- 直方体の範囲に入る、指定方向のエッジを検索するのは簡単
- エッジ番号ゼロと同一面内のエッジの総面積を求めれば断面積が得られる
- エッジ番号ゼロと同一線上のエッジの総延長を求めれば長さが得られる
- あとは個々のエッジについて、長さと幅から決まる電圧・抵抗などを割り当てればいい

抵抗を配置するコードをパクれば(?!)簡単そう???


* ifeed, vfeed を合算するには [#uc301c46]

vfeed, ifeed が面内や長さ方向に分布を持つ可能性があるのだろうか?
トレースが長くなれば当然ある気がしてきた。

えっと、その場合って何を求めるのが今やりたいことなんだ???

インピーダンスの合成と考えれば、長さに沿って加えたものを、幅方向に並列に接続した際の合成インピーダンスを求めるだけで良いような気がするけれど・・・

結果としてそれを求めるには、どのように ifeed, vfeed を決めればいいのか。
良く考えないとわからん???

- 長さ方向に積算した vfeed を面内で平均して vfeed を求める
- 面内に積算した ifeed を長さ方向に平均して ifeed を求める

とかでOK?

まずはオフラインで計算してみて、うまく行きそうなら計算プログラムに組み込んじゃう方向で。

* x 方向が粗すぎた [#ifa1e14d]

50 GHz だと波長が 3.25 mm しかないから、セルが 0.5 mm だとたぶん粗すぎるね。

&attachref(microstrip-E2.ofd);

0.25 mm にしてみたのがこれ。

&ref(mslE2-impedance.png,,15%);&ref(mslE2-reflection.png,,15%);

&ref(mslE2-smith.png,,15%);

思ったとおり大幅に改善した。でも計算時間も延びた。(1516s)

&attachref(microstrip-E3.ofd);

0.125 mm にしてみたのがこれ。

&ref(mslE3-impedance.png,,15%);&ref(mslE3-reflection.png,,15%);

&ref(mslE3-smith.png,,15%);

さらに理論値に近づいた。計算時間の延びはセル数比例程度。(2862s)

とはいえ自分のノートPCではそろそろつらいくらいには時間がかかるな。。。

&attachref(microstrip-E4.ofd);

さらに半分にした上で cuda を使えるマシンで動かしたところ、
点数を増やしたにもかかわらず計算時間は 1/10 以下に短くなった。すごい(語彙力

&ref(mslE4_impedance.png,,15%);

でも結果は思ったほど改善しなかった。もう X 方向だけの問題ではないのかもしれない?

* まとめ [#a6a74d20]

- 0.35 mm 幅 15 um 厚のマイクロストリップライン
- 誘電体厚 0.19 mm 誘電率 4.3
- ほぼ理論値通りの入力インピーダンスを再現できた → &ref(microstrip-E2.ofd);
- ほぼ理論値通りの入力インピーダンスを再現できた → &ref(microstrip-E3.ofd);
-- 導体厚がセルサイズと同程度になるため、正しく計算するには系に指定された実質サイズに注意が必要
-- 給電点をマイクロストリップラインに接続する配線部分が大きなインピーダンスを持ってしまわないよう注意が必要
-- 波長と比較してセルサイズを十分小さくしないと誤差が出る。高周波で長距離を計算するにはかなりの計算資源が必要になる。CUDA 環境を整えるか???

本当なら「給電点」を1つだけ配置するのではなく、
「給電点」を並べた「給電ブロック」のようなものを作って電場を導入し、
その総和としての電圧と電流で入力インピーダンスを描かせることができれば
入力部分のインピーダンスに悩まされることはなくなりそうなのだけれど・・・
現状の OpenFDTD にはそういう機能は無いようだ(?)

** やり残し [#y207cf9b]

- 高周波領域での理論値からのずれは何に起因するものか?
- もう少しメッシュを削減できないか?
- 給電点の構造を改善&簡略化できないか?

* コメント・質問 [#aca880d5]

#article_kcaptcha

Counter: 1509 (from 2010/06/03), today: 3, yesterday: 0