Такт, импульсы и тайминги
Цифровая схема выглядит простой, пока вы не начинаете считать время.
🎓 В курсе nand2cpuТактовые сигналы в действии: Урок 25: 555 таймер
Импульс и его параметры
┌────────┐ ┌────────┐
│ │ │ │
│ HIGH │ │ HIGH │
──────┘ └──────────┘ └──────
↑ ↑ ↑
│ │ │
rising falling rising
edge edge edge
(фронт) (спад) (фронт)
|←── t_high ──→|←─ t_low ─→|
|←───────── T (период) ────→|
Ключевые понятия
| Термин | Описание |
|---|---|
| Импульс | Кратковременное изменение уровня |
| Фронт (rising edge) | Переход 0 → 1 |
| Спад (falling edge) | Переход 1 → 0 |
| Период T | Время одного полного цикла |
| Частота f | Сколько циклов в секунду |
Период и частота
| Частота | Период | Где встречается |
|---|---|---|
| 1 Гц | 1 с | Мигание LED |
| 100 Гц | 10 мс | Датчики, кнопки |
| 1 кГц | 1 мс | Сервоприводы, PWM |
| 16 МГц | 62.5 нс | Arduino Uno |
| 240 МГц | 4.17 нс | ESP32 |
Скважность (duty cycle)
D = 25%: D = 75%:
┌──┐ ┌──┐ ┌──────┐ ┌──────┐
│ │ │ │ │ │ │ │
────┘ └────────┘ └──── ────┘ └────┘ └──
|25%| 75% | | 75% |25%|
Применение PWM:
- D = 0% → мотор стоит, LED выключен
- D = 50% → половина мощности
- D = 100% → полная мощность
Такт (clock) — сердце цифровой системы
CLK: ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐
│ │ │ │ │ │ │ │ │ │
───┘ └──┘ └──┘ └──┘ └──┘ └──
↑ ↑ ↑ ↑
│ │ │ │
Триггеры защёлкивают данные
ТОЛЬКО по фронту CLK
Зачем нужен такт:
- Синхронизация — все части схемы работают в одном ритме
- Предсказуемость — изменения только в определённые моменты
- Фильтрация помех — короткие пики между тактами игнорируются
Источники тактового сигнала
| Источник | Частота | Точность | В курсе nand2cpu |
|---|---|---|---|
| RC-генератор | ~1 кГц – 1 МГц | ±10-20% | — |
| 555 таймер | ~1 Гц – 500 кГц | ±5% | Урок 25 |
| Кварцевый резонатор | до 200 МГц | ±0.01% | — |
| Керамический резонатор | до 20 МГц | ±0.5% | — |
Проблемы с таймингами
1) Дребезг контактов
Идеально: Реально (дребезг):
┌───────── ┌┐┌┐┌─────
│ │││││
────┘ ────┘└┘└┘
1 фронт 5-10 фронтов!
Решение: антидребезг
2) Шум на длинных проводах
Провод > 30 см работает как антенна и ловит помехи.
Решения:
- Подтягивающий резистор (4.7–10 кОм)
- RC-фильтр на входе
- Экранированный кабель
- Триггер Шмитта (74HC14)
3) Метастабильность
Если данные меняются слишком близко к фронту CLK, триггер может «зависнуть» между 0 и 1.
Решение: соблюдать setup time и hold time (из datasheet).
Триггер Шмитта (Schmitt trigger)
Специальный вход с гистерезисом — два разных порога:
Обычный вход: Триггер Шмитта:
───────── порог ─────── верхний порог
─────── нижний порог
На шумном сигнале обычный вход даёт много фронтов, Шмитт — чистый.
74HC14 — 6 инверторов с триггером Шмитта.
Практические правила
- Внешний сигнал → фильтруй: подтяжка + антидребезг
- Считаешь импульсы → проверь длительность: импульс должен быть ≥ 2 такта счётчика
- PWM для мотора → частота 1–20 кГц (не слышно, не греет драйвер)
- PWM для LED → частота ≥ 100 Гц (не мерцает)
Связь с другими темами
- Антидребезг — фильтрация механических контактов: debouncing
- Последовательная логика — триггеры и такт: sequential_logic
- Счётчики — подсчёт тактов: counters
- 555 таймер — генератор тактов: nand2cpu урок 25
- Стабильное питание — для чистого CLK: power_supplies
Мини‑задания
Найдите период для \(f=2\,\text{кГц}\).
PWM 1 кГц, \(D=25\%\). Чему равно \(t_{high}\)?
Arduino работает на 16 МГц. Сколько тактов в 1 мс?
Почему триггер Шмитта лучше для кнопки, чем обычный вход?
Какая минимальная частота PWM для LED, чтобы не было мерцания?
Details
\(T=1/2000=0.5\,\text{мс}\).
\(T=1\,\text{мс}\), \(t_{high}=0.25 \times 1=0.25\,\text{мс}=250\,\text{мкс}\).
\(16\,000\,000 \times 0.001 = 16\,000\) тактов.
Гистерезис отсекает шум — переключение происходит чётко, без дребезга на пороге.
≥ 100 Гц (лучше 200+ Гц).
