Modèles de diode simple et Shockley : comparaison pour la charge d'un condensateur en Python avec UliEngineering

Vous pouvez facilement comparer un modèle de diode à chute de tension constante simple avec un modèle de diode de Shockley pour la charge d’un condensateur à l’aide de la bibliothèque Python UliEngineering.

Dans cet exemple, le modèle simple est ajusté au modèle de Shockley à un courant de référence de 10mA. Le sous-graphique du haut montre la tension absolue du condensateur pendant la charge, et le sous-graphique du bas montre la différence Shockley - simple.

compare_diode_models_for_capacitor_charging.py
from UliEngineering.Electronics.Capacitors import capacitor_resistor_charge_time
from UliEngineering.Electronics.Diode import *
import matplotlib.pyplot as plt
import numpy as np

plt.style.use('ggplot')

SOURCE_VOLTAGE = 5.0
CAPACITANCE = 100e-6
RESISTANCE = 470.0
REFERENCE_CURRENT = 10e-3


def build_models(simple_drop, ideality_factor):
  saturation_current = shockley_diode_saturation_current(
    simple_drop,
    REFERENCE_CURRENT,
    ideality_factor=ideality_factor,
  )
  return (
    SimpleDiodeModel(simple_drop),
    ShockleyDiodeModel(saturation_current, ideality_factor=ideality_factor),
  )


def charge_curves(simple_model, shockley_model):
  max_voltage = (SOURCE_VOLTAGE - simple_model.minimum_series_voltage()) * 0.999
  voltage_grid = np.linspace(0.0, max_voltage, 1200)

  simple_times = capacitor_resistor_charge_time(
    CAPACITANCE,
    RESISTANCE,
    SOURCE_VOLTAGE,
    voltage_grid,
    initial_voltage=0.0,
    diode_model=simple_model,
  )
  shockley_times = capacitor_resistor_charge_time(
    CAPACITANCE,
    RESISTANCE,
    SOURCE_VOLTAGE,
    voltage_grid,
    initial_voltage=0.0,
    diode_model=shockley_model,
  )

  common_time = np.linspace(0.0, max(simple_times[-1], shockley_times[-1]), 1200)
  simple_voltage = np.interp(common_time, simple_times, voltage_grid)
  shockley_voltage = np.interp(common_time, shockley_times, voltage_grid)
  return common_time, simple_voltage, shockley_voltage


def render_plot(title, simple_model, shockley_model, outfile):
  time_axis, simple_voltage, shockley_voltage = charge_curves(simple_model, shockley_model)
  difference = shockley_voltage - simple_voltage

  fig, axes = plt.subplots(2, 1, figsize=(7, 6), sharex=True)
  axes[0].plot(time_axis * 1000.0, simple_voltage, label='Modèle de diode simple', linewidth=2)
  axes[0].plot(time_axis * 1000.0, shockley_voltage, label='Modèle de diode de Shockley', linewidth=2)
  axes[0].set_ylabel('Tension du condensateur (V)')
  axes[0].set_title(title)
  axes[0].legend(loc='lower right')
  axes[0].grid(True, which='both', linestyle='--', linewidth=0.5)

  axes[1].plot(time_axis * 1000.0, difference, linewidth=2)
  axes[1].axhline(0.0, color='black', linewidth=1, alpha=0.5)
  axes[1].set_xlabel('Temps (ms)')
  axes[1].set_ylabel('Delta de tension (V)')
  axes[1].grid(True, which='both', linestyle='--', linewidth=0.5)

  fig.tight_layout()
  fig.savefig(outfile)
  plt.close(fig)


render_plot(
  'Courbe de charge du condensateur : approximation de diode Schottky',
  *build_models(0.3, 1.05),
  'capacitor_charge_schottky_simple_vs_shockley.svg',
)

render_plot(
  'Courbe de charge du condensateur : approximation de diode silicium',
  *build_models(0.7, 1.9),
  'capacitor_charge_silicon_simple_vs_shockley.svg',
)

Comparaison de diode Schottky

capacitor charge schottky simple vs shockley.svg

Comparaison de diode silicium

capacitor charge silicon simple vs shockley.svg

Pourquoi le modèle de Shockley est-il si différent ?

Le point clé est que ces deux modèles de diode répondent à des questions physiques différentes.

Le modèle de diode simple suppose une chute de tension directe fixe, par exemple 0.7V pour une diode en silicium. Cela signifie que le réseau RC voit toujours approximativement :

$$ V_R = V_{source} - V_C - V_D $$

avec un V_D constant. En d’autres termes, la diode est traitée comme un décalage de tension toujours actif.

Le modèle de Shockley ne maintient pas la chute de tension de la diode constante. Au lieu de cela, la tension directe dépend du courant approximativement comme suit :

$$ I = I_S \left(e^{\frac{V_D}{nV_T}} - 1\right) $$

donc lorsque le courant de charge change, la tension de la diode change également.

Dans cet exemple, les deux modèles sont ajustés uniquement en un point de fonctionnement : 10mA. Cela signifie qu’ils ne sont en accord qu’au voisinage de ce courant. Au tout début de la charge, le courant est proche de cette valeur de référence, donc les deux courbes commencent presque superposées.

Ensuite, le condensateur se charge et le courant diminue. C’est là que les modèles se séparent :

C’est pourquoi la différence est la plus visible au milieu du processus de charge. Le modèle simple ne peut pas réagir au courant changeant, tandis que le modèle de Shockley fait exactement cela.

Pourquoi le delta atteint-il un pic ?

Le pic se produit pour deux raisons : l’une physique, l’autre numérique.

1. La raison physique

À t = 0, les deux modèles sont proches car le courant est proche du point d’ajustement. Lorsque le courant descend en dessous de 10mA, la tension directe de Shockley tombe en dessous de l’approximation à chute fixe, donc la tension du condensateur de Shockley prend de l’avance de plus en plus.

Cela fait que le delta augmente initialement.

2. La raison de tracé/simulation

Le code ne compare pas les deux modèles jusqu’à la fin asymptotique non restreinte de la solution de Shockley. Au lieu de cela, il construit une grille de tension uniquement jusqu’à :

max_voltage_snippet.py
max_voltage = (SOURCE_VOLTAGE - simple_model.minimum_series_voltage()) * 0.999

Ainsi, les deux courbes ne sont comparées que jusqu’à ce qu’elles atteignent environ 99.9% de la tension finale du modèle simple.

Ensuite, les deux traces de tension sont rééchantillonnées sur un axe temporel commun à l’aide de np.interp(). Une fois que le modèle de Shockley atteint cette tension de comparaison supérieure, sa trace interpolée devient plate à la fin du graphique, tandis que le modèle simple rattrape encore son retard.

Cela signifie que :

Le pic n’est donc pas seulement une « caractéristique mystérieuse » de l’équation de la diode. Il résulte de la combinaison du comportement de la diode dépendant du courant et du fait que ce graphique particulier ne compare les deux modèles que sur une plage de tension fixe.


Check out similar posts by category: Electronics, Python