マイコン出力の R は、なぜ「直近」に置くのか — 1D 伝送線シミュで反射を観察する
- pcb
- python
- signalintegrity
- 電子工作
- マイコン
はじめに
マイコンの出力ピンと、その先のセンサや LED の間に、20Ω や 33Ω くらいの直列抵抗を入れている回路図を見たことはありますか。
データシートにも「出力に直列抵抗を入れることを推奨します」とサラッと書いてあったりして、入門書では理由まで踏み込まないことが多いです。実際、私も最初に組んだ STM32 の基板では、何となく「テンプレだから入れる」だけで、なぜ入れるのか、どこに置けばいいのかは、よく分かっていませんでした。
この記事では、その「直列 R」の意味を、200 行くらいの小さな 1D 伝送線シミュレータで見てみます。電源と負荷の間に線路 1 本だけがある、極めて単純なモデルです。それでも、
- なぜ「マイコン直近」に R を置くのが定番なのか
- R の前と後で、波形がどれくらい違うのか
- R を末端に置くと、なぜ効果が薄いのか
くらいの疑問は、絵で見て分かります。

連作シリーズ lab-pcb-physics の第 3 本(最終回)です。
- 第 1 本: 90 度の角を曲がると電子は飛び出すのか
- 第 2 本: 隣の信号と GND ガード
- 第 3 本: 直列 R の置き場所(この記事)
何を確かめる
整理しておきます。
- R なしのとき、マイコン側と線路側はどんな波形になるか
- R をマイコン直近 / 線路の真ん中 / 末端 に置くと、それぞれどう変わるか
- R の値が小さすぎる / ぴったり / 大きすぎる、で何が起きるか
シミュレータは、線路を 1 次元の格子で離散化した telegrapher's equation の time-stepping です。L と C を per-unit-length で与えて、∂V/∂x = -L ∂I/∂t, ∂I/∂x = -C ∂V/∂t を素直に解くだけ。境界条件としてマイコン側に「電圧源 + Zs + R」、線路末端に「負荷 RL」を置きます。
| パラメータ | 値 | 意味 |
|---|---|---|
| 線路長 | 30 cm | 基板の長辺くらい |
| Z0 | 50Ω | 標準的なシングルエンド配線 |
| 伝搬速度 v | 2×10⁸ m/s | FR-4 の典型値 |
| Vdd | 3.3V | マイコン電源 |
| Zs (マイコン出力) | 20Ω | データシート典型値 |
| 立ち上がり時間 | 1 ns | 急峻なディジタル出力 |
| 線路往復時間 | 3 ns | 立ち上がりより長い → 反射が見える条件 |
動かす
git clone https://github.com/logicia32/lab-pcb-series-resistor
cd lab-pcb-series-resistor
uv sync # または: pip install -e .
python scripts/run_series_r.py
outputs/ に以下が出ます。
| ファイル | 中身 |
|---|---|
wave_no_r.png |
R なし、マイコン側 + 線路側の波形 |
wave_r_close.png |
R を直近に置いたときの波形 |
wave_r_middle.png |
R を線路中間に置いたときの波形 |
wave_r_far.png |
R を末端に置いたときの波形 |
compare_position.png |
4 通りの線路側波形を重ねた図 |
compare_value.png |
R の値を変えた 3 通りの比較 |
half_step_zoom.png |
「半分ステップ」現象の拡大図 |
ez_propagation.gif |
パルスが線路上を伝搬・反射するアニメ |
ベンチ目安: ノート PC で 1 分かかりません。
結果 1: R なし — マイコン側にリンギング
派手にリンギングします。マイコンの出力インピーダンス Zs ≒ 20Ω と、線路の Z0 ≒ 50Ω が不整合なので、線路の端で跳ね返った波がマイコン側でまた跳ね返り、何往復もしているのが見えます。

反射係数 Γ = (Z₁ − Z₂) / (Z₁ + Z₂) を素朴に当てると:
| 接続点 | 反射係数 Γ |
|---|---|
| マイコン側 (Z0=50Ω → Zs=20Ω) | (20−50)/(20+50) ≒ −0.43 |
| 線路末端 (Z0=50Ω → RL=10kΩ ≒ 開放) | ≒ +1.0 |
末端でほぼ完全に反射し、戻った波の 4 割強がマイコン側でまた反射、というループが続いています。
立ち上がり時間 1 ns に対して線路の往復時間 3 ns。立ち上がりより往復のほうが長いので、リンギングがしっかり観測できる条件です。
このリンギングは見た目だけの問題ではありません。下振れが受信側のしきい値をまたぐと「0 と 1 が 2 回送られてきた」と誤判定されるダブルクロッキングを起こしますし、無駄な高周波成分は EMI やクロストークの源にもなります。「とりあえず R 入れとけ」と言われる動機は、ここにあります。
結果 2: R をマイコン直近に — きれいに収まる
R = 30Ω を出力ピンの直近に入れると、Zs + R ≒ 50Ω で線路と整合がとれて、戻ってきた反射波がマイコン側で吸収されます。線路側のリンギングは 1 往復でほぼ収束する形に変わりました。

時間軸の波形だけだと「線路の中で何が起きてるか」がイメージしづらいので、線路上の電圧分布 V(x) を時間で動かしたアニメーションも添えておきます。

ただし、ここで面白いのが 線路の入り口で「ちょうど半分の高さで一瞬止まるステップ」が現れる ことです。
これはバグではなく、分圧の効果です。立ち上がり直後、波はまだ線路の端まで届いていないので、回路全体は Zs + R + Z0 の直列で電圧が分圧された状態になります。観測点ごとに、見える電圧はこう変わります:
- マイコンピン (R の手前):
(R + Z0) / (Zs + R + Z0) × 3.3V = 80/100 × 3.3V ≒ 2.64V - R の直後 (線路の入り口):
Z0 / (Zs + R + Z0) × 3.3V = 50/100 × 3.3V ≒ 1.65V(ちょうど半分)
負荷端 (線路末端) では、到達した 1.65V の入射波が開放端でほぼ同じ大きさだけ反射するため、入射波と反射波が同じ瞬間に重なって、最初の到達時に一気に Vdd 近くまで上がります。一方、線路入口や R の手前では、戻ってきた反射波が到達する往復 3 ns 後まで、初期ステップの電圧で止まったままです。これが源端終端の教科書的な「片方は階段、もう片方はほぼ一段で立ち上がる」波形です。

シミュ結果でも、ぴったり同じ波形が出てきます。MCU ピン側は 2.64V でしばらく止まり、R の直後は 1.65V でしばらく止まり、負荷端は階段なしでほぼ直に Vdd に到達しています。

つまり R の手前か後ろか、どこにオシロを当てたかで見える電圧は違いますが、いずれも階段状になるのは源端終端で期待される挙動の一つ です。ここを「波形がおかしい」と早合点して R を外すと、線路側でリンギングする元の状態に戻ってしまいます。
なお、もっとも単純な「末端終端 (parallel termination)」として線路の末端側に 50Ω 抵抗を GND との間に入れる方法でも反射は防げますが、定常時に 3.3V / 50Ω = 66 mA が流れ続けます。マイコン GPIO の駆動能力 (典型 20〜25 mA) を超えやすく、消費電力面でも不利です。CMOS 信号で源端終端 (直列 R) が好まれるのは、定常電流がゼロで済むためです (Thevenin 終端や AC 終端で消費電力を抑える派生形もありますが、ここでは話を絞ります)。
結果 3: R の位置を変えると…
R の値は同じ 30Ω のまま、置き場所だけ変えてみます。
| R の位置 | マイコン側 オーバーシュート | 負荷端 オーバーシュート | 負荷端 収束時間 |
|---|---|---|---|
| なし | +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 |
(収束時間は「Vdd ±5% の範囲に最後に入った時刻」。立ち上がり完了からの相対値です)
「なし」と「末端」が完全に同じ数字なのは、シミュのバグではありません。今回の負荷は 10kΩ と十分高く、そこに 30Ω を直列で足しても RL ≒ 開放 という条件はほぼ変わらないので、源端側から見た Zs=20Ω と Z0=50Ω の不整合がそのまま残り、結果も同じになります。これがそのまま「R を末端に置いても源端の反射は消えない」の証拠です。

