Антидребезг сигналов и кнопок

Урок про подавление ложных срабатываний механических контактов и дискретных датчиков.

Антидребезг (debounce) — приём, при котором изменение состояния признаётся, только если новое значение продержалось стабильно несколько отсчётов подряд.

Механическая кнопка не замыкается мгновенно: контакты «дребезжат» миллисекунды, и наивный код насчитает десяток нажатий вместо одного. То же с дискретными датчиками — концевиками, герконами, датчиками препятствия. Антидребезг отсекает эту трескотню.

Стабильность как критерий

Идея: считаем, сколько отсчётов подряд держится новое значение. Меняем состояние, только когда счётчик достиг порога стабильности $N$. Короткие всплески не доживают до $N$ и игнорируются.

def debounce(samples, stable_n=3):
    state = samples[0]
    count = 0
    out = [state]
    for s in samples[1:]:
        if s != state:
            count += 1
            if count >= stable_n:
                state = s     # новое значение устоялось
                count = 0
        else:
            count = 0         # вернулось к старому — сброс
        out.append(state)
    return out

# дребезг при нажатии: 0->1 с помехами
raw = [0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1]
print(debounce(raw, stable_n=3))

Вывод:

[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]

Выбор окна стабильности

Порог $N$ связан с частотой опроса $f_s$ и длительностью дребезга $t_d$:

$$ N \ge t_d \cdot f_s $$

Например, дребезг до 5 мс при опросе 1 кГц требует $N \ge 5$.

t_d = 0.005    # 5 мс дребезга
fs = 1000      # опрос 1 кГц
N = int(t_d * fs)
print("нужно держать стабильным минимум", N, "отсчётов")

Вывод:

нужно держать стабильным минимум 5 отсчётов

Как работает под капотом

Антидребезг — это, по сути, фильтр нижних частот для дискретного сигнала: он пропускает устойчивые уровни и режет короткие переходы. Есть два подхода: программный (счётчик стабильности, как выше) и аппаратный (RC-цепочка или триггер Шмитта на входе). Программный гибче и не требует деталей, но «съедает» немного времени реакции — ровно $N$ отсчётов задержки. Для быстрых событий (энкодеры) задержку держат минимальной, для кнопок человека $20$–$50$ мс незаметны.

Частые ошибки

  • Совсем не делать антидребезг кнопок — одно нажатие посчитается как несколько.
  • Брать слишком большое $N$ — кнопка станет «тормозной», пропустит быстрые нажатия.
  • Сбрасывать счётчик неверно — при возврате к старому значению он должен обнуляться.

Итог

  • Антидребезг признаёт смену состояния только после $N$ стабильных отсчётов.
  • Порог $N$ выбирают по длительности дребезга и частоте опроса: $N \ge t_d f_s$.
  • Это фильтр нижних частот для дискретного сигнала; цена — задержка в $N$ отсчётов.
Проверьте себя
1. Когда антидребезг признаёт смену состояния?
AСразу при первом новом значении
BПосле N стабильных отсчётов нового значения
CНикогда
DПо таймеру раз в секунду
2. Дребезг длится до 4 мс, опрос идёт с частотой 2 кГц. Каким взять минимальный N?
A2
B4
C8
D0