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

Вопросы и ответы

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

Кнопка Arduino — один из самых популярных и простых типов датчиков. Работа любой кнопки основана на механическом способе размыкания и замыкания контактов. Нажимая любую кнопку, даже самую простую, мы формируем определенное давление на внутренние механизмы (тарелки или пружины), в результате чего происходит сближение или расхождение металлических пластин.

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

Иллюстрация кнопки отказов

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

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


Осциллограмма коммутируемого тока




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

Постараемся исправить ситуацию. Мы знаем, что отскок контакта происходит в течение миллисекунд после замыкания контакта. Подождем, скажем, 5 мс после изменения состояния кнопки. Это время для человека — почти мгновение, а нажатие на кнопку обычно занимает гораздо больше времени — несколько десятков миллисекунд. И Arduino отлично работает с такими короткими периодами времени, и эти 5 мс позволят ему перестать отскакивать от контактов одним нажатием кнопки.
В этом скетче мы объявим процедуру debounce () («bounce» на английском языке — это просто «bounce», префикс «de» указывает на обратный процесс), на вход которой мы передаем предыдущее состояние кнопки. Если нажатие кнопки длится более 5 мсек, то это действительно нажатие. Измеряя давление, мы меняем состояние светодиода.

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

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

Работа этих схем основана на временных задержках, созданных с помощью RC-цепей. На рисунке 2a показана схема с задержкой включения и выключения, на рисунке 2c показана схема с задержкой только включения, а на рисунке 2e показана схема с задержкой выключения. Эти схемы разовые, о чем уже писалось в одной из частей этой статьи. На рисунках 2b, 2d, 2f показаны их временные диаграммы.

нетрудно заметить, что эти формирователи выполнены на микросхемах серии К561, которая относится к микросхемам КМОП, поэтому номиналы резисторов и конденсаторов указаны для таких микросхем. Эти формирователи следует использовать в схемах, построенных на микросхемах серий К561, К564, К176 и подобных.

Примените триггер RS

Самый простой способ — устранить дребезг контактов с помощью уже известного триггера RS, который собран на логической микросхеме К155ЛА3, точнее на ее элементах DD1.1 и DD1.2. Согласимся, что прямой выход RS-триггера — контакт 3, соответственно, обратный выход — контакт 6.

При сборке RS-триггера из элементов логических микросхем необходимо заключать такое соглашение. Если триггер представляет собой готовую микросхему, например, К155ТВ1, расположение прямого и обратного выходов указывается ее справочными данными. Но даже тогда, если входы JK и C не используются, а микросхема используется просто как RS-триггер, указанное выше соглашение может быть вполне подходящим. Например, для удобства монтажа микросхемы на плате. Конечно, в этом случае меняются местами и входы RS.

В положении переключателя, показанном на схеме, на прямом выходе RS уровень триггера является логическим и, наоборот, конечно, логическим нулем. Состояние триггера счетчика DD2.1 остается таким же, как при включении питания.

При необходимости его можно сбросить с помощью кнопки SB2. Для сброса триггера в момент включения между входом R- и общим проводом подключают небольшой конденсатор в диапазоне 0,05… 0,1 мкФ, а резистор сопротивлением 1… 10 кОм — между входом R- и общим проводом плюс мощность и R — вход. Пока конденсатор не заряжен на входе R, кратковременно присутствует напряжение логического нуля. Этого короткого нулевого импульса достаточно для сброса триггера. Если по условиям работы устройства необходимо установить триггер в одно состояние при включении, такая RC-цепочка подключается ко входу S. Абзац RC-цепочки будет считаться лирическим отступлением, а теперь продолжим борьбу с отскоком контактов.

Нажатие кнопки SB1 замкнет ее правый контакт с общим проводом. При этом на выводе 5 микросхемы DD1.2 появится целая серия импульсов дребезга. Но быстродействие микросхем даже самой медленной серии намного выше скорости механических контактов. Затем, с самого первого импульса RS, триггер сбрасывается в ноль, что соответствует высокому уровню на обратном выходе.

В этот момент на нем образуется положительное падение напряжения, которое переводит триггер DD2.1 в состояние, противоположное входу C, что можно наблюдать с помощью светодиода HL2. Последующие импульсы отражения не влияют на состояние триггера RS, поэтому состояние триггера DD2.1 остается неизменным.

При отпускании кнопки SB1 триггер на элементах DD1.1 DD1.2 возвращается в уникальное состояние. В это время на обратном выходе (вывод 6 DD1.2) формируется отрицательное падение напряжения, которое не меняет состояние триггера DD2.1. Чтобы вернуть триггер счетчика в исходное состояние, нужно будет снова нажать кнопку SB1. JK: Триггер сработает с таким же успехом в таком устройстве.

Такой формирователь — это типовой узор, который хорошо и безупречно работает. Единственный недостаток — использование кнопки с переключающим контактом.

Примечание: при подготовке статьи были использованы материалы с сайтов: https://electrik.info/ https://easymcu.ru/

Устраняем программно дребезг кнопок и переключателей

Кнопки и другие переключатели являются неотъемлемой частью практически любого устройства. Однако реализация этих устройств приводит к такому нежелательному для микроконтроллерного оборудования явлению, как дребезг контактов. Что такое отскок? Давайте разберемся!

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

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

Если бы не было защиты чата, нажав букву на клавиатуре, вы бы получили, например, 7 букв на экране, поэтому, когда вы попытаетесь очистить их, нажав кнопку возврата, вы удалите случайное количество символов, для пример 5. Работать на такой клавиатуре было бы невозможно. Осциллограмма напряжения на такой кнопке выглядит так. На фото отскок длится ровно 10 мс.

На хорошем уровне осциллограмма должна выглядеть примерно так. Интересный факт, эта форма волны идеальна: как видно из рисунка, переключение происходит мгновенно, поэтому нет необходимости удалять дребезг для этой кнопки. Для впечатления запомните, как долго длится отскок (я упоминал об этом ранее), и посмотрите на эту осциллограмму, где одна ячейка составляет 250 нс (1000 нс = 1 мкс).

Для получения стабильного значения я предлагаю следующий алгоритм: контроллер прослушивает порт (пин), к которому подключена кнопка. Если вывод изменяет свое логическое значение по сравнению с предыдущим состоянием, которое мы также помним, то мы начинаем процедуру проверки: мы проверяем значение текущего вывода и последние три раза через равные промежутки времени. Если значения совпадают три раза, то можно предположить, что значение стабилизировалось, и функция возвращает логическое значение вывода. Для реализации этого алгоритма я предлагаю следующую программу на C.

Время задержки между элементами управления подбирается экспериментально. В случае ошибок в определении увеличьте время задержки. Помните, что 1000 мкс = 1 мс. Это общий код, как переделать его для Arduino и языка обработки, я объясню ниже в этой статье. Код снабжен комментариями, но если что-то остается для вас непонятным, всегда жду ваших вопросов в комментариях к этому посту.

Чтобы повторить этот код для Arduino, замените main () на loop (). Перед loop () добавьте setup () {} и настройте требуемый контакт (к которому подключена кнопка) в качестве входа. В определении макроса BUTTON вместо адреса порта укажите номер контакта с кнопкой, а в дополнительном коде замените все BUTTON на digitalRead (BUTTON); Также замените Delay_us на delayMicroseconds. Все остальное без изменений.

Попробуйте, экспериментируйте! Удачных разработок! Жду ваших вопросов, комментариев, пожеланий и предложений как по этой статье, так и по теме будущих статей. Скоро!

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

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

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

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

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

Схема отскока

Иллюстративная диаграмма инверсии сигнала
Схема подключения RS-триггера

Программирование ПЛИС. Изучение явления «дребезг контактов» и метод избавления от него

Продолжаем изучать язык FPGA и VHDL. В этой статье для начинающих мы исследуем феномен отскока и посмотрим, как от него избавиться. Итак, цель работы: изучить феномен «дребезга контактов», создать проект в Xilinx ISE Project Navigator: при нажатии кнопки значение регистра увеличивается на 1.

Часть 1. Что такое «дребезг контактов»?

«Дребезг — это явление, которое возникает в электрических и электронных переключателях, при которых вместо определенного стабильного сигнала они излучают на выходе случайные высокочастотные колебания» (c) Википедия. Проще говоря, когда вы нажимаете и отпускаете кнопку, она не сразу переходит в желаемое состояние. Некоторое время контакты кнопки «качают» друг друга, что будет восприниматься микроконтроллером как множественные импульсы. Количество таких импульсов может превышать тысячу. Дребезг хорошо виден на осциллограмме, которая показывает момент отпускания кнопки:

Часть 2. Создание проекта.

В моей предыдущей статье объяснялось, как создать новый проект Spartan-3E Starter Kit в Xilinx ISE Project Navigator v12.3. Создадим проект еще раз, назовем его, например, drebezg_habr и внесем некоторые изменения:

  1. Нам понадобится кнопка и восемь светодиодов. Добавим к дверям вход btn и 8 выходов led:
  2. В файле pin.ucf напишите названия контактов, соответствующих кнопке и каждому светодиоду:

Ножка K17 соответствует нижней кнопке среди доступных: Слово PULLUP подключает кнопку по следующей схеме (справа внутри ПЛИС):

Часть 3. Программирование.

Перейдите в файл drebezg_habr.vhd. Создадим 8-битный регистровый счетчик, который попробуем добавить по одному к однократному нажатию кнопки: между архитектурой и запуском пишем

И сразу после слова start адресуем этот счетчик нашим светодиодам:

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

Транслируем, шьем, тестируем. Уверен, результат вас совсем не устроит, потому что диоды будут мигать совершенно хаотично. Это связано с тем, что существует много событий, если old_btn = ‘0’ и btn = ‘1’ то во время нажатия и отпускания кнопки, именно из-за дребезга контактов. Чтобы избавиться от этого явления, нужно дождаться четко установленного значения логической единицы. Для этого мы создадим счетчик, который будет увеличиваться на 1, пока кнопка не примет значение логической единицы. Счетчик сбрасывается, если кнопка имеет логическое нулевое значение.

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

Значение btn_wait было выбрано 0,25 секунды, чтобы значение count_led не добавлялось слишком часто, пока кнопка удерживается. Другой (даже более надежный) вариант защиты от отказов — добавить счетчик 1, когда btn является логической единицей, и вычесть 1 из счетчика, когда btn равен нулю. Кроме того, если значение счетчика падает до 0, кнопка не была нажата или произошел отскок. Что ж, если счетчик считается для области btn_wait, значит был щелчок =) В качестве домашнего задания могу посоветовать закончить проект: добавить count_led после нажатия и отпускания кнопки.

Итак, мы практически ознакомились с феноменом «отскока контакта» и узнали, как от него избавиться. Это явление наблюдается не только в кнопках, тумблерах и других подобных вещах, но иногда и в различных протоколах, например RS-232. Исходники проекта здесь. Желаю всем успехов в освоении ПЛИС!




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

Для сборки триггера Шмитта на водосчетчик вам потребуются следующие комплектующие (ссылка на Алиэкспресс):

  • Wemos D1 mini.
  • Wemos D1 mini RTC Shield. Напряжение питания чипа составляет 5 В, поэтому экран не подходит для питания от батареи 3,7 В.
  • Разделочная доска Wemos.
  • Триггер Шмитта SN74HC14N. Техническая спецификация.
  • Резисторы 1 кОм — 2 шт.
  • Резисторы 10 кОм — 2 шт.
  • Конденсаторы керамические 100 нФ (0,1 мкФ) — 2 шт.
  • 18650 аккумулятор.
  • 18650 батарейный отсек.

Wemos D1 mini RT использует следующие контакты для RTC:

Wemos D1 mini (ESP8266) Описание ESP32
D1 (GPIO5) SCL GPIO 22 (SCL)
D2 (GPIO4) ПДД GPIO 21 (SDA)
GND GND

Устройство чтения SD-карт использует контакты:

Wemos D1 mini (ESP8266) Описание ESP32VSPI ESP32 HSPI
D5 (GPIO 14) CLK / SCK GPIO18 GPIO14
D6 (GPIO 12) DO / MISO GPIO19 GPIO12
D7 (GPIO13) DI / MOSI GPIO23 GPIO13
D8 (GPIO 15) CS / SS GPIO5 GPIO15

Свободных немного: D0 (GPIO16), D3 (GPIO0), D4 (GPIO3). И все это проблемные входы:

  • Вход D0 Wemos D1 mini не поддерживает обработку прерываний, поэтому не подходит.
  • D3, D4 — входы, на которых должен присутствовать определенный уровень сигнала при перезапуске / запуске ESP8266. Если он другой, прошивка ESP8266 не загрузится. То есть при каждом перезапуске необходимо отключать выходы.
  • Светодиод подключен к D4 на Wemos D1 mini.

В общем, получается, что одновременно подключить RTC с картридером и модуль с триггером Шмитта не получится. Или вам нужно будет добавить в схему микросхему, чтобы увеличить количество входов. Однако RTC и кардридер не имеют особого смысла, если вы используете образец кода для получения времени от серверов NTP.


Триггерные штифты Шмитта SN74HC14

Программный способ устранения дребезга кнопок

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

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

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

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

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

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

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

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

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

Теория

