Якої довжини насправді можуть бути чвертьхвильові шлейфи на PCB?

Використання довжини чвертьхвильового шлейфа як максимальної довжини для шлейфів на PCB є поширеним практичним правилом у радіочастотному проєктуванні. Але якої довжини насправді можуть бути ці шлейфи для різних частот і матеріалів PCB?

Ця корисна діаграма дозволяє швидко прийняти рішення:

Quarter Wavelength Stub Length.svg

Код для генерації цього графіка

Ми використовуємо UliEngineering для розрахунку швидкості поширення в різних матеріалах PCB на основі їхньої відносної діелектричної проникності (epsilon r), а також matplotlib для створення графіка:

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

# Імпорти UliEngineering
from UliEngineering.Electronics.PropagationSpeed import propagation_speed
from UliEngineering.EngineerIO import format_value

# Фіксоване mu_r, зазвичай 1.0 для немагнітних матеріалів
mu_r = 1.0

# Діапазон 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"]

# Вісь частот: від 10 МГц до 10 ГГц
frequencies = np.logspace(np.log10(10e6), np.log10(10e9), num=500)

# Побудова графіка
plt.style.use("ggplot")
fig, ax = plt.subplots(figsize=(10, 12))

# Генерація кольорів
colors = plt.cm.viridis(np.linspace(0, 1, len(ers)))

for er, c in zip(ers, colors):
    v = propagation_speed(er, mu_r)  # швидкість поширення в м/с
    lengths = v / (4.0 * frequencies)  # чверть довжини хвилі в метрах
    ax.loglog(frequencies, lengths, color=c, lw=2, label=rf"$\epsilon_r={er:.1f}$ - " + er_labels[ers.index(er)])

# Додати легенду, що містить epsilon_r (LaTeX)
legend = ax.legend(loc='upper right', fontsize='small')

ax.set_xlabel("Частота")
ax.set_ylabel("Довжина λ/4")
ax.set_title("Довжина шлейфа λ/4 залежно від частоти")
ax.grid(True, which="both", ls="--")

# Форматувальники осей з використанням 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")))
# Увімкнути другорядні поділки та додати другорядні підписи на осі Y
ax.minorticks_on()
# Для осей з логарифмічною шкалою переконатися, що другорядні локатори встановлені, щоб другорядні поділки відображалися коректно
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")))
# Стилізувати другорядні підписи: на 30% менші та 70% сірі
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')
# Також встановити другорядні поділки на осі X і стилізувати їх меншими повернутими підписами
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")

Дивіться схожі статті за категоріями: Electronics, Python