RisalDash RisalDash

Loyiha · Oʻlchov · ADC

Bitta ADC pindan choʻntak ostsilloskop

$300 lik asbob har doim ham kerak emas. «Signal tirikmi, qanchalik katta, qaysi chastota?» uchun ESP32’ning oʻz 12-bit ADC’si uchchalasiga javob beradi: pinni burst-sampling qiling, uch tsikl matematika — va Vpp, Vrms va chastota jonli dashboardda. Bu Rigol emas — lekin gugurt qutisiga sigʻadigan haqiqiy oʻlchov asbobi.

LoyihaOʻlchovADCESP32
ESP32 ostsilloskop loyihasi: bitta ADC pinda Vpp, Vrms va chastota

Avvalo: pinni kuydirmaslik

ADC 0–3.3 V ni, boshqa hech narsani koʻtarmaydi. Real signallar minusga tushadi va pik otadi — shuning uchun kirish obvyazkasi koddan muhimroq: ajratuvchi kondensator ikki rezistorli oʻrta-shina biasga (AC 1.65 V atrofida tebranadi) va kutilmagan hamma narsadan 3V3 va GND’ga clamping diodlar. Va ADC1 pinini (GPIO32–39) oling — Wi-Fi yonishi bilan ADC2 oʻchadi.

Matematika — uch tsikl, FFT kerak emas

«Bu qanday signal» uchun time-domain matematika FFT’dan yaxshi: min/max Vppni, oʻrtachasiz RMS Vrmsni, oʻrtacha ayirilgan signalning koʻtariluvchi nol kesishishlarini sanash esa chastotani beradi — shovqinli trassada ham barqaror:

// --- the scope maths: mean, Vpp, Vrms, zero-cross frequency ---
float mean = 0, mn = 99, mx = -99;
for (int i = 0; i < N; i++) { mean += buf[i]; if (buf[i] < mn) mn = buf[i]; if (buf[i] > mx) mx = buf[i]; }
mean /= N;
float sq = 0; int crossings = 0;
for (int i = 1; i < N; i++) {
  float a = buf[i - 1] - mean, b = buf[i] - mean;
  sq += b * b;
  if (a < 0 && b >= 0) crossings++;              // rising zero-crossings
}
vpp  = mx - mn;
vrms = sqrtf(sq / (N - 1));
freq = crossings * SPS / N;                      // crossings per second

Sample rate haqida halol: oddiy analogRead() ~10 kSps beradi — Nyquist boʻyicha bu bir necha kHz gacha toza: tarmoq foni, audio, sensor toʻlqinlari. Koʻproq kerakmi? ESP32’ning I2S/DMA ADC yoʻli CPU’siz 50 kSps+ oqizadi — matematika oʻsha, bufer kattaroq.

Dashboard

dash.layout("Scope", RICON_SIGNAL);
dash.stat("Frequency", &freq, "Hz");
dash.stat("Vpp", &vpp, "V");
dash.stat("Vrms", &vrms, "V");
dash.chart("Signal level", &level, "V");   // the live "screen"
dash.beginAP("RisalDash-Scope", "12345678");

// acquire a burst — real board:
// for (int i = 0; i < N; i++) buf[i] = analogRead(PIN) * 3.3f / 4095.0f;

Kutubxonadagi namuna (examples/04_Templates/Oscilloscope) sintetik 45–55 Hz sinus + shovqinda ishlaydi — chastota hisoblagichi simlar ulanmasidan oldin dreyfni kuzatadi; keyin demo-tsiklni analogRead() ga almashtirasiz. Batareya qoʻllanmasidagi boʻluvchini qoʻshsangiz, oʻsha pin DC shinalarni ham oʻlchaydi.

Halol qilib nimaga yaraydi

VazifaXulosa
Sensor/generator tirikmi?✅ ideal
Tarmoq foni, audio diapazon✅ toza oʻlchovlar
PWM: toʻldirish va ~5 kHz gacha chastota✅ ishlaydi
MHz shinalar, µs frontlar❌ mantiqiy analizator / haqiqiy skop oling

Simlarni ulashdan oldin matematika dreyflagan signalni qanday tutishini koʻring.