Zusammenarbeit
KUNST
SCHÖNHEIT & WELLNESS
HANDWERK
KULTUR & GESCHICHTE
UNTERHALTUNG
UMFELD
ESSEN & GETRÄNKE
REVERSE ENGINEERING
WISSENSCHAFTEN
SPORT
TECHNOLOGIE
WEARABLES
Inbetriebnahme: Die erste Stunde mit deinem eigenen Chip, getestet von einem ESP32
English
Youblob (drawn from the sketch's pin map) · CC0
Ed

Erstellt von

Ed

29. September 2026FI
44
0
0
0
0

Inbetriebnahme: Die erste Stunde mit deinem eigenen Chip, getestet von einem ESP32

Inbetriebnahme ist das, was Ingenieure das erste Einschalten neuer Siliziumchips nennen, und die Reihenfolge dabei ist wichtiger als jeder einzelne Test. Schau hin, bevor du Strom einschaltest, schalte Strom ein, bevor du den Takt setzt, und begrenze den Strom, bevor du irgendetwas anderes tust, denn ein Kurzschluss, den eine Strombegrenzung in einer Sekunde abgefangen hätte, kann die einzigen Chips zerstören, die du hast. Diese Stufe ist der Inbetriebnahmeplan für den PWM-Dimmer aus den früheren Stufen, auf der Breakout-Platine aus Stufe 2. Ein ESP32 übernimmt die Arbeit eines Labors: Er erzeugt den Takt des Chips, hält seinen Reset, setzt das Tastverhältnis an acht Pads und misst die PWM, die zurückkommt, und gibt dann für jedes Tastverhältnis PASS oder FAIL aus. Ein Notizbuch übersetzt einen Fehler in den Namen des Pads, dessen Draht falsch ist. Ehrlich gesagt: Es gibt noch keinen Chip. Der Sketch wurde für diese Blaupause kompiliert, und die erwarteten Werte stammen aus den Simulationen der früheren Stufen; der erste echte Durchlauf liegt bei dir.
Erfahren
Ein Nachmittag, sobald der Chip eintrifft

Anweisungen

1

Die zu erwartenden Zahlen und wie man einen Fehler liest

Jupyter-Notebook wird geladen …
2

Der Chip, den du gerade in Betrieb nimmst

Der eingebettete Blueprint legt Pull-down-Widerstände an jeden Eingang, sodass ein nicht angeschlossener Chip deaktiviert bleibt. Genau das testet dieser Plan.
3

Vor dem Anlegen einer Spannung

Ohne angeschlossene Verbindungen den Chip-on-Board betrachten, der auf dem Breakout sitzt, unter der Lupe: sauber aufgesetztes Quadrat, keine Lötbrücke, nichts lose. Dann mit dem Multimeter den Widerstand zwischen einem VDD-IO-Pad und einem GND-IO-Pad des Breakouts messen, in beiden Polaritäten, und beide Werte notieren. Ein Messwert nahe null bedeutet einen Kurzschluss: dann hier anhalten. Die Pad-Tabelle für Durchlauf 1 nennt, welche Breakout-Pads VDD-IO und GND-IO sind; verwende die Tabelle deines Durchlaufs, da wafer.space darauf hinweist, dass sich Pinbelegungen zwischen Durchläufen ändern. Prüfe auf die gleiche Weise, dass kein Daten-Pad mit seinem Nachbarn oder mit Masse kurzgeschlossen ist.

Materialien für diesen Schritt:

Eigener ASIC-DieEigener ASIC-Die1 Stück
LeiterplatteLeiterplatte1 Stück

Benötigte Werkzeuge:

MultimeterMultimeter
4

Leistung, bei niedriger Strombegrenzung

Stellen Sie das Labornetzteil vor dem Anschluss auf die Versorgungsspannung Ihres Chips ein. Diese Spannung hängt von den Bibliotheken ab, mit denen Ihr Chip gebaut wurde: Die Standardbibliotheken der Vorlage sind 5-V-Bibliotheken, es kann aber auch mit 3,3-V-Bibliotheken gebaut werden. Entnehmen Sie den genauen Wert der Dokumentation Ihres Durchlaufs; die Pad-Tabelle des Durchlaufs 1 nennt die Versorgungspads, aber nicht deren Spannung. Stellen Sie die Strombegrenzung auf die niedrigste Einstellung, bei der das Netzteil noch regelt, verbinden Sie VDD IO und GND IO und schalten Sie ein, während ESP32 noch getrennt ist. Ohne Takt und mit allen auf Masse gezogenen Eingängen sollte der Chip ruhig bleiben. Notieren Sie den Strom. Geht die Versorgung sofort in die Strombegrenzung, schalten Sie aus: Es liegt ein Kurzschluss vor. Messen Sie den Strom danach noch zweimal: im Reset mit laufendem Takt und während der Chip ein Muster abspielt. Diese drei Werte sind die eigene Signatur Ihres Chips; eine Platine, die später deutlich mehr zieht als heute, hat einen Fehler.

Benötigte Werkzeuge:

LabornetzgerätLabornetzgerät
MultimeterMultimeter
5

Verdrahte den ESP32

Zwölf Drähte, wie im Bild und in der Kopfzeile der Skizze: GPIO 27 zum Takt-Pad, 26 zu rst_n, 32 zu Eingang 0 (enable), 13, 14, 18, 19, 21, 22, 23 und 25 zu bidirektionalen Pads 0 bis 7, und bidirektionales Pad 8 zurück zu GPIO 34, plus eine gemeinsame Masse. GPIO 34 ist ein reiner Eingangspin am ESP32, daher kann er nie mit dem Ausgang des Chips in Konflikt geraten. Der ESP32 ist ein Bauteil mit 3,3 V, und seine Eingänge sind nicht 5-V-tolerant. Falls die I/O-Spannung Ihres Chips nicht 3,3 V beträgt, setzen Sie Pegelwandler in alle zwölf Leitungen: drei Vierkanal-Platinen. Die übliche Bauart hat Pull-up-Widerstände auf beiden Seiten, die die schwachen Pull-down-Widerstände des Chips überschreiben können, bis der ESP32 seine Pins ansteuert; die Skizze hält Reset und Enable beim Start sofort auf Low, noch bevor der Takt läuft.

Materialien für diesen Schritt:

LogikpegelwandlerLogikpegelwandler3 Stück
SteckbrückenSteckbrücken1 Stück

Benötigte Werkzeuge:

SteckbrettSteckbrett
6

The test sketch

bringup.ino. It starts the chip's clock with the ESP32's LED PWM peripheral at 100 kHz, with 1-bit resolution for a plain square wave; holds reset low for 1,000 chip clocks; checks that the output stays low while enable is off; then sets seven duty values and measures the high time with pulseIn, averaged over eight periods, against 10 microseconds per step, within 3 microseconds. It compiles for the ESP32 with the Arduino ESP32 core 3.3.12; it has not been run, because the chip does not exist yet.
bringup.inocpp
// SPDX-License-Identifier: Apache-2.0
// First-light test for the PWM dimmer chip (Youblob silicon rungs 3 and 6), run from an ESP32.
// The ESP32 is the whole lab: it makes the chip's clock, holds its reset, sets the duty on eight
// pads, and times the PWM that comes back, then prints PASS or FAIL for each duty value.
//
// Wiring, through a logic level converter if your chip's I/O is not 3.3 V (see the blueprint):
//   CLK      GPIO 27  -> clk pad         RST_N  GPIO 26 -> rst_n pad   (both clear of the boot strapping pins)
//   EN       GPIO 32  -> input[0]        D0..D7 GPIO 13,14,18,19,21,22,23,25 -> bidir[0..7]
//   PWM_IN   GPIO 34  <- bidir[8]        (GPIO 34 is input-only on the ESP32: it cannot fight the chip)
//   and a common ground.

const int PIN_CLK = 27, PIN_RST = 26, PIN_EN = 32, PIN_PWM = 34;
const int DATA_PINS[8] = {13, 14, 18, 19, 21, 22, 23, 25};

// 100 kHz: slow enough for a level converter's pull-up edges, and one chip clock is 10 us,
// so pulseIn's 1 us resolution sees a tenth of a clock.
const uint32_t CHIP_CLK_HZ = 100000;
const float US_PER_CLK = 1e6f / CHIP_CLK_HZ;
const float PERIOD_US = 256 * US_PER_CLK;          // one PWM period: 256 chip clocks = 2560 us
const float TOL_US = 3.0f;                         // allowed error, about a third of a clock

void setDuty(uint8_t d) {
  for (int b = 0; b < 8; b++) digitalWrite(DATA_PINS[b], (d >> b) & 1);
}

// Average high time over n periods; returns -1 if the pin never went high (pulseIn timed out).
float meanHighUs(int n) {
  float sum = 0;
  for (int i = 0; i < n; i++) {
    unsigned long t = pulseIn(PIN_PWM, HIGH, 3 * (unsigned long)PERIOD_US);
    if (t == 0) return -1;
    sum += t;
  }
  return sum / n;
}

bool alwaysLow(unsigned long ms) {
  unsigned long t0 = millis();
  while (millis() - t0 < ms)
    if (digitalRead(PIN_PWM)) return false;
  return true;
}

void setup() {
  Serial.begin(115200);
  delay(500);
  for (int b = 0; b < 8; b++) pinMode(DATA_PINS[b], OUTPUT);
  pinMode(PIN_RST, OUTPUT);
  pinMode(PIN_EN, OUTPUT);
  pinMode(PIN_PWM, INPUT);

  // Reset low BEFORE the clock starts, then give the chip some clocks in reset.
  digitalWrite(PIN_RST, LOW);
  digitalWrite(PIN_EN, LOW);
  setDuty(0);
  if (!ledcAttach(PIN_CLK, CHIP_CLK_HZ, 1)) {      // 1-bit resolution: a plain square wave
    Serial.println("FAIL: could not start the clock on GPIO 27");
    return;
  }
  ledcWrite(PIN_CLK, 1);                           // 1 of 2 steps high = 50 % duty
  delay(10);                                       // 1,000 chip clocks in reset
  digitalWrite(PIN_RST, HIGH);

  Serial.printf("# chip clock %lu Hz, PWM period %.0f us\n", (unsigned long)CHIP_CLK_HZ, PERIOD_US);
  Serial.println("duty,expected_us,measured_us,result");
  int fails = 0;

  // Disabled: the output must stay low whatever the duty.
  setDuty(200);
  bool low = alwaysLow(20);
  Serial.printf("disabled,0,%s,%s\n", low ? "0" : "high seen", low ? "PASS" : "FAIL");
  fails += !low;

  digitalWrite(PIN_EN, HIGH);
  const uint8_t duties[] = {0, 1, 16, 64, 128, 200, 254};
  for (uint8_t d : duties) {
    setDuty(d);
    delay(10);                                     // let a few periods pass with the new value
    float expected = d * US_PER_CLK;
    float got;
    bool ok;
    if (d == 0) {
      ok = alwaysLow(20);
      got = ok ? 0 : meanHighUs(8);                // a pad stuck high shows up here as a duty above 0
    } else {
      got = meanHighUs(8);
      ok = got >= 0 && fabsf(got - expected) <= TOL_US;
    }
    Serial.printf("%u,%.1f,%.1f,%s\n", d, expected, got, ok ? "PASS" : "FAIL");
    fails += !ok;
  }
  Serial.printf("# %d failure(s)\n", fails);
}

void loop() {}

Benötigte Werkzeuge:

ESP32-EntwicklungsboardESP32-Entwicklungsboard
Desktop-ComputerDesktop-Computer
7

Wie ein guter Chip ausgibt

Öffnen Sie den seriellen Monitor mit 115200 Baud. Ein funktionierender Chip gibt pro Zeile den Duty-Wert, die erwartete und gemessene High-Zeit in Mikrosekunden sowie das Ergebnis aus: # Chip-Takt 100000 Hz, PWM Periode 2560 us duty,expected_us,measured_us,result disabled,0,0,PASS 0,0.0,0.0,PASS 1,10.0,10.0,PASS ... 254,2540.0,2540.0,PASS # 0 failure(s) Sehen Sie sich danach Pad 8 zusätzlich mit dem Oszilloskop an: Eine Periode sollte bei diesem Takt 2.560 Mikrosekunden betragen, mit sauberen Flanken. Der Sketch misst die Zeit; das Oszilloskop zeigt die Form, und eine langsame oder schwingende Flanke durch einen Pegelwandler ist nur dort sichtbar.

Benötigte Werkzeuge:

Digitales OszilloskopDigitales Oszilloskop
8

Ein Chip, der nicht hochfährt

Fehlersuche bei der Inbetriebnahme.

Flow

Loading...
9

Quellen und ehrliche Grenzen

**Quellen**, abgerufen am 29. September 2026: wafer-space/chip-on-board-wire-bonded-pcbs, run-1/README.md (die Pad-Tabelle mit den Bezeichnungen VDD-IO- und GND-IO-Pads sowie der Hinweis, dass sich die Pinbelegungen zwischen den Durchläufen ändern); wafer-space/gf180mcu-project-template, README.md und Makefile (der Standardwert von 5 V und die Bibliotheksoptionen für 3,3 V); die Simulationen der früheren Stufen für die erwarteten High-Zeiten. **Ehrliche Grenzen.** Es existiert noch kein Chip: Dieser Plan und seine Skizze wurden noch nicht auf Silizium getestet. Die Versorgungsspannung und der Strom werden hier nicht angegeben, weil die zum Zeitpunkt des Schreibens verfügbare Dokumentation zum Durchlauf sie nicht angibt. Die Wirkung des Pegelwandlers auf die Pull-Down-Widerstände hängt von der verwendeten Platine ab.

Materialien

4

Benötigte Werkzeuge

6

CC0 Gemeinfrei

Dieser Blueprint ist unter CC0 veröffentlicht. Sie dürfen dieses Werk für jeden Zweck frei kopieren, ändern, verbreiten und verwenden, ohne um Erlaubnis zu fragen.

Unterstützen Sie den Maker, indem Sie Produkte über seinen Blueprint kaufen, wo er eine Maker-Provision von Anbietern festgelegt, verdient. Oder erstellen Sie eine neue Iteration dieses Blueprints und verbinden Sie ihn in Ihrem eigenen Blueprint, um Einnahmen zu teilen.

Diskussion

(0)

Anmelden um an der Diskussion teilzunehmen

Kommentare werden geladen...