تعاون
فن
خوبصورتی اور تندرستی
دستکاری
ثقافت اور تاریخ
تفریح
ماحول
خوراک اور مشروبات
ریورس انجینئرنگ
سائنسز
کھیل
ٹیکنالوجی
پہننے والے آلات
بring-Up: آپ کی اپنی چپ کا پہلا گھنٹہ، جس کی جانچ ایک ESP32 نے کی
English
Youblob (drawn from the sketch's pin map) · CC0
Ed

تخلیق کار

Ed

29. ستمبر 2026FI
43
0
0
0
0

بring-Up: آپ کی اپنی چپ کا پہلا گھنٹہ، جس کی جانچ ایک ESP32 نے کی

بring-up وہ اصطلاح ہے جو انجینئر نئی سلیکون کے پہلی بار پاور آن ہونے کو کہتے ہیں، اور اس کی ترتیب کسی بھی ایک ٹیسٹ سے زیادہ اہم ہے۔ پاور دینے سے پہلے دیکھیں، گھڑی لگانے سے پہلے پاور دیں، اور کچھ بھی کرنے سے پہلے کرنٹ کی حد مقرر کریں، کیونکہ وہ شارٹ سرکٹ جسے کرنٹ لمٹ ایک سیکنڈ میں پکڑ لیتی، آپ کی واحد چپس کو تباہ کر سکتا ہے۔ یہ مرحلہ پچھلے مراحل کے PWM ڈمر کے لیے bring-up منصوبہ ہے، مرحلہ 2 کے بریک آؤٹ بورڈ پر۔ ایک ESP32 لیب کا کام کرتا ہے: یہ چپ کی گھڑی بناتا ہے، اس کا reset روکے رکھتا ہے، آٹھ پیڈز پر duty مقرر کرتا ہے اور واپس آنے والے PWM کا وقت ناپتا ہے، پھر ہر duty کے لیے PASS یا FAIL پرنٹ کرتا ہے۔ ایک notebook ناکامی کو اس پیڈ کے نام میں بدل دیتی ہے جس کی تار غلط ہے۔ ایمانداری سے بیان: ابھی کوئی چپ نہیں ہے۔ سکیچ اس blueprint کے لیے compile کیا گیا تھا اور متوقع اعداد پچھلے مراحل کی simulations سے آتے ہیں؛ پہلا حقیقی run آپ کا ہوگا۔
اعلیٰ
ایک دوپہر، جب چپ پہنچ جائے

ہدایات

1

توقع کرنے والے اعداد، اور ناکامی کو کیسے پڑھیں

Jupyter نوٹ بک لوڈ ہو رہی ہے…
2

وہ چپ جسے آپ شروع کر رہے ہیں

ایمبیڈڈ بلیوپرنٹ ہر ان پٹ پر پull-down لگاتا ہے، اس لیے غیر منسلک چپ غیر فعال رہتی ہے۔ یہی وہ بنیاد ہے جس کی یہ منصوبہ جانچ کرتا ہے۔
3

قبل از اعمال کسی بھی طاقت کے

کچھ بھی منسلک کیے بغیر، لوپ کے نیچے بریک آؤٹ پر لگی چپ-آن-بورڈ کو دیکھیں: چپ چوکور طور پر جمی ہوئی ہو، کوئی سولڈر برج نہ ہو، اور کچھ ڈھیلا نہ ہو۔ پھر ملٹی میٹر سے بریک آؤٹ کے ایک VDD IO پیڈ اور ایک GND IO پیڈ کے درمیان مزاحمت دونوں پولرٹیز میں ناپیں، اور دونوں اعداد لکھ لیں۔ صفر کے قریب ریڈنگ شارٹ ہے: وہیں رک جائیں۔ رن-1 پیڈ ٹیبل بتاتا ہے کہ کون سے بریک آؤٹ پیڈ VDD IO اور GND IO ہیں؛ اپنے رن کا ٹیبل استعمال کریں، کیونکہ wafer.space کے مطابق پن آؤٹ رنز کے درمیان بدل جاتے ہیں۔ اسی طریقے سے جانچیں کہ کوئی ڈیٹا پیڈ اپنے پڑوسی یا گراؤنڈ سے شارٹ نہ ہو۔

اس مرحلے کے لیے مواد:

کسٹم ASIC ڈائیکسٹم ASIC ڈائی1 ٹکڑا
چھپا ہوا سرکٹ بورڈچھپا ہوا سرکٹ بورڈ1 ٹکڑا

درکار اوزار:

ملٹی میٹرملٹی میٹر
4

بجلی، کرنٹ کی حد کم ہونے کے ساتھ

بینچ سپلائی کو اپنی چِپ کی سپلائی وولٹیج پر سیٹ کریں، اس سے پہلے کہ اسے جوڑیں۔ یہ وولٹیج اُن لائبریریوں پر منحصر ہے جن سے آپ کی چِپ بنائی گئی تھی: ٹیمپلیٹ کی ڈیفالٹ لائبریریاں 5 V والی ہیں، اور یہ 3.3 V لائبریریوں کے ساتھ بھی بن سکتی ہے۔ درست قدر اپنے رن کی دستاویزات سے لیں؛ رن-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 پر صرف ان پٹ والا پن ہے، اس لیے یہ کبھی چپ کے آؤٹ پٹ سے نہیں لڑ سکتا۔ ESP32 ایک 3.3 V پارٹ ہے اور اس کے ان پٹس 5 V برداشت نہیں کرتے۔ اگر آپ کی چپ کا I/O 3.3 V نہیں ہے، تو بارہوں لائنوں میں لیول کنورٹرز لگائیں: تین چار چینل والے بورڈ۔ عام قسم میں دونوں طرف پل اپ ریزسٹرز ہوتے ہیں، جو ESP32 کے اس کے پنز کو چلانے تک چپ کے کمزور پل ڈاؤن ریزسٹرز کو اوور رائڈ کر سکتے ہیں؛ اسکیچ شروع ہوتے ہی ری سیٹ اور enable کو low رکھتا ہے، کلاک چلنے سے پہلے۔

اس مرحلے کے لیے مواد:

لاجک سطح تبدیل کنندہلاجک سطح تبدیل کنندہ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) پھر اس چپclock پر پن 8 کو آسیلوسکوپ سے بھی دیکھیں: اس کلاک پر ایک پیریڈ 2,560 مائیکروسیکنڈ ہونا چاہیے، صاف ایجز کے ساتھ۔ اسکیچ وقت ناپتا ہے؛ آسیلوسکوپ شکل دکھاتا ہے، اور لیول کنورٹر کے ذریعے سست یا رنگنگ ایج صرف وہیں نظر آتی ہے۔

درکار اوزار:

ڈیجیٹل آسیلوسکوپڈیجیٹل آسیلوسکوپ
8

ایک چپ جو شروع نہیں ہوتی

بring-up ٹربل شوٹنگ۔

Flow

Loading...
9

ذرائع اور ایماندار حدود

**ذرائع**، 29 ستمبر 2026 کو پڑھا گیا: wafer-space/chip-on-board-wire-bonded-pcbs، run-1/README.md (پیڈ ٹیبل جو VDD IO اور GND IO پیڈز کا نام دیتا ہے، اور یہ نوٹ کہ پن آؤٹ ہر رن کے درمیان بدلتے ہیں)؛ wafer-space/gf180mcu-project-template، README.md اور Makefile (ڈیفالٹ 5 V اور 3.3 V لائبریری کے اختیارات)؛ متوقع ہائی اوقات کے لیے پچھلے مراحل کی سمولیشنز۔ **ایماندار حدود۔** ابھی تک کوئی چپ موجود نہیں: یہ منصوبہ اور اس کا خاکہ سلیکون پر نہیں چلائے گئے۔ سپلائی وولٹیج اور کرنٹ یہاں بیان نہیں کیے گئے کیونکہ تحریر کے وقت دستیاب رن دستاویزات انہیں بیان نہیں کرتیں۔ لیول کنورٹر کا پull-down پر اثر اس بورڈ پر منحصر ہے جو آپ استعمال کرتے ہیں۔

مواد

4

درکار اوزار

6

CC0 پبلک ڈومین

یہ بلیو پرنٹ CC0 کے تحت جاری کیا گیا ہے۔ آپ اجازت لیے بغیر اس کام کو نقل، ترمیم، تقسیم اور کسی بھی مقصد کے لیے استعمال کرنے کے لیے آزاد ہیں۔

میکر کی حمایت کریں ان کے بلیو پرنٹ کے ذریعے پروڈکٹس خرید کر جہاں وہ میکر کمیشن وینڈرز کی طرف سے مقرر، کماتے ہیں، یا اس بلیو پرنٹ کی نئی تکرار بنائیں اور آمدنی شیئر کرنے کے لیے اسے اپنے بلیو پرنٹ میں کنکشن کے طور پر شامل کریں۔

بحث

(0)

لاگ ان بحث میں شامل ہونے کے لیے

تبصرے لوڈ ہو رہے ہیں...