Как избавиться от дребезга контактов при подключении кнопки к arduino

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

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

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

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); }

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

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

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

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

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

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

Постараемся исправить ситуацию. Мы знаем, что дребезг контактов проявляет себя в течение нескольких миллисекунд после замыкания контактов. Давайте после изменения состояния кнопки выжидать, скажем, 5 мсек. Это время для человека является практически мгновением, и нажатие кнопки человеком обычно происходит значительно дольше – несколько десятков миллисекунд. А Arduino прекрасно работает с такими короткими промежутками времени, и эти 5 мсек позволят ему отсечь дребезг контактов от нажатия кнопки.Скетч обработки нажатия кнопки с задержкой для устранения эффекта дребезга контактов int switchPin = 2; // пин кнопки int ledPin = 13; // пин светодиода boolean lastButton = false; // предыдущее состояние кнопки boolean currentButton = false; // текущее состояние кнопки boolean ledOn = false; // состояние светодиода void setup() { pinMode (switchPin, INPUT); pinMode (ledPin, OUTPUT);} void loop() { currentButton = debounce (lastButton); // получаем состояние кнопки без дребезга if (lastButton == false && currentButton == true) { // если кнопка была нажата дольше 5 мсек, ledOn = !ledOn; // то меняем состояние светодиода } lastButton = currentButton; // обнуляем состояние нажатия кнопки digitalWrite (ledPin, ledOn); // зажигаем/гасим светодиод} // Процедура определения нажатия кнопки без дребезга:boolean debounce(boolean last) { boolean current = digitalRead(switchPin); // считываем текущее состояние кнопки if (last != current) { // если состояние изменилось delay(5); // делаем задержку на 5 мсек, пока уляжется дребезг current = digitalRead(switchPin); // и считываем снова } return current; // возвращаем текущее состояние кнопки} В данном скетче мы объявим процедуру debounce() («bounce» по-английски – это как раз «дребезг», приставка «de» означает обратный процесс), на вход которой мы подаём предыдущее состояние кнопки. Если нажатие кнопки длится более 5 мсек, значит это действительно нажатие. Определив нажатие, мы меняем состояние светодиода.

Загрузим скетч в плату Arduino. Теперь всё гораздо лучше! Кнопка срабатывает без сбоев, при нажатии светодиод меняет состояние, как мы и хотели.

Как это выглядит?

В общем чего томить, выбрал самую не внушающую доверие (но удобную в креплении во всяких самоделках) кнопку и подключил её по схеме (представлена ниже).

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

Ну а бывает и такое, херачит переходы в течении почти 26 мс .

Цифровая система может и будет регистрировать эти переходы, таким образом если нужно что-то сделать при нажатии (например, изменить состояние свечения СИД), то конечное состояние хер предскажешь, нужно что-то делать.

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

Аппаратные решения всегда ценились за их надёжность и возможность облегчить написание программы.

Вот как выглядела схема подключения кнопки без аппаратной защиты от дребезга:

Схема подключения кнопки к Arduino

Добавив пару дополнительных элементов в схему мы сможем полностью избавиться от дребезга, не усложняя при этом код. А добавим мы инвертирующий триггер Шмитта и конденсатор. Мы построим RC-цепь с инвертирующим триггером. Вот так это выглядит на схеме:

Резистор 10 кОм у нас теперь подтягивает вывод не к земле, а к +5В. Причём подтягивается не вход Ардуино, а вход инвертирующего триггера и заодно, конденсатор. Кнопка же, наоборот, подключена к земле. Сделано это в связи с тем, что триггер у нас инвертирующий. Суть такова: входящий аналоговый сигнал может быть восходящим, либо нисходящим. Внутри триггера определены пороговые значения:

1,6 В — для нисходящего сигнала и

0,9 В — для восходящего. Выход триггера становится логической единицей (5 В), при прохождении нисходящим сигналом через свой порог в 0,9 В, при этом нисхождение восходящим сигналом верхнего порога в 1,6 В будет проигнорировано. Аналогично, выход триггера становится логическим нулём (0 В), только когда восходящий сигнал проходит свой порог в 1,6 В, при этом проигнорируется прохождение нисходящим сигналом нижнего порога в 0,9 В. Зона неопределённости между порогами называется гистерезисом. То есть триггер переворачивает сигнал. Конденсатор с резистором образует RC-цепь. RC — от английских названий резистора и конденсатора (resistor и capacitor). RC-цепь замедляет затухание сигнала. То есть при снятии напряжения, оно пропадёт не сразу, а будет плавно снижаться. При нажатии кнопки мы прижмём RC-цепь к земле, конденсатор начнёт разряжаться и напряжение начнёт плавно падать. После отпускания кнопки, напряжение начнёт так же плавно расти:

График изменения напряжения RC-цепи

Инвертирующий триггер выполняет 2 функции:

1) он инвертирует (переворачивает) логические уровни: единица становится нулём, а ноль становится единицей.

2) он преобразует аналоговый сигнал в цифровой. То есть, в определённый момент, когда конденсатор разрядится до определённого уровня, триггер выдаст логическую единицу. Затем это нужно? При отпускании кнопки, при достижении определённого уровня заряда конденсатора, триггер установит на выходе низкий уровень. Сигнал на выходе триггера не будет зависеть от дребезга:

График изменения напряжения на выходе инвертирующего триггера Шмитта

Что такое дребезг контактов

Дребезг контактов возникает во время замыкания или размыкания контактов. Посмотрите на рисунок:

Изначально контакт разомкнут.

Когда мы начинаем замыкать контакт (нажимаем на кнопку), то замыкание происходит не сразу.

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

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

Однако быстродействие микроконтроллера таково, что он заметит все (или почти все) замыкания-размыкания переходного процесса. Это будет означать, что программа микроконтроллера столько раз отреагирует на сигнал от кнопки, сколько раз будет изменяться сигнал во время переходного процесса.

А мы то ожидаем, что одно нажатие кнопки — это одно переключение входа микроконтроллера. Но на самом деле это не так. Потому что дребезг контактов вносит свою лепту в усложнение жизни инженеров.

Представьте, что наши кнопки — это клавиатура телефона. Мы нажимаем цифру 8, подразумевая, что эта цифра будет набрана телефоном один раз. Но телефон вместо этого набирает 5 или 10 восьмёрок, потому что разработчики телефона не удосужились предусмотреть защиту от дребезга контактов. Станете вы пользоваться таким телефоном?

Ну и напоследок надо сказать, что время дребезга контактов зависит от качества контактов, и обычно составляет от 10 до 100 мс.

Устранение дребезга контактов

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

Есть два способа борьбы с дребезгом контактов:

  1. Аппаратный
  2. Программный

Далее рассмотрим в общих чертах оба способа.

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

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

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

Простая схема устранения дребезга контактов приведена на рисунке:


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

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

Программное подавление дребезга контактов

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

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

Самое простое и самое распространённое программное решение для борьбы с дребезгом — это временная задержка. Алгоритм простой:

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

Бывают особые случаи, когда быстрое переключение контактов — это обычное состояние системы. Ну например, если есть какой-то датчик, который по логике работы не может принимать фиксированное значение на длительное время. То есть идёт как бы непрерывный дребезг контактов. И в этом бесконечном потоке нам надо как-то определить, какой же всё-таки сигнал на входе.

В этом случае можно применить следующий алгоритм:

  1. Посчитать количество и/или продолжительность замкнутого и разомкнутого состояния контакта в единицу времени (например, в секунду).
  2. По наибольшему количеству (или времени) определить конечное состояние сигнала.

Например, если за секунду на входе у нас 50 раз была логическая 1, и 20 раз — логический 0, то можно считать, что на входе единица. Разумеется, здесь нужен индивидуальный подход в зависимости от задачи.

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

Теория

Что такое дребезг контактов? Когда вы нажимаете на кнопку или на микропереключатель или изменяете положение тумблера, два металлических контакта замыкаются. Для пользователя может показаться, что контакт наступил мгновенно. Это не совсем правильно. Внутри коммутатора есть движущиеся части. Когда вы нажимаете на коммутатор, он вначале создает контакт между металлическими частями, но только в кратком разрезе микросекунды. Затем он делает контакт немного дольше, а затем еще немного дольше. В конце коммутатор полностью замыкается. Коммутатор скачет (дребезжит) между состояниями наличия и отсутствия контакта. «Когда коммутатор замыкается, два контакта фактически разъединяются и снова соединяются обычно от 10 до 100 раз за время, примерно равное 1 мс» («Искусство схемотехники», Хоровиц и Хилл, второе издание). Обычно оборудование работает быстрее, чем дребезг, что приводит к тому, что оборудование думает, что вы нажали на кнопку несколько раз. Оборудование часто является интегральной микросхемой. Следующие скриншоты иллюстрируют типовой дребезг контактов без какой-либо обработки:


Осциллограмма дребезга контактов

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

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


Исследуемые коммутаторы

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

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

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

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

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


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

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

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

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

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

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

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

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

Полный текст программы

// constants won’t change. They’re used here to set pin numbers: const int buttonPin = 2; // the number of the pushbutton pin const int ledPin = 13; // the number of the LED pin // Variables will change: int ledState = HIGH; // the current state of the output pin int buttonState; // the current reading from the input pin int lastButtonState = LOW; // the previous reading from the input pin // the following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); // set initial LED state digitalWrite(ledPin, ledState); } void loop() { // read the state of the switch into a local variable: int reading = digitalRead(buttonPin); // check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you’ve waited long enough // since the last press to ignore any noise: // If the switch changed, due to noise or pressing: if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); } if ((millis() — lastDebounceTime) > debounceDelay) { // whatever the reading is at, it’s been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if (reading != buttonState) { buttonState = reading; // only toggle the LED if the new button state is HIGH if (buttonState == HIGH) { ledState = !ledState; } } } // set the LED: digitalWrite(ledPin, ledState); // save the reading. Next time through the loop, it’ll be the lastButtonState: lastButtonState = reading; }

Полный текст программы

// constants won’t change. They’re used here to set pin numbers: const int buttonPin = 2; // the number of the pushbutton pin const int ledPin = 13; // the number of the LED pin // Variables will change: int ledState = HIGH; // the current state of the output pin int buttonState; // the current reading from the input pin int lastButtonState = LOW; // the previous reading from the input pin // the following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); // set initial LED state digitalWrite(ledPin, ledState); } void loop() { // read the state of the switch into a local variable: int reading = digitalRead(buttonPin); // check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you’ve waited long enough // since the last press to ignore any noise: // If the switch changed, due to noise or pressing: if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); } if ((millis() — lastDebounceTime) > debounceDelay) { // whatever the reading is at, it’s been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if (reading != buttonState) { buttonState = reading; // only toggle the LED if the new button state is HIGH if (buttonState == HIGH) { ledState = !ledState; } } } // set the LED: digitalWrite(ledPin, ledState); // save the reading. Next time through the loop, it’ll be the lastButtonState: lastButtonState = reading; }

Определение и суть проблемы в электронике

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

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

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

Пример осциллограммы дребезга контактов изображен на рисунке ниже:

Скетч (код) к уроку 8. Arduino: Дребезг — программное устранение.ino 1 Kb 59 Вы можете скачать файл.

Устранение дребезга контактов в счетчике воды | Жизнь, бизнес и IT
Для того, чтобы понять как устранить дребезг кнопки посмотрим рисунок, на котором изображен дребезг кнопки. Как видим, дребезг длится недолго, и если сделать небольшую задержку после нажатия на кнопку и считать значение еще раз, то считаное значение будет уже в установившемся состоянии.

Мнение эксперта
It-Technology, Cпециалист по электроэнергетике и электронике
Задавайте вопросы «Специалисту по модернизации систем энергогенерации»

Мучаем 5576ХС4Т — часть 5 — подавление дребезга кнопки: nabbla1 — ЖЖ Аппаратное устранение дребезга кнопки представляет собой изменение схемы подключения путем установки элементов, которые способны устранить дребезг. Спрашивайте, я на связи!

Способы устранения и подавления дребезга

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

Аппаратный способ

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

Для снижения уровня коммутационного износа в различных реле и силовых выключателях применяют искрогасящие цепочки:

  • шунтирующие RC-цепи;
  • варисторы, препятствующие скачкообразному изменению напряжения;
  • обратные диоды, подавляющие напряжения самоиндукции;
  • стабилитроны;
  • комбинированные схемы (варистор +RC-цепь).

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

Схемы цепей изображены на рис. 3.


Рисунок 3. Схемы искрогасящих цепей

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

Управление приборами чувствительными к дребезгу осуществляется через ФНЧ (например, через RC-цепочку). Обладая электрической емкостью, конденсатор забирает часть энергии в момент касания контактов. После разрыва цепи вследствие дребезга накопленная энергия возвращается. Таким образом, происходит сглаживание амплитуды колебаний.

Установки триггеров

Ещё один способ борьбы с дребезгом состоит в использовании специальных электронных схем, включающих rs-триггеры.

Роль триггеров заключается в преобразовании входного аналогового сигнала в цифровой и инверсии (переворачивания) логических уровней. Наглядно инверсию объясняет схема на рисунке 4.


Рис. 4. Наглядная схема инверсии сигнала

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

Простая схема с триггером показана на рисунке 5.


Рис. 5. Наглядная схема подключения rs-триггеров

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

Использование герконов

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

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

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

Методы устранения перекоммутации:

  1. С помощью задержки.
  2. Через bounce-библиотеку.
  3. С применением фильтра.
  4. С использованием триггера Шмитта.

С помощью задержки

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

В качестве отсрочки используются следующие команды:

  • delay() (применяется в коде с 1 переменной, где не требуется возвращать таймер отсчета времени к начальному значению);
  • millis() (выгоднее использовать в скетчах, где задействованы 2 и более переменных, позволяет организовать параллельную работу нескольких процессов).

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

Данные функции вызываются в программе после того, как произведено действие, реагирующее на изменение состояния кнопки.

Например:

if(digitalRead(button2Pin) == HIGH)

{

digitalWrite(led2Pin,HIGH);

delay(3000);

digitalWrite(led2Pin,LOW);

}

Алгоритм данного кода следующий:

  1. Клавиша имеет уровень логической единицы.
  2. Зажечь светодиод.
  3. Подождать.
  4. Погасить светодиод.

Таким образом получается реализовать простой алгоритм мигания лампочки.

С помощью библиотеки Bounce

Для подавления дребезга создана специальная библиотека Bounce, которая позволяет использовать классы для инициализации объектов.

Типичный вид объекта следующий: Bounce (byte *номер вывода контроллера, к которому подключен ключ*, unsugned long *время в миллисекундах, в течение которого длится дребезг*).

Чтобы библиотеку использовать в скетче, нужно:

  • подключить ее командой #include ;
  • инициализировать объект (например, Bounce bouncer = Bounce(BUTTON,5);
  • в коде, где считывается или записывается состояние кнопки, добавлять приставку «bouncer.» (например, bouncer.read()).

Пример использования функций Bounce в программе: http: //greenoakst.blogspot.com /2012/06/ arduino-bounce. Html

При помощи сглаживающего фильтра

Устранить дребезг можно не только программно, но и аппаратно. Например, с помощью установки пассивного фильтра низких частот на основе конденсатора параллельно клавише.

Принцип действия метода состоит в том, что напряжение на конденсаторе не может изменяться мгновенно. Нажатие кнопки запускает процесс заряда/разряда. Ложные нажатия при этом будут отсутствовать, т. к. будет только 1 переходный процесс — заряд/разряд емкости (которая намного больше паразитных емкостей).

Преимущества использования аппаратного устранения дребезга:

  1. Освобождаются ресурсы микроконтроллера для выполнения других задач.
  2. Упрощается процесс отладки кода (чем меньше в нем строк, тем он проще).

Недостатком данного метода является удорожание электрической схемы.


КАК УСТРАНИТЬ ДРЕБЕЗГ КОНТАКТОВ

Посредством триггера Шмитта

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

Использование триггера Шмитта, включенного между кнопкой и пином микроконтроллера, позволяет устранить дребезг контактов полностью и сократить время переходного процесса до минимума (даже при большом приближении создается впечатление, что оно равно 0 секунд).

Недостатком такого метода устранения паразитных ПП является дороговизна микросхемы, содержащей триггер Шмитта, а также необходимость резервировать под нее место на плате.

Дребезжание реле

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

Решением этой проблемы также является установка порогового элемента петлей гистерезиса в его передаточных статических характеристиках, то есть триггера Шмидта или Компаратора на операционном усилителе. На схеме ниже изображен исходный вариант с рассмотренной на графике проблемой:

А так выглядит схема с дополнением в виде задержки включения на логических элементах 2И-НЕ отечественной микросхемы К561ЛА7:

Иногда с этой же проблемой справляются с помощью установки стабилитрона в сигнальные цепи.

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

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

Также рекомендуем посмотреть хорошее видео на эту тему:

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

Программа водосчетчика для ESP8266

//int LED_PIN = 2; //D4
int COLD_WATER_PULSE_PIN = 12; //D6
int HOT_WATER_PULSE_PIN  = 13; //D7 4; //D2
int cold_water_counter = 0; 
int hot_water_counter = 0; 

void setup() 
{
  Serial.begin(9600);
  pinMode(COLD_WATER_PULSE_PIN, INPUT); //Pullup internal resister
  pinMode(HOT_WATER_PULSE_PIN,  INPUT); //Pullup internal resister
  //pinMode(LED_PIN, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(COLD_WATER_PULSE_PIN), triggerColdWater, RISING);
  attachInterrupt(digitalPinToInterrupt(HOT_WATER_PULSE_PIN), triggerHotWater, RISING);
}

void loop() {
  //int state = digitalRead(HOT_WATER_PULSE_PIN);
  //Serial.println("State: " + (String)(state));
  //delay(1000);
  //digitalWrite(LED_PIN, !state );
}

void triggerColdWater() 
{
  cold_water_counter++;
  Serial.println("Cold water consumption: " + (String)(cold_water_counter*10) + " l.");
}

void triggerHotWater() 
{
  hot_water_counter++;
  Serial.println("Hot water consumption: " + (String)(hot_water_counter*10) + " l.");
}
Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Профессионал и Ко
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: