Python: Vergleich von einfachem und Shockley-Diodenmodell für Kondensatorladung mit UliEngineering
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.
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
Silizium-Dioden-Vergleich
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:
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:
- Im einfachen Modell fällt die Diode immer noch die gleiche feste Spannung ab.
- Im Shockley-Modell erzeugt der niedrigere Strom eine niedrigere Durchlassspannung.
- Da die Shockley-Diode nun weniger von der Quellenspannung „verbraucht“, bleibt mehr Spannung über dem Widerstand-Kondensator-Pfad.
- Das lässt den Kondensator schneller laden, sodass die Shockley-Kurve über der Kurve des einfachen Modells liegt.
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 = (SOURCE_VOLTAGE - simple_model.minimum_series_voltage()) * 0.999Beide 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:
- Zu Beginn ist die Differenz klein, weil beide Modelle von derselben Anfangsspannung starten.
- In der Mitte kommt das Shockley-Modell voran, weil sein Durchlassspannungsabfall mit dem Strom abnimmt.
- Gegen Ende hat der Shockley-Verlauf die gewählte Obergrenze bereits erreicht, sodass das einfache Modell allmählich aufholt.
- Infolgedessen schrumpft die dargestellte Differenz wieder und kehrt schließlich gegen null.
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.