Fix the RF launch: relieve the planes under J2 and put the ESD on the line
The 0.164/0.200 CPWG geometry was fine; the calculation just stopped at the trace and never covered the connector launch, which is where the real discontinuity was. J2's centre land is 1.5 mm wide because that is what the connector's centre pin needs mechanically. Sitting on solid L2_GND only 0.0994 mm below, that land is a 10.7 ohm transmission line, not a 50 ohm one. The 1.84 mm of it over the plane is 6.7 degrees at L1 and reflects 12 dB (VSWR 1.67) - by far the worst discontinuity in the chain, and worse than everything the carefully built 0.164 mm line downstream avoids. RF_LAUNCH_RELIEF voids L2_GND and L3_SIG under the land, (172.35, 40.95) to (175.10, 43.05). The reference drops to L4_PWR - VCC3V0_RF, an AC ground - 0.587 mm below, which raises the launch to 37 ohm and 30 dB. L3 carried no pour and no copper there, so only L2 actually had to go; the area covers L3 as well so a later edit cannot fill the gap back in. It stops where the land ends and the 0.164 mm line begins, verified: L2 GND is absent across the whole land and present again at x = 172.0 and inboard. D1's ESD clamp sat at the end of a 1.34 mm spur, where its 0.3 pF presented -j228 ohm and cost 3.4 dB for nothing. D1 is rotated onto the run at (171.30, 42.416) so pad 1 overlaps the line directly and pad 2 lands in the RF ground pour; the spur is deleted. Return loss, worst term first: SMA launch land 12.0 -> 30.0 dB (10.7 -> 37.0 ohm) D1 ESD clamp 19.2 -> 22.6 dB (now just the part's own 0.3 pF) C85 DNP tuning stub 25.5 dB unchanged, intentional provision C84 DNP land in line 30.1 dB unchanged, negligible worst-case coherent 7.0 -> 14.4 dB The dominant term is now a component choice rather than a layout defect. Verified: ERC 0/0, DRC 0 violations, 0 unconnected, every net one copper group, parity unchanged at the 402 pre-existing warnings, RF still 10 segments all on F.Cu at exactly 0.164 mm. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012KaTmCCxCEW4awsmXRNT1d
This commit is contained in:
@@ -141,8 +141,9 @@ def route_rf(board: pcbnew.BOARD) -> None:
|
||||
dc_block_1 = pad_xy(board, "C83", "1")
|
||||
l4_2 = pad_xy(board, "L4", "2")
|
||||
add_polyline(board, "RF_SMA", [j2_inner, (170.10, 42.09), l4_2, dc_block_1], w)
|
||||
d1 = pad_xy(board, "D1", "1")
|
||||
add_polyline(board, "RF_SMA", [d1, (d1[0], 42.09)], w)
|
||||
# D1 sits directly on the 50-ohm line: its pad 1 overlaps the run above,
|
||||
# so no spur is drawn. On a 1.34-mm stub the 0.3-pF clamp presented
|
||||
# -j228 ohm at L1 and cost 3.4 dB of return loss for nothing.
|
||||
|
||||
add_polyline(board, "RF_PRE_SAW",
|
||||
[pad_xy(board, "C83", "2"), pad_xy(board, "FL1", "1")], w)
|
||||
@@ -433,6 +434,42 @@ def add_named_rule_areas(board: pcbnew.BOARD) -> None:
|
||||
board.Add(area)
|
||||
|
||||
|
||||
def add_rf_launch_relief(board: pcbnew.BOARD) -> None:
|
||||
"""Void the reference planes under the SMA edge-launch pad.
|
||||
|
||||
J2's centre land is 1.5 mm wide because that is what the connector's
|
||||
centre pin needs mechanically, but 1.5 mm of copper 0.0994 mm above a
|
||||
solid L2_GND is a 10.7-ohm transmission line, not a 50-ohm one. The
|
||||
1.84 mm of it that sits over the plane is 6.7 degrees long at L1 and
|
||||
reflects 12 dB - by far the worst discontinuity in the RF path, and worse
|
||||
than everything the 0.164-mm line downstream is carefully built to avoid.
|
||||
|
||||
Removing the plane under the land moves its reference down to L4_PWR
|
||||
(VCC3V0_RF, an AC ground) 0.587 mm below, which raises the launch to about
|
||||
37 ohms and 30 dB. L3_SIG carries no pour and no copper here, so this
|
||||
only has to void L2; the area covers L3 as well so a later edit cannot
|
||||
fill the gap back in. It stops at x = 172.35, where the land ends and the
|
||||
0.164-mm line begins, so the line keeps its own L2 reference.
|
||||
"""
|
||||
relief = pcbnew.LSET()
|
||||
for layer in (pcbnew.In1_Cu, pcbnew.In2_Cu): # L2_GND, L3_SIG
|
||||
relief.AddLayer(layer)
|
||||
area = pcbnew.ZONE(board)
|
||||
area.SetZoneName("RF_LAUNCH_RELIEF")
|
||||
area.SetIsRuleArea(True)
|
||||
area.SetLayerSet(relief)
|
||||
area.SetDoNotAllowTracks(True)
|
||||
area.SetDoNotAllowVias(True)
|
||||
area.SetDoNotAllowZoneFills(True)
|
||||
area.SetDoNotAllowPads(False)
|
||||
area.SetDoNotAllowFootprints(False)
|
||||
outline = area.Outline()
|
||||
outline.NewOutline()
|
||||
for x, y in ((172.35, 40.95), (175.10, 40.95), (175.10, 43.05), (172.35, 43.05)):
|
||||
outline.Append(point(x, y))
|
||||
board.Add(area)
|
||||
|
||||
|
||||
def routed_lengths(board: pcbnew.BOARD) -> dict[str, float]:
|
||||
totals = {net: 0.0 for net in CRITICAL_NETS}
|
||||
for item in board.GetTracks():
|
||||
@@ -473,6 +510,7 @@ def main() -> None:
|
||||
route_rf(board)
|
||||
route_usb(board)
|
||||
add_rf_ground(board)
|
||||
add_rf_launch_relief(board)
|
||||
add_named_rule_areas(board)
|
||||
|
||||
# The reserved RF and USB corridors are gone now, so the power pads that
|
||||
|
||||
Reference in New Issue
Block a user