- Определение и суть проблемы в электронике
- Библиотеки для подавлениядребезга контактов
- Программный способ устранения дребезга кнопок
- Борьба с дребезгом кнопки с помощью библиотеки ардуино
- Подключение кнопки к Arduino для демонстрации подавления «дребезга»
- Что такое дребезг контактов и как его устранить?
- В чем же дело и как происходит дребезг контактов
- Дребезг контактов, и как с ним бороться
- Теория
- Настройка оборудования
- Алгори контактов
- Ошибки дребезга кнопки
- Искрение контактов реле и пускателей — причины возникновения и способы устранения
- Устранение эффекта
- Дребезжание реле
- Аппаратный способ подавления дребезга кнопки
- Подавление дребезга с помощью триггера шмидта
- Настройка оборудования
- Программирование ПЛИС. Изучение явления «дребезг контактов» и метод избавления от него
- Часть 1. Что такое «дребезг контактов»?
- Часть 2. Создание проекта.
- Часть 3. Программирование.
- Подавление дребезга контактовс помощью задержки
Определение и суть проблемы в электронике
Дребезг контактов при нажатии на кнопку и переключатель. Любой переключатель устроен так, что у него есть подвижный и неподвижный контакт. Как видно из названия, подвижным называется тот, который соединен с толкателем или рычагом, который уже нажимает человек или механизм при работе устройства.
Так как кнопки имеют механическое устройство, то от их качества зависит то, как точно она онататражаб. При этом в любом случае полностью устранить явление дребезга нельзя. К чему он приводит?
Если клавиша управляет каким-то электронным устройством с цифровым входом, например, микроконтроллера, логического элемента и пр.
Пример осциллограммы дребезга контактов изображен на рисунке ниже:
Библиотеки для подавлениядребезга контактов
Аналогичная функциональность обеспечивается специальными библиотеками, например, библиотекой Bounce2. Для установки библиотеки помещаем её в директорию / библиотеки / среды разработки Arduino и перезапускаем IDE.
Библиотека Bounce2 содержит следующие методы:
Название | Назначение |
Подпрыгивать() | инициализация объекта Bounce; |
пустой интервал (мсек) | устанавливает время задержки в миллисекундах; |
void attach (номерПина) | задаёт вывод, к которому подключена кнопка; |
int update() | обновляет объект и возвращает true, если состояние пина изменилось, и false в случае потери; |
int читать() | считывает новое состояние пина. |
Перепишем наш скетч с использованием библиотеки. Можно также запоминать и сравнивать прошлое состояние кнопки с текущим, но давайте упростим алгогого.
Скетч обработки кнопок с использованием библиотеки для использования кнопки с использованием библиотеки для устранения влияния к // пин кнопки const int ledPin = 13; // пин светодиода int cnt = 0; // счётчик прочий Bounce b = Bounce (); // инстанциируем объект Bounce void setup() {
pinMode (switchPin, ВХОД); digitalWrite (switchPin, HIGH); // включаем подтягивающий резистор pinMode (ledPin, OUTPUT); б прикрепить (switchPin); // объект Bounce будет слушать кнопку на пине switchPin b.interval (5); // устанавливаем время задержки в мс
} void loop() {
if (b.update () && b.read () == 0) {// если зарегистрировано событие и кнопка нажата, cnt + = 1; // инкрементируем счётчик прочий if (cnt% 2 == 0) digitalWrite (ledPin, LOW); // если увеличий чётное число, гасим светодиод else digitalWrite (ledPin, HIGH); // иначе — зажигаем светодиод }
}
— Такой скетч смотрится лаконично, его легко прочитать и легко применить.
Программный способ устранения дребезга кнопок
Самым способом справиться с проблемой дребезга кнопки выдерживание паузы. Мы просто останавливаемся и ждем, пока переходный процесс не завершится. Для этого можно использовать функцию) delay () или millis (). 10-50 миллисекунд — вполне нормальное значение паузы для сообществ.
В данном примере мы использовали задержку в программе, чтобы не реагировать на случайные случайные вспледелекиламьспледелекилеманерекилекил
Борьба с дребезгом кнопки с помощью библиотеки ардуино
Проблема с дребезгом настолько популярна, что есть специальные библиотеки, которые вам не надо организовывать ожидание и паузы вручную — это все делается внутри специального класса. Пример популярной библиотеки для борьбы с дребезгом кнопок — библиотека Bounce.
Подключение кнопки к Arduino для демонстрации подавления «дребезга»
Давайте посмотрим, как дребезг контактов на правильную работу схемы. Подключим к Arduino тактовую кнопку по схеме со стягивающим резистором. Будем по разъемию кнопки зажигать светодиод и оставлять включённым до повторного нажатия кнопки. Для наглядности подключим к цифровому выводу 13 внешний светодиод, хотя можно обойтись и всымроеннно.
Схема подключения кнопки к Arduino для демонстрации подавления эффекта «дребезга» контактов
Что такое дребезг контактов и как его устранить?
В этой статье мы рассмотрим такое распространенное и вредное явление как дребезг контактов. Ознакомимся с причинами возникновения дребезга. Изучим основные методы аппаратного и устранения данного явления.
В чем же дело и как происходит дребезг контактов
Когда она смещается, это происходит по причине образования вибрационных волн контактной пластины, когда она смещается.
Всякий переключатель имеет два контакта: подвижный и фиксированный. Логично, что подвижным мы называем тот контакт, прикрепленный к рычагу, на который, в свою очередь, мы давим с целью привести аппарат в движение.
При всем желании избавиться от дребезга электронных контактов на все сто процентов не удастся.
Каждая кнопка — это механическое устройство, соответственно, чем точнее она сделана, тем ченотледенаведенаденаденаденадцать Но, какими же последствиями чревато данное негативное явление?
В случае, когда кнопка регулирует работу электронного механизма с цифровым входом, такой как микроконтроллер, логический компонент, прочие, то его вход идентифицирует такое количество последовательний, как много последовало импульсов отправлено по итогу возникновения дребезга.
Дребезг контактов, и как с ним бороться
В данной статье мы рассмотрим, что такое дребезг контактов и способы борьбы с ним. Сначала я рассмотрю теорию, а позже покажу вам некоторые способы обработки дребезга и аппарарапномл.
Теория
Что такое дребезг контактов? Когда вы нажимаете на кнопку или на микропереключатель или изменяете положение тумблера, дваниктектекамакамакамакиктекамак Для пользователя может показаться, что контакт наступил мгновенно. Это не совсем правильно. Внутри коммутатора есть движущиеся части.
Когда вы нажимаете на коммутатор, он вначале создает контакт между металическими коммутаторами. Затем он делает контакт немного дольше, а затем еще немного дольше. В конце коммутатор полностью замыкается. Коммутатор скачет (дребезжит) между состояниями наличия и отсутствия контакта.
«Когда коммутатор замыкается, два контакта между ними соединяются и снова соединяются обычно от 10 до 100 раз за время, примерно равное мс 1» («Искусство схемотехники», Хоровиц и Хилл, второе издание). Обычно оборудование работает быстрее, чем дребезг, что приводит к тому, что оборудование работает быстрее, чем дребезг
Оборудование часто является интегральной микросхемой. Следующие скриншоты иллюстрируют типовой дребезг контактов без какой-либо обработки:
Осциллограмма дребезга контактов
Каждый коммутатор обладает своими собственными характеристиками относительно дребезга. Если вы сравните два одинаковых коммутатора, есть большая вероятность того, что они будут «дребьназ.
Я покажу вам дребезг четырех разных коммутаторов. Я меня есть две микрокнопки, 1 кнопка и 1 тумблер:
Исследуемые коммутаторы
Настройка оборудования
Все коммутаторы будут подключены одинаково (это важно, если мы собираемся сравнивать результаты). Сначала мы увидим, как коммутаторы ведут себя без обработки. Основой нашей схемы будет HCF4017BE.
Это десятичный счетчик / делитель, производимый STMicroelectronics. Они больше не производят эту микросхему, так как этот тип устарел.
Тем не менее, есть много других производителей, которые всё еще выпускают эту маленькую мимамамамамамамамаманосомамамамаманососок
Микросхема получает тактовый импульс на вывод 14, после чего загорается светодиод, подключеный канный. Когда принимается следующий тактовый импульс, микросхема отключает 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 после добавления конденсатора (импульс соответствует логическому нулю)
— Это то, чего мы и хотели.
Алгори контактов
Чтобы реализовать задачу подавления дребезга контактов, первое, что приходит в голову:
- запоминать предыдущее состояние кнопки;
- сравнивать с текущим состоянием;
- если состояние изменилось, то меняем состояние светодиода.
Напишем такой скетч и загрузим в память Arduino.
Скетч обработки кнопок без учёта эффекта дребезга контактов int switchPin = 2; // вывод считывания кнопки int ledPin = 13; // вывод светодиода boolean lastButton = false; // предыдущее состояние кнопки boolean ledOn = false; // включён или выключен светодиод void setup() {
pinMode (switchPin, ВХОД); // состояние кнопки считываем (in) pinMode (ledPin, OUTPUT); // светодиод запитываем (вых)
} void loop() {
нажатое int = digitalRead (switchPin); / * состояние кнопки: HIGH, true — нажата, LOW, false — нет * / if (press == true && lastButton == false) {/ * если кнопка сейчас нажата * а доганатената * а доганатената *; // меняем состояние светодиода lastButton = true; // запоминаем новое состояние кнопки} else {lastButton = digitalRead (switchPin); // считываем состояние кнопки} digitalWrite (ledPin, ledOn); // зажигаем или гасим светодиод
}
При включении схемы в работу, сразу виден эффект дребезга контактов. Он проявляется в том, что светодиод загорается не сразу после добавления кнопки, или загорается и тут же гаснет, или не выключается сразу после добавления кнопки, а продолжает гореть. В общем, схема работает не стабильно.
Ошибки дребезга кнопки
Как отразится дребезг на нашем проекте? Да самым прямым образом — мы будем получать на входе случайный набор значений. Ведь если мы считываем значение с кнопки непрерывно, в каждом новом рабочем цикле значение с кнопки непрерывно, в каждом новом рабочем цикле фуначениевсаникикикикимозмадиким Потому что пауза между двумя вызовами цикл составляет микросекунды и мы измерим все мелкие изменения.
Если мы хотим отследить ситуацию, когда кнопка была отпущена после того, как получим множество ложных сигналов — она будет «нажата-отпущена» десятки раз, хотя мы выполнили лишь однократное отследие.
Вот пример скетча, в котором непременно обнаружится ошибка дребезга. Мы сможем увидеть в мониторе портала в первые мгновения после того, как появится набор нулей).
void loop () {если (digitalRead (PIN_BUTTON)) {Serial.println («1»); } else {Serial.println («0»); } }
Естественно, такое поведение ни к чему хорошему не приведет. В нашем арсенале есть два метода: программный и аппаратный. Первый довольно простой, но не всегда его можно использовать в реальных условиях. Второй — более надежный, но требует существенных изменений в схеме. Давайте рассмотрим оба способа подробнее.
Искрение контактов реле и пускателей — причины возникновения и способы устранения
Наверняка многие сталкивались с проблемой искрения контактов электромагнитных реле или пускателя. Кто-то эту проблему для себя давно решил. Некоторые просо меняют коммутирующее устройство при появлении первых тревожных симптомов (такикарх) А бывает и такое, что даже заменой коммутатора избавиться от пагубного явления не удается.
Вообще искра при коммутации — это нормальное явление, но лишь в том случае, если искрение проненененененинененененененем На самом деле практически любое механическое устройство коммутации цепей приводит к нарушению коммутируемой цепи. В этом и заключается главная проблема.
Из-за чего возникает искрение
Причинами искрения контактов могут выступать факторы. Быть может коммутируемый ток сильно допустимую для контактов контактов. Может быть со временем ослабился прижимной механизм (пружина, пластина), усилился дребезг контактов, либо характер коммутируемой нагрузки неизбежно вызывает образование дуги.
Так или иначе, лучше всего зарубить тенденцию к пагубному искрению на корню. Однако для начала давайте обратим внимание на физику этого вредного процесса.
известно, что при наличии между проводниками разности потенциалов, в определенных, на некотором расстоянии между ними легко может произойти ионизация в воздушном промежутке и образоваться искра или дуга.
Это явление успешно и используется используется например в сварке, но контакты реле или пускателя — отнюдь не сварочный аппарат, а скорее наоборот — они призваны надежно разомкнуть (или замкнуть) цепь, по протеканию (или будет протекать) ток.
Если же коммутаторы коммутатора превращаются в сварочный аппарат, это ведет к потерям энергии и снижению качества работы нагрузки, в некоторых случаях может послужить причиной пожара. Поэтому факторы риска необходимо устранять.
.
Справедливости ради отметим, что даже в норме контакты реле и пускателей неизбежно имеют негобекотеберыбереберебекотек Это значит, что, например, во время замыкания, контакты в течение нескольких секунд сближаются, вновь расходятся на очень маленькое расстояние, но в конце концов замыкаются. В ходе этого процесса образуются крайне слабые искры, не причиняющие вреда.
Гораздо более опасно индуктивное влияние в ходе коммутации таких нагрузок как электродвигатели, трансформаторы, и так далее, они имеют большую индуктивность. А из курса физики нам известно, что ЭДС самоиндукции тем выше, чем больше индуктивность коммутируемой нагрузки, чем выше скорость изменения тока, в нашем случае — скорость размыкания или замыкания.
Так вот, благодаря тому, что контакт размыкаются, увеличиваясь, увеличивая индуктивность, мгновенно прекращается (он уменьшающимся магнитным полем), на выводах образуется высокая ЭДС самоиндукции, пропорциональная индуктивности и обратно пропорциональная скорость размыкания.
Кстати, даже просто проводка обладает индуктивностью, позволяет вызвать немалую ЭДСиндукции на контактах, особенно если провода достаточно длинные, хотя коммутируемая нагрузка может иметь и чисто активный характер.
Итак, причинами искрения сверх всякой реле контактов электромагнитных пускателей и могась
ослабленный прижимной механизм и связанный с этим продолжительный дребезг плюс образованнай награннай;
влияние индуктивности коммутируемой нагрузки;
превышение максимально допустимого тока коммутатора.
Как устранить искрение
Если причина чрезмерного искрения контактов известна, можно попытаться ее устранить. В случае если контакты покрыты сажей, их нужно почистить. Это делается при помощи растворителя и мельчайшего абразива. Контакты должны плотно прижиматься друг к другу без зазора, поэтому в ходе чистки нельзя скрест. Если ослаблен прижимной механизм, можно попробовать его восстановить, подогнув пластину.
Устранение эффекта
Чтобы устранить дребезг контактов, возможно использовать аппаратное или программное решение. К аппаратным решениям относится:
- Установка конденсаторов входу.
- Введение триггеров Шмидта во входную цепь устройства. Более сложное решение, затруднительно для реализации в ходе доработки уже готового изденелелого
Если рассмотреть это явление на примере сдвигового регистратора, то в этом видео наглядно покагозаной представой После каждого кнопки должен загораться следующий светодиод.
Схема включения регистра и светодиодов на рисунке ниже:
Кнопка подключена так, как показано на схеме:
Пример осциллограммы сигнала с выраженным дребезгом:
Установив конденсатор на 1 мкФ кнопке для его подавления, получаем стабильное и точны
Схема подавления:
А можете фронт сигнала переключения, как вы убедиться, действительно завален, зато без ливспникекек.
Альтернативой такому решению от этого эффекта, без заваливания фронта и с большим ффекта. Типовая его схема изображена ниже:
На следующем рисунке изображены другие варианты схем на логических элементах для борьбы с дрекозантав:
Кроме аппаратного устранения, как было сказано, есть и программный способ решения данной пробления данного пробления. Он заключается в написании кода, смысл которого в считывании изменения сигнала, выдержкиогоногоногоногоногоногоногоним
Дребезжание реле
Кроме дребезга кнопок в цифровых электронных схемах также доставляет проблемы дребезг конвамактов. Таким образом можно отнести сумеречное реле или различные датчики протока, а также регуляторы. Когда датчик выдаёт сигнал на пороге срабатывания устройства, получается неопределенное на порога И при срабатывании реле не всегда устойчивое удержание контактов, оно начинает всегда На эпюре ниже наглядно изображена эта проблема на регулятора температуры:
Решением этой проблемы также является установка порогового элемента петлей гистерезиса в его передаточных статических характеристиках, то есть триггера Шмидта или Компаратора на операционном усилителе. На схеме ниже изображен исходный вариант с рассмотренной на графике проблема:
А так выглядит схема с дополнением в виде задержки включения на логических элементах 2И-Носеконекикемекамек
Иногда с этой же проблемой справляются с помощью стабилитрона в сигнальные цепи.
Кнопок аналогично дребезгуте реле. — Особенно часто это происходит при срабатывании реле на переменном токе.
Всё это связано с механической структурой герконов, реле и других коммутаторов. Их контакты замыкаются не моментально. Вы здесь.
Теперь вы знаете, что такое дребезг контактов реле и способы борьбы с ним наиболее внфект. Если возникли вопросы, задавайте и в комментариях под статью!
Аппаратный способ подавления дребезга кнопки
Подавление дребезга кнопки с помощью задержек в скетче — способ очень распространенный иниминеминеминеменемей Но далеко не всегда его можно использовать — ведь 10 миллисекунд — это целая вечность для многосомрекомрекомрекомревемрекомремевемревемевемевемревемрев Также программный способ применить при прерывании — дребезг к многократному вызову функций и повлиять на этот процесс в скетче мы не сможем.
Более правильный (и более сложный) способ борьбы с дребезгом — использование. Для этого, правда, придется внести изменения в схему.
Аппаратный способ устранения дребезга основан на использовании сглаживающих фильтров. Сглаживающий фильтр, как следует из названия, занимается сглаживанием всплесков сигналов за счет добавления в схему элементов, имеющего своеобразную «инерцию» по отношению к таким параметрам как ток или напряжение. Самым распространенным примером таких «инерционных» электронных компонентов является конденсатото. Он может «поглощать» все резкие пики, медленно накапливая и отдавая энергию, точно так же, какапархарутерекамарутеретеретеретерек
За инерцией устройство как утюг походит по «мятому» сигналу с большим счетом пиков и впадин, создавая пусть и не идеальную, но вполне гладкую кривую, у которой легче определить уровень срабатывания.
Пример простого фильтра на базе RC-цепочки
Схема подключения фильтра для устранения дребезга:
Пример подключения к плате ардуино
Форма сигнала после использования фильтра:
Как видим, «лес» дребезга сменился достаточно плавной линией, с которой уже можно работать дальш.
Подавление дребезга с помощью триггера шмидта
Сделать квадратную форму сигнала с помощью простого RC цепочки невозможно. Для «огранения» сглаженных форм используется специальный компонент, который называется триггер тримгер. Его особенностью является срабатывание сигнала при достижении определенного уровня. На выходе триггера шмидта мы получим высокий или низкий уровень сигнала, никаких промениченчечото. Выход триггера инвертированный: при спаде входного сигнала он выдает на выходе включение иороб. Ниже представлена схема и результат работы с триггером шмидта.
Иллюстрация результата работы:
Как видим, мы практически полностью избавились от результатов переходных процессов, сперва превратив хаос в почти гладкую кривую линию, а с помощью триггера шмидта «отрубили» хвосты, придав сигналу практически идеальный вид. Подав его на вход ардуино, мы уже можем не беспокоиться о ложных срабатываниях и мы уже можем не беспокоиться о ложных срабатываниях и смело п.
Настройка оборудования
Все коммутаторы будут подключены одинаково (это важно, если мы собираемся сравнивать результаты). Сначала мы увидим, как коммутаторы ведут себя без обработки. Основой нашей схемы будет HCF4017BE. Это десятичный счетчик / делитель, производимый STMicroelectronics. Они больше не производят эту микросхему, так как этот тип устарел. Тем не менее, есть много других производителей, которые всё еще выпускают эту маленькую мимамамамамамамамаманосомамамамаманососок
Микросхема получает тактовый импульс на вывод 14, после чего загорается светодиод, подключеный канный. Когда принимается следующий тактовый импульс, микросхема отключает Q1 и зажигает Q2, и так далее. Когда счетчик достигает Q8 (вывод 9), он подает импульс на вывод 15, который является выводом сброса. Это означает запуск отсчета, начиная с Q0.
Наша основная схема:
Схема тестового макета (описание выше)
Сначала мы попробуем не обрабатывать дребезг совсем. Схемы подачи тактового сигнала показаны ниже:
На видео мы используем схему справа. Тактовый вывод удерживается на уровне логической импульс, соответствует уровню логического.
Видео:
Теперь давайте посмотрим некоторые скриншоты осциллографа. Здесь мы использовали левый вариант схемы подачи импульсов: тактовый вывод удерживается на уровне логического нуля, импульс соответствует уровню логической единицы.
Для коммутатора A:
Дребезг контактов коммутатора A
Для коммутатора B:
Дребезг контактов коммутатора B
Для коммутатора C:
Дребезг контактов коммутатора C
Для коммутатора D:
Дребезг контактов коммутатора D
И один скриншот я снял для коммутатора C при использовании правой схемы импульсов: тактовый вывод удерживается на уровне логической единицы, импульс соответствует уровню логического нуля.
Дребезг контактов коммутатора C (импульс соответствует логическому нулю)
Как вы можете видеть, микросхеме кажется, что было несколько разъемий на коммутатор. Хотя это и не так, поскольку на коммутатор было выполнено только одно разъемие.
Добавим керамический конденсатор:
При добавлении конденсатора мы создаем RC-цепь. RC-цепи здесь не обсуждаются.
Новые скриншоты осциллографа сильно отличается от полученных ранее. Это показывает, что RC-цепь отфильтровывает дребезг.
Видео показывает, как работает схема с керамическим конденсатором 0,1 мкФ:
Для коммутатора A:
Сигнал с коммутатора A после добавления конденсатора
Для коммутатора B:
Сигнал с коммутатора B после добавления конденсатора
Для коммутатора C:
Сигнал с коммутатора C после добавления конденсатора
Для коммутатора D:
Сигнал с коммутатора D после добавления конденсатора
Для коммутатора C (импульс соответствует логическому нулю):
Сигнал с коммутатора C после добавления конденсатора (импульс соответствует логическому нулю)
— Это то, чего мы и хотели.
Программирование ПЛИС. Изучение явления «дребезг контактов» и метод избавления от него
Мы продолжаем изучение ПЛИС и языка VHDL. В данной статье, ориентированной на новичков, мы изучим явление «дребезг контактов» и расогозмозмотрибасозмотрибанимотриб Итак, цель работы: Изучить явление «дребезг контактов», создать проект в Xilinx ISE Project Navigator: При нажаназаниканикичаникичаникичаникиник
Часть 1. Что такое «дребезг контактов»?
«Дребезг — явление, вызывающее электрические и электронные переключатели, при которых они вместо некоторого стабильного сигнала выдают на выходе случайные высокочастотные колебания»
(с) Википедия. Говоря кнопки проще, при нажатии и отпускании она переходит в нужное состояние не сразу. Какое-то время контакты кнопки «дребезжат» между собой, что будет воспринято микроконтроламлеромкамогокомгамогомогомогомог Количество этих импульсов может быть тысячи. Наглядно дребезг можно увидеть на осциллограмме, на которой показан момент отпускания кнопки:
Часть 2. Создание проекта.
В моей предыдущей статье было подробно описано создание нового проекта для Spartan-3E Starter Kit Xilinx ISE Project Navigator v12.3. Создадим проект еще раз, назовем его, например, drebezg_habr и внесем в него некоторые изменения:
1. Нам потребуется одна кнопка и восемь светодиодов. Добавим входной сигнал btn и 8 выходных сигналов led в порты:
сущность drebezg_habr — это порт (clk: в STD_LOGIC; btn: в STD_LOGIC; led: из STD_LOGIC_VECTOR (от 7 до 0)); конец drebezg_habr;
2. В файле pin.ucf напишем имена ножек, соответствующие кнопке и каждому светодиоду:
NET «clk» LOC = «C9»; NET «led <0>» LOC = «F12»; NET «led <1>» LOC = «E12»; NET «led <2>» LOC = «E11»; NET «led <3>» LOC = «F11»; NET «led <4>» LOC = «C11»; NET «led <5>» LOC = «D11»; NET «led <6>» LOC = «E9»; NET «led <7>» LOC = «F9»; NET «btn» LOC = «K17»; НЕТТО «btn» PULLUP;
):
Часть 3. Программирование.
Переходим в файл drebezg_habr.vhd. Создадим 8-битный регистр-счетчик
сигнал count_led: std_logic_vector (от 7 до 0);
И сразу же, после слова begin, направляем этот счетчик на наши светодиоды:
led <= count_led;
Теперь наша задача прибавить единицу к счетчику count_led при нажатии кнопки. Сразу же напрашивается решение сделать переменную, которая бы хранила предыдущее решение сделать переменную Давайте так и сделаем:
архитектура Поведение drebezg_habr — это сигнал count_led: std_logic_vector (от 7 до 0); сигнал old_btn: std_logic; начать процесс (clk) начать, если восходящий край (clk) then old_btn <= btn; если old_btn = ‘0’ и btn = ‘1’, тогда count_led <= count_led + 1; конец, если; конец, если; завершить процесс; led <= count_led; конец Поведенческий;
Транслируем, зашиваем, тестируем. Уверен, что результат совершенно не устроит, потому что диоды будут просто неупорядогенно. Это связано с тем, что событий, если old_btn = ‘0’ и btn = ‘1’, то во время использования и отпускания кнопки оченгозарзакогозарзакозарзакогозарзарзаркогозарзарзакогозарзар мн. Чтобы избавиться от этого явления нам необходимо дождаться четко установившегося значения логичедичеды. Для этого мы заведем счетчик, который на 1 увеличен, пока кнопка имеет значение логической логической. Счетчик обнуляется, если кнопка принимает значение логического нуля. Таким образом, сколько бы не было временных кнопок во время использования кнопки из-за дребезга, когда значение btn четко установило в логическую единицу, счетчик достигнет определенного значения, и мы сможем использовать кнопки из-за дребезга. Теперь нам не потребуется переменная old_btn.
архитектура Поведение drebezg_habr — это сигнал count_led: std_logic_vector (от 7 до 0); константа clk_freq: integer: = 50_000_000; — частота кварца, константа btn_wait: integer: = clk_freq / 4; — будем ждать 0,25 секунды экземпляра объекта счетчик сигналов: диапазон целых чисел от 0 до btn_wait: = 0; начать процесс (clk) начать, если восходящий край (clk), то если btn = ‘1’, то count <= count + 1; если count = btn_wait, то count_led <= count_led + 1; счетчик <= 0; конец, если; иначе счетчик <= 0; конец, если; конец, если; завершить процесс; led <= count_led; конец Поведенческий;
Значение btn_wait было выбрано 0,25 секунды для того, чтобы значение count_led не прибавлялось слишком часткиком постокиком прибавлялось слишком, Еще один вариант антидребезга (даже более надежный) — прибавление count 1, когда на btn является логической единицей, и вычитание из count 1, когда btn является нулем. При этом если значение count опускается до 0 значит кнопка не нажата, либо был дребезг. Ну а если count досчитал до заветного btn_wait значит домашнее используемое =) В качестве задания могу посоветовать дописать проект: сделайте прибавление count_led после того, как кнопка была нажата и отпущена.
Итак, мы ознакомились с практикой с явлением «дребезг контактов» и научились избавляться от него. — Исходники проекта здесь. Желаю всем успехов в освоении ПЛИС!
Подавление дребезга контактовс помощью задержки
Постараемся исправить ситуацию. Мы знаем, что дребезг контактов оказывает себя в течение нескольких миллисекунд после замыкания. Давайте после изменения состояния кнопки выжидать, скажем, 5 мсек. Это время человека быстро происходит быстро — несколько десятков миллисекунд. А Arduino прекрасно работает с такими короткими промежутками времени, и эти 5 мсек позволят ему откикикогоганоготкикикоткикоткикотким
Скетч обработки кнопок с задержкой для устранения эффекта дребезга контактов int switchPin = 2; // пин кнопки int ledPin = 13; // пин светодиода boolean lastButton = false; // предыдущее состояние кнопки boolean currentButton = false; // текущее состояние кнопки boolean ledOn = false; // состояние светодиода void setup() {
pinMode (switchPin, ВХОД); pinMode (ledPin, ВЫХОД);
} void loop() {
currentButton = debounce (lastButton); // получаем состояние кнопки без дребезга if (lastButton == false && currentButton == true) {// если кнопка была нажата дольше 5 мсек; // то меняем состояние светодиода} lastButton = currentButton; // обнуляем состояние кнопки digitalWrite (ledPin, ledOn); // зажигаем / гасим светодиод
}
// Процедура указанной кнопки без дребезга:
boolean debounce (boolean last) {
логический ток = digitalRead (switchPin); // считываем текущее состояние кнопки if (last! = current) {// если состояние изменилось delay (5); // делаем задержку на 5 мсек, пока уляжется дребезг current = digitalRead (switchPin); // и считываем снова} возвращаем ток; // возвращаем текущее состояние кнопки
}
В данном скетче мы объявим debounce () («bounce» по-английски — это как раз «дребезг» приставка ‘де’ означает обратный процесс), вход которой мы подаём предыдущее состояние кнопки. Разъёмные кнопки длится более 5 мсек. Определившимие, мы меняем состояние светодиода.
Загрузим скетч в плату Arduino. Теперь всё гораздо лучше! Кнопка срабатывает без сбоев, при нажатии светодиод меняет состояние, как мы и хотели.