Quelle longueur peuvent réellement faire les stubs quart d'onde sur les PCB ?
Utiliser une longueur de stub quart d’onde comme longueur maximale pour les stubs sur les PCB est une règle empirique courante en conception RF. Mais quelle longueur ces stubs peuvent-ils réellement faire selon les différentes fréquences et matériaux PCB ?
Ce graphique utile vous permet de décider instantanément :
Code pour générer ce tracé
Nous utilisons UliEngineering pour calculer la vitesse de propagation dans différents matériaux PCB en fonction de leur permittivité relative (epsilon r), et matplotlib pour créer le tracé :
Plot-Quarter-Wavelength-Stub-Length.py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter, LogLocator
# Imports UliEngineering
from UliEngineering.Electronics.PropagationSpeed import propagation_speed
from UliEngineering.EngineerIO import format_value
# mu_r fixe, généralement 1.0 pour les matériaux non magnétiques
mu_r = 1.0
# Plage d'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"Stratifié PTFE à très faible $\epsilon_r$", "PCB aluminium", "PCB FR4 standard"]
# Axe des fréquences : 10 MHz à 10 GHz
frequencies = np.logspace(np.log10(10e6), np.log10(10e9), num=500)
# Tracé
plt.style.use("ggplot")
fig, ax = plt.subplots(figsize=(10, 12))
# Générer les couleurs
colors = plt.cm.viridis(np.linspace(0, 1, len(ers)))
for er, c in zip(ers, colors):
v = propagation_speed(er, mu_r) # vitesse de propagation en m/s
lengths = v / (4.0 * frequencies) # quart d'onde en mètres
ax.loglog(frequencies, lengths, color=c, lw=2, label=rf"$\epsilon_r={er:.1f}$ - " + er_labels[ers.index(er)])
# Ajouter une légende contenant epsilon_r (LaTeX)
legend = ax.legend(loc='upper right', fontsize='small')
ax.set_xlabel("Fréquence")
ax.set_ylabel("Longueur λ/4")
ax.set_title("Longueur du stub λ/4 vs Fréquence")
ax.grid(True, which="both", ls="--")
# Formateurs d'axes utilisant format_value d'EngineerIO
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")))
# Activer les graduations mineures et ajouter des étiquettes de graduation mineures sur l'axe Y
ax.minorticks_on()
# Pour les axes à échelle logarithmique, s'assurer que les locateurs mineurs sont définis afin que les graduations mineures s'affichent correctement
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")))
# Style des étiquettes de graduation mineures : 30 % plus petites et gris à 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')
# Définir également les graduations mineures de l'axe X et les styliser avec des étiquettes plus petites et pivotées
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")Consultez les articles similaires par catégorie :
Electronics, Python
Si cet article vous a aidé, pensez à m'offrir un café ou à faire un don via PayPal pour soutenir la recherche et la publication de nouveaux articles sur TechOverflow