Пороги и гистерезис событий
Урок про то, как из чисел сделать события «включить/выключить» без дрожания на границе.
Гистерезис порога (триггер Шмитта) — использование двух разных порогов: один для включения, другой для выключения, чтобы убрать дребезг около границы.
Термостат, сигнализация, автоподсветка — все они превращают непрерывную величину в событие по порогу. Но если порог один, а сигнал чуть шумит у самой границы, выход начинает быстро дёргаться «вкл-выкл». Лекарство — два порога.
Проблема одиночного порога
Пусть включаем нагрев, когда температура ниже порога. Около порога шум $\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]
Как работает под капотом
Зона между порогами создаёт «память» состояния: пока сигнал колеблется внутри неё, выход не меняется. Чтобы переключиться, сигналу нужно решительно пересечь всю зону, а не просто коснуться одной линии. Ширину зоны выбирают чуть больше амплитуды шума: слишком узкая не спасёт от дребезга, слишком широкая сделает систему вялой (нагрев включится слишком поздно). Тот же принцип Шмитта встроен в аналоговые компараторы аппаратно.
Частые ошибки
- Ставить один порог для зашумлённого сигнала — гарантированный дребезг.
- Делать зону гистерезиса уже амплитуды шума — она не сработает.
- Путать направления: для нагрева включаем по нижнему порогу, выключаем по верхнему.
Итог
- Один порог на шумном сигнале даёт дребезг на границе.
- Гистерезис — два порога с зоной нечувствительности между ними.
- Ширину зоны берут чуть больше амплитуды шума.