Что такое дребезг контактов и как его устранить?

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

Подавление дребезга кнопки с помощью задержек в скетче – способ очень распространенный и не требующий изменения самой схемы. Но далеко не всегда его можно использовать – ведь 10 миллисекунд – это целая вечность для многих процессов в электроном мире. Также программный способ невозможно применять при использовании прерываний  – дребезг приведет к многократному вызову функций и повлиять на этот процесс в скетче мы не сможем.

Более правильный (и более сложный) способ борьбы с дребезгом – использование аппаратного решения, сглаживающего импульсы, посылаемые с кнопки. Для этого, правда, придется внести изменения в схему.

Аппаратный способ устранения дребезга основан на использовании сглаживающих фильтров. Сглаживающий фильтр, как следует из названия, занимается сглаживанием всплесков сигналов за счет добавления в схему элементов, имеющих своеобразную “инерцию” по отношению к таким электрическим параметрам как ток или напряжение. Самым распространенным примером таких “инерционных” электронных компонентов является конденсатор. Он может “поглощать” все резкие пики, медленно накапливая и отдавая энергию, точно так же, как это делает пружина в амортизаторах.

За счет инерции устройство как утюгом походит по “мятому” сигналу с большим количеством пиков и впадин, создавая пусть и не идеальную, но вполне гладкую кривую, у которой легче определить уровень срабатывания.

Пример простого фильтра на базе RC-цепочки

Схема подключение фильтра для устранения дребезга:

Пример подключения к плате ардуино

Форма сигнала после использования фильтра:

Как видим, “лес” дребезга сменился достаточно плавной линией, с которой уже можно работать дальше.

Подавление дребезга с помощью триггера шмидта

Сделать квадратную форму сигнала с помощью простой RC цепочки невозможно. Для “огранения” сглаженных форм используется специальный компонент, который называется триггер шмидта. Его особенностью является срабатывание при достижении определенного уровня сигнала. На выходе триггера шмидта мы получим или высокий или низкий уровень сигнала, никаких промежуточных значений. Выход триггера инвертированный: при спаде входного сигнала он выдает на выходе включение и наоборот. Ниже представлена схема и результат работы с триггером шмидта.

Иллюстрация результата работы:

Как видим, мы практически полностью избавились от результатов переходных процессов, сперва превратив хаос в почти гладкую кривую линию, а затем с помощью триггера шмидта “отрубили” хвосты, придав сигналу практически идеальный вид. Подав его на вход ардуино, мы уже можем не беспокоиться о ложных срабатываниях и  смело использовать в скетче метод digitalRead и прерывания.

Это интересно: Измерение металлосвязи — методика, нормы, приборы для проверки

Программный метод

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

  • путём временной задержки сигнала, на период вероятного дребезга контактов;
  • методом многократного считывания состояния контактов, на заданном временном интервале. Программа считает цепь замкнутой, если на этом промежутке времени наступает период устойчивого замыкания контакта;
  • используя алгоритм подсчёта, при котором учитывается количество совпадающих значений сигналов замкнутости в определённый промежуток времени (в пределах от 10 до 100 мкс). Если программой будет замечено заданное число совпадений состояния замкнутости, она посчитает контакт устойчиво замкнутым и пропустит сигнал.

Сигнал, полученный программным способом, довольно надёжный и устойчивый. К недостаткам такой схемы подавления дребезга можно отнести разве что небольшую задержку сигнала, которая не превышает 0,1 с. Этот промежуток времени настолько мал, что им можно пренебречь во многих случаях. Обычно палец человека задерживается на клавише до момента отпускания кнопки свыше 0,2 с.

Программированные устройства получают сигналы управления с кнопок и передают идеальные импульсы на устройства-потребители, работающие на цифровых микросхемах. В результате отсечения программой сигналов дребезга, на входы микросхемы поступают только качественные импульсы. Это обеспечивает стабильную работу цифровых устройств, противостоит ложному срабатыванию логических дешифраторов, независимо от уровня сигнала и его качества.

