H-Brücke diskret: Bootstrap und Ladungspumpe am Oszi

Im H-Brücke Deep Dive steht, warum der High-Side-Schalter einen Gatetreiber braucht -- Bootstrap, Ladungspumpe, die 100-%-Tastgrad-Grenze, die Body-Dioden-Klemmung in der Totzeit. Alles nachvollziehbar. Aber in einem fertigen Treiber-IC ist davon nichts zu sehen: eine Blackbox mit acht Beinen.

Deshalb bauen wir die Funktionen hier diskret auf -- jede Teilfunktion ein eigenes, anfassbares Bauteil -- und machen jede Behauptung des Artikels als Oszilloskop-Messung sichtbar. (Gleiche Philosophie wie beim Spinning-Current-Projekt: Was integriert verborgen ist, extern aufbauen und messen.)

Material

Alles Kernmaterial liegt im Fundus:

Funktion Bauteil Anmerkung
Halbbrücke IRLZ44N (TO-220) Logic-Level, 55 V/47 A -- überdimensioniert ist hier ein Feature
Bootstrap-Diode Schottky DO-41 (40 V/1 A) schnell, geringe Flussspannung
Bootstrap-Kondensator Kerko 1 µF + 100 nF parallel aus dem Sortiment
Level-Shifter 2N7000 Klein-FET, schaltet das HS-Signal auf die Boot-Ebene
Gate-Totem-Pole PN2222A + 2N3906 npn/pnp-Paar, treibt das HS-Gate niederohmig
Ladungspumpe 2--3× 1N4148 + Kerkos Dickson-Stufen
Taktquelle Pumpe NE555 astabil, einige 10 kHz
PWM + Totzeit A-Star 328PB (oder Uno) komplementäre PWM per Timer1, s. Sketch
Last TT-Motor oder Drossel + Leistungswiderstand induktiv, sonst kein Body-Dioden-Plateau
Versorgung 12 V Bank-Netzteil (V_Bus) + 5 V Logik Strombegrenzung an!

Aufbau 1: Bootstrap, komplett diskret

Funktionsblöcke (Schaltplan folgt):

  1. Halbbrücke: 2× IRLZ44N zwischen +12 V und GND, Schaltknoten in der Mitte, Last gegen GND (Halbbrücken-Betrieb reicht -- das High-Side-Problem ist dasselbe wie in der Vollbrücke).
  2. Boot-Zweig: Schottky von +12 V (V_CC) auf den Boot-Knoten, C_Boot vom Boot-Knoten zum Schaltknoten.
  3. Level-Shifter: 2N7000 zieht (masse-bezogenes HS-Signal) einen Pullup-Widerstand, der an der Boot-Schiene hängt -- damit „übersetzt" ein einziger Transistor das Signal auf die mitfliegende Ebene. Achtung: invertiert (im Sketch berücksichtigt).
  4. Totem-Pole: PN2222A/2N3906 als Emitterfolger-Paar zwischen Boot-Knoten und Schaltknoten, treibt das Gate des oberen IRLZ44N. Gate-Widerstand ~10--22 Ω.
  5. Low-Side: direkt vom µC-Pin über einen kleinen Vorwiderstand (IRLZ44N ist Logic-Level; für saubere Flanken später gern ein zweites Totem-Pole).

Aufbau 2: Dickson-Ladungspumpe

NE555 astabil (einige 10 kHz) treibt eine klassische Diodenkette: Koppelkondensator → 1N4148 → Speicherkondensator, zwei Stufen reichen für V_CC + ~8 V. Erst solo vermessen (Ripple, Lastverhalten), dann statt der Bootstrap-Diode als High-Side-Versorgung anschließen -- und damit die 100-%-Tastgrad-Grenze aufheben.

Der Steuer-Sketch: komplementäre PWM mit einstellbarer Totzeit

Timer1 des ATmega328 im Phase-Correct-Modus, beide Compare-Kanäle auf einer Zeitbasis: OC1A (Pin 9) nicht-invertiert fürs High-Side-Signal, OC1B (Pin 10) invertiert fürs Low-Side-Signal. Die Totzeit entsteht durch den Versatz der beiden Compare-Werte -- Hardware-genau, kein Jitter:

// Komplementäre PWM mit einstellbarer Totzeit (ATmega328, Timer1)
// Pin 9  = OC1A = HS-Signal (an Level-Shifter, dort invertiert -> INVERT_HS)
// Pin 10 = OC1B = LS-Signal (direkt/Totem-Pole)
// Poti A0 = Tastgrad, Poti A1 = Totzeit, Taster D2 = "HS dauerhaft an"
//           (Bootstrap-Aushunger-Test, Experiment 4)

const uint16_t TOP = 400;      // 16 MHz / (2*400) = 20 kHz PWM
const bool INVERT_HS = true;   // 2N7000-Level-Shifter invertiert

void setup() {
  pinMode(9, OUTPUT); pinMode(10, OUTPUT);
  pinMode(2, INPUT_PULLUP);

  // Timer1: Phase-Correct PWM, TOP = ICR1 (Mode 10), Prescaler 1
  ICR1 = TOP;
  TCCR1A = _BV(COM1A1) | (INVERT_HS ? _BV(COM1A0) : 0)   // OC1A
         | _BV(COM1B1) | _BV(COM1B0)                     // OC1B invertiert
         | _BV(WGM11);
  TCCR1B = _BV(WGM13) | _BV(CS10);
}

void loop() {
  uint16_t duty = map(analogRead(A0), 0, 1023, 0, TOP);      // 0..100 %
  uint16_t dt   = map(analogRead(A1), 0, 1023, 2, 40);       // Totzeit-Zähler
                       // 1 Count = 62,5 ns; Flanken-Totzeit = dt * 62,5 ns

  if (digitalRead(2) == LOW) duty = TOP;   // Aushunger-Test: 100 % erzwingen

  // HS endet dt Counts früher, LS beginnt dt Counts später:
  uint16_t a = (duty > dt)        ? duty - dt : 0;
  uint16_t b = (duty + dt < TOP)  ? duty + dt : TOP;
  noInterrupts(); OCR1A = a; OCR1B = b; interrupts();
  delay(20);
}

Der Messplan: sechs Experimente, sechs Artikel-Claims

Scope-Zuordnung (Fundus: PicoScope 4444, 3204, 5204):

⚠️ Die klassische Falle: Niemals die Masseklemme eines normalen Tastkopfs an den Schaltknoten hängen, um „mal eben" \(V_{GS,\text{HS}}\) zu messen -- das legt den Knoten über die Masseleitung an Erde und schließt beim Schalten die Halbbrücke kurz. Erdfreie Messungen gehören auf die Differenzkanäle.

# Experiment Messung Artikel-Claim
1 Grundbetrieb Schaltknoten \(V(t)\) Knoten springt 0 ↔ V_Bus, liegt nie „in der Mitte"
2 Der Kondensator-Ritt Boot-Knoten gegen GND + Knoten Boot-Schiene = Knoten + ~12 V, reitet mit
3 Nachladen \(V(C_\text{Boot})\) differenziell Sägezahn: lädt bei LS-an, entlädt je HS-Puls
4 Aushungern Taster D2: Duty → 100 % Boot-Spannung sackt ab, HS-Gate bricht ein -- die Bootstrap-Grenze live
5 Totzeit & Body-Diode Knoten fein aufgelöst, induktive Last −0,7-V-Plateau während \(t_d\) (Klemmung), Totzeit am Poti verstellen und zusehen
6 Ladungspumpe Pumpen-Ausgang; dann Exp. 4 wiederholen Ripple/Lastverhalten; mit Pumpe läuft 100 % Duty durch

Bonus, wenn alles steht: Reverse Recovery der Body-Diode als Stromspitze sichtbar machen (Shunt in der Low-Side) und den Unterschied Schottky vs. 1N4148 als Boot-Diode vermessen.

Stand

Projekt angelegt, Material reserviert, Sketch bereit. Als Nächstes: Schaltplan zeichnen, Steckbrett-Aufbau, dann die Messreihe.

Weiterführendes


Erstellt: 07.07.2026