Кухонный таймер [Амперка / Вики]
Проекты на Arduino и Slot Shield
Простой электронный таймер запустит обратный отсчёт и громко пропищит о его окончании. Временной интервал задаётся ручкой потенциометра, а отсчёт запускается и останавливается кнопкой.
Видеоинструкция
Что потребуется
Как собрать
Скетч
Прошейте контроллер скетчем через Arduino IDE.
- timer.ino
// Подключаем библиотеку для работы с дисплеем #include <QuadDisplay2.h> // номер аналогового пина пищалки #define POT_PIN A0 // номер цифрового пина пищалки #define BUZZER_PIN 2 // номер цифрового пина кнопки #define BUTTON_PIN 4 // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(9); // переменная для подсчёта времени unsigned long prevMillis = 0; // переменная для хранения таймера int reverseTimer; void setup() { // инициализация дисплея qd.begin(); // функция установки таймера settingTimer(); } void loop() { // если время таймера не дошло до нуля и прошла 1 секунда if ((reverseTimer > 0) && ((millis() - prevMillis) > 1000)) { // выводим значение на дисплей qd.displayInt(--reverseTimer); // запоминаем текущее время prevMillis = millis(); // если таймер дошёл до нуля if (reverseTimer == 0) { // подаём звуковой сигнал и выводим «Off» на дисплей qd.displayDigits(QD_NONE, QD_O, QD_f, QD_f); tone(BUZZER_PIN, 4000, 200); } } // если нажата кнопка if (!digitalRead(BUTTON_PIN)) { // подаём звуковой сигнал tone(BUZZER_PIN, 500, 500); delay(1000); // выполняем настройку таймера settingTimer(); } } // функция настройки таймера void settingTimer() { // пока кнопка не нажата while (digitalRead(BUTTON_PIN)) { // считываем значения с потенциометра reverseTimer = analogRead(A0); // и выводим его на дисплей qd.displayInt(reverseTimer); delay(30); } // после нажатия кнопки, подаём звуковой сигнал tone(BUZZER_PIN, 2000, 200); delay(300); tone(BUZZER_PIN, 3000, 200); delay(300); tone(BUZZER_PIN, 4000, 200); }
Что дальше?
FAQ
Где скачать и как установить необходимые библиотеки?
У моего модуля QuadDisplay всего три ноги и расположены они слева. Можно ли использовать его в этом проекте?
Да, модуль можно использовать, но скетч, библиотеки и схема сборки отличаются.
Вставьте QuadDisplay в правый нижний слот
Прошейте контроллер скетчем через Arduino IDE.
- timer.ino
// Подключаем библиотеку для работы с дисплеем #include <QuadDisplay.h> // номер аналогового пина потенциометра #define POT_PIN A0 // номер цифрового пина пищалки #define BUZZER_PIN 2 // номер цифрового пина кнопки #define BUTTON_PIN 4 // номер цифрового пина дисплея #define DISPLAY_PIN 11 // переменная для подсчёта времени unsigned long prevMillis = 0; // переменная для хранения таймера int reverseTimer; void setup() { // функция установки таймера settingTimer(); } void loop() { // если время таймера не дошло до нуля и прошла 1 секунда if ((reverseTimer > 0) && ((millis() - prevMillis) > 1000)) { // выводим значение на дисплей displayInt(DISPLAY_PIN, --reverseTimer); // запоминаем текущее время prevMillis = millis(); // если таймер дошёл до нуля if (reverseTimer == 0) { // подаём звуковой сигнал и выводим «Off» на дисплей displayDigits(DISPLAY_PIN, QD_NONE, QD_O, QD_f, QD_f); tone(BUZZER_PIN, 4000, 200); } } // если нажата кнопка if (!digitalRead(BUTTON_PIN)) { // подаём звуковой сигнал tone(BUZZER_PIN, 500, 500); delay(1000); // выполняем настройку таймера settingTimer(); } } // функция настройки таймера void settingTimer() { // пока кнопка не нажата while (digitalRead(BUTTON_PIN)) { // считываем значения с потенциометра reverseTimer = analogRead(A0); // и выводим его на дисплей displayInt(DISPLAY_PIN, reverseTimer); delay(30); } // после нажатия кнопки, подаём звуковой сигнал tone(BUZZER_PIN, 2000, 200); delay(300); tone(BUZZER_PIN, 3000, 200); delay(300); tone(BUZZER_PIN, 4000, 200); }
Скачайте и установите библиотеку для работы с «трёхногим» дисплеем.
включение нагрузки по таймеру от кнопки (видео)
Это опять-таки один из первых моих опытов работы с Ардуино. Пока я даже еще помню какой.. Это второй проект! Так вот, во втором проекте, в большинстве случаев, людей учат работать с кнопкой, то есть нажал кнопку, подал напряжение на нагрузку – загорелся светодиод. Отпустил кнопку – светодиод потух. Однако посмотрев подобную тему, я немного был ошарашен, ну что это за проект!? Зачем применять Ардуино и связку из проводов, резисторы, если все на само деле можно реализовать просто обычной цепью через источник питания, кнопку и светодиод. Это и надежнее, дешевле и понятнее и не потребует специальных знаний. Нет, я понимаю, что микроконтроллер Ардуино начинает себя оправдывать лишь с определенных проектов, когда надо выполнять сложные действия вроде как с задержкой с распределением питания и все в таком духе. А вот для того чтобы до этого дойти, необходимо научиться работать с примитивом. Так скажем, что надо пройти не совсем прагматичное, дабы впоследствии воспользоваться возможностями на все сто. Пока я еще нахожусь в сторону баланса когда все было бы проще собрать скажем на той же микросхеме NE555, нежели заморачиваться Ардуинкой и заливать программу для таймера. Однако буду очень надеться, что далее применение в проектах Ардуино начнут себя оправдывать. Хотя уже и сейчас можно начать находить некие плюсы в обычном таймере от Ардуино, он легко настраивается на любое время срабатывания без пайки, просто меняем время в программке. Он может легко инвертировать сигналы от включено к выключено. Он в конце концов может работать сразу по нескольким критериям, если к нему подключить несколько кнопок и к каждой задать свой выход или свое время срабатывания. В общем уже кое-что, так что давайте обо всем этом поподробнее.
Включение нагрузки от кнопки на Arduino UNO
Как я все же не хаял что заниматься проектом с кнопками это все же детство, но пройти через это придется, ведь даже полет в космос начинался с сюрреалистических эскизов на бумаге, пока не оброс чем-то значимым и стоящим, что в итоге подняло в пространство ракету! Так вот, первый вариант будет реализовывать следующий алгоритм работы. Нажимаем кнопку – светодиод горит. Отпускаем- гаснет. Вначале подключаем все физически, а потом начинаем работать с программой. Принципиальная схема подключения будет выглядеть так.
P.S. Схема подразумевает подачу положительного потенциала на вход от кнопки. Сопротивление 10 кОм применено с тем, дабы в отсутствии сигнала от кнопки, на проводе не появлялись наводки и не было ложных срабатываний. Если убрать цепь с сопротивлением, то на входе возможно появление логической 1 просто от наводок, что сделает работу схемы и программы нестабильной.
int button = 2; int led = 13; // назначаем константы void setup() { pinMode(led, OUTPUT); pinMode(button, INPUT); // инициализируем что вход, что выход } void loop(){ if (digitalRead(button) == HIGH) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); // это условие при котором высокий потенциал на кнопке зажигает светодиод во всех других случаях светодиод не горит } }
Все ждем пока все зальется в микроконтроллер и уже можно пробовать нажимать на кнопку. Если никаких проблем при загрузке не возникло, то все будет как я и говорил. Нажимаем на кнопку – горит, отпускам — гаснет. Вот такой примитив! Что же, теперь попробуем хоть малость усовершенствовать программу и сделать из нее таймер, то есть нажал на кнопку светодиод включился скажем на 10 секунд.
Включение таймера от кнопки на Arduino UNO
Итак, из предыдущей версии описанной в абзаце выше делаем таймер, чтобы светодиод включался и горел какое-то время. Схема подключения все та же, еще раз ее приведу.
Код тоже почти тот же, разве что после включения светодиода делаем задержку для последующего выполнения затухания, применяя функцию delay. Можете сравнить с предыдущим кодом, все один в один, разве добавилась задержка.
int button = 2; int led = 13; // назначаем константы void setup() { pinMode(led, OUTPUT); pinMode(button, INPUT); // инициализируем что вход, что выход } void loop(){ if (digitalRead(button) == HIGH) { digitalWrite(led, HIGH); delay(10000); // ждем 10 сек } else { digitalWrite(led, LOW); // это условие при котором высокий потенциал на кнопке зажигает светодиод во всех других случаях светодиод не горит при этом таймер встроен в область условия } }
Вот собственно так и родился проект и программка таймера. Плюсы такого таймер перед тем же таймером собранным без микроконтроллера конечно есть. Это возможность быстро поменять время задержки (меняем цифру 10000), инвертировать включение выключение нагрузки, то есть сделать чтобы она не включалась, а наоборот выключалось, для эnого надо поменять местами значения HIGH и LOW. Можно сделать несколько таймеров, от разных кнопок, если задать разные входы для нескольких кнопок и подключить их.
Подводя итог…
Можно сказать, что проект принес свои результаты. Явной пользой данного проекта будет возможность понять как формируется программа. Что есть константы описываемые в программе, есть инициализация всего того что подключено к контроллеру, есть алгоритм работы. Еще здесь же можно провести аналогию и с тем, как же будут впоследствии подключаться датчик и приводы, ведь датчик имеет примерно такой же сигнал, как и положительный потенциал с кнопки, а привод также может быть управляем низкоточным сигналом, сродни светодиоду.
Единственным, чем я остался не удовлетворен, так это тем, что нагрузкой в данном случае служит светодиод. Что толку от него, когда хотелось бы управлять силовыми элементами в электрической цепи? Скажем, включать мощные осветительные лампы, нагреватели, насосы или прочие электроприборы. Поэтому надо будет подготовить статью о том, как из низкоточного управляющего сигнала получить мощный управляющий. Видимо это будет темой одной из ближайших моих статьей.
Видео про таймер на Ардуино
Простой таймер на Ардуино с реле и обратным отсчётом
Сегодня покажу как легко и просто сделать таймер для управления реле к которому можно подключить любую нагрузку.
Нам понадобятся. Ардуино, LCD индикатор, реле, пищалка для подачи сигнала и 4 кнопки.
Чтобы не тянуть, сразу покажу как это работает, а потом посмотрим схему подключения.
Слева на экране я буду управлять кнопками всеми настройками, а справа я вывел более крупное изображение дисплея, что бы лучше видеть все изменения.
При нажатии на 1 кнопку можно выбрать установку времени. Это секунды, минуты и часы.
После выбора режима, кнопками плюс и минус можно настроить время таймера. Отсчёт времени будет идти в обратную сторону. И при достижении нуля, раздастся сигнал и включится или выключится реле. Это будет завесить от того какой режим у вас запрограммирован.
После установки нужного времени надо нажать четвёртую кнопку и таймер начнёт работу. Для примера я поставил время срабатывания 14 секунд, и режим работы Отключение. После нажатия ОК, реле включит нагрузку, которая отключится через 14 секунд.
Установленное время сохраняется в памяти Ардуино, и если вы захотите снова использовать это же время, вам надо просто нажать ОК.
Теперь изменим режим и будем включать лампу при срабатывании таймера. Как менять режимы я покажу дальше в видео.
Ждём срабатывание таймера. Я ускорю видео, чтобы не тратить ваше время.
Таймер сработал и лампа загорелась.
Для работы вам надо установить библиотеки.
Библиотеку таймера и библиотеку для работы с LCD дисплеем. Так как я в скетче использую русский шрифт, то вам надо установить вот эту библиотеку. Если вам что-то будет непонятно, то посмотрите вот это видео, там я подробно всё рассказал.
Здесь указано к каким пинам подключены кнопки. А здесь куда подключены пищалка и реле.
Эти две переменные отвечают за выбор режима работы. Сейчас установлен режим Выключение. То есть при срабатывании таймера, реле будет отключено.
Если вы поменяете эти значения на противоположные. Сделаете OFF равным единице, а ON равным нулю, то измените режим на включение и при срабатывании таймера он включит нагрузку.
Подведу итог работы, но не видео.
В таймере можно устанавливать время. Часы, минуты и секунды. Режим работы может быть как на включение или отключение нагрузки.
Давайте посмотрим схему. Индикатор подключается по стандартной схеме к шине I2C.
Пищалка подключается в пину d6, а реле к пину d5. И то и другое питается от 5 вольт Ардуино. Если у вас будет тускнеть дисплей, то вам надо подключить реле к выводу WIN Ардуино, если вы питаете плату от USB или запитать от отдельного источника.
Кнопки подключены к выводам А0 – А3. Другой вывод кнопки надо подключить к земле. Так как в скетче я включил внутреннюю подтяжку, то вам не обязательно устанавливать внешние резисторы.
Если вам нравятся мои видео, то вы можете помочь в развитии канала став его спонсором. Все ваши вклады пойдут на закупки новых модулей. Вам же за это будут предоставлены дополнительные бонусы, и они довольно интересные.
Вы видите ссылки на видео, которые, я думаю будут вам интересны. Перейдя на любое из этих видео вы узнаете что-то новое, а ещё поможете мне. Ведь любой ваш просмотр — это знак YOUTUBE, что это кому-то интересно и что его надо показывать чаще.
Спасибо.
Кухонный таймер на Arduino
2012-02-17
Всі статті →Этот кухонный таймер представляет собой достаточно простое устройство, кнопка для нажимания и удерживания, которая поведет отсчет с интервалами в 5 минут до тех пор, пока вы не отпустите кнопку. Когда вы это сделаете, будет сигнал и таймер начнет отсчитывать назад. В таймер входят будильник и дисплей с пронзительным звуком, чтобы привлечь ваше внимание.
я взял все электрические компоненты из старых испорченных приспособлений. Старайтесь использовать вещи повторно, таким образом можно довольно просто избавиться от испорченной электроники, постарайтесь использовать поломанное по максимуму! Видите перемычки в проекте? Нет, скрепки для бумаги намного лучше — они очень дешевы и более надежны:)
Шаг 1. Компоненты
Вам понадобятся:
Arduino – я использовал duemillanove, но вы всегда можете взять другую вместо нее.
Проводки переходников – у меня они закончились, и я использовал скрепки для бумаги, но вы всегда можете сделать по-своему.
Кнопка – думаю, что можно использовать кнопку, встроенную в протошилд!
10 Bar LED Bar Graph – можно использовать для этого 10 светодиодов, я нашел мои в сломанном CD плеере.
Пьезо-электрическая пищалка –я использовал элемент от старого кухонного таймера со сломанным чипом. В общем-то, это и стало причиной, почему я захотел сделать собственный таймер на основе Ардуино!
Резистор – для подключения кнопки я использовал подтягивающий резистор в 10k, который выпаял из машинки для посева семян.
Дополнительно:
Arduino шилд – я использовал его, т.к. мне нравится экспериментировать с Arduino, и я не хочу долго возиться с таймером, если можно бысро сделать и пользоваться. В шилд встроена небольшая макетная плата, с ними проект выглядит аккуратнее.
Еще резисторы – для ваших компонентов, чтобы не сгорели выводы на вашей Arduino. Хотя я знаю, что это хорошая идея, у меня на тот момент не было достаточно резисторов, кроме того, я не знал, как использовать подтягивающие резисторы с Arduino, поэтому на тот момент сделал без них. Просто помните об этом, и не моя вина, если вы сожжете свою Arduino!
Шаг 2. Строим!
Проще всего показать, как соединена схема, это нарисовать ее в программе Fritzing (см. выше). Теперь о схеме. Как вы видите, одна сторона линейки из 10 светодиодов соединена с Gnd выводом Arduino, в то время, как каждая ножка с другой стороны присоединена к цифровому выводу Arduino. Это значит, что когда на выводе Arduino установлен высокий уровень (HIGH), соответствующий сегмент светодиода загорится. Выводы используемые для соединения с Arduino, 3, 4, 5, 6, 7, 8, 10, 11, 12, и 13, а вывод 2 резервируется для кнопки, и ШИМ (PWM) вывод 9 зарезервирован для использования пьезо-электрического звукового сигнала. Кнопка подсоединена проводком, таким образом, что когда она нажата напряжение 5В подается на вывод 2 и на нем появляется высокий логический уровень (HIGH), а когда кнопка не нажата, вывод на вывод 2 будет поступать низкий логический уровень (LOW). Пьезо звуковой сигнал соединен с ШИМ выводом 9, таким образом мы можем имитировать квадратную синусоидальную волну, используя analogWrite, который создаст звуковой сигнал, предупреждающий, что время истекло.
ШАГ 3: Кодируйте! Или используйте мой код
Чтобы запустить кухонный таймер, накормите вашу Ардуинку качественным, вкусненьким кодом. Я написал достаточно простой (но страшненький на вид) код, который может вести все это. Те, кому достаточно, чтобы система просто работала, могут загрузить его сейчас.
Объяснить немного сложнее, поэтому я сделаю краткий обзор, а остальное достаточно понятно:
Сначала мы инициализируем все выводы и функции, которые собираемся использовать, чтобы убедиться, что наша Arduino будет с ними работать. Мы используем const int чтобы показать, что вывод, который мы инициализируем, является константным и не изменится. Переменные могут также быть инициализированы, но, как правило, они не является константными (постоянными), так как они установлены по всему скрипту. Затем мы проверяем, была ли кнопка (подключенная к выводу 2) нажата или нет, и если это так, то загорается следующий сегмент, и добавляет к tastyTimeVariable. Это означает, что мы можем использовать функцию else, чтобы указать необходимый отрезок времени, в зависимости от величины нашего tastyTimeVariable. Вы увидите, что мы задерживаем «300L * 1000L», что соответствует примерно 5 минутам, так как 300,000 миллисекунд = 300 секунд, и 300/60 = 5. Затем мы говорим Arduino, что если tastyTimeVariable равняется чему угодно, кроме 0 (другими словами, кнопка нажата, и какой-то отрезок времени выбран) включить графический дисплей, и пищать пищалкой. Мы можем менять длительность звукового сигнала, меняя команду.
Я также написал комментарии в скрипте, чтобы помочь тем, кто хочет понять, как это работает, или модифицировать для своих нужд.
Добавляю сообщение, присланное мне от одной читательницы, она пишет:
Я изменила код кухонного таймера, т.к. он был очень длинным. Написанный мною код делает то же самое, но является частью оригинального кода. Надеюсь, вы не возражаете. Вот линк к нему. Для работы этого скетча необходима библиотека Utility, если она у вас не установлена — скачайте и сохраните в подпапку libraries папки, в которую установлен ваш Arduino IDE
Это фантастический кусок кода, поэтому попробуйте его, процесс инсталляции тот же. Большое спасибо за присланный код!
Шаг 4 Готовим!
Да, подключаем устройство к USB адаптеру. Не думаю, что оно очень защищено от воды, поэтому убедитесь, что руки сухие перед тем, как пользоваться. И все, что вы делаете, теперь на вашей ответственности, поэтому не пытайтесь потом предъявлять мне иск.
*/ Usage Instructions
Перезагрузите Arduino, и нажмите кнопку, чтобы светодиодные сегменты загорелись. Каждый сегмент представляет 5 минутный отрезок времени. Когда нужное количество сегментов загорится, отпустите кнопку. Дисплей засветится и все сегменты появятся опять. 5 минут спустя один исчезнет, и так далее, до тех пор, пока время не истечет. В этот момент раздастся звуковой сигнал. Чтобы остановить сигнал, перезагрузите Arduino. Выключать Arduino не нужно, т.к. кухонный таймер не включается без нажатия.
Наслаждайтесь /*
Anonymouse197, Ari Cooper Davis ©, anonymouse197[at]gmail.com
Дякуємо Вам за звернення! Ваш відгук з’явиться після модерації адміністратором.
Кухонный таймер на Ардуино. ⋆ ОБЪЕМНИК
Простой кухонный таймер с обратным отсчетом позволяет выставить время от одной минуты до 99 часов 99 минут. Время выводится на дисплей tm1637. Для установки времени использована мембранная клавиатура с четырьмя кнопками, кнопки: +1 , +10, +60 минут и Сброс настроек. Таймер работает на литиевом li-on аккумуляторе типоразмер 18650 и заряжается от стандартного 5В зарядного устройства для телефона, через micro USB разъем. Мозгом устройства является Arduino ProMini. Скетч написан в IDE Arduino 1.6.7 для Arduino UNO или ProMini.
Arduino — торговая марка аппаратно-программных средств для построения простых систем автоматики.
с обратным отсчетом. С возможностью подключить реле на 3-й пин.
Принципиальная схема кухонного таймера
Для заряда аккумулятора установлен контроллер TP4056 с защитой от разряда.
В схеме питания таймера есть повышающий модуль mt3608 DC-DC Step Up, для повышения напряжения до 5В. Выходное напряжение с платы защиты 4В, для работы Arduino ProMini и высокой яркости свечения led дисплея требуется напряжение 5В.
Вывод времени в конструкции таймера применен led дисплей tm1637.
Модуль звука Buzzer активный 5v.
Обозначение контактов:
VCC – напряжение питания;
I/O – управляющий сигнал;
GND – общий контакт.
Указанные элементы, на принципиальной схеме кухонного таймера: резистор, транзистор и буззер, уже установлены в модуль звука Buzzer, поэтому этот элемент схемы можно заменить модулем.
Модуль адаптер micro USB.
Скетч и библиотеки скачать одним архивом. https://yadi.sk/d/yV8bp2UYHA9A3g
В Скетч добавил выход на реле 3pin https://yadi.sk/d/3LDD01zEnptOvQ
Используемые компоненты (заказать в Китае):
1. Arduino promini; http://got.by/2snd5z
2. Мембранная клавиатура 1х4; http://ali.pub/2sng3r
3. Модуль звука Buzzer; http://ali.pub/2sngdh
4. led дисплей tm1637; http://ali.pub/2sng7g
5. Тумблер 2 Pin; http://ali.pub/2snfxx
6. Повышающий модуль mt3608; http://ali.pub/2snfo0 или http://ali.pub/2snfoz
7. контроллер TP4056; http://got.by/2snfa0 или http://ali.pub/28346d
8. Честные аккумуляторы 18650, 3400 мА⋅ч; http://ali.pub/5gxdx6
9. Модуль micro USB; http://ali.pub/2sng09
10. Холдер 18650; http://ali.pub/5gxe89
11. Коробочка для поделок; http://ali.pub/5gxedi , http://ali.pub/5gxeik
12. Реле модуль 1 канал http://ali.pub/2s42mk или http://ali.pub/2s419r или http://ali.pub/2s42aw
Похожие Статьи
с вашего сайта.
Ардуино и микросхемы | Реле времени. Таймер задержки 0-999 сек 5-30V
ОПИСАНИЕ ТОВАРА: «РЕЛЕ ВРЕМЕНИ. ТАЙМЕР NE555 0-999 sec»
Данный релейный модуль с таймером времени отличется от своих собратьев наличием внешеного управления через Триггер, т.е. управление через подачу Высокого (HIGH) или Низкого (LOW) сигнала. Сигнал от тригерра возможен в диапазоне от 3-х до 24-х воьт. Модуль имеет LED-индикатор, на котором вожет отображаться как текущее время, так и сохраненные настройки.
Настройки и программирование «Модуля реле времени» смотрите ниже:
1) Данное реле имеет несколько режимов и может работать ТОЛЬКО в одном из режимов! Для того, тобы сменить режим, необходимо зажать кнопку SET на 1 секунду и отпустить;
2) кнопки UP(верх) и DOWN(низ) используются для выбора необходимого режима и короткое нажатие кнопки SET подтверждение выбора;.
Список режимов и их назначение
P1.1 — В данном режиме реле по умолчание разомкнуто, при подаче логической единицы (от 3V до 24V) на порт Trigger реле сразу же замыкается и начинается отсчет времени установленный в параметре OP, после окончания отсчета — реле выключается.
P1.2 — В данном режиме реле по умолчанию разомкнуто, при подаче сигнала на порт Trigger реле замыкается и начинается отсчет указанный в параметре OP. После окончания отсчета, реле отключится (как и в режиме P1.1), но до того как время истечет моно сделать повтор отсчета предыдещего значения времени сначала, повторно подав HIGH-сигнал на порт Trigger.
P1.3 — В этом режиме реле по умолчанию разомкнуто. И после подачи HIGH-сигнала с Trigger реле замыкается. Начинается отсчет времени указанный в параметре OP. После отсчета времени реле выключится. Для принудительного завершения (размыкания) Модуля реле раньше установленного таймером времени требуется повторно подать высокий сигнал на порт Trigger.
P-2 — данный режим срабатывает при подаче логического сигнала на Trigger, отрабатывает один раз и ждет следующей подачи логической единицы. При подаче логической единицы реле времени сначала ожидает время выставленное для разомкнутого состояния CL, и после истечении этого времени замыкает реле и ожидает время выставленное для замкнутого состояния OP. После чего опять размыкает реле и ждет следующей подачи сигнала на Trigger, настройка количества повторений здесь недоступна.
P3.1 — данный режим похож на P-2 за исключением нескольких вещей, при подаче логической единицы на порт Trigger реле переходит сразу в замкнутое состояние. В этом режиме можно указать количество повторений LOP. Если после срабатывания реле по высокому сигналу на Trigger реле замкнется, и, не завершив заданные циклы, повторно подать высокий сигнал на порт Trigger, — произойдет остановка работы реле. Т.е. реле отключится и отсчет циклов завершится.
P3.2 — данный режим срабатывает сразу после подачи питания на реле, при этом реле сразу переходит в замкнутый режим, отсчитывает время указанное для замкнутого режима OP, после этого реле размыкается и начинается отсчет времени указанного для разомкнутого режима CL, всё это повторяется указанное в параметре LOP количество раз, если указана бесконечность (—), то реле будет повторять эти действия бесконечно.
P4 — в этом режиме реле по умолчанию отключено, при подаче сигнала на Trigger сразу же замыкается реле. Реле будет замкнуто до тех пор, пока на Trigger будет подаваться сигнал, как только подача сигнала на Trigger прекращается, реле отключается не сразу, срабатывает таймер выставленный в OP, как только отсчет заканчивается — реле отключается.
Сразу после подключения питания к реле на дисплее отображается текущий режим работы.
Теперь после того, как мы выбрали кнопкой SET нужный режим, вас автоматически переключит на настройки времени срабатывания реле.
В этих настройках мы можем изменить три функции:
OP — Время нахождения реле в замкнутом состоянии
CL — Время нахождения реле в разомкнутом состоянии
LOP — Количество повторений (циклов) включения/выключения реле
Чтобы задать значения каждого из функций нужно выбрать одну из них нажатием кнопки SET после чего она высветится, мигнет 3 раза, и затем уже можно задавать ее значения. После выбора нужной функции на дисплее появится 3- три цифры, с помощью которых мы можем настроить нашу функцию по инструкции ниже:
Функция OP (замкнутое состояние):
Эта функция нужна для установки времени, в течении которого реле будет замкнуто.
При нажатии кнопок UP и DOWN можно менять время в большую или меньшую сторону.
В этой функции присутствует точка разрядности. Если эта точка находится только после третьей цифры, то мы устанавливаем время в секундах. Если точка стоит после второй цифры, то мы устанавливаем время в 0.1 секундах (десятые доли миллисекунд). Если же унас стоит 3 точки, то мы устанавливаем время в минутах.
Для того чтобы менять положение точек, необходимо кратковременно нажимать на кнопку STOP.
Функция CL (разомкнутое состояние):
Настраивается точно так же как и функция OP. Только здесь устанавливается время, в течение которого Модуль реле будет находится в разомкнутом состоянии.
Точно так же на дисплее отобразится 3 цифры, которые в зависимости от расположения точки может означать секунды, 0.1 секунды и минуты. Точно так же кнопкой STOP мы меняем расположение точки.
Функция LOP (количество повторений):
Функция установки количества повторений циклов разомкнутого и замкнутого состояния реле. Число повторенийс задается с помощью кнопок UP и DOWN от 1сек до 999 сек. При установке значения менее 1 — циклы будут повторяться бесконечно (на дисплее отобразится 3 тире «- — — «
После окончательной настройки -времени разомкнутого и замкнутого состояния реле, и -количества повторений: — сохранение настройки производится длительным нажатием на 2-3 сек кнопки SET (дисплей должен моргнуть 3 раза).
Для запуска реле после настройки служит короткое нажатие кнопки STOP (при этом на экране отобразится надпись «ON», при повторном нажатии кнопки STOP реле выключится и при этом на дисплее отобразится надпись OFF.
Таймер для мытья рук. Arduino против коронавируса… Как⁈ Журнал для тех, кто делает
Сегодня я сделаю простой таймер с разноцветными светодиодами и динамиком. Устройство почувствует приближение рук и включит обратный отсчёт до того момента, когда можно выключать воду.
Что понадобится
— микроконтроллер Arduino Uno
— инфракрасный датчик препятствий E18-D80NK
— трёхцветный светодиод
— сопротивление на 220 Ом
— пьезопищалка
— макетная плата
— соединительные провода «папа-папа»
Устройство построено на популярном микроконтроллере Arduino Uno. Я собирал таймер на оригинальной итальянской плате, но вам подойдут практически любые китайские клоны — проект простой и нетребовательный к ресурсам.
Я соберу проект на макетной плате, поэтому мне не понадобится паяльник. Как устроены макетные платы, уже рассказывал в предыдущем проекте — бесконтактном санитайзере. Если остались вопросы, пишите в комментариях, обязательно ответим.
Итак, за работу.
Шаг первый. Подключаем светодиод
Самая яркая деталь устройства — RGB-светодиод. В его прозрачном корпусе спрятаны сразу три источника света: красный (R, от английского red), зелёный (G — green)и синий (B — blue) светодиоды. Поэтому ног у него больше, чем у одноцветных диодов. Самая длинная из четырёх — это общий минус. Чуть короче — плюс зелёного светодиода. Самые короткие — плюсы красного и синего цветов. Соедините минус с сопротивлением, а сопротивление подключите к контакту GND на Arduino. Теперь подключите красный, зелёный и синий плюс к контактам 4,3 и 2.
Это стандартная схема подключения, но вы всегда можете проверить свой светодиод. Просто подключите плюс к контакту 5V на Ардуино. На этом контакте всегда есть напряжение, поэтому светодиод загорится. Главное, не забывайте подключать минус через сопротивление, иначе светодиод сгорит.
Проверим как работает светодиод. Для этого прошьём плату простым скетчем. Эта программа раз в секунду будет переключать цвет светодиода.
Основной код программы находится в закольцованной функции (loop в переводе означает петля). Эта функция будет повторятся снова и снова, пока не выключить плату. Это удобно для повторяющихся событий и постоянного опроса датчиков.
Шаг второй. Таймер обратного отсчёта
Изменим программный код так, чтобы светодиод изменял своё состояние по более сложному алгоритму.
После включения платы мы на секунду зажжём красный светодиод. Следующие двадцать секунд устройство будет мигать синим диодом: девять десятых секунды он будет гореть, потом выключаться на одну десятую. После двадцати таких повторений, устройство зажжёт зелёный светодиод.
Время, необходимое для мытья рук, задаётся в первой строке программного кода. Сейчас оно равно 20 секундам, но вы можете настроить этот интервал с точностью до секунды.
Устройство можно считать условно рабочим — оно отсчитывает заданное время, но для этого плату приходится каждый раз включать вручную. Исправим это, добавим бесконтактный сенсор.
Шаг третий. Датчик приближения
Инфракрасный датчик препятствий работает как кнопка, только не нужно ничего нажимать — достаточно просто поднести руки.
Подключу датчик напрямую к плате, как делал это в предыдущем проекте. Отличие одно: 4 контакт уже занят светодиодом, поэтому подключу сигнальную линию к 7 контакту.
Изменится и код.
Теперь плата постоянно находится в режиме ожидания, об этом сообщает зажённый красный светодиод. Когда сенсор обнаружит препятствие, плата запустит обратный отсчёт и начнёт мигать синим светодиодом. Когда пройдут 20 секунд, светодиод загорится зелёным, а потом плата вернётся в режим ожидания.
Шаг четвёртый. Добавляем звук
Устройство стало намного удобней, но теперь хочется добавить звуки. До Алисы мы со временем дойдем, а пока ограничимся простым пьезодинамиком. За издаваемые звуки его часто называют пищалкой или базером.
Для подключения динамика понадобятся всего два провода, один подключим к минусу, а второй к 9 контакту на Arduino. Сопротивление здесь не понадобится, да и полярности динамик не имеет — не важно какую ножку подключать к плюсу, а какую к минусу.
В программе добавились три строки: первая задаёт контакт для работы с динамиком, вторая и третья выдают звуки. Для этого используется функция tone. В этой функции можно задать частоту и продолжительность звукового сигнала.
Всего за пару минут у нас получилось собрать законченное устройство. Такой таймер особенно пригодится, если у вас есть дети: с ним опостылевшее мытьё рук превратиться в маленькую игру.
Оставляйте комментарии, какие электронные проекты вам интересны, что осталось непонятно и о чём рассказать в следующих статьях.
таймерных прерываний: улучшите свои навыки работы с Arduino | Ардуино
Таймерыявляются жизненно важной частью работы с микроконтроллерами. Продолжая серию «Улучшение навыков Arduino», я покажу вам, как с ними работать, чтобы раскрыть всю мощь таймеров и счетчиков!
Для чего используются таймеры?
Таймеры играют жизненно важную роль в управлении различными аспектами микроконтроллера, в нашем случае, Arduino, некоторые из приложений следующие:
1.) ШИМ
ШИМ или широтно-импульсная модуляция — метод, хорошо известный и имеющий широкий спектр приложений, от управления двигателем до затемнения светодиода.
Модуляция ширины импульса — это управление рабочим циклом, то есть, чтобы контролировать, сколько времени цифровой выход остается высоким или низким, необходим точный контроль времени, чтобы заставить ШИМ работать, и для этого мы нужно использовать встроенный таймер, который существует внутри нашего Arduino.
2.) Прерывания по таймеру
Есть много случаев использования, когда нам нужно подсчитать время после того, как событие произошло, или мы хотим через некоторое время повернуть выход определенного пина на высокий или низкий уровень, для этого нам нужно использовать таймеры.
Необходимые вещи:
Arduino Uno
Светодиоды
BreadBoard
Перемычки
Таймеры в Arduino
В Arduino Uno есть часы с частотой 16 МГц, которые служат базовыми часами, обычно 16 МГц слишком быстро для нашего приложения поэтому мы должны разделить его на какое-то число, чтобы сделать его полезным для наших повседневных приложений, это число, которое мы используем для деления, известно как предделитель, он помогает нам снизить базовую частоту высоких частот, чтобы соответствовать наше приложение.
В Arduino Uno есть три регистра счетчика, а именно Timer0, Timer1 и Timer2.
Timer0 и timer2 — это 8-битные таймеры, то есть они могут хранить максимальное значение счетчика 255. Timer1 — это 16-битный таймер, то есть он может хранить максимальное значение счетчика 65535. Когда счетчик достигает своего максимума, он начинает отсчет до нуля (это называется переполнением). Это означает, что на частоте 16 МГц, даже если мы установим регистр сравнения сравнения на максимальное значение счетчика, прерывания будут происходить каждые 256/16 000 000 секунд (~ 16 мкс) для 8-битных счетчиков и каждые 65 536/16 000 000 (~ 4 мс) секунд для 16-битный счетчик.Ясно, что это не очень полезно, если вы хотите прерывать только один раз в секунду.
Вместо этого вы можете контролировать скорость увеличения счетчика таймера с помощью так называемого предварительного делителя. Предварительный делитель определяет скорость вашего таймера в соответствии со следующим уравнением:
(скорость таймера (Гц)) = (тактовая частота Arduino (16 МГц)) / предварительный делитель
Таким образом, предварительный делитель 1 увеличивает счетчик на 16 МГц, предварительный делитель 8 будет увеличивать его до 2 МГц, предделитель 64 = 250 кГц и так далее.Как указано в таблицах выше, предварительный делитель может быть равен 1, 8, 64, 256 и 1024. (Я объясню значение CS12, CS11 и CS10 на следующем шаге.)
Теперь вы можете рассчитать прерывание. частота с помощью следующего уравнения:
частота прерывания (Гц) = (тактовая частота Arduino 16000000 Гц) / (предварительный делитель * (регистр сопоставления + 1))
+1 присутствует, потому что регистр сопоставления сопоставления имеет нулевой индекс
изменив приведенное выше уравнение, вы можете найти значение регистра сопоставления, которое даст желаемую частоту прерывания:
регистр сопоставления сравнения = [16000000 Гц / (предварительный делитель * желаемая частота прерывания)] — 1
помните, что при использовании для таймеров 0 и 2 это число должно быть меньше 256 и меньше 65536 для таймера 1
, поэтому, если вы хотите прерывание каждую секунду (частота 1 Гц):
регистр сравнения совпадений = [16,000,000 / (предделитель * 1)] — 1
с предварительным делителем 1024 y или получить:
регистр сравнения совпадений = [16,000,000 / (1024 * 1)] -1
= 15,624
, поскольку 256 <15,624 <65,536, вы должны использовать таймер 1 для этого прерывания.
Код настройки таймера выполняется внутри функции setup () {} в скетче Arduino.
Код, используемый для настройки прерываний по таймеру, немного пугает, но на самом деле это не так уж и сложно. Я в значительной степени просто копирую один и тот же основной фрагмент кода и меняю предделитель и сравниваю регистр совпадения, чтобы установить правильную частоту прерывания.
Основная структура настройки прерывания выглядит так:
Arduino — Таймеры и прерывания. Таймеры — важная часть… | Адити Шах | Vicara Hardware University
Таймеры являются важной частью функциональных возможностей микроконтроллеров и играют жизненно важную роль в управлении различными их аспектами.Таймер или счетчик — это аппаратное обеспечение, встроенное в плату Arduino для измерения событий и выполнения определенных задач в определенный интервал времени.
Некоторые применения таймеров следующие:
- ШИМ — широтно-импульсная модуляция — это метод управления рабочим циклом, то есть цифровым выходом контроллера. Он имеет широкий спектр применения: от управления двигателем до затемнения светодиодов и многого другого.
- Прерывания по таймеру — во многих случаях нам нужно подсчитать точное время до того, как произойдет событие, или выдать желаемый выход определенного вывода через некоторое время — прерывания по таймеру помогают нам выполнить эти действия.
Таймеры в Arduino
В зависимости от каждого микроконтроллера доступно несколько таймеров для работы. У каждого таймера есть счетчик, который увеличивает значение таймера при каждом такте таймера. ATmega328, построенный на Arduino Uno, имеет в общей сложности 3 доступных таймера, а именно:
- Timer0 — 8-битный таймер, используемый функциями Arduino delay (), millis () и micros ().
- Timer1 — 16-битный таймер, используемый библиотекой Servo ()
- Timer2 — 8-битный таймер, используемый библиотекой Tone ()
Примечание. Разница между 8 и 16 битами — это разрешение таймера — диапазоны 8 бит для (0–255) значений и 16-битные диапазоны для значений (0–65535).
В этом блоге мы рассмотрим эти таймеры и рассмотрим пример, чтобы получить представление об их использовании.
Тактовая частота 16 МГц действует как базовая частота в Arduino Uno, но поскольку 16 МГц слишком быстрая для нашего приложения, нам придется разделить ее на какое-то число, чтобы сделать ее пригодной для нашего использования. Это число, которое мы используем для деления, известно как предделитель, он помогает нам снизить базовую частоту высоких частот, чтобы соответствовать нашему приложению. Предварительный делитель определяет скорость вашего таймера в соответствии со следующим уравнением:
скорость таймера (Гц) = (тактовая частота Arduino (16 МГц)) / предварительный делитель
После этого давайте обратимся к таблице данных ATmega328, как это будет помогите нам более последовательно понять остальную часть процесса.
Это блок-схема счетчика. Предварительный делитель принимает импульс от тактового цикла и затем передает его в логику управления, отныне управляющая логика увеличивает регистр TCTn на 1.
Теперь мы можем сравнить значение TCNTn с определенное значение, когда регистр TCNTn достигает этого значения, мы знаем, что оно прошло определенное время.
Этот метод называется режимом CTC для «Сброс таймера при сравнении». Значение в регистре TCNTn сравнивается с регистром OCRn, и когда происходит сравнение, TOVn генерирует прерывание.
Еще одним важным шагом является определение значения регистра OCRn для отсчета определенного времени.
Важно установить предварительный делитель в конце, потому что после этой инструкции таймер начинает отсчет, и если нам нужно его остановить, мы должны сбросить все биты TCCR0B.
Теперь мы рассмотрим простой пример, на котором мы можем включить / выключить светодиод с помощью таймеров.
Вы можете использовать следующую схему для настройки устройства.
После того, как вы запустите этот код, он должен включать и выключать светодиод каждую секунду с помощью внутреннего таймера.
В этом блоге мы узнали, как работают внутренние таймеры Arduino, как использовать их, чтобы настроить их для определенного действия, которое нам нужно выполнить через период с помощью прерываний.
Как использовать таймер в Arduino Uno
В 2005 году платформа разработки Arduino была первоначально запущена как удобное программируемое устройство для художественных и дизайнерских проектов. Основная цель этого запуска заключалась в том, чтобы помочь тем, у кого нет инженерных навыков, работать с микроконтроллерами и базовой электроникой, не обладая такими обширными знаниями в области программирования.
Однако, из-за его удобных возможностей, вскоре любители и новички в электронике адаптировали его во всем мире. Многие люди во всем мире предпочитают его для разработки POC и прототипов.
Хотя всегда нормально начинать с Arduino, наиболее рекомендуемый вариант — медленно перейти к основным микроконтроллерам, таким как ARM, STM, AVR, PIC или любой другой, а затем запрограммировать его с помощью собственного приложения.
Причина в том, что язык программирования Arduino довольно прост для понимания, поскольку большая часть работы выполняется встроенными функциями, такими как AnalogWrite (), digitalWrite () и Delay (), среди других.За ними обычно скрывается машинный язык низкого уровня.
Тем не менее, вам нужно иметь в виду, что программы Arduino сильно отличаются от других кодов Embedded C, где вам нужно иметь дело с битами, которые зарегистрированы, и делать их низкими или высокими в логике нашей программы.
Таймеры Arduino без задержки
Если вы хотите понять все, что происходит внутри встроенных функций, вам сначала нужно покопаться в оговоренных условиях.Хорошим примером является использование функции delay () для установки битов регистра счетчика и таймера микроконтроллера ATmega.
В этом посте мы в основном сосредоточимся на функции delay (), хотя вы можете использовать те же функции в аналогичной IDE Arduino. Биты нашего регистра таймера будут установлены, и мы также будем использовать «Прерывание переполнения таймера», чтобы помочь переключать светодиод при возникновении прерывания.
Хорошая новость заключается в том, что вы также можете отрегулировать значение предварительной загрузки бита таймера с помощью кнопок, которые помогают контролировать продолжительность прерывания.
Таймер во встроенной электронике
Таймер очень похож на прерывание. Обычно они похожи на простые часы, которые могут измерять временной интервал события. Обратите внимание, что у каждого микроконтроллера есть осциллятор или часы. Например, в Arduino Uno за скорость отвечает 16 МГц.
Следовательно, чем выше тактовая частота, тем выше скорость обработки. Чтобы сделать всего один счет в Arduino Uno, требуется примерно 1/16000000 секунд или 62 нано наносекунды.Это означает, что каждые 62 нано секунды Arduino перемещает инструкции.
Таймеры Arduino Uno
В Arduino Uno есть 3 таймера, которые используются в разных функциях. В их числе:
- Timer0 — 8-битный таймер , который обычно используется в функциях таймера delay () или millis ().
- Timer1 — 16-битный таймер , который обычно используется в серво-библиотеке.
- Timer2 — 8-битный таймер , обычно используемый в функции tone ().
Регистры таймера Arduino
Регистры таймераобычно используются для изменения конфигурации.
- Регистры управления таймером или счетчиком
Это регистр, который содержит основное управление таймером, а также используется для управления предварительными масштабаторами таймеров. С помощью этого регистра вы также можете управлять режимом таймера с помощью битов WGM.
Предделитель
Биты CS12, CS11, CS10 в TCCR1B устанавливают значение предварительного делителя.Предделитель может помочь вам установить тактовую частоту таймера. Некоторые из предделителей Arduino Uno включают 1, 8, 64, 256 и 1024.
- Регистр таймера / счетчика (TCNTn)
Значение счетчика обычно контролируется регистром, а затем устанавливается на значение предварительного загрузчика.
Если вам нужно время в считанные секунды, вот формула, которую вы должны использовать:
Регистр таймера / счетчика = 65535 — (16x 1010 x время в секундах / значение предделителя)
Формула для расчета значения прелоадера для таймера 1 за две секунды:
Регистр таймера / счетчика 1 = 65535 — (16 × 1010 x2 / 1024), что будет равно 34 285.
Прерывания таймера Arduino Uno
Есть несколько прерываний таймера Arduino Uno, которые мы собираемся выделить ниже. Проверь их.
- Прерывание переполнения таймера
Когда таймер достигает своего максимального значения, такого как 16-битный 65535, происходит прерывание переполнения времени. Поэтому, когда это происходит, обычная служба прерывания ISR вызывается прямо в TOIEx в регистре маски прерывания таймера, также известном как TIMSKx.
Ниже представлен формат ISR:
ISR (TIMERx_OVF_vect)
Регистр сравнения выходных данных
При возникновении прерывания сопоставления выходных данных вызывается служба ISR. Более того, бит флага OCFxy устанавливается в регистре TIFRx. Обычно ISR запускается, когда бит включения установлен в OCIExy, который находится в регистре TIMSKx. Следовательно, TIMSKx — это регистр маски прерывания от таймера.
Захват входа таймера
Когда происходит это прерывание, вызывается служба ISR (TIMERx_CAPT), и бит флага ICFx устанавливается в TIFRx или регистре флага входного прерывания таймера. Вы можете включить эту ISR, установив бит включения ICIEx в регистре TIMSKx.
Необходимые компоненты:Некоторые из необходимых вам компонентов:
- Резистор 10 кОм (2), 2,2 кОм (1)
- Светодиод
- 2 кнопки
- ЖК-дисплей 16X2
- Arduino Uno
Процесс установки таймеров Arduino включает в себя множество шагов и процессов, которые необходимо соблюдать, чтобы все прошло гладко.В этом посте мы обсудили лишь краткий обзор того, как вы можете использовать таймер в Arduino Uno для вашего удобства.
В целом, весь процесс является довольно подробным и сложным для начинающих пользователей, но как только вы освоите его, он станет легче, что позволит вам делать это быстрее и эффективнее.
Итог
Несмотря на то, что научиться пользоваться таймером в Arduino uno — сложный процесс, со временем его можно освоить. Выполнение процессов, которые мы выделили выше, — это первый шаг к тому, чтобы вы успешно использовали таймер в Arduino uno.
Множество шагов и процедур никого не должны пугать, так как процесс легко освоить и освоить.
Таймер Arduino1
Таймер Arduino1Использование таймера 1
ECE3400
Среда Arduino использует Mega328 timer0, но не касается timer1.
Timer1 — это 16-битный счетчик, который можно настроить для выполнения нескольких различных функций.
Функции таймера1
- Источники часов
- Таймер 1 может использовать прескаляр или приращение на основе ввода с вывода ввода-вывода (нарастающий / спадающий фронт).16-1, затем перейдите к нулю и продолжайте считать.
- Переполнение может вызвать прерывание, если оно разрешено.
- Подсчитайте до двух предустановленных значений, указанных в выходном регистре сравнения A или B (OCR1A, OCR1B).
- Достижение любого предустановленного значения может запускать прерывания, если они разрешены.
- Достижение предустановленного значения в OCR1A может привести к сбросу таймера. Подсчет до заданного значения с последующим сбросом (и автоматическим продолжением счета) — лучший способ создания точной временной базы.
- Достижение предустановленного значения в OCR1A или OCR1B может привести к установке, очистке или переключению выходного контакта. Эту функцию можно использовать для генерации прямоугольных волн различных частот без дополнительных затрат на программное обеспечение.
- Режим широтно-импульсной модуляции (ШИМ).
- Два сигнала ШИМ для каждого таймера выводятся на контакты в зависимости от предустановленного значения (OCR1A или OCR1B), которое может изменяться в каждом цикле ШИМ.
- Если разрешено, прерывание может генерироваться в каждом цикле ШИМ.
- В режиме ШИМ таймер больше ничего делать не может!
- Скопируйте значение счетчика таймера (текущее время) в регистр захвата входа (ICR1) при возникновении внешнего события.
- Событие может быть логическим переходом на одном выводе ввода-вывода.
- Событием может быть изменение состояния встроенного аналогового компаратора (только таймер1!).
Это позволяет процессору определять, когда аналоговое напряжение равно произвольному опорному напряжению. - Эта функция позволяет процессору определять точное время внешнего события.
Существуют различные способы установки временных интервалов (и, следовательно, частоты):
(1) Использование захвата ввода:
Перед кодом инициализации Arduino напишите процедуру обслуживания прерывания, чтобы скопировать таймер 1 в регистр и вычесть его, чтобы получить период.
Обратите внимание, что вычитание является правильным, даже если счетчик переполняется (один раз) между измерениями.Временное разрешение 0,0625 мкс.
Вход логического уровня должен быть на выводе 8 Arduino. Он использует функцию ввода-захвата (ICP1) таймера 1.
// ********************************************** *********** // таймер 1 захватывает переменные для вычисления периода sq-волны непостоянный беззнаковый int T1capture, lastT1capture, период; // таймер 1 захватывает ISR ISR (TIMER1_CAPT_vect) начинать // считываем регистр захвата ввода таймера 1 T1capture = ICR1; // вычисляем время между захватами period = T1capture - lastT1capture; lastT1capture = T1capture; конец // *********************************************** **********
В разделе инициализации установите таймер (раздел 16 даташита, а особенно 16.11)
// настраиваем таймер 1 на полную скорость и // захват фронта на выводе аналогового компаратора B.3 // Устанавливаем захват на положительный фронт, полная скорость счета TCCR1B = (1 << ICES1) + 1; // Включаем прерывание таймера 1 при захвате TIMSK1 = (1 << МКПП1); // выключаем другие функции timer1 TCCR1A = 0;В разделе цикла просто прочтите переменную периода
. (2) Использование внешнего прерывания с таймером 1:
Включите внешнее прерывание в интерфейсе Arduino и настройте таймер 1 на непрерывную работу.
TCCR1B = 1; // выключаем другие функции timer1 TCCR1A = 0;
Каждый раз, когда происходит внешнее прерывание, считайте регистр таймера ( TCNT1
) и вычтите.
Этот метод менее точен, чем метод 1, из-за времени, необходимого для выполнения прерывания.
(3) Использование внешнего прерывания с таймером Arduino:
Включите внешнее прерывание в интерфейсе Arduino и считайте микросекундную функцию Arduino при возникновении прерывания.
Этот метод является наиболее простым и менее точным, чем любой из вышеперечисленных методов.
Временное разрешение не может быть лучше 4 микросекунд.
Использование таймера Arduino и прерывания таймера
1. Введение в таймер Arduino
Arduino UNO имеет три таймера, а именно timer0, timer1 и timer2. У каждого таймера есть счетчик, который увеличивает каждый такт таймера. Прерывание таймера CTC запускается, когда счетчик достигает указанного значения, хранящегося в регистре сравнения сравнения.Как только счетчик таймера достигнет этого значения, он будет очищен (сброшен на ноль) на следующем таймере на часах таймера, а затем он продолжит отсчет до значения сопоставления сравнения снова. Выбрав значение сопоставления для сравнения и установив скорость, с которой таймер увеличивает счетчик, вы можете контролировать частоту прерываний таймера.
Отношения конфигурации каждого регистра таймера показаны ниже.
Два, основная концепция таймера
1. Коэффициент предварительного деления делителя и сопоставитель сравнения
Часы Arduino работают на частоте 16 МГц.Значение шкалы счетчика представляет 1/16 000 000 секунд (~ 63 нс), а значение счета 16 000 000 требуется для завершения 1 с.
1. Timer0 и timer2 - это 8-битные таймеры, которые могут хранить максимальное значение счетчика, равное 255.
2. Timer1 - это 16-битный таймер, который может хранить максимальное значение счетчика 65535.
Когда счетчик достигнет максимального значения, он вернется к нулю (это называется переполнением). Следовательно, необходимо делить тактовую частоту, то есть предделитель.Скорость приращения счетчика таймера контролируется предварительным делителем. Скорость счета предварительного делителя и таймера следующая:
Скорость таймера (Гц) = тактовая частота Arduino (16 МГц) / коэффициент предварительного делителя
Следовательно, 1 предварительный делитель будет увеличивать счетчик на частоте 16 МГц, предварительный делитель 8 будет увеличивать частоту до 2 МГц, предварительный делитель 64 = 250 кГц и так далее.
Конфигурация коэффициентов предварительного делителя трех таймеров показана в таблице:
Я объясню значение CS12, CS11 и CS10 на следующем шаге.
Теперь вы можете использовать следующие шаги для вычисления частоты прерывания. Следующая формула:
Частота прерывания (Гц) = (тактовая частота Arduino 16 МГц) / (предварительный делитель * (регистр сравнения + 1))
Измените приведенное выше уравнение, чтобы задать желаемую частоту прерывания, и вы сможете вычислить значение регистра сопоставления сравнения:
Регистр совпадения сравнения = [16 000 000 Гц / (предварительный делитель * требуемая частота прерывания)] - 1
Помните, что при использовании таймеров 0 и 2 это число должно быть меньше 256 и меньше 65536 для таймера 1.
Итак, если вы хотите прерывать один раз в секунду (частота 1 Гц):
Регистр сопоставления сравнения = [16 000 000 / (предварительный делитель * 1)] -1
С предварительным делителем 1024 вы получите:
Регистр сравнения совпадений = [16,000,000 / (1024 * 1)] -1 = 15,624
Поскольку 256 <15,624 <65 536, вы должны использовать timer1 для реализации этого прерывания.
Таймер 0:
Таймер 0 - это 8-битный таймер.
В мире Arduino timer0 используется для таких функций таймера, как delay (), millis () и micros ().Если изменить регистр timer0, это может повлиять на функцию таймера Arduino. Итак, вы должны знать, что делаете.
Таймер 1:
Таймер 1 - это 16-битный таймер.
В мире Arduino библиотека Servo 492 использует timer1 (timer5 на Arduino Mega) на Arduino Uno.
Таймер 2:
Таймер 2 - это 8-битный таймер, например timer0.
В работе Arduino функция tone () использует timer2.
Таймер3 , Таймер4 , Таймер5 :
Таймеры 3, 4 и 5 применимы только к материнской плате Arduino Mega.Все эти таймеры представляют собой 16-битные таймеры.
Три, код конфигурации таймера
int toggle0, toggle1, toggle2;
void setup () {
cli ();
TCCR0A = 0;
TCCR0B = 0;
TCNT0 = 0;
OCR0A = 24;
TCCR0A | = (1 << WGM01);
TCCR0B | = (1 << CS01) | (1 << CS00);
TIMSK0 | = (1 << OCIE0A);
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 1999;
TCCR1B | = (1 << WGM12);
TCCR1B | = (1 << CS11);
TIMSK1 | = (1 << OCIE1A);
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0;
OCR2A = 249;
TCCR2A | = (1 << WGM21);
TCCR2B | = (1 << CS21);
TIMSK2 | = (1 << OCIE2A);
sei ();
}
ISR (TIMER0_COMPA_vect) {
if (toggle0) {
digitalWrite (8 , ВЫСОКИЙ);
toggle0 = 0;
}
еще{
digitalWrite (8 , LOW);
toggle0 = 1;
}
}
ISR (TIMER1_COMPA_vect) {
если (toggle1> = 500)
digitalWrite (13, ВЫСОКИЙ);
если (переключатель1 <= 500)
digitalWrite (13, LOW);
toggle1 + = 1;
если (переключатель1> = 1000)
toggle1 = 0;
}
ISR (TIMER2_COMPA_vect) {
if (toggle2) {
digitalWrite (9 , ВЫСОКИЙ);
toggle2 = 0;
}
еще{
digitalWrite (9 , НИЗКИЙ);
toggle2 = 1;
}
}
void loop () {
}
Таймер с реле и ЖК-дисплеем Arduino, код
Таймер - это электрический выключатель, который приводится в действие с помощью схемы таймера или механизма таймера, который измеряет определенные временные интервалы.Его можно использовать для включения или выключения устройства по истечении определенного периода времени, установленного пользователем.
В приведенной ниже схеме выход Arduino подключен к релейному модулю, который можно использовать для включения или выключения устройств, подключенных к внешнему источнику питания, например, источнику переменного тока, источнику питания от батареи и т. Д.
Таймер выключения Arduino
Это базовая программа для выключения устройства по истечении определенного периода времени с момента его включения. Когда мы включаем схему, выходной контакт 9 по умолчанию будет в низком состоянии.Следовательно, нагрузка, подключенная к реле, останется выключенной. В схеме кнопка подключена к контакту 2, это кнопка включения для включения выхода. Как только он нажат, выход на контакте 9 переключается в состояние высокого уровня, реле активируется, и контакты реле переключаются на нормально разомкнутый контакт, который включает нагрузку или подключенные к нему устройства.
Здесь в коде время отключения инициализируется как 1 минута; значение времени, используемое в коде, выражается в минутах. После включения устройство будет выключено по прошествии времени, указанного в переменной «offtime».
Код
const int switch_on = 2, output = 9; int offtime = 1, off_timer_start = 0; void setup () { pinMode (switch_on, ВХОД); pinMode (вывод, ВЫХОД); } void loop () { int x = ((миллис () / 1000) - off_timer_start) / 60; if (digitalRead (switch_on) == HIGH) { off_timer_start = (миллис () / 1000); digitalWrite (вывод, ВЫСОКИЙ); } else if (x> = offtime && digitalRead (output == HIGH)) { digitalWrite (вывод, LOW); } задержка (1000); }
Таймер выключения с регулировкой времени и ЖК-дисплеем
Этот код аналогичен приведенному выше, но с несколькими дополнительными опциями для изменения времени выключения, ЖК-дисплеем для отображения времени выключения, текущего состояния устройства и оставшегося времени до выключения.
Здесь схема имеет два кнопочных переключателя входа, один из которых подключен к контакту 2, который должен включать устройство, а вторая кнопка подключена к контакту 3 для установки значения времени выключения; в приведенном выше коде сначала необходимо объявить время выключения, и как только скетч будет загружен, его необходимо повторно загрузить, чтобы изменить значение времени выключения. Здесь этот недостаток можно преодолеть, добавив вход для изменения времени выключения.
В коде, пока вывод 3 удерживается в состоянии ВКЛ, время отключения увеличивается на 1 и повторяется снова с 0, когда достигает значения 30 минут.Предел времени, значение приращения, скорость приращения можно изменить, регулируя значения в коде; это указано в соответствующих строках кода.
Код
#include < LiquidCrystal_I2C .h> LiquidCrystal_I2C lcd (0x27, 16, 2); uint8_t clock [8] = {0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0}; const int switch_on = 2, input_off_time = 3, output = 9; int off_timer_start = 0, offtime = 0; void setup () { pinMode (switch_on, ВХОД); pinMode (input_off_time, ВХОД); pinMode (вывод, ВЫХОД); ЖКв этом(); lcd.backlight (); lcd.setCursor (6, 0); lcd.print ("ВЫКЛ"); lcd.createChar (2, часы); lcd.setCursor (0, 1); lcd.write (2); lcd.print ((String) "" + время выключения + ""); } void loop () { int x = ((миллис () / 1000) - off_timer_start) / 60; if (x <= offtime && digitalRead (output) == HIGH) { int m = ((offtime * 60) + off_timer_start - (миллис () / 1000)) / 60; int s = ((offtime * 60) + off_timer_start - (миллис () / 1000))% 60; ЖКsetCursor (10, 0); lcd.print ((String) "" + m + ":" + s + ""); } if (digitalRead (switch_on) == HIGH) { digitalWrite (вывод, ВЫСОКИЙ); off_timer_start = миллис () / 1000; lcd.setCursor (6, 0); lcd.print («ВКЛ»); } else if (x> = offtime && digitalRead (output == HIGH)) { digitalWrite (вывод, LOW); lcd.setCursor (6, 0); lcd.print ("ВЫКЛ"); } while (digitalRead (input_off_time) == HIGH) { if (offtime <= 29) {// изменяем максимальное время нерабочее время + = 1; // изменить инкремент на x } еще { offtime = 0; } ЖКsetCursor (0, 1); lcd.write (2); lcd.print ((String) "" + время выключения + ""); delay (500); // настраиваем скорость увеличения } }
Таймер включения и выключения Arduino
Это расширенная версия вышеупомянутой программы, здесь у нас есть дополнительные опции для установки времени для включения и выключения устройства. Здесь устройство ВКЛЮЧАЕТСЯ по истечении времени, установленного на «время включения», и ВЫКЛЮЧАЕТСЯ после «времени отключения».
Здесь переключатель, подключенный к контакту 3, может использоваться для изменения времени включения, а контакт 4 - для изменения времени выключения.Контакт 2 такой же, как и выше, для включения устройства.
#include < LiquidCrystal_I2C .h> LiquidCrystal_I2C lcd (0x27, 16, 2); uint8_t clock [8] = {0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0}; const int switch_on = 2, input_on_time = 3, input_off_time = 4, output = 9; int timer_start = 0, ontime = 0, offtime = 0; Строка device_status = "ВЫКЛ"; void setup () { pinMode (время_входа, ВХОД); pinMode (input_off_time, ВХОД); pinMode (вывод, ВЫХОД); ЖКв этом(); lcd.backlight (); lcd.createChar (2, часы); lcd.setCursor (8, 1); lcd.write (2); lcd.print ((String) "ВЫКЛ" + время выключения + ""); lcd.setCursor (0, 1); lcd.write (2); lcd.print ((String) "ON" + ontime + ""); lcd.setCursor (6, 0); lcd.print ("ВЫКЛ"); } void loop () { int x = ((миллис () / 1000) - таймер_старт) / 60; if (x <= ontime && device_status == "TO_ON") { int m = ((ontime * 60) + timer_start - (миллис () / 1000)) / 60; int s = ((ontime * 60) + timer_start - (millis () / 1000))% 60; ЖКsetCursor (10, 0); lcd.print ((String) "" + m + ":" + s + ""); } else if (x - ontime <= offtime && device_status == "TO_OFF") { int m = ((offtime * 60) + timer_start + (ontime * 60) - (миллис () / 1000)) / 60; int s = ((offtime * 60) + timer_start + (ontime * 60) - (миллис () / 1000))% 60; lcd.setCursor (10, 0); lcd.print ((String) "" + m + ":" + s + ""); } if (digitalRead (switch_on) == HIGH) { timer_start = миллис () / 1000; device_status = "TO_ON"; } else if (x - ontime> = offtime && device_status == "TO_OFF") { digitalWrite (вывод, LOW); ЖКsetCursor (6, 0); lcd.print ("ВЫКЛ"); device_status = "ВЫКЛ"; } else if (x> = ontime && device_status == "TO_ON") { digitalWrite (вывод, ВЫСОКИЙ); lcd.setCursor (6, 0); lcd.print («ВКЛ»); device_status = "TO_OFF"; } while (digitalRead (input_on_time) == HIGH) { if (ontime <= 24) { ontime + = 1; } еще { ontime = 0; } lcd.setCursor (0, 1); ЖКнаписать (2); lcd.print ((String) "ON" + ontime + ""); задержка (500); } while (digitalRead (input_off_time) == HIGH) { if (offtime <= 24) { нерабочее время + = 1; } еще { offtime = 0; } lcd.setCursor (8, 1); lcd.write (2); lcd.print ((String) "ВЫКЛ" + время выключения + ""); задержка (500); } }
Таймер-0 / Счетчик-0 Концепция: Arduino / ATmega328p
Примечание
Эта статья является частью Руководства по программированию встроенного микропрограммного обеспечения C Arduino / ATmega328p .Попробуйте изучить домашнюю страницу курса, чтобы найти статьи на похожие темы.
Учебное пособие по Arduino Встроенный уровень регистра C Мастер-класс Arduino
Также посетите страницу выпуска для встроенной аппаратной абстракции C на уровне регистров и код для AVR .
Введение
- Характеристики
- Два независимых блока сравнения выходов
- Регистры сравнения выходов с двойной буферизацией
- Сброс таймера при совпадении сравнения (автоматическая перезагрузка)
- Без сбоев, фазово-корректирующий широтно-импульсный модулятор (ШИМ)
- Регулируемый период ШИМ
- Генератор частоты
- Три независимых источника прерывания (TOV0, OCF0A и OCF0B)
Timer-0 / Counter-0 - это 8-битный модуль таймера / счетчика общего назначения с двумя независимыми модулями сравнения выходов и с поддержкой ШИМ.Это позволяет точно определять время выполнения программы (управление событиями) и генерировать волны.
Блок-схема AVR Atmega328p Timer-0 / Counter-0Таймер-0 имеет два вывода ШИМ / переменной частоты, назначенных на порт ввода-вывода. OC0A отображается на PD6, который является цифровым выводом 6 на плате Arduino UNO. OC0B отображается на PD5, который является цифровым контактом 5 на плате Arduino UNO.
Схема контактов ввода-вывода Arduino UNO Назначение контактов Arduino UNO Atmega328pОпределения часто используемых терминов в таймере
НИЖНИЙ | Счетчик достигает ВНИЗ, когда становится 0x00. |
MAX | Счетчик достигает своего MAXimum, когда становится 0xFF (десятичное 255). |
TOP | Счетчик достигает TOP, когда он становится равным наивысшему значению в последовательности счета. Значение TOP может быть фиксированным значением 0xFF (MAX) или значением, хранящимся в регистре OCR0A. Назначение зависит от режима работы. |
Что вы узнаете
- Как запрограммировать Таймер-0 в Arduino?
- Как программировать таймер-0 в AVR ATmega328p?
- Какие существуют режимы таймера-0 в Arduino / ATmega328p?
- Какие частоты счета и вывода в каждом режиме Таймера-0?
Регистры и источник тактовой частоты
Многие регистры и битовые ссылки в этом разделе написаны в общей форме.Строчная буква «n» заменяет номер таймера / счетчика, в данном случае 0. Строчная буква «x» заменяет выходной модуль сравнения, в данном случае модуль сравнения A или модуль сравнения B. Однако при использовании регистра или бит определяет в программе, должна использоваться точная форма, то есть TCNT0 для доступа к значению счетчика Timer / Counter0 и так далее.
Таймер / счетчик может синхронизироваться внутренне, через предделитель или внешний источник синхронизации на выводе T0. Логический блок Clock Select управляет тем, какой источник тактовых импульсов и фронт используется таймером / счетчиком для увеличения (или уменьшения) своего значения.Таймер / счетчик неактивен, если не выбран ни один источник синхронизации. Выходной сигнал логики выбора тактового сигнала называется тактовым сигналом таймера (clkT0). Источник синхронизации выбирается логикой выбора часов, которая управляется битами выбора часов (CS02: 0), расположенными в регистре управления таймером / счетчиком (TCCR0B).
Регистры сравнения вывода с двойной буферизацией (OCR0A и OCR0B) постоянно сравниваются со значением таймера / счетчика. Результат сравнения может быть использован генератором сигналов для генерации выходного сигнала ШИМ или переменной частоты на выводах сравнения выходных сигналов (OC0A и OC0B).Событие сравнения сопоставления также установит флаг сравнения (OCF0A или OCF0B), который можно использовать для генерации запроса прерывания сравнения выходных данных.
Счетчик
Основной частью 8-битного таймера / счетчика является программируемый двунаправленный счетчик.
Блок-схема блока счетчика AVRОписание сигнала:
count | Увеличение или уменьшение TCNT0 на 1 |
направление | Выбор между приращением или уменьшением |
очистить | Очистить TCNT0 |
clkTn 9055 | Сообщите, что TCNT0 достиг максимального значения |
bottom | Сообщите, что TCNT0 достиг минимального значения |
В зависимости от используемого режима работы счетчик очищается, увеличивается или уменьшается на каждом такте таймера (clkT0).clkT0 может генерироваться из внешнего или внутреннего источника тактовых импульсов, выбираемых битами выбора тактового сигнала (CS02: 0). Когда не выбран ни один источник синхронизации (CS02: 0 = 0), таймер останавливается. Однако ЦП может получить доступ к значению TCNT0 независимо от того, присутствует clkT0 или нет. Запись CPU отменяет (имеет приоритет) все операции очистки или подсчета счетчиков.
Последовательность подсчета определяется установкой битов WGM01 и WGM00, расположенных в регистре управления таймером / счетчиком (TCCR0A), и бита WGM02, расположенного в регистре управления таймером / счетчиком B (TCCR0B).Существует тесная связь между тем, как ведет себя (считает) счетчик, и тем, как формируются сигналы на выходах OC0A и OC0B сравнения выходов.
Флаг переполнения таймера / счетчика (TOV0) устанавливается в соответствии с режимом работы, выбранным битами WGM02: 0. TOV0 может использоваться для генерации прерывания ЦП.
Блок сравнения выходов
8-битный компаратор постоянно сравнивает TCNT0 с выходными регистрами сравнения (OCR0A и OCR0B). Когда TCNT0 равен OCR0A или OCR0B, компаратор сигнализирует о совпадении.При совпадении устанавливается флаг сравнения выходных данных (OCF0A или OCF0B) в следующем цикле тактовой частоты таймера. Если соответствующее прерывание разрешено, флаг сравнения выходов генерирует прерывание сравнения выходов. Флаг сравнения вывода автоматически сбрасывается при выполнении прерывания. В качестве альтернативы, флаг может быть сброшен программно, записав логическую единицу в его расположение бита ввода / вывода. Генератор формы сигналов использует сигнал совпадения для генерации выходного сигнала в соответствии с рабочим режимом, установленным битами WGM02: 0 и битами режима выхода сравнения (COM0x1: 0).Сигналы максимума и минимума используются генератором сигналов для обработки особых случаев экстремальных значений в некоторых режимах работы.
Блок-схема блока сравнения выходов AVRРегистры OCR0x имеют двойную буферизацию при использовании любого из режимов широтно-импульсной модуляции (ШИМ). Для нормального режима работы и режима сброса таймера при сравнении (CTC) двойная буферизация отключена. Двойная буферизация синхронизирует обновление регистров сравнения OCR0x до начала или конца счетной последовательности.Синхронизация предотвращает возникновение несимметричных импульсов ШИМ нечетной длины, тем самым обеспечивая отсутствие сбоев на выходе.
Доступ к регистру OCR0x может показаться сложным, но это не так. Когда двойная буферизация включена, ЦП имеет доступ к регистру буфера OCR0x, а если двойная буферизация отключена, ЦП будет обращаться к OCR0x напрямую.
В режимах генерации сигналов без ШИМ согласованный выход компаратора может быть принудительно записан путем записи единицы в бит принудительного сравнения выходных данных (FOC0x).Принудительное сопоставление сравнения не установит флаг OCF0x или перезагрузит / очистит таймер, но вывод OC0x будет обновлен, как если бы произошло реальное сопоставление сравнения (настройки битов COM0x1: 0 определяют, установлен ли вывод OC0x, очищен или переключен) .
Запись TCNT0 в любом режиме работы будет блокировать все совпадения сравнения для одного тактового цикла таймера, существуют риски, связанные с изменением TCNT0 при использовании блока сравнения выходов, независимо от того, работает таймер / счетчик или нет. Если значение, записанное в TCNT0, равно значению OCR0x, сравнение будет пропущено, что приведет к формированию неправильной формы сигнала.Точно так же не записывайте значение TCNT0 равным BOTTOM, когда счетчик ведет обратный отсчет.
Настройка OC0x должна быть выполнена до настройки регистра направления данных для вывода порта. Самый простой способ установить значение OC0x - использовать строб-биты Force Output Compare (FOC0x) в нормальном режиме. Регистры OC0x сохраняют свои значения даже при переключении между режимами генерации сигналов.
Блок вывода сравнения совпадений
Биты режима вывода сравнения (COM0x1: 0) имеют две функции.Генератор сигналов использует биты COM0x1: 0 для определения состояния выходного сравнения (OC0x) при следующем сопоставлении. Кроме того, биты COM0x1: 0 управляют выходным источником вывода OC0x.
Регистры ввода-вывода, биты ввода-вывода и контакты ввода-вывода на рисунке выделены жирным шрифтом. Показаны только те части регистров общего управления портом ввода-вывода (DDR и PORT), на которые влияют биты COM0x1: 0. При обращении к состоянию OC0x ссылка относится к внутреннему регистру OC0x, а не к выводу OC0x. Если происходит сброс системы, регистр OC0x сбрасывается на «0».
Блок-схема блока вывода сравнения AVRОбщая функция порта ввода / вывода отменяется функцией сравнения выходных сигналов (OC0x) от генератора сигналов, если установлен один из битов COM0x1: 0. Однако направление вывода OC0x (вход или выход) по-прежнему контролируется регистром направления данных (DDR) для вывода порта. Бит регистра направления данных для вывода OC0x (DDR_OC0x) должен быть установлен как выход, прежде чем значение OC0x станет видимым на выводе. Функция переопределения порта не зависит от режима генерации сигнала.Конструкция логики вывода сравнения вывода позволяет инициализировать состояние OC0x до включения выхода.
Генератор сигналов использует биты COM0x1: 0 по-разному в режимах Normal, CTC и PWM. Для всех режимов установка COM0x1: 0 = 0 сообщает генератору сигналов, что никакие действия с регистром OC0x не должны выполняться при следующем сопоставлении.
Режимы работы
Режим работы, то есть поведение выводов таймера / счетчика и вывода сравнения, определяется комбинацией битов режима генерации сигнала (WGM02: 0) и режима вывода сравнения (COM0x1: 0).Биты режима вывода сравнения не влияют на последовательность подсчета, в то время как биты режима генерации сигнала влияют. Биты COM0x1: 0 определяют, должен ли генерированный выход ШИМ быть инвертирован или нет (инвертированный или неинвертированный ШИМ). Для режимов без ШИМ биты COM0x1: 0 определяют, должен ли выход быть установлен, очищен или переключен при совпадении сравнения.
Таймер нормального режима
Простейшей моделью работы является нормальный режим (WGM02: 0 = 0). В этом режиме направление счета всегда вверх (увеличивается), и сброс счетчика не выполняется.Счетчик просто переполняется, когда он проходит свое максимальное 8-битное значение (TOP = 0xFF), а затем перезапускается снизу (0x00). При нормальной работе флаг переполнения таймера / счетчика (TOV0) будет установлен в том же тактовом цикле таймера, когда TCNT0 становится нулевым. Флаг TOV0 в этом случае ведет себя как девятый бит, за исключением того, что он только устанавливается, а не сбрасывается. Однако в сочетании с прерыванием переполнения таймера, которое автоматически очищает флаг TOV0, разрешение таймера может быть увеличено программно. В нормальном режиме нет особых случаев, которые следует учитывать, новое значение счетчика можно записать в любое время.Блок сравнения выходных данных может использоваться для генерации прерываний в определенный момент времени. Использование функции сравнения выходных сигналов для генерации сигналов в нормальном режиме не рекомендуется, так как это будет занимать слишком много времени ЦП.
Временная диаграмма таймера / счетчика с предделителем (fclk_IO / 8)Режим сброса таймера при сопоставлении (CTC)
В режиме сброса таймера при сравнении или CTC (WGM02: 0 = 2) регистр OCR0A используется для управления разрешением счетчика. В режиме CTC счетчик сбрасывается до нуля, когда значение счетчика (TCNT0) совпадает с OCR0A.OCR0A определяет верхнее значение счетчика, а значит, и его разрешение. Этот режим позволяет лучше контролировать выходную частоту сравнения. Это также упрощает операцию подсчета внешних событий.
Таймер AVR - временная диаграмма режима CTCПрерывание может генерироваться каждый раз, когда значение счетчика достигает значения TOP, с помощью флага OCF0A. Если прерывание разрешено, процедура обработки прерывания может использоваться для обновления значения TOP. Однако изменение TOP на значение, близкое к BOTTOM, когда счетчик работает без значения или с низким значением Prescaler, необходимо выполнять с осторожностью, поскольку режим CTC не имеет функции двойной буферизации.Если новое значение, записанное в OCR0A, ниже, чем текущее значение TCNT0, счетчик пропустит сопоставление. Затем счетчик должен будет отсчитать свое максимальное значение (0xFF) и выполнить цикл, начиная с 0x00, прежде чем может произойти сравнение. Для генерации выходного сигнала в режиме CTC, выход OC0A может быть настроен на переключение своего логического уровня при каждом совпадении сравнения, установив биты режима выхода сравнения в режим переключения (COM0A1: 0 = 1). Значение OC0A не будет отображаться на выводе порта, если направление данных для вывода не установлено на вывод.Сгенерированный сигнал будет иметь максимальную частоту fOC0 = fclk_IO / 2, когда OCR0A установлен на ноль (0x00). Частота сигнала определяется следующим уравнением:
Расчет частоты режима CTC AVRПеременная N представляет коэффициент предварительного масштабирования (1, 8, 64, 256 или 1024). Что касается нормального режима работы, флаг TOV0 устанавливается в том же тактовом цикле таймера, который счетчик считает от MAX до 0x00.
Режим быстрой ШИМ
Режим быстрой широтно-импульсной модуляции или быстрый режим ШИМ (WGM02: 0 = 3 или 7) обеспечивает возможность генерации высокочастотного сигнала ШИМ.Быстрый ШИМ отличается от других вариантов ШИМ однонаправленным режимом работы. Счетчик ведет счет от НИЖНЕГО к ВЕРХНЕМУ, затем перезапускается с НИЖНЕГО. TOP определяется как 0xFF, когда WGM2: 0 = 3, и OCR0A, когда WGM2: 0 = 7. В неинвертирующем режиме сравнения выходных данных, выходное сравнение (OC0x) сбрасывается при совпадении сравнения между TCNT0 и OCR0x и устанавливается в BOTTOM. В режиме инвертирования выхода сравнения выход устанавливается на совпадение сравнения и очищается ВНИЗ. Из-за однонаправленного режима рабочая частота в режиме быстрой ШИМ может быть вдвое выше, чем в режиме фазовой коррекции ШИМ, в котором используется двухступенчатый режим.Эта высокая частота делает быстрый режим ШИМ хорошо подходящим для регулирования мощности, выпрямления и применения ЦАП. Высокая частота позволяет использовать внешние компоненты (катушки, конденсаторы) небольшого размера, что снижает общую стоимость системы.
Таймер AVR - режим быстрой ШИМВ режиме быстрой ШИМ счетчик увеличивается до тех пор, пока значение счетчика не будет соответствовать значению TOP. Затем счетчик очищается в следующем тактовом цикле таймера. Значение TCNT0 на временной диаграмме показано в виде гистограммы для иллюстрации операции с однократным наклоном.Схема включает неинвертированный и инвертированный выходы ШИМ. Маленькие горизонтальные отметки на наклонах TCNT0 представляют собой сравнительные совпадения между OCR0x и TCNT0.
Флаг переполнения таймера / счетчика (TOV0) устанавливается каждый раз, когда счетчик достигает TOP. Если прерывание разрешено, процедура обработки прерывания может использоваться для обновления значения сравнения. В быстром режиме ШИМ блок сравнения позволяет генерировать сигналы ШИМ на выводах OC0x. Установка битов COM0x1: 0 на два приведет к неинвертированному ШИМ, а инвертированный выход ШИМ может быть сгенерирован путем установки COM0x1: 0 на три: Установка битов COM0A1: 0 на единицу позволяет контакту OC0A переключаться на Сравнить совпадения, если установлен бит WGM02.Эта опция недоступна для вывода OC0B. Фактическое значение OC0x будет видно на выводе порта только в том случае, если направление данных для вывода порта установлено как выходное. Форма сигнала ШИМ генерируется путем установки (или очистки) регистра OC0x при совпадении сравнения между OCR0x и TCNT0 и очистки (или установки) регистра OC0x в тактовом цикле таймера, счетчик очищается (изменяется с TOP на BOTTOM).
Частоту ШИМ на выходе можно рассчитать по следующей формуле:
Формула частоты AVR для быстрой ШИМ Переменная N представляет коэффициент предварительного масштабирования (1, 8, 64, 256 или 1024).
Крайние значения для регистра OCR0A представляют особые случаи при генерации выходного сигнала ШИМ в быстром режиме ШИМ. Если OCR0A установлен равным BOTTOM, на выходе будет узкий всплеск для каждого тактового цикла таймера MAX + 1. Установка OCR0A равным MAX приведет к постоянно высокому или низкому выходному сигналу (в зависимости от полярности вывода, установленной битом COM0A1: 0). Может быть достигнута частотная (с коэффициентом заполнения 50%) выходная форма волны в режиме быстрой ШИМ. путем настройки OC0x для переключения логического уровня при каждом сопоставлении (COM0x1: 0 = 1).Сгенерированный сигнал будет иметь максимальную частоту fOC0 = fclk_I / O / 2, когда OCR0A установлен на ноль. Эта функция аналогична переключателю OC0A в режиме CTC, за исключением того, что функция двойного буфера блока сравнения выходов включена в режиме быстрой ШИМ.
Режим фазовой коррекции ШИМ
Режим ШИМ с коррекцией фазы (WGM02: 0 = 1 или 5) обеспечивает возможность генерации сигнала ШИМ с коррекцией фазы с высоким разрешением. Режим ШИМ с правильной фазой основан на работе с двойным наклоном. Счетчик ведет постоянный отсчет от НИЖНЕГО к ВЕРХНЕМУ, а затем от ВЕРХНЕГО к НИЖНЕМУ.TOP определяется как 0xFF, когда WGM2: 0 = 1, и OCR0A, когда WGM2: 0 = 5. В неинвертирующем режиме сравнения выходных данных, выходное сравнение (OC0x) сбрасывается при совпадении сравнения между TCNT0 и OCR0x при обратном подсчете, и установите совпадение по сравнению с обратным отсчетом. В инвертирующем режиме сравнения выходов операция инвертируется. Работа с двойным наклоном имеет более низкую максимальную рабочую частоту, чем при работе с одним наклоном. Однако из-за симметричности режимов двойного наклона ШИМ эти режимы предпочтительны для приложений управления двигателем.
В режиме ШИМ с правильной фазой счетчик увеличивается до тех пор, пока значение счетчика не совпадет с TOP. Когда счетчик достигает TOP, он меняет направление счета. Значение TCNT0 будет равно TOP для одного такта таймера. Значение TCNT0 на временной диаграмме показано в виде гистограммы для иллюстрации работы с двойным наклоном. Схема включает неинвертированный и инвертированный выходы ШИМ. Маленькие горизонтальные отметки на наклонах TCNT0 представляют собой сравнительные совпадения между OCR0x и TCNT0.
AVR - Временная диаграмма PWM с фазовой коррекциейФлаг переполнения таймера / счетчика (TOV0) устанавливается каждый раз, когда счетчик достигает ВНИЗ. Флаг прерывания может использоваться для генерации прерывания каждый раз, когда счетчик достигает НИЖНЕГО значения. В режиме ШИМ с правильной фазой блок сравнения позволяет генерировать сигналы ШИМ на выводах OC0x. Установка битов COM0x1: 0 на два приведет к неинвертированному PWM. Инвертированный выход ШИМ может быть сгенерирован установкой COM0x1: 0 на три: Установка битов COM0A0 в единицу позволяет контакту OC0A переключаться на сравнение совпадений, если бит WGM02 установлен.Эта опция недоступна для вывода OC0B. Фактическое значение OC0x будет видно на выводе порта только в том случае, если направление данных для вывода порта установлено как выходное. Форма сигнала ШИМ генерируется очисткой (или установкой) регистра OC0x при совпадении сравнения между OCR0x и TCNT0 при увеличении счетчика и установкой (или очисткой) регистра OC0x при совпадении сравнения между OCR0x и TCNT0 при уменьшении счетчика. Частота ШИМ для выхода при использовании ШИМ с правильной фазой может быть рассчитана по следующему уравнению:
Формула частоты ШИМ коррекции фазы АРНПеременная N представляет коэффициент предварительного масштабирования (1, 8, 64, 256 или 1024).