Что такое дребезг контактов и как его устранить?
Программируемое устройство для устранения дребезга

Примечания[ | ]

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

Найти и оформить в виде сносок ссылки на независимые авторитетные источники, подтверждающие написанное.

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

Настройка оборудования

Все коммутаторы будут подключены одинаково (это важно, если мы собираемся сравнивать результаты). Сначала мы увидим, как коммутаторы ведут себя без обработки

Основой нашей схемы будет HCF4017BE. Это десятичный счетчик/делитель, производимый STMicroelectronics. Они больше не производят эту микросхему, так как этот тип устарел. Тем не менее, есть много других производителей, которые всё еще выпускают эту маленькую микросхему, и они часто совместимы по контактам.

Микросхема получает тактовый импульс на вывод 14, после чего загорается светодиод, подключенный к Q1. Когда принимается следующий тактовый импульс, микросхема отключает Q1 и зажигает Q2, и так далее. Когда счетчик достигает Q8 (вывод 9), он подает импульс на вывод 15, который является выводом сброса. Это означает запуск отсчета, начиная с Q0.

Наша основная схема:

Что такое дребезг контактов и как его устранить?Схема тестового макета (описание выше)

Сначала мы попробуем не обрабатывать дребезг совсем. Схемы подачи тактового сигнала показаны ниже:

Тактовый вывод удерживается на уровне лог. 0,
импульс – лог. 1
Тактовый вывод удерживается на уровне лог. 1,
импульс – лог. 0

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

На видео мы используем схему справа. Тактовый вывод удерживается на уровне логической единицы, импульс соответствует уровню логического нуля.

Видео:

Теперь давайте посмотрим некоторые скриншоты осциллографа. Здесь мы использовали левый вариант схемы подачи импульсов: тактовый вывод удерживается на уровне логического нуля, импульс соответствует уровню логической единицы.

Для коммутатора A:

Что такое дребезг контактов и как его устранить?Дребезг контактов коммутатора A

Для коммутатора B:

Что такое дребезг контактов и как его устранить?Дребезг контактов коммутатора B

Для коммутатора C:

Что такое дребезг контактов и как его устранить?Дребезг контактов коммутатора C

Для коммутатора D:

Что такое дребезг контактов и как его устранить?Дребезг контактов коммутатора D

И один скриншот я снял для коммутатора C при использовании правой схемы подачи импульсов: тактовый вывод удерживается на уровне логической единицы, импульс соответствует уровню логического нуля.

Что такое дребезг контактов и как его устранить?Дребезг контактов коммутатора C (импульс соответствует логическому нулю)

Как вы можете видеть, микросхеме кажется, что было несколько нажатий на коммутатор. Хотя это и не так, поскольку на коммутатор было выполнено только одно нажатие.

Добавим керамический конденсатор:

Тактовый вывод удерживается на уровне лог. 0,
импульс – лог. 1
Тактовый вывод удерживается на уровне лог. 1,
импульс – лог. 0

При добавлении конденсатора мы создаем RC-цепь. RC-цепи здесь не обсуждаются.

Новые скриншоты осциллографа сильно отличаются от полученных ранее. Это показывает, что RC-цепь отфильтровывает дребезг.

Данное видео показывает, как работает схема с керамическим конденсатором 0,1 мкФ:

Для коммутатора A:

Что такое дребезг контактов и как его устранить?Сигнал с коммутатора A после добавления конденсатора

Для коммутатора B:

Что такое дребезг контактов и как его устранить?Сигнал с коммутатора B после добавления конденсатора

Для коммутатора C:

Что такое дребезг контактов и как его устранить?Сигнал с коммутатора C после добавления конденсатора

Для коммутатора D:

Что такое дребезг контактов и как его устранить?Сигнал с коммутатора D после добавления конденсатора

Для коммутатора C (импульс соответствует логическому нулю):

Что такое дребезг контактов и как его устранить?Сигнал с коммутатора C после добавления конденсатора (импульс соответствует логическому нулю)

Эти скриншоты говорят нам о том, что дребезг устранен, и что микросхема «видит» только одно нажатие или переключение. Это то, чего мы и хотели.

Транскрипт

1 Тема 3.1(Ч.4). Способы устранения дребезга механических контактов при вводе информации в МПС. План 1. Причины возникновения дребезга контактов. 2. Схемотехнические средства борьбы с дребезгом контактов 3. Программные способы устранения дребезга механических контактов. Причины возникновения дребезга контактов. При работе микроконтроллера с датчиками, имеющими механиче- ские или электромеханические контакты (кнопки, клавиши, реле и клавиатуры), возникает явление, называемое дребезгом (см. рис. 1). Это явление заключается в том, что при замыкании контактов воз- можно появление отскока контактов, которое приводит к переходно- му процессу. При этом сигнал с контакта может быть прочитан МК как случайная последовательность нулей и единиц. Рис. 1 Проявление дребезга контактов

2 Рис. 2 Схемотехнические средства борьбы с дребезгом контактов Подавить это нежелательное явление можно схемотехническими средствами с использованием буферного триггера, как показано на рис. 2. Наиболее надежной и простой в схемном решении является схема подавления дребезга на статическом RC — триггере (рис. 2 — а). Сигнал 0, подаваемый с помощью переключателя к одному из входов этого триггера опрокидывает его. Причем при каждом срабатывании переключателя (кнопки) триггер реагирует на первое же замыкание соответствующей контактной пары и последующие замыкания уже не изменяют его состояние. Недостатком такой схемы подавления дребезга является необходимость использования контактов на переключение, что не всегда приемлемо. В тех случаях, когда кнопка (переключатель) имеет всего одну пару контактов только на замыкание, применяются схемы, использующие постоянную времени перезаряда конденсатора. Формирователь, показанный на рис. 2-б лишен этого недостатка. Он состоит из триггера Шмидта, на входе которого включена интегрирующая цепь (R2, C). При замыкании контактов кнопки SB напряже-

3 ние на входе цепи R2 C падает до нуля. Возникающее в процессе переключения кратковременные импульсы, вызванные дребезгом, сглаживаются интегрирующей цепью. Постоянная времени интегрирующей цепи выбирается так, чтобы амплитуда пульсаций сигнала на её выходе была меньше порога чувствительности триггера Шмидта. Рассматриваемый формирователь может работать и без сопротивления R2 (его включают в качестве токоограничивающего сопротивления через замкнутые контакты кнопки). Благодаря малому сопротивлению замкнутых механических контактов первое же их замыкание приводит к полному разряду конденсатора. Последующие же размыкания контактов, вызванные дребезгом, практически не увеличивают напряжение на конденсаторе вследствие относительно большой постоянной времени его заряда. Формирователь импульсов на одном инверторе (рис. 1-в) позволяет получить относительно большую постоянную времени перезаряда конденсатора при малой его емкости. При замыкании контактов кнопки конденсатор С быстро разряжается через R2. В отличие от рассмотренных выше формирователей, здесь на выходе вырабатывается импульс, длительность которого определяется постоянной времени RC цепи.

4 Рис. 3. Блок-схемы алгоритмов программного устранения дребезга контактов Часто устранение дребезга контактов выполняется программными способами, наибольшее распространение из которых получили сле- дующие два: 1) подсчет заданного числа совпадающих значений сиг- нала; 2) временная задержка. Блок-схемы алгоритмов реализации этих способов приведены на рис. 3. Суть первого способа состоит в многократном считывании сигнала с контакта. Подсчет удачных опросов (т.е. опросов, обнаруживших, что контакт устойчиво замкнут) ведется программным счетчиком. Если после серии удачных опросов встречается неудачный, то подсчет начинается сначала. Контакт считается устойчиво замкнутым (дребезг устранен), если последовало N удачных опросов. Число N подбирается экспериментально для каждого типа используемых датчиков и лежит в пределах от 5 до 50. Устранение дребезга контакта путем введения временной задерж- ки заключается в следующем. Программа, обнаружив замыкание кон- такта, запрещает опрос состояния этого контакта на время, заведомо большее длительности переходного процесса. Временная задержка (в пределах 1-20 мс) подбирается экспериментально для каждого типа датчиков. Вопросы для самоконтроля 1. Причины дребезга контактов.. 2. Схемотехнические способы устранения дребезга механических контактов. 3. Программные способы устранения дребезга механических кон-

Популярные статьи  Что такое сухой трансформатор и как он работает?

5 тактов.

Вариант 1. Использование прерываний.

Этот способ мы использовали в демонстрационном примере для контроллера DINduino. В нем мы соединили подавление дребезга контактов с формированием «событий» нажатых кнопок.

Прежде всего мы определили выводы микроконтроллера к которым подключены используемые нами кнопки. Это сделано исключительно ради читаемости кода программы.

#define INPUT_PIN_1 10 // Вывод кнопки вверх #define INPUT_PIN_2 9 // Вывод кнопки вниз

Следующим шагом мы определили список значений, который будет присваиваться переменной btn_state в результате нажатия на кнопки:

#define BTN_NONE 0 // Нет нажатых кнопок #define BTN_UP 1 // Нажата кнопка вверх #define BTN_DOWN 2 // Нажата кнопка вниз #define BTN_SELECT 3 // Нажата кнопка выбор #define BTN_CANCEL 4 // Нажата кнопка отмена

Следующим шагом мы создали два обработчика прерывания, которые будут выполняться при любом изменении состояния кнопки. Происходит тут следующее: при нажатии на кнопку changeKind == 0 запоминается текущее время. При отпускании кнопки changeKind == 1 мы сравниваем записанное время и текущее. Если значения различаются незначительно — игнорируем считая их ошибочными, если 100 — 750 миллисекунд — считаем коротким нажатием и если более 750 миллисекунд — длительным нажатием.

// Обработчик прерывания нажатия на кнопку 1 void onPinChange_1(byte changeKind) { unsigned long _delay; if (changeKind == 0) { btn_1_time = millis(); } if (changeKind == 1) { _delay = millis() — btn_1_time; if (_delay > 100) btn_state = BTN_UP; if (_delay > 750) btn_state = BTN_SELECT; } } // Обработчик прерывания нажатия на кнопку 2 void onPinChange_2(byte changeKind) { unsigned long _delay; if (changeKind == 0) { btn_2_time = millis(); } if (changeKind == 1) { _delay = millis() — btn_2_time; if (_delay > 100) btn_state = BTN_DOWN; if (_delay > 750) btn_state = BTN_CANCEL; } }

В процедуре инициализации нам только потребовалось зарегистрировать обработчики прерывания для событий изменения состояния нажатия кнопок.

void setup(void) { // Настраиваем вводы-выводы контроллера pinMode(BUZZER, OUTPUT); pinMode(INPUT_PIN_1, INPUT); pinMode(INPUT_PIN_2, INPUT); // Инициализируем слушателей прерываний PciManager.registerListener(INPUT_PIN_1, &listener_1); PciManager.registerListener(INPUT_PIN_2, &listener_2); }

Для реализации работу с прерываниями мы использовали библиотеку PciManager доступную для установки через Library Manager вашей среды Arduino. Впрочем, аналогичным образом вы можете как использовать любую другую библиотеку работы с прерываниями, так и написать эти функции самостоятельно.

Борьба с дребезгом кнопки с помощью библиотеки Ардуино

Мы поняли, что проблема чисто аппаратная, но, как ни парадоксально, со стороны «железа» её сложно исправить. Вы же не можете лично под микроскопом отполировать контакты, да ещё и просить пользователя нажимать на кнопку лишь с одной силой и на постоянной основе.

Поэтому нам придется хитрить со стороны кода и пытаться каким-то образом вписать в обработчик событий этот непростой процесс. А так как мы уже знаем природу этого явления, то примерно представляем, как его обойти или хотя бы постараться минимизировать нагрузку на систему в этот момент.

А всё на самом деле просто, ведь перед нами стоит такой перечень условий:

  1. На срок до 10-100 мС, система пребывает в нестабильном состоянии и может выдавать ошибки.
  2. Далее идет срок от 1 до 2-ух секунд, что в 10 раз больше от предыдущего, пока кнопку нажимают.
  3. И вновь, под конец, 10-100 мС, длится дребезг.

Все, кто работал с многопоточностью на Си, уже заприметили очевидные триггеры, от которых мы и будем отталкиваться. Дело в том, что для предотвращения проблем по программной части нам достаточно выдержать тишину на каком-то промежутке времени, пока дребезг не пройдет, то есть достаточно воспользоваться уже готовой функцией delay().

https://youtube.com/watch?v=bFqEjtEOaeY

Ошибки дребезга кнопки

Как отразится дребезг на нашем проекте? Да самым прямым образом – мы будем получать на входе совершенно случайный набор значений. Ведь если мы считываем значение с кнопки непрерывно, в каждом новом рабочем цикле функции loop, то будем замечать все “всплески” и “падения” сигнала. Потому что пауза между двумя вызовами loop составляет микросекунды и мы измерим все мелкие изменения.

Если мы хотим отследить ситуацию, когда кнопка была отпущена после нажатия, то получим множество ложных сигналов – она будет “нажата-отпущена” десятки раз, хотя мы выполнили лишь однократное нажатие.

Вот пример скетча, в котором непременно обнаружится ошибка дребезга

Мы сможем увидеть в мониторе порта в первые мгновения после нажатия целый набор нулей и единиц в случайной последовательности (не важно, что означает 1 – нажатие или отпускание кнопки, важен сам факт появления хаоса)

void loop() { if (digitalRead(PIN_BUTTON)) { Serial.println(«1»); } else { Serial.println(«0»); } }

Естественно, такое поведение ни к чему хорошему не приведет и нам нужно придумать способ борьбы с дребезгом. В нашем арсенале есть два способа: программный и аппаратный. Первый довольно простой, но не всегда его можно использовать в реальных проектах. Второй – более надежный, но требует существенных изменений в схеме. Давайте рассмотрим оба способа подробнее.

Причины дребезга контактов

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

Чаще всего с дребезгом сталкиваются при подключении кнопки, но почему так происходит? Вот пример при котором это будет:

void loop() {
   if (digitalRead(PIN_BUTTON)) {
     Serial.println("1");
   } else {
     Serial.println("0");
   }
}

Кнопка – это один из видов дополнительных модулей под Ардуино, служащих для ввода информации. В основе работы такого механизма лежит простой алгоритм работы – вы надавливаете на механический переключатель, он смыкает контакты, лежащие под оболочкой, и запускается какой-нибудь скрипт. Таким образом, при помощи давления, которое формируется при нажатии, происходит схождение или расхождение металлических пластин, которые и выступают наиболее популярными триггерами.

Программисту остается лишь написать код, который будет как-то засекать данное событие и выполнять определённые действия.

Пример программного решения проблемы:

int currentValue, prevValue;
void loop() {
  currentValue = digitalRead(PIN_BUTTON);
  if (currentValue != prevValue) {
    // Что-то изменилось, здесь возможна зона неопределенности
    // Делаем задержку
    delay(10);
    // А вот теперь спокойно считываем значение, считая, что нестабильность исчезла
    currentValue = digitalRead(PIN_BUTTON);
  }
 
  prevValue = currentValue;
  Serial.println(currentValue);
}

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

Соответственно, в реальности контакты соприкасаются не моментально, из-за недочетов конструкции и на короткий промежуток времени на границах пластин меняется сопротивление, вместе с взаимной емкостью.

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

Однако, когда мы сталкиваемся с системами, способными фиксировать состояние объектов вплоть до миллисекунды, все эти процессы становятся заметными и крайне проблемными. А всё дело в том, что каждая строчка кода, которую вы прописываете при программировании системы, каким-то образом должна учитывать и обрабатывать все сигналы, в том числе и тот самый пресловутый «дребезг контактов».

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

Фильтр дребезга из триггера Шмитта

Таким образом простой фильтр дребезга может быть собран из триггера Шмитта, и RC-цепочки. Причем резистор подходящего номинала уже присутствует в модуле энкодера (подтягивающий резистор на 10 кОм). Остается добавить конденсатор между выводом энкодера и землей. Емкость конденсатора определяется временем дребезга контактов: чем дольше дребезг, тем больше должна быть емкость. Я подобрал подходящую емкость опытным путем: конденсатор 104 позволил устранить большую часть шумов, но временами небольшие всплески все же проскакивали. После добавления второго конденсатора скачки на вход триггера Шмитта уже не проходили, т.е. мне хватило емкости 0.2 мкФ. Можно было бы использовать конденсатор с кодом 224 на 0.22 мкФ, у меня таких не нашлось. Касаемо используемого триггера: в стандартные серии цифровых микросхем входят триггеры Шмитта, представляющие собой инверторы (ТЛ2 — 6 инверторов), элементы 2И-НЕ (ТЛ3 — 4 элемента) и элементы 4И-НЕ (ТЛ1 — 2 элемента). Поэтому в схеме используется инвертирующий триггер Шмитта (я использую микросхему SN74HC14N, аналог отечественной К561ТЛ2).

В приведенной схеме фильтра сигнал на входе триггера будет нарастать постепенно, пока заряжается конденсатор. Но при замыкании контакта конденсатор будет быстро разряжаться через него. Если требуется обеспечить плавность затухания сигнала, то в схему добавляется второй резистор между кнопкой и конденсатором. В моем случае это не требуется.

Для проверки работы фильтра я подготовил стенд из мотора с редуктором и энкодера, т.к. планирую сравнить разные способы устранения дребезга. Стенд поможет сравнить их при одинаковых условиях. Итак, ниже представлен результат использования RC-цепочки с триггером Шмитта для подавления дребезга энкодера. Напоминаю, что энкодер имеет 2 сигнальных вывода, поэтому на осциллограммах показаны 2 сигнала, для каждого используется свой фильтр дребезга.

Что такое дребезг контактов и как его устранить?

Искаженный дребезгом сигнал на выводах энкодера

Что такое дребезг контактов и как его устранить?

Сигнал, сглаженный RC-цепочкой

Что такое дребезг контактов и как его устранить?

Сигнал, восстановленный триггером Шмитта

Последний скриншот подтверждает, что фильтр справляется со своей задачей на отлично. При увеличении скорости вращения ручки энкодера сбоев также не наблюдалось. Теперь такой сигнал можно подавать на вход Ардуино и использовать для генерации прерываний, о чем речь пойдет в следующей статье.

Дребезг контактов кнопки ардуино – одно из самых неприятных и непонятных явлений, с которыми сталкивается начинающий ардуинщик. Устранение дребезга необходимо для корректной работы проекта, в противном случае на короткий отрезок времени схема становится практически неуправляемы. В этой статье мы рассмотрим основные причины возникновения и способы подавления дребезга. О том, что такое кнопка, как правильно подключать модуль и писать для него скетч вы можете прочитать в первой статье, посвященной кнопкам в ардуино.

Рейтинг
( Пока оценок нет )