Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

lab-pcb-series-resistor

PCB の「マイコン出力に直列 R を入れる」を、自作の小さな 1D 伝送線シミュレータ (telegrapher's equation を Yee 風に時間離散化したもの) で見てみる実験ノートです。

電源と負荷の間に線路 1 本だけがある、極めて単純な 1 次元モデルでも、

  • マイコン直近に R を置くと反射波がきれいに収まる
  • R の前と後で観測波形がはっきり違う (半分ステップ)
  • R を末端に置くと、マイコン側の不整合は全然改善されない
  • R の値が小さすぎても大きすぎてもダメ

くらいの話は絵で見えます。

連作シリーズ lab-pcb-physics の第 3 本 (最終回) です。第 1 本 lab-pcb-fdtd-corners で 90 度コーナーの都市伝説を、第 2 本 lab-pcb-crosstalk-guard で隣の信号とのカブり + GND ガード を確かめました。

何を確かめる

  • R なしのとき、マイコン側と線路側にどんな波形が出るか
  • R を MCU 直近 / 線路の中間 / 末端 に置くと、それぞれどう変わるか
  • R = 10Ω / 30Ω / 100Ω で挙動はどう変わるか

動かす

Python 3.11+ と uv (または pip) があれば手元で動きます。実機・有償ツール不要。

git clone https://github.com/logicia32/lab-pcb-series-resistor
cd lab-pcb-series-resistor
uv sync     # または: pip install -e .

# 6 通り走らせて PNG / GIF / time-series を保存
python scripts/run_series_r.py

outputs/ に以下が生成されます。

ファイル 中身
wave_no_r.png R なしのとき、3 観測点の電圧波形
wave_r_close.png R = 30Ω を MCU 直近に置いたときの波形
wave_r_middle.png R = 30Ω を線路中間に置いたときの波形
wave_r_far.png R = 30Ω を末端に置いたときの波形
compare_position.png 4 通りの位置を線路側で並べた比較図
compare_value.png R = 10 / 30 / 100Ω の値違い比較
half_step_zoom.png 「半分ステップ」拡大図 (R=30Ω 直近)
ez_propagation.gif 線路上の電圧分布 V(x) の時間発展アニメ
coupling_summary.txt 各シナリオのオーバーシュート / 収束時間

ベンチ目安: ノート PC (Intel Core i5 相当) で 1 分かかりません。

結果 (手元での計測値)

Vdd = 3.3V を基準にした、4 通りの R 位置でのオーバーシュート量です。

R の位置 マイコン側 OS 負荷端 OS 負荷端 収束時間
なし +11.9% +42.4% 9.7 ns
マイコン直近 0.0% 0.0% 1.4 ns
線路中間 +4.7% +23.6% 6.7 ns
末端 +11.9% +42.4% 9.7 ns

末端と「なし」がほぼ同じ数字に並ぶのが、シリーズ全体の主張 「マイコン側の不整合は、マイコン側で吸わないと取れない」の証拠です。

物理モデル

線路は 1 次元の telegrapher's equation を Yee 風に時間離散化した leapfrog 更新で解いています。

V at integer nodes 0..N
I at half-integer nodes 0.5..(N-0.5)

I^{n+1/2}_{i+1/2} = I^{n-1/2}_{i+1/2} - (dt/(L dx)) * (V^n_{i+1} - V^n_i)
V^{n+1}_i        = V^n_i             - (dt/(C dx)) * (I^{n+1/2}_{i+1/2}
                                                    - I^{n+1/2}_{i-1/2})

境界は次のとおりです。

  • マイコン側: 電圧源 + 直列内部インピーダンス (Zs だけ、あるいは Zs + R の合計)。半セル積分の implicit BC で安定化。
  • 負荷側: 高インピーダンス純抵抗 (CMOS 入力近似、RL = 10 kΩ)。同じく implicit BC。
  • R が線路の中間 ("middle") のときは、ローカルセルで Crank-Nicolson 風に R 項を陰的に扱って、R 値に依らず数値的に安定。

構造

src/
  tline.py             # 1D telegrapher solver と Scenario 定義
scripts/
  run_series_r.py      # 4 + 3 通りのシナリオを走らせて PNG / GIF / summary を保存
tests/
  test_tline.py        # 解析的に分かる値 (1.65V / 2.64V 等) との比較を含む 8 件

テストは pytest で走ります (pip install pytestpython -m pytest tests/)。 特に test_close_r_initial_voltage_division は、R = 30Ω を MCU 直近に置いた ときに線路入口に 1.65V (ちょうど Vdd / 2)、MCU ピン側に 2.64V のステップが 立つことを直接チェックします。

正直に書いておく限界

  • 1D シミュです。 線路を「特性インピーダンス Z0、伝搬速度 v の細い 1 次元」 として扱っています。実機のように層構造があったり、隣の配線とカブったり する効果は入っていません (カブりは連作の第 2 本で扱いました)。
  • 損失は控えめにしか入れていません。 銅損・誘電損は別物として扱う必要が あります。
  • マイコン出力モデル は「理想電圧源 + 直列 Zs」の素朴な等価回路です。 実 IC のドライバ強度プロファイルや、電源変動の影響は入っていません。
  • 負荷は CMOS 入力近似の高インピーダンス純抵抗 (10 kΩ) です。実機の CMOS 入力は数 pF の入力容量を持つので、短時間ではエッジが少し丸まります。 LED 直駆動のような低インピーダンス負荷では波形の挙動はかなり変わります。
  • 実機計測 (オシロでの実波形) はこのリポジトリには含めていません。 シミュ主体の実験ノートです。

関連記事

Zenn に解説記事を書いています (公開後リンクを追記します)。 連作シリーズ lab-pcb-physics の第 3 本 (最終回) です。

ライセンス

MIT License. © 2026 K. NISHIMURA

About

1D telegrapher's-equation experiment: source-series-termination resistor on a microcontroller output. Third book of lab-pcb-physics.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages