Пороги и гистерезис событий

Урок про то, как из чисел сделать события «включить/выключить» без дрожания на границе.

Гистерезис порога (триггер Шмитта) — использование двух разных порогов: один для включения, другой для выключения, чтобы убрать дребезг около границы.

Термостат, сигнализация, автоподсветка — все они превращают непрерывную величину в событие по порогу. Но если порог один, а сигнал чуть шумит у самой границы, выход начинает быстро дёргаться «вкл-выкл». Лекарство — два порога.

Проблема одиночного порога

Пусть включаем нагрев, когда температура ниже порога. Около порога шум $\pm 0{,}2\,°C$ заставит реле щёлкать многократно. Это изнашивает технику и раздражает.

# одиночный порог 22.0 -> дребезг на границе
def single_threshold(temps, thr=22.0):
    return [1 if t < thr else 0 for t in temps]

temps = [22.1, 21.9, 22.05, 21.95, 22.1, 21.8]
print(single_threshold(temps))

Вывод:

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

Два порога убирают дребезг

Включаем при $T \lt T_{on}$, выключаем только при $T \gt T_{off}$, где $T_{off} \gt T_{on}$. В зоне между порогами состояние не меняется:

$$ T_{on} \lt T_{off}, \qquad \text{зона нечувствительности} = T_{off} - T_{on} $$

def schmitt(temps, t_on=21.5, t_off=22.5):
    state = 0
    out = []
    for t in temps:
        if state == 0 and t < t_on:
            state = 1          # включить нагрев
        elif state == 1 and t > t_off:
            state = 0          # выключить
        out.append(state)
    return out

temps = [22.1, 21.9, 22.05, 21.4, 22.0, 22.6, 22.1]
print(schmitt(temps))

Вывод:

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

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

Зона между порогами создаёт «память» состояния: пока сигнал колеблется внутри неё, выход не меняется. Чтобы переключиться, сигналу нужно решительно пересечь всю зону, а не просто коснуться одной линии. Ширину зоны выбирают чуть больше амплитуды шума: слишком узкая не спасёт от дребезга, слишком широкая сделает систему вялой (нагрев включится слишком поздно). Тот же принцип Шмитта встроен в аналоговые компараторы аппаратно.

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

  • Ставить один порог для зашумлённого сигнала — гарантированный дребезг.
  • Делать зону гистерезиса уже амплитуды шума — она не сработает.
  • Путать направления: для нагрева включаем по нижнему порогу, выключаем по верхнему.

Итог

  • Один порог на шумном сигнале даёт дребезг на границе.
  • Гистерезис — два порога с зоной нечувствительности между ними.
  • Ширину зоны берут чуть больше амплитуды шума.
Проверьте себя
1. Зачем в пороговом срабатывании используют два порога вместо одного?
AЧтобы сэкономить память
BЧтобы убрать дребезг на границе при шуме
CЧтобы повысить чувствительность
DЭто требование стандарта
2. Как выбирать ширину зоны гистерезиса?
AНулевой
BЧуть больше амплитуды шума
CКак можно шире всегда
DСлучайно