การทำงานร่วมกัน
ศิลปะ
ความงามและสุขภาพ
งานฝีมือ
วัฒนธรรมและประวัติศาสตร์
ความบันเทิง
สิ่งแวดล้อม
อาหารและเครื่องดื่ม
วิศวกรรมย้อนรอย
วิทยาศาสตร์
กีฬา
เทคโนโลยี
อุปกรณ์สวมใส่
การเริ่มต้นใช้งาน (Bring-Up): ชั่วโมงแรกกับชิปของคุณเอง ทดสอบโดย ESP32
English
Youblob (drawn from the sketch's pin map) · CC0
Ed

สร้างโดย

Ed

29. กันยายน 2026FI
43
0
0
0
0

การเริ่มต้นใช้งาน (Bring-Up): ชั่วโมงแรกกับชิปของคุณเอง ทดสอบโดย ESP32

Bring-up คือสิ่งที่วิศวกรเรียกว่าการจ่ายไฟครั้งแรกให้กับซิลิคอนใหม่ และลำดับของขั้นตอนนี้สำคัญยิ่งกว่าการทดสอบรายการใดรายการหนึ่ง ตรวจสอบก่อนจ่ายไฟ จ่ายไฟก่อนป้อนสัญญาณนาฬิกา และจำกัดกระแสไฟก่อนทำสิ่งใดทั้งสิ้น เพราะการลัดวงจรที่ตัวจำกัดกระแสจะตรวจจับได้ภายในหนึ่งวินาที อาจทำลายชิปเพียงชุดเดียวที่คุณมีได้ ขั้นตอนนี้คือแผนการ bring-up สำหรับตัวหรี่ไฟ (dimmer) จากขั้นก่อนหน้า บนบอร์ดทดลอง (breakout board) จากขั้นที่ 2 ESP32 ทำงานแทนห้องปฏิบัติการ โดยสร้างสัญญาณนาฬิกาให้ชิป ควบคุมสัญญาณรีเซ็ต กำหนดดิวตี้ (duty) บนแพด 8 ตัว และจับเวลา PWM ที่ส่งกลับมา จากนั้นพิมพ์ PASS หรือ FAIL สำหรับแต่ละดิวตี้ สมุดบันทึกจะแปลงความล้มเหลวให้เป็นชื่อของแพดที่สายไฟผิดพลาด เพื่อความตรงไปตรงมา: ตอนนี้ยังไม่มีชิป สเก็ตช์นี้ถูกคอมไพล์สำหรับพิมพ์เขียวนี้ และค่าที่คาดหวังมาจากการจำลองในขั้นก่อนหน้า การรันจริงครั้งแรกเป็นหน้าที่ของคุณ
ขั้นสูง
บ่ายหนึ่งวัน เมื่อชิปมาถึงแล้ว

คำแนะนำ

1

ตัวเลขที่ควรคาดหวัง และวิธีอ่านความล้มเหลว

กำลังโหลดสมุด Jupyter…
2

ชิปที่คุณกำลังเปิดใช้งาน

แบบแปลนฝังตัวนี้ใส่ตัวต้านทานแบบดึงลง (pull-down) ไว้ที่ทุกอินพุต ดังนั้นชิปที่ไม่ได้เสียบจะอยู่ในสถานะปิดใช้งาน นี่คือแกนหลักที่แผนนี้ทดสอบ
3

ก่อนจ่ายไฟใดๆ

เมื่อไม่มีการเชื่อมต่อใดๆ ให้ตรวจดูชิปแบบ chip-on-board ที่ติดตั้งอยู่บนแผงทดลอง (breakout) ผ่านแว่นขยาย: ตรวจว่าติดตั้งอยู่ตรงตำแหน่งสี่เหลี่ยม ไม่มีสะพานประสาน (solder bridge) และไม่มีชิ้นส่วนหลวม จากนั้นวัดค่าความต้านทานระหว่างแพด IO VDD และแพด IO GND ของแผงทดลองด้วยมัลติมิเตอร์ ทั้งสองขั้วการต่อ แล้วจดค่าทั้งสองไว้ หากค่าที่อ่านได้ใกล้ศูนย์ แสดงว่าเกิดการลัดวงจร ให้หยุดตรงนั้น ตาราง pad ของการรันที่ 1 ระบุว่าแพดใดของแผงทดลองเป็น VDD IO และแพดใดเป็น GND IO ให้ใช้ตารางของการรันของคุณเอง เพราะ wafer.space ระบุว่าการจัดขาอาจเปลี่ยนแปลงระหว่างการรันแต่ละครั้ง ตรวจสอบด้วยวิธีเดียวกันว่าไม่มีแพดข้อมูลใดลัดวงจรกับแพดข้างเคียงหรือกับกราวด์

วัสดุสำหรับขั้นตอนนี้:

ชิป ASIC สั่งทำชิป ASIC สั่งทำ1 ชิ้น
แผ่นวงจรพิมพ์แผ่นวงจรพิมพ์1 ชิ้น

เครื่องมือที่ต้องใช้:

มัลติมิเตอร์มัลติมิเตอร์
4

พลังงาน โดยมีขีดจำกัดกระแสต่ำ

ตั้งค่าแหล่งจ่ายไฟแบบม้านั่งให้เป็นแรงดันไฟฟ้าของชิปของคุณก่อนเชื่อมต่อ แรงดันนั้นขึ้นอยู่กับไลบรารีที่ใช้สร้างชิปของคุณ: ไลบรารีเริ่มต้นของเทมเพลตเป็นไลบรารี 5 V และยังสามารถสร้างด้วยไลบรารี 3.3 V ได้ด้วย ให้ใช้ค่าที่แน่นอนจากเอกสารการรันของคุณ ตารางแพดของ run-1 ระบุแพดไฟเลี้ยงแต่ไม่ได้ระบุแรงดันของแพดเหล่านั้น ตั้งขีดจำกัดกระแสเป็นค่าต่ำสุดที่ทำให้แหล่งจ่ายไฟยังคงควบคุมแรงดันได้ เชื่อมต่อ VDD IO และ GND IO แล้วเปิดเครื่องโดยที่ ESP32 ยังไม่เชื่อมต่อ เมื่อไม่มีสัญญาณนาฬิกาและทุกอินพุตถูกดึงลงกราวด์ ชิปควรอยู่นิ่ง จดบันทึกกระแสที่วัดได้ หากแหล่งจ่ายไฟเข้าสู่การจำกัดกระแสทันที ให้ปิดเครื่อง: แสดงว่ามีการลัดวงจร ให้บันทึกกระแสอีกสองครั้งในภายหลัง ได้แก่ ขณะรีเซ็ตโดยมีสัญญาณนาฬิกาทำงาน และขณะที่ชิปกำลังเล่นรูปแบบสัญญาณ ตัวเลขทั้งสามนี้คือลายเซ็นเฉพาะของชิปคุณ หากบอร์ดในภายหลังดึงกระแสมากกว่าที่เคยวัดได้ในวันนี้มาก แสดงว่าบอร์ดมีข้อบกพร่อง

เครื่องมือที่ต้องใช้:

แหล่งจ่ายไฟตั้งโต๊ะแหล่งจ่ายไฟตั้งโต๊ะ
มัลติมิเตอร์มัลติมิเตอร์
5

เดินสาย ESP32

สายสิบสองเส้น ตามภาพและหัวข้อของสเก็ตช์: GPIO 27 ไปยังขาสัญญาณนาฬิกา, 26 ไปยัง rst_n, 32 ไปยังอินพุต 0 (enable), 13, 14, 18, 19, 21, 22, 23 และ 25 ไปยังขาสองทิศทาง 0 ถึง 7, และขาสองทิศทาง 8 กลับไปยัง GPIO 34, พร้อมกราวด์ร่วมหนึ่งเส้น GPIO 34 เป็นขาอินพุตอย่างเดียวบน ESP32 จึงไม่มีทางแย่งสัญญาณกับเอาต์พุตของชิป

วัสดุสำหรับขั้นตอนนี้:

ตัวแปลงระดับลอจิกตัวแปลงระดับลอจิก3 ชิ้น
สายจัมเปอร์สายจัมเปอร์1 ชิ้น

เครื่องมือที่ต้องใช้:

เบรดบอร์ดเบรดบอร์ด
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() {}

เครื่องมือที่ต้องใช้:

บอร์ดพัฒนา ESP32บอร์ดพัฒนา ESP32
คอมพิวเตอร์ตั้งโต๊ะคอมพิวเตอร์ตั้งโต๊ะ
7

ชิปที่ดีจะพิมพ์อะไร

เปิดเซเรียลมอนิเตอร์ที่ 115200 บอด ชิปที่ทำงานได้จะพิมพ์ในแต่ละบรรทัด ได้แก่ ดิวตี้ เวลาสูงที่คาดหวังและที่วัดได้เป็นไมโครวินาที และผลลัพธ์: # chip clock 100000 Hz, PWM period 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) จากนั้นให้ดูขาที่ 8 ด้วยออสซิลโลสโคปเช่นกัน หนึ่งคาบควรเป็น 2,560 ไมโครวินาทีที่สัญญาณนาฬิกานี้ พร้อมขอบสัญญาณที่สะอาด สเก็ตช์วัดเวลา ส่วนออสซิลโลสโคปแสดงรูปร่างสัญญาณ และขอบสัญญาณที่ช้าหรือแกว่งผ่านตัวแปลงระดับจะมองเห็นได้เฉพาะที่นั่น

เครื่องมือที่ต้องใช้:

ออสซิลโลสโคปดิจิทัลออสซิลโลสโคปดิจิทัล
8

ชิปที่ไม่สามารถเริ่มทำงานได้

การแก้ไขปัญหาในขั้นตอนการเริ่มต้นระบบ

Flow

Loading...
9

แหล่งที่มาและข้อจำกัดที่ซื่อตรง

**แหล่งที่มา** อ่านเมื่อ 29 กันยายน 2026: wafer-space/chip-on-board-wire-bonded-pcbs, run-1/README.md (ตารางแพดที่ระบุแพด IO ของ VDD และ IO ของ GND และหมายเหตุว่า pinout เปลี่ยนแปลงระหว่างแต่ละรอบการผลิต); wafer-space/gf180mcu-project-template, README.md และ Makefile (ค่าเริ่มต้น 5 V และตัวเลือกไลบรารี 3.3 V); การจำลองของขั้นก่อนหน้าสำหรับเวลาสูงที่คาดไว้ **ข้อจำกัดที่ซื่อตรง** ยังไม่มีชิปจริง: แผนนี้และแบบร่างยังไม่ได้ทดสอบบนซิลิกอนจริง แรงดันและกระแสไฟฟ้าไม่ได้ระบุไว้ที่นี่เพราะเอกสารการผลิตที่มีอยู่ ณ เวลาที่เขียนไม่ได้ระบุไว้ ผลของตัวแปลงระดับสัญญาณต่อตัวต้านทานดึงลง (pull-down) ขึ้นอยู่กับบอร์dที่คุณใช้

วัสดุ

4

เครื่องมือที่จำเป็น

6

CC0 สาธารณสมบัติ

พิมพ์เขียวนี้เผยแพร่ภายใต้ CC0 คุณสามารถคัดลอก แก้ไข แจกจ่าย และใช้งานผลงานนี้เพื่อวัตถุประสงค์ใดก็ได้ โดยไม่ต้องขออนุญาต

สนับสนุนเมกเกอร์โดยซื้อสินค้าผ่านพิมพ์เขียวของพวกเขา ซึ่งพวกเขาจะได้รับ ค่าคอมมิชชันเมกเกอร์ ที่ผู้ขายกำหนด หรือสร้างเวอร์ชันใหม่ของพิมพ์เขียวนี้และรวมเป็นการเชื่อมต่อในพิมพ์เขียวของคุณเพื่อแบ่งรายได้

การสนทนา

(0)

เข้าสู่ระบบ เพื่อร่วมการสนทนา

กำลังโหลดความคิดเห็น...