Привет! Как всем известно механические тактильные кнопки как и авторы статей склонны к дребезгу. И существует огромное количество способов с этим самым дребезгом бороться. Снижение скорости нарастания фронтов конденсатором, фильтры, программный антидребезг, применение триггеров, валерьянка,... Но как выбрать тот единственный и неповторимый для того, чтобы пользователь не поседел, постоянно пытаясь нажать кнопку именно столько раз - сколько он хоте.
Так что же такое дребезг контактов?
А - это довольно просто. Представьте себе, что подвижный контакт кнопки - это шарик от подшипника диаметром 50 мм у Вас в руке, а неподвижный контакт - батин металлический верстак. Если хорошенько вспомнить те ощущения, благодаря которым тактильная кнопка именно так называется - момент переключения происходит, когда мы "побеждаем" пружину или другой механизм натяжки и подвижный контакт очень быстро летит к неподвижному. Слышится щелчок и довольные электроны отправляются в путь в нелогичном для электронщика направлении - но это в идеале. Если вернуться к нашему шарику и проделать то, что произошло в кнопке - шарик непременно отскочит несколько раз от верстака, теряя соприкосновение. И это несмотря на то, что мы его рукой к столу давить не прекращали. В кнопке происходит то же самое, только масштабы поменьше и длительность не такая...длительная. А чувствительной электронике хватает этих коротких наносекунд, чтоб посчитать одно нажатие - четырьмя, например.
Ещё раз. Когда вы нажимаете на кнопку, происходит следующее:
- Подвижный контакт летит к неподвижному.
- Удар. Контакты сталкиваются.
- Микро-отскок. Из-за упругости металла контакты отскакивают друг от друга на микросекунды (образуется микро-дуга или просто разрыв).
- Затухающие колебания. Они снова ударяются, снова немного отскакивают, и так несколько раз, пока сила прижатия не погасит эти колебания.
Выглядит всё это довольно не приятно.
Как же всё подключить, чтобы нивелировать дребезг?
1. Случай, когда используются современные кнопки и современный микроконтроллер.
Тут всё просто. Особенно если проводник к кнопке не выходит за пределы печатной платы и экранирован земляным полигоном.
В настройках GPIO указывается подтяжка к внутреннему сопротивлению для выставления уровня по умолчанию как высокого и каким-либо способом, зависящим от того, насколько всё быстро должно происходить в программе. Иногда подойдет и просто Delay(10);, а иногда придется использовать прерывание и таймер для отслеживания событий.
2. Тот же случай, но если нет свободных ресурсов на такое расточительство или используется не микроконтроллер, а современная логика и скорость нарастания фронта роли не играет.
Самый простой аппаратный метод. Параллельно кнопке ставится конденсатор (обычно 0.1 мкФ - 1 мкФ) и резистор. Работает так - конденсатор не может изменить напряжение мгновенно. Когда контакты прыгают, конденсатор держит напряжение на входе микросхемы, сглаживая иголки дребезга в ровную линию. Это дешево и просто, но замедляет фронт сигнала.
3. Если от того, как хорошо нажимается кнопка зависит процветание цивилизации. Ну или нужно максимально разгрузить микроконтроллер.
Для нивелирования медленного нарастания фронта после RC-цепи можно применить триггер Шмидта, который наши плавные фронты импульсов сделает ровнее некуда. Так же во многих микроконтроллеров можно программно включить аппаратный модуль триггера Шмидта, но внешний выглядит надежнее!
Если нужно уж совсем надежно - можно применить кнопку с двумя парами контактов или одним перекидным. И RS-триггер. Вот тут уж точно всё пройдет как надо. А если ещё и конденсаторов насыпать!!!
Любой тип триггера можно приспособить под антидребезг с разной степенью аппаратных колдунств. Даже T, при огромном желании. Было бы зачем.
Пара замечаний.
Все средства хороши для борьбы с невидимым врагом. Но не нужно забывать о рациональности и качестве исполнения. Неверная разводка печатной платы, отсутствие гальванической развязки с восьмидесятикилограммовой антенной средних лет и прочие прелести объемного монтажа в комок могут внести свои коррективы в работу самого продуманного схемотехнически шедеврального устройства.
Так что же по генератору случайных чисел?
Соберем тестовый стенд из того, что есть под рукой. Будем считывать количество нажатий с кнопки пином Ардуино с программным антидребезгом и выводить на экран. Так же будем выводить расшифрованное значение с выхода счетчика. Так как некоторые биты пропущены дешифратор на микроконтроллере придется так же сделать немного счетчиком. Но это всё программно. И в конце подытожим результат расхождения в процентном соотношении.
Первый эксперимент. Без физического антидребезга. 100 нажатий.
Как видно - результат не особенно хорош. Расхождение в целых 4 процента! А это уже тянет на тот самый генератор не особенно случайных чисел.
Второй эксперимент. С конденсатором на 100 нанофаррад параллельно кнопке.
Значительно лучше. В выборке из 100 нажатий - никаких пропусков.
Но нужно ещё исключить из уравнения ту самую антенну средних лет! Для совсем уж чистоты эксперимента.
Для этого я распечатал немного деталей на 3д принтере. Для сборки автомата по нажатию кнопок.
Немного моего любимого навесного монтажа в комке.
Установка готова к тестам!
В тесте без аппаратного антидребезга у нас-таки получился генератор случайных чисел! Как оказывается я своей антенностью не вношу в систему такого хаоса как плохо собранная система.
А вот тут простая система антидребезга справилась даже с такой нелегкой ситуацией.
И что теперь?
На самом деле ложных срабатываний могло быть гораздо больше. А это бы очень сильно ухудшало ощущения от использования аппаратуры с отсутствием защиты. В случае с микросхемой К561ИЕ16 на руку сыграл так называемый эффект "старого кремния" -ведь это довольно медленная по современным меркам микросхема неё есть такое понятие как входная емкость и инерционность. Если частота дребезга очень высокая -современные кнопки, старый чип может просто не успеть среагировать на каждый щелчок. Он "увидит" первый фронт, а пока он переключается внутри, остальные импульсы для него пролетят мимо. Если же частота дребезга будет низкая - старые кнопки с большими отскоками - он посчитает всё.
Но огромную роль, как выяснилось в ходе исследования, играет качество исполнения. Если уж такая медленная система начинает сбоить при условиях, в которых ее заставили работать - что уж говорить о современных быстрых чипах с их высокоомными входами, многие из которых отлично работают как сенсорные кнопки, если забыть защитить их от цепей-агрессоров и пальцев любопытных пользователей.
На этом пока что всё. Как обычно буду рад конструктивным комментариям. До свидания!