¿Cuánto pueden medir realmente los stubs de cuarto de longitud de onda en los PCBs?

Usar una longitud de stub de cuarto de longitud de onda como longitud máxima para los stubs en los PCBs es una regla general común en el diseño de RF. Pero, ¿cuánto pueden medir realmente estos stubs en diferentes frecuencias y materiales de PCB?

Este gráfico útil le permite decidir al instante:

Quarter Wavelength Stub Length.svg

Código para generar este gráfico

Usamos UliEngineering para calcular la velocidad de propagación en diferentes materiales de PCB basándose en su permitividad relativa (epsilon r), y matplotlib para crear el gráfico:

Plot-Quarter-Wavelength-Stub-Length.py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter, LogLocator

# Importaciones de UliEngineering
from UliEngineering.Electronics.PropagationSpeed import propagation_speed
from UliEngineering.EngineerIO import format_value

# mu_r fijo, normalmente 1.0 para materiales no magnéticos
mu_r = 1.0

# Rango de Epsilon_r - https://techoverflow.net/2025/11/18/relative-permittivity-epsilon-r-of-different-pcb-materials-collection/
ers = [2.14, 4.2, 4.8]
er_labels = [r"Ultra-low $\epsilon_r$ PTFE laminate", "Aluminium PCB", "Standard FR4 PCB"]

# Eje de frecuencias: 10 MHz a 10 GHz
frequencies = np.logspace(np.log10(10e6), np.log10(10e9), num=500)

# Graficación
plt.style.use("ggplot")
fig, ax = plt.subplots(figsize=(10, 12))

# Generar colores
colors = plt.cm.viridis(np.linspace(0, 1, len(ers)))

for er, c in zip(ers, colors):
    v = propagation_speed(er, mu_r)  # velocidad de propagación en m/s
    lengths = v / (4.0 * frequencies)  # cuarto de longitud de onda en metros
    ax.loglog(frequencies, lengths, color=c, lw=2, label=rf"$\epsilon_r={er:.1f}$ - " + er_labels[ers.index(er)])

# Añadir una leyenda que contenga epsilon_r (LaTeX)
legend = ax.legend(loc='upper right', fontsize='small')

ax.set_xlabel("Frequency")
ax.set_ylabel("λ/4 length")
ax.set_title("λ/4 stub length vs Frequency")
ax.grid(True, which="both", ls="--")

# Formateadores de ejes usando EngineerIO format_value
ax.xaxis.set_major_formatter(FuncFormatter(lambda x, pos: format_value(x, "Hz")))
ax.yaxis.set_major_formatter(FuncFormatter(lambda y, pos: format_value(y, "m")))
# Habilitar marcas menores y añadir etiquetas de marcas menores en el eje Y
ax.minorticks_on()
# Para ejes de escala logarítmica, asegurar que los localizadores menores estén configurados para que las marcas menores se muestren correctamente
ax.yaxis.set_minor_locator(LogLocator(base=10.0, subs=(2,3,4,5,6,7,8,9)))
ax.yaxis.set_minor_formatter(FuncFormatter(lambda y, pos: format_value(y, "m")))
# Estilizar etiquetas de marcas menores: 30% más pequeñas y 70% gris
maj_ylabels = ax.yaxis.get_ticklabels(which='major')
if len(maj_ylabels) > 0:
    base_size = maj_ylabels[0].get_size()
else:
    base_size = plt.rcParams.get('ytick.labelsize', plt.rcParams.get('font.size', 10))
ax.tick_params(axis='y', which='minor', labelsize=base_size * 0.7, labelcolor='0.7', colors='0.7')
# También configurar las marcas menores del eje X y estilizarlas con etiquetas más pequeñas rotadas
ax.xaxis.set_minor_locator(LogLocator(base=10.0, subs=(2,3,4,5,6,7,8,9)))
ax.xaxis.set_minor_formatter(FuncFormatter(lambda x, pos: format_value(x, "Hz")))
maj_xlabels = ax.xaxis.get_ticklabels(which='major')
if len(maj_xlabels) > 0:
    base_x_size = maj_xlabels[0].get_size()
else:
    base_x_size = plt.rcParams.get('xtick.labelsize', plt.rcParams.get('font.size', 10))
ax.tick_params(axis='x', which='minor', labelsize=base_x_size * 0.7, labelcolor='0.7', colors='0.7')
for tl in ax.get_xminorticklabels():
    tl.set_rotation(90)
for tl in ax.get_xmajorticklabels():
    tl.set_rotation(90)

fig.tight_layout()
plt.savefig("Quarter-Wavelength-Stub-Length.svg")

Echa un vistazo a artículos similares por categoría: Electronics, Python