Colaboración
ARTE
BELLEZA Y BIENESTAR
ARTESANÍA
CULTURA E HISTORIA
ENTRETENIMIENTO
MEDIO AMBIENTE
COMIDA Y BEBIDAS
INGENIERÍA INVERSA
CIENCIAS
DEPORTES
TECNOLOGÍA
TECNOLOGÍA VESTIBLE
Puesta en marcha: la primera hora con tu propio chip, probado por un ESP32
English
Youblob (drawn from the sketch's pin map) · CC0
Ed

Creado por

Ed

29. septiembre 2026FI
44
0
0
0
0

Puesta en marcha: la primera hora con tu propio chip, probado por un ESP32

La puesta en marcha es lo que los ingenieros llaman el primer encendido de un silicio nuevo, y el orden importa más que cualquier prueba individual. Mira antes de alimentar, alimenta antes de dar reloj y limita la corriente antes de hacer cualquier otra cosa, porque un cortocircuito que un límite de corriente habría detectado en un segundo puede destruir los únicos chips que tienes. Este peldaño es el plan de puesta en marcha para el PWM atenuador de los peldaños anteriores, en la placa de conexiones del peldaño 2. Un ESP32 hace el trabajo de un laboratorio: genera el reloj del chip, mantiene su reset, ajusta el ciclo de trabajo en ocho pads y mide el PWM que regresa, y luego imprime PASS o FAIL para cada ciclo de trabajo. Un cuaderno convierte un fallo en el nombre del pad cuyo cable está mal. Dicho con honestidad: todavía no hay chip. El sketch se compiló para este plano y los números esperados provienen de las simulaciones de los peldaños anteriores; la primera ejecución real es tuya.
Avanzado
Una tarde, cuando llegue el chip

Instrucciones

1

Los números que cabe esperar y cómo interpretar un fallo

Cargando el cuaderno de Jupyter…
2

El chip que estás activando

El plano integrado coloca resistencias pull-down en cada entrada, de modo que un chip desconectado permanece deshabilitado. Ese es el núcleo que este plan pone a prueba.
3

Antes de cualquier alimentación

Sin nada conectado, observe el chip-on-board montado en la placa de conexiones bajo la lupa: cuadrado asentado, sin puente de soldadura, nada suelto. Luego mida con el multímetro la resistencia entre un pad de IO de VDD y un pad de IO de GND de la placa de conexiones, en ambas polaridades, y anote ambos números. Una lectura cercana a cero indica un cortocircuito: deténgase ahí. La tabla de pads de la ejecución 1 indica qué pads de la placa son IO de VDD y IO de GND; use la tabla de su ejecución, porque wafer.space indica que las asignaciones de pines cambian entre ejecuciones. Compruebe de la misma forma que ningún pad de datos está cortocircuitado con su vecino ni con tierra.

Materiales para este paso:

Chip ASIC a medidaChip ASIC a medida1 pieza
Placa de circuito impresoPlaca de circuito impreso1 pieza

Herramientas necesarias:

MultímetroMultímetro
4

Alimentación, con el límite de corriente bajo

Ajuste la fuente de alimentación de banco a la tensión de alimentación de su chip antes de conectarla. Esa tensión depende de las bibliotecas con las que se construyó su chip: las bibliotecas predeterminadas de la plantilla son de 5 V, y también puede construirse con bibliotecas de 3.3 V. Tome el valor exacto de la documentación de su ejecución; la tabla de pads de la ejecución 1 nombra los pads de alimentación, pero no su tensión. Ajuste el límite de corriente al valor más bajo que permita que la fuente regule, conecte VDD IO y GND IO, y encienda con ESP32 aún desconectado. Sin reloj y con todas las entradas conectadas a masa mediante pull-down, el chip debería permanecer inactivo. Anote la corriente. Si la fuente entra directamente en limitación de corriente, apáguela: hay un cortocircuito. Mida la corriente dos veces más después, en reset con el reloj en funcionamiento y mientras reproduce un patrón. Esos tres valores son la firma propia de su chip; una placa que más adelante consuma mucho más de lo que consumía hoy tiene un fallo.

Herramientas necesarias:

Fuente de alimentación de bancoFuente de alimentación de banco
MultímetroMultímetro
5

Conecte el ESP32

Doce cables, como en la imagen y en el encabezado del esquema: GPIO 27 al pad de reloj, 26 a rst_n, 32 a la entrada 0 (enable), 13, 14, 18, 19, 21, 22, 23 y 25 a los pads bidireccionales 0 a 7, y el pad bidireccional 8 de vuelta a GPIO 34, más una masa común. GPIO 34 es un pin solo de entrada en el ESP32, por lo que nunca puede pelear con la salida del chip. El ESP32 es un componente de 3,3 V y sus entradas no toleran 5 V. Si la E/S de su chip no es de 3,3 V, coloque convertidores de nivel en las doce líneas: tres placas de cuatro canales. El tipo común tiene resistencias pull-up en ambos lados, que pueden anular los pull-down débiles del chip hasta que el ESP32 controle sus pines; el esquema mantiene reset y enable en bajo en cuanto arranca, antes de que funcione el reloj.

Materiales para este paso:

Convertidor de niveles lógicosConvertidor de niveles lógicos3 piezas
Cables de puenteCables de puente1 pieza

Herramientas necesarias:

Placa de pruebasPlaca de pruebas
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() {}

Herramientas necesarias:

Placa de desarrollo ESP32Placa de desarrollo ESP32
Ordenador de sobremesaOrdenador de sobremesa
7

Qué imprime un buen chip

Abra el monitor serie a 115200 baudios. Un chip que funciona imprime, por línea, el ciclo de trabajo, el tiempo en alto esperado y medido en microsegundos, y el resultado: # reloj del chip 100000 Hz, PWM periodo 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) Después, observe también el pin 8 con el osciloscopio: un periodo debería ser de 2.560 microsegundos con este reloj, con flancos limpios. El boceto mide el tiempo; el osciloscopio muestra la forma, y un flanco lento o con oscilaciones a través de un convertidor de nivel solo es visible ahí.

Herramientas necesarias:

Osciloscopio digitalOsciloscopio digital
8

Un chip que no se inicia

Solución de problemas de puesta en marcha.

Flow

Loading...
9

Fuentes y límites honestos

**Fuentes**, consultadas el 29 de septiembre de 2026: wafer-space/chip-on-board-wire-bonded-pcbs, run-1/README.md (la tabla de pads que nombra los pads de IO VDD y de IO GND, y la nota de que las asignaciones de pines cambian entre ejecuciones); wafer-space/gf180mcu-project-template, README.md y Makefile (las opciones de biblioteca por defecto de 5 V y de 3.3 V); las simulaciones de los escalones anteriores para los tiempos altos esperados. **Límites honestos.** Todavía no existe ningún chip: este plan y su boceto no se han ejecutado en silicio. El voltaje y la corriente de alimentación no se indican aquí porque la documentación de ejecución disponible en el momento de escribir no los especifica. El efecto del convertidor de nivel sobre las resistencias de pull-down depende de la placa que utilices.

Materiales

4

Herramientas requeridas

6

CC0 Dominio público

Este Blueprint se publica bajo CC0. Eres libre de copiar, modificar, distribuir y usar este trabajo para cualquier propósito, sin pedir permiso.

Apoya al Maker comprando productos a través de su Blueprint, donde gana una Comisión del Maker establecida por los vendedores, o crea una nueva iteración de este Blueprint e inclúyela como conexión en tu propio Blueprint para compartir ingresos.

Discusión

(0)

Iniciar sesión para unirte a la discusión

Cargando comentarios...