Джереми Блум - Изучаем Arduino: инструметы и методы технического волшебства
- Название:Изучаем Arduino: инструметы и методы технического волшебства
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2015
- Город:Санкт-Петербург
- ISBN:978-5-9775-3585-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Джереми Блум - Изучаем Arduino: инструметы и методы технического волшебства краткое содержание
Для радиолюбителей
Изучаем Arduino: инструметы и методы технического волшебства - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
При таком сигнале функция обработки прерывания будет вызвана три раза подряд.
Чтобы предотвратить это, добавим в схему 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. Окончательный вариант схемы подавления дребезга
Мы разобрались, как работает аппаратное подавление дребезга для кнопки. Для экспериментов возьмем RGB-светодиод и одну кнопку. Соедините элементы согласно схеме, изображенной на рис. 12.8.
- 261 -

Погашение дребезга с помощью RC-контура и триггера Шмитта
Рис. 12.7. Сигнал на выходе схемы подавления дребезга с триггером Шмипа

Рис. 12.8. Схема устройства подавления дребезга
- 262 -
Пришло время написать простую программу для проверки работы устройства устранения дребезга и уяснения возможностей аппаратных прерываний Arduino. Наиболее очевидное и полезное применение аппаратных прерываний - опрос внешних входов во время работы программы, в которой присутствуют задержки delay().
Есть много сценариев, в которых это необходимо, мы будем управлять яркостью светодиода, формируя ШИМ-сигнал с помощью функции analogWrite(). Устройство подает на один из трех выводов RGB-светодиода сигнал, варьирующий от 0 до 255 и обратно. Каждый раз при нажатии на кнопку меняется цвет свечения. Это невозможно сделать с помощью опроса состояния вывода в цикле, т. к. момент нажатия кнопки почти наверняка будет пропущен.
Сначала разберемся, что такое переменные volatile. Если переменная будет меняться при выполнении прерывания, ее следует объявить как volatile (нестабильная). Это необходимо для корректной обработки переменной компилятором. Пример объявления переменной как volatile:
volatile int selectedLED = 9;
Для вызова прерывания в Arduino предусмотрена функция attachInterrupt(), находящаяся в setup(). Параметры функции: идентификатор прерывания (или номер контакта для платы Due ), имя функции обработки прерывания и режим запуска прерывания (LOW, CHANGE, RISING или FALLING). В нашей программе объявлено прерывание о (вывод 2 на плате Uno), которое при срабатывании RISING (по фронту) запускает функцию swap()
attachInterrupt(0, swap, RISING);
Осталось написать код функции обработки прерывания swap() и добавить его к основной программе. После подключения прерывания и написания кода функции обработки прерывания вы можете писать остальной текст программы. Каждый раз при вызове прерывания основная программа приостанавливается, выполняется функция обработки прерывания, затем ход основной программы продолжается с того места, где она была прервана. Поскольку прерывание останавливает основную программу, его обработка должна быть очень короткой и не содержать задержки delay(). Теперь все готово для написания программы управления яркостью RGB-светодиода и переключения цвета по нажатию кнопки. Полный текст программы приведен в листинге 12.1.
Листинг 12.1. Аппаратные прерывания, реализующие многозадачность - hw_multitask.ino
// кнопка с аппаратной противодребезговой защитой,
// управляемая прерыванием
// Контакт кнопки
const int BUTTON_INT =0; // Прерывание 0 (вывод 2 для Uno)
const int RED=11;
// Красный вывод RGB-светодиода контакт 11
const int GREEN=10;
// Зеленый вывод RGB-светодиода контакт 10
const int BLUE=9;
// Синий вывод RGB-светодиода контакт 9
- 263 -
// Переменные volatile можно изменять внутри функции обработки прерывания
Читать дальшеИнтервал:
Закладка: