Обычная кнопка подключена к цифровому выводу с помощью подтягивающего резистора. Наличие подтягивающего резистора (pull-up) дает следующий эффект: по умолчанию на входе высокий уровень, при нажатии на кнопку контакт Arduino соединяется с землей, и на вход платы поступает низкий уровень.
На рис. 12.2 изображена осциллограмма сигнала на входе при нажатии кнопки.
Видно, что напряжение скачет несколько раз вверх и вниз, прежде чем устанавливается в низком состоянии.
При таком сигнале функция обработки прерывания будет вызвана три раза подряд.
Чтобы предотвратить это, добавим в схему RC-цепочку. Подключим параллельно
- 258 -
кнопке конденсатор, а последовательно подсоединим резистор (рис. 12.3). Когда кнопка не нажата, конденсатор заряжается через резисторы R1 и R2. При нажатии на кнопку конденсатор начинает разряжаться и через некоторое время на выходе напряжение упадет до нуля. Если есть дребезг, сигнал "подпрыгивает" вверх и вниз в течение нескольких миллисекунд, но конденсатор подзаряжается через резистор и на выходе поддерживается высокий уровень напряжения. Благодаря этому уровень сигнала меняется с высокого на низкий только один раз в течение интервала времени, определяемого значениями резистора и конденсатора.
Рис. 12.2. Дребезг при нажатии обычной кнопки
Рис. 12.3. Схема устранения дребезга с помощью RC-цепочки
- 259 -
Резистор R2, включенный последовательно с кнопкой, уменьшает ток заряда и разряда конденсатора. Слишком большой ток может повредить кнопку. Добавление резистора 100 Ом увеличивает время разряда и обеспечивает безопасность компонентов. Но в результате спад импульса приобретает вид, изображенный на рис. 12.4.
Погашение дребезга с помощью RC-контура
Рис. 12.4. Сигнал на выходе RC-цепочки, устраняющей дребезг
Благодаря RC-цепочке дребезг исчез, но перепад напряжения на выводе Arduino приобрел экспоненциальную форму. При опросе контакта прерывание происходит при переходе от низкого уровня к высокому и от высокого к низкому с определеой скоростью. Из-за сглаживания, вызванного конденсатором, момент прерывания определяется неточно. Крутизну спада сигнала можно увеличить с помощью триггера Шмитта. Интегральные схемы с триггером Шмитта обеспечивают резкий перепад сигнала на выходе, при превышении входным сигналом определенного порога. Выходной сигнал с триггера Шмитта можно непосредственно подавать на контакт Arduino. В этой главе мы используем инвертирующий триггер Шмитта на микросхеме 74НС14. В корпусе этой микросхемы находятся шесть отдельных инвертирующих триггеров Шмитта, в наших примерах понадобится только один.
Цоколевка микросхемы приведена на рис. 12.5.
Подсоединим выход RC-цепочки к входу триггера Шмитта, а сигнал с его выхода подадим на контакт платы Arduino (рис.-12.6).
Поскольку выход триггера инверсный, то и сигнал будет перевернут. При нажатии кнопки уровень на входе Arduino будет высокий. При написании программы необходимо помнить об этом. Окончательный вид выходного сигнала изображен на рис. 12.7, как видим, сигнал чистый, без дребезга. Такой сигнал вполне подходит для формирования аппаратного прерывания.
- 260 -
Рис. 12.5. Цоколевка микросхемы 74НС14
Рис. 12.6. Окончательный вариант схемы подавления дребезга
12.3.2. Монтаж схемы
Мы разобрались, как работает аппаратное подавление дребезга для кнопки. Для экспериментов возьмем RGB-светодиод и одну кнопку. Соедините элементы согласно схеме, изображенной на рис. 12.8.
- 261 -
Погашение дребезга с помощью RC-контура и триггера Шмитта
Рис. 12.7. Сигнал на выходе схемы подавления дребезга с триггером Шмипа
Рис. 12.8. Схема устройства подавления дребезга
Читать дальше