Перейти к содержанию

Дребезг контактов

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

Обновлено Редакция GAW

Дребезг контактов (contact bounce) — явление, при котором механические контакты кнопки, переключателя или реле в момент замыкания или размыкания несколько раз соединяются и разъединяются, прежде чем установятся в новом положении. Контакты упруги и отскакивают друг от друга, а при размыкании могут какое-то время скользить, меняя сопротивление. Вместо одного фронта на входе микросхемы получается пачка импульсов.

Сколько длится

Джек Ганссл измерил дребезг 18 разных переключателей. У 16 из них дребезг длился в среднем около 1,6 мс, наибольший — 6,2 мс, причём многие отдельные отскоки были короче микросекунды. Две кнопки выбивались из ряда: одна однажды замыкалась 11,3 мс, другая при отпускании дребезжала до 157 мс. Отсюда вывод: длительность дребезга сильно зависит от конкретного переключателя и направления переключения, и рассчитывать на среднее значение нельзя.

Как подавить

  • Программно. Вход опрашивают по таймеру и считают состояние изменившимся, только если оно держится всё время подавления. Ганссл рекомендует 20–50 мс: реакция за 50 мс кажется мгновенной, а 100 мс уже заметны.
  • RC-цепью. Резистор и конденсатор сглаживают пачку импульсов в медленный фронт, время которого задаёт постоянная времени цепи. Такой фронт подают только на вход с триггером Шмитта: обычный логический вход на медленном фронте сам начнёт переключаться. Номиналы фильтра поможет подобрать калькулятор RC-фильтра.
  • SR-защёлкой. С переключателем на два направления два логических элемента, включённые триггером, полностью убирают дребезг — самый надёжный, но редкий вариант, потому что такие переключатели крупнее и дороже.

Кнопка на входе внешнего прерывания особенно чувствительна к дребезгу: EXTI у STM32F103 замечает импульс от 10 нс (DS5319, табл. 38), и каждый отскок вызывает прерывание. Как настраивать прерывания от выводов и обрабатывать их флаги — в статье о прерываниях STM32.

Частые вопросы

Сколько длится дребезг кнопки?

По измерениям Джека Ганссла на 18 разных переключателях у большинства дребезг длился в среднем около 1,6 мс и не больше 6,2 мс. Но встречаются исключения: одна кнопка при отпускании дребезжала до 157 мс. Поэтому время подавления выбирают с запасом, а не по среднему значению.

Какое время подавления дребезга выбрать в программе?

Ганссл предлагает от 20 до 50 мс: это больше дребезга почти всех переключателей, а реакция за 50 мс воспринимается как мгновенная. При 100 мс задержка уже заметна человеку. Программа считает кнопку нажатой, только если вход держит новое состояние всё это время.

Почему кнопка на прерывании срабатывает несколько раз?

Потому что вход прерывания замечает очень короткие импульсы — у STM32 EXTI реагирует на импульс от 10 нс, — а многие отскоки контактов длятся меньше микросекунды. Каждый отскок вызывает своё прерывание. Решение — RC-фильтр на входе или программная обработка: после первого фронта игнорировать следующие в течение времени подавления.

Источники

  1. Jack Ganssle. A Guide to Debouncing, part 1: Debouncing Contacts and Switches — измерения 18 разных переключателей: у 16 в среднем 1557 мкс дребезга, наибольший — 6200 мкс; у одного размыкание с дребезгом до 157 мс; многие отскоки короче 1 мкс
  2. Jack Ganssle. A Guide to Debouncing, part 2: Debouncing, hardware and software — RC-цепь с входом триггера Шмитта, SR-защёлка, программные алгоритмы; период подавления 20–50 мс, реакция за 50 мс кажется мгновенной, 100 мс — заметна
  3. STMicroelectronics. STM32F103x8, STM32F103xB datasheet (DS5319) — табл. 38: EXTI замечает импульс от 10 нс

Нашли ошибку?