← До всіх проєктів
Основи Середній

Логічний аналізатор: побачити, що насправді відбувається на виводах

Дешевий 8-канальний аналізатор за кілька сотень гривень показує сигнали на GPIO в часі. Порівнюємо програмний меандр на digitalWrite і апаратний ШІМ, вчимося міряти період і заповнення.

Складність
Середній
Час
30 min
Категорія
Основи
Оновлено

Про проєкт

Мультиметр показує середню напругу, а коли сигнал змінюється тисячі разів на секунду, він безсилий. Логічний аналізатор записує стан кількох цифрових ліній у часі та малює їх як діаграму. Це найкращий спосіб зрозуміти, чому не працює I2C, скільки насправді триває ваш delay(1) або чи правильно налаштовано ШІМ.

Популярний недорогий варіант — клон Saleae на 8 каналів і 24 МГц, який працює з безкоштовною програмою PulseView (проєкт sigrok).

Що знадобиться

  • ESP32 DevKit
  • Логічний аналізатор 8 каналів / 24 МГц (USB)
  • Програма PulseView

Схема

Канал аналізатора ESP32 Що побачимо
D0 GPIO25 програмний меандр
D1 GPIO26 повільніший шаблон
D2 GPIO27 апаратний ШІМ 1 кГц, 25 %
GND GND обов'язково спільна земля

Без з'єднання GND аналізатор показуватиме шум. Входи дешевих аналізаторів розраховані на 0–5 В, тож 3.3 В ESP32 для них безпечні.

Що генерує скетч

  • D0: у кожному проході loop() вивід перемикається, потім delay(1). Виходить меандр із періодом ~2 мс, але він «дихає»: кожен прохід триває трохи довше за 1 мс.
  • D1: біт 2 лічильника n, тобто сигнал, вчетверо повільніший за D0.
  • D2: апаратний блок LEDC видає 1 кГц із заповненням 64/256 = 25 %. Він не залежить від loop() і працює ідеально рівно, навіть поки програма зайнята чимось іншим.

Код

// Три сигнали для логічного аналізатора
void setup() {
  pinMode(25, OUTPUT);
  pinMode(26, OUTPUT);
  ledcAttach(27, 1000, 8);   // апаратний ШІМ: 1 кГц
  ledcWrite(27, 64);         // заповнення 25 %
}

void loop() {
  static uint8_t n = 0;
  digitalWrite(25, !digitalRead(25));   // перемикається кожну ~1 мс → період 2 мс
  digitalWrite(26, (n >> 2) & 1);       // учетверо повільніше
  n++;
  delay(1);
}

Як читати діаграму

  • Період — час між двома фронтами наростання. Частота = 1 / період.
  • Заповнення — частка періоду, коли лінія в HIGH.
  • У PulseView додайте декодер протоколу (I2C, UART, SPI, 1-Wire): він підпише байти прямо над сигналом.
  • Частота дискретизації має бути хоча б у 4–10 разів вищою за частоту сигналу. Для I2C на 400 кГц потрібно 4 МГц і більше.

Що спробувати

  • Змініть delay(1) на delayMicroseconds(100) і подивіться, як стискається D0.
  • Змініть ledcWrite(27, 64) на 192: заповнення стане 75 %.
  • У симуляторі змінюйте «Вікно часу» у властивостях аналізатора (2 мс … 5 с), щоб розглянути сигнал ближче або побачити довгий фрагмент.