直近 → 中間 → 末端と R が離れるほど、マイコン側のリンギングが復活してきます。理由はシンプルで、R までの区間が Zs vs Z0 の不整合のまま残っているからです。マイコンから R までの距離を波が往復する時間が、立ち上がり時間より長くなった瞬間に、その区間でリンギングが見えるようになります。
R を末端に置いた場合は、今回のような高インピーダンス負荷では「直結 + 開放端負荷」とほぼ同じになってしまって、マイコン側の不整合は改善されません。
これが 「直列 R はマイコン直近に置け」と教科書に書いてある物理的な根拠 です。「直近」というのは曖昧な表現に聞こえますが、目安として「R までの往復時間 < 立ち上がり時間」を保てる距離、と考えると分かりやすいです。
結果 4: R の値を変えると
直近に置いたまま、値だけ変えてみます。
R = 10Ω:Zs + R = 30Ω、線路 50Ω に対して不足整合 → 軽いリンギング残りR = 30Ω:Zs + R = 50Ω、ちょうど整合 → 一番きれいR = 100Ω:Zs + R = 120Ω、過剰 → リンギングは消えるが、立ち上がりが鈍る。初期に線路へ入る電圧が50/(20+100+50) × 3.3V ≒ 0.97Vまで下がり、負荷端でも最初は約 1.94V までしか上がりません。反射が戻ってくるまで受信側のしきい値に届かず、エッジが遅延して見えます

「線路と整合する値」が存在することと、その上下で挙動が違うこと、が見えます。実機では Zs がデータシートに幅をもって書かれているので、ピッタリにはなりませんが、おおよそ近づければ十分です。
正直に書いておく限界
- 1D シミュです。線路を「特性インピーダンス Z0、伝搬速度 v の細い 1 次元」として扱っています。今回は配線 1 本の反射に注目するため、前 2 本の 2D FDTD より単純な 1D モデルに落としました。実機のように層構造があったり、隣の配線とカブったりする効果は入っていません(カブりは第 2 本で扱いました)。
- 損失は控えめに入れていますが、現実の銅損・誘電損とは合っていません。傾向比較を主目的としてください。
- マイコン出力モデルは「理想電圧源 + 直列 Zs」の素朴な等価回路です。データシートの実際のドライバ強度プロファイルとは厳密には違います。
- 受信側 (負荷) は CMOS 入力のような高インピーダンス純抵抗 (RL = 10 kΩ ≒ 開放) を仮定しています。実機の CMOS 入力は純抵抗ではなく数 pF の入力容量も持つので、短時間ではエッジが少し丸まります。LED を直接駆動するような低インピーダンス負荷の場合、波形の挙動はかなり変わります。
- 実機計測(オシロでの実波形)はこのリポジトリには含めていません。シミュ主体の実験ノートです。
連作シリーズの締めくくり
lab-pcb-physics 連作はこの第 3 本で一区切りです。
- 第 1 本(コーナー): PCB は曲げ方より、不連続箇所での反射が効く
- 第 2 本(クロストーク + GND): 隣の信号は本当にカブる、GND の縫い方で抑えられる
- 第 3 本(直列 R): マイコン出力に R を入れる物理的な意味、置き場所が効く理由
通して見えるのは、「PCB 上の高速信号の振る舞いは、ほぼ全て『波の反射と結合』で説明できる」 ということです (電源デカップリングや熱は別の物語ですが)。

昔、私がマイコン基板でリンギングに悩まされた頃は、「とりあえず R 入れとけ」「とりあえずベタ GND」みたいな魔法のおまじないとして覚えていました。でも、実際に小さなシミュを書いて手を動かしてみると、「なぜ」が少しずつ自分の言葉になっていきます。同じ場所で詰まっている誰かに、この連作が「絵で見て理解する」きっかけになれば嬉しいです。
ここまで読んでくださった方、ありがとうございました。次は別のテーマで、また何か作ります。
この記事は Zenn に初出したものを加筆・補足したものです ── Zenn の元記事を見る