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.pyoutputs/ に以下が生成されます。
| ファイル | 中身 |
|---|---|
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 pytest 後 python -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 本 (最終回) です。
- 第 1 本: 90 度の角を曲がると電子は飛び出すのか
- 第 2 本: 隣の信号と GND ガード
- 第 3 本: マイコン出力の直列 R (このリポ)
MIT License. © 2026 K. NISHIMURA