マイクロストリップライン

(541d) 更新


ソフトウェア/OpenFDTD

概要

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

計算による設計

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

impedance_theory.png

入力インピーダンスの特性:

  • 周波数に依存して変わる
  • 高周波数では徐々に増加する

に注意が必要。

本家の MSL.ofd

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

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

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

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

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

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

以下これを見る。

サイズを合わせ、メッシュを細かくした

mslA_repetition.png

filemicrostrip-A.ofd

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

=== cpu time [sec] ===

part-1 : 859.429

part-2 : 0.209

--------------------

total : 859.638

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

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

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

input_structure.png

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

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

mslA_impedance.pngmslA_impedance2.png

mslA_impedance3.pngmslA_reflectance.png

mslA_smith.png

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

とはいえ、

周波数理論値計算値
0.1GHz50.24Ω49.69Ω
10GHz50.55Ω50.17Ω

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

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

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

mslA_yz2.pngmslA_yz3.png

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

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

mslA_xy.pngmslA_zx.pngmlsA_yz.png

入力ラインの影響1

filemicrostrip-B.ofd

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

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

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

mslB_input_structure.png

mslB_impedance.pngmslB_reflection.png

mslB_smith.png

mslB_zx.pngmlsB_yz.png

入力ラインの影響2

filemicrostrip-C.ofd

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

mslC_impedance.pngmslC_impedance2.png mslC_reflection.png

mslC_smith.png

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

インピーダンスの実数成分が上がって、下がっているのはどこの影響なのか。 まだ調べ切れていない。

トレースの厚さ

filemicrostrip-E.ofd

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

mslE_impedance.pngmslE_eyz.png

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

filemicrostrip-D.ofd

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

mslD_impedance.png

filemicrostrip-F.ofd

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

mslF_impedance.png

ふむぅ。

給電点を複数置いてみた

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

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

multiple_source.pngmulti1_impedance.png

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

ええと???

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 を配置したところ、まともになった。

filemicrostrip-G.ofd

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

multi2_impedance.pngmulti2_smith.png

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

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

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

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

filemicrostrip-F2.ofd

給電点の配置を自動化するには

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

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

ifeed, vfeed を合算するには

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

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

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

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

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

とかでOK?

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

x 方向が粗すぎた

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

filemicrostrip-E2.ofd

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

mslE2-impedance.pngmslE2-reflection.png

mslE2-smith.png

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

filemicrostrip-E3.ofd

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

mslE3-impedance.pngmslE3-reflection.png

mslE3-smith.png

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

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

filemicrostrip-E4.ofd

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

mslE4_impedance.png

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

まとめ

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

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

やり残し

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

コメント・質問





添付ファイル: filemslE4_impedance.png 122件 [詳細] filemicrostrip-E4.ofd 135件 [詳細] filemslE3-smith.png 127件 [詳細] filemslE3-reflection.png 121件 [詳細] filemslE3-impedance.png 125件 [詳細] filemicrostrip-E3.ofd 151件 [詳細] filemicrostrip-E2.ofd 127件 [詳細] filemslE2-smith.png 124件 [詳細] filemslE2-reflection.png 122件 [詳細] filemslE2-impedance.png 113件 [詳細] filemicrostrip-F2.ofd 130件 [詳細] filemicrostrip-G.ofd 135件 [詳細] filemulti2_smith.png 132件 [詳細] filemulti2_impedance.png 121件 [詳細] filemulti1_impedance.png 114件 [詳細] filemultiple_source.png 124件 [詳細] fileimpedance_theory.png 122件 [詳細] filemslF_impedance.png 125件 [詳細] filemicrostrip-F.ofd 137件 [詳細] filemslE_eyz.png 141件 [詳細] filemicrostrip-D.ofd 126件 [詳細] filemicrostrip-E.ofd 151件 [詳細] filemslE_impedance.png 140件 [詳細] filemslD_impedance.png 135件 [詳細] filemicrostrip-C.ofd 141件 [詳細] filemslC_smith.png 132件 [詳細] filemslC_reflection.png 131件 [詳細] filemslC_impedance2.png 131件 [詳細] filemslC_impedance.png 133件 [詳細] filemslB_zx.png 126件 [詳細] filemlsB_yz.png 125件 [詳細] filemicrostrip-B.ofd 140件 [詳細] filemslB_input_structure.png 117件 [詳細] filemslB_smith.png 113件 [詳細] filemslB_reflection.png 121件 [詳細] filemslB_impedance.png 112件 [詳細] filemslA_yz2.png 121件 [詳細] filemslA_yz3.png 113件 [詳細] filemlsA_yz.png 119件 [詳細] filemslA_zx.png 118件 [詳細] filemslA_xy.png 134件 [詳細] filemslA_reflectance.png 130件 [詳細] filemslA_impedance3.png 108件 [詳細] filemslA_smith.png 120件 [詳細] filemslA_repetition.png 115件 [詳細] filemicrostrip-A.ofd 146件 [詳細] filemslA_impedance2.png 119件 [詳細] filemslA_impedance.png 121件 [詳細] fileinput_structure.png 139件 [詳細]

Counter: 1467 (from 2010/06/03), today: 1, yesterday: 4