Python: Vergleich von einfachem und Shockley-Diodenmodell für Kondensatorladung mit UliEngineering

English Deutsch

Du kannst leicht ein einfaches Diodenmodell mit konstantem Spannungsabfall mit einem Shockley-Diodenmodell für Kondensatorladung vergleichen mit der UliEngineering-Python-Bibliothek.

In diesem Beispiel wird das einfache Modell mit dem Shockley-Modell bei einem Referenzstrom von 10mA abgeglichen. Das obere Teilbild zeigt die absolute Kondensatorspannung während des Ladens, und das untere Teilbild zeigt die Differenz Shockley - einfach.

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='Simple diode model', linewidth=2)
  axes[0].plot(time_axis * 1000.0, shockley_voltage, label='Shockley diode model', linewidth=2)
  axes[0].set_ylabel('Capacitor voltage (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('Time (ms)')
  axes[1].set_ylabel('Voltage delta (V)')
  axes[1].grid(True, which='both', linestyle='--', linewidth=0.5)

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


render_plot(
  'Capacitor charge curve: Schottky diode approximation',
  *build_models(0.3, 1.05),
  'capacitor_charge_schottky_simple_vs_shockley.svg',
)

render_plot(
  'Capacitor charge curve: Silicon diode approximation',
  *build_models(0.7, 1.9),
  'capacitor_charge_silicon_simple_vs_shockley.svg',
)

Schottky-Dioden-Vergleich

Kondensatorladung Schottky einfach vs. Shockley

Silizium-Dioden-Vergleich

Kondensatorladung Silizium einfach vs. Shockley

Warum unterscheidet sich das Shockley-Modell so stark?

Der entscheidende Punkt ist, dass diese beiden Diodenmodelle unterschiedliche physikalische Fragen beantworten.

Das einfache Diodenmodell geht von einem festen Durchlassspannungsabfall aus, zum Beispiel 0,7V für eine Siliziumdiode. Das bedeutet, dass das RC-Netzwerk immer ungefähr sieht:

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

mit einem konstanten V_D. Mit anderen Worten, die Diode wird als immer-ein-Spannungsversatz behandelt.

Das Shockley-Modell hält den Diodenspannungsabfall nicht konstant. Stattdessen hängt die Durchlassspannung vom Strom ab, ungefähr als:

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

Wenn sich also der Ladestrom ändert, ändert sich auch die Diodenspannung.

In diesem Beispiel werden beide Modelle nur bei einem Arbeitspunkt abgeglichen: 10mA. Das bedeutet, sie stimmen nur in der Nähe dieses Stroms am besten überein. Zu Beginn des Ladens liegt der Strom nahe diesem Referenzwert, sodass beide Kurven fast übereinander beginnen.

Danach lädt sich der Kondensator auf und der Strom sinkt. Hier trennen sich die Modelle:

Deshalb ist der Unterschied in der Mitte des Ladevorgangs am deutlichsten sichtbar. Das einfache Modell kann nicht auf den sich ändernden Strom reagieren, während das Shockley-Modell genau das tut.

Warum erreicht die Differenz ein Maximum?

Das Maximum entsteht aus zwei Gründen: ein physikalischer und ein numerischer.

1. Der physikalische Grund

Bei t = 0 sind beide Modelle nahe beieinander, weil der Strom nahe dem Abgleichpunkt liegt. Wenn der Strom unter 10mA fällt, sinkt die Shockley-Durchlassspannung unter die Approximation mit festem Spannungsabfall, sodass die Shockley-Kondensatorspannung zunehmend vorauseilt.

Das lässt die Differenz anfangs wachsen.

2. Der Plot-/Simulationsgrund

Der Code vergleicht die beiden Modelle nicht bis zum uneingeschränkten asymptotischen Ende der Shockley-Lösung. Stattdessen erstellt er ein Spannungsraster nur bis zu:

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

Beide Kurven werden also nur verglichen, bis sie etwa 99,9% der Endspannung des einfachen Modells erreichen.

Dann werden beide Spannungsverläufe auf eine gemeinsame Zeitachse mit np.interp() resampelt. Sobald das Shockley-Modell diese obere Vergleichsspannung erreicht, wird sein interpolierter Verlauf am Ende des Diagramms flach, während das einfache Modell noch aufholt.

Das bedeutet:

Das Maximum ist also nicht nur ein „rätselhaftes Merkmal“ der Diodengleichung. Es ergibt sich aus der Kombination des stromabhängigen Diodenverhaltens und der Tatsache, dass dieses spezielle Diagramm beide Modelle nur über einen festen Spannungsbereich vergleicht.


Check out similar posts by category: Electronics, Python