Логічний аналізатор: побачити, що насправді відбувається на виводах
Дешевий 8-канальний аналізатор за кілька сотень гривень показує сигнали на GPIO в часі. Порівнюємо програмний меандр на digitalWrite і апаратний ШІМ, вчимося міряти період і заповнення.
Про проєкт
Мультиметр показує середню напругу, а коли сигнал змінюється тисячі разів на секунду, він безсилий. Логічний аналізатор записує стан кількох цифрових ліній у часі та малює їх як діаграму. Це найкращий спосіб зрозуміти, чому не працює 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 с), щоб розглянути сигнал ближче або побачити довгий фрагмент.