Что такое отскок контакта? При нажатии кнопки или микровыключателя или изменении положения тумблера два металлических контакта замыкаются. Пользователю может показаться, что контакт был установлен мгновенно. Это не совсем так. Внутри переключателя есть движущиеся части. Когда переключатель нажат, сначала устанавливается контакт между металлическими частями, но только на время короткого замыкания в микросекунду. Затем он поддерживает контакт еще немного, а затем еще немного. В конце концов, переключатель полностью закрыт. Переключатель подпрыгивает (подпрыгивает) между включенным и выключенным состояниями. «Когда переключатель замкнут, два контакта эффективно размыкаются и снова подключаются, обычно от 10 до 100 раз примерно за 1 мс» (The Art of Circuitry, Horowitz & Hill, второе издание). Обычно оборудование работает быстрее, чем болтает, что заставляет оборудование думать, что вы нажимали кнопку несколько раз. Аппаратное обеспечение часто представляет собой интегральную схему. На следующих снимках экрана показан типичный отскок контакта без какой-либо обработки:

Осциллограмма отскока контактов
Осциллограмма отскока контактов

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

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

Переключатели исследованы
Переключатели исследованы

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

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

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

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

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

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

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


Схема тестового макета (описана выше)

Во-первых, мы постараемся вообще не справляться с отскоком. Схемы часов показаны ниже:

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

Видео:

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

Для переключателя A:


Контактный выключатель дребезга A

Для переключателя B:


Переключатель Bounce B

Для переключателя C:


Дребезг контакта переключателя C

Для переключателя D:


Переключатель дребезга D

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


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

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

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

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

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

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

Для переключателя A:


Сигнал от переключателя А после добавления конденсатора

Для переключателя B:


Сигнал от переключателя B после добавления конденсатора

Для переключателя C:


Сигнал от переключателя C после добавления конденсатора

Для переключателя D:


Сигнал от переключателя D после добавления конденсатора

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


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

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

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

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

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

Метод аппаратного устранения дребезга основан на использовании фильтров сглаживания. Фильтр сглаживания, как следует из его названия, занимается сглаживанием всплесков сигналов путем добавления в схему элементов, которые имеют своего рода «инерцию» по отношению к электрическим параметрам, таким как ток или напряжение. Самый распространенный пример таких «инерционных» электронных компонентов — конденсатор. Он может «поглотить» все острые пики, медленно накапливая и высвобождая энергию, как пружина в амортизаторе.

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

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

Схема подключения фильтра противодействия:

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

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

Как видите, отскок «лес» заменен довольно плавной линией, с которой можно работать дальше.

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

Невозможно создать прямоугольный сигнал с помощью простой RC-цепи. Для «вырезания» плавных форм используется специальный компонент, называемый триггером Шмидта. Его особенность — активация при достижении определенного уровня сигнала. На выходе триггера Шмидта мы получаем высокий или низкий уровень сигнала, промежуточного значения нет. Выход триггера инвертирован: когда входной сигнал падает, он дает выход зажигания и наоборот. Ниже представлена ​​диаграмма и результат использования триггера Шмидта.

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

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

Устранение эффекта

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

  1. Установка конденсаторов параллельно вводу. Таким образом, скорость реакции на давление может снизиться при слишком большой мощности и неполном устранении отскока, если она слишком мала.
  2. Введение триггеров Шмидта во входную цепь устройства. Более сложное решение, которое сложно реализовать при доработке уже готового продукта, но при этом более технологичное и совершенное.

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

Примечания

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

Вредное влияние дребезга

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

Отскок контакта почти всегда 1 нежелателен в технических устройствах. Например, при переключении мощных электрических цепей между контактами происходит многократное включение и выключение электрической дуги или искрение, вызывающее повышенный износ контактов.

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

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

C++| ARDUINO IDE | ESP8266. Схема подключения кнопки

Рис. 1

Кнопочные переключатели, тумблеры и электромеханические реле имеют одну общую черту: они содержат контакты. Эти контакты металлические, они замыкаются и размыкают цепь электрического тока. Поскольку металлические контакты имеют массу, и по крайней мере один из контактов подвижен и обладает эластичностью, при замыкании контакты замыкаются и отскакивают друг от друга несколько раз (обычно 5-100 раз в течение 40-100 миллисекунд), прежде чем окончательно войти в полностью замкнутый контур позиция. Эффект называется «дребезг контактов» (см. Рис. 1). Обратите внимание, что контакты могут вибрировать как при замыкании, так и при размыкании.

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

Читайте также: Модуль часов реального времени на Ардуино: описание и схема включения

Оцените статью
Блог про Arduino