Приветствую, друзья.
Хочу представить вам мою конструкцию программируемого таймера.
Данный таймер предназначен для отсчета заданных промежутков времени.
Он может иметь как непрерывно-циклический режим работы (бесконечный цикл «включение-пауза»), так и ограниченно-циклический (заданное количество циклов «включение-пауза»), либо однократное включение — на заданное время включения.
Время включения, время паузы и количество рабочих циклов задаются независимо.
Квант времени может быть выбран равным одной секунде или одной минуте, соответственно, время включения и время паузы могут находиться в диапазоне от 1 до 255 секунд или минут, количество рабочих циклов может быть в диапазоне от 1 до 255.
Таким образом, минимальный промежуток времени может быть равным 1 секунде, максимальный – 4 часам и 15 минутам.
Отсчет времени начинается после нажатия кнопки старта (кнопку надо нажимать менее двух секунд).
Блок-схема программы таймера изображена на рис. 1.
Все константы – время включения, время паузы, количество рабочих циклов, величина кванта времени, режим работы также хранятся в энергонезависимой памяти, и могут быть изменены в любую сторону (перепрограммированы) посредством DIP-переключателей и отдельной кнопки программирования.
Для удобства таймер оснащен световой и звуковой сигнализацией.
Питаться таймер может как от сетевого адаптера с выходным постоянным напряжением 15-20 В, так и от аккумулятора напряжением 12 В.
Схема устройства изображена ниже. Его основа – микроконтроллер ATMega8L.
В качестве источника тактового сигнала используется внутренний RC-генератор микроконтроллера частотой 1 МГц. Для повышения точности отсчета временных интервалов используется синхронизация внутреннего таймера-счетчика Т/С2, (далее – таймера Т2) микроконтроллера от внешнего кварцевого резонатора BQ1 на частоту 32768 Гц. При коэффициенте деления 128 8-разрядный таймер Т2 переполняется каждую секунду, генерируя прерывание.
Исполнительным устройством служит реле К1, которое управляется посредством ключа на транзисторе VT1 с вывода РС5 микроконтроллера. Его контакты выведены на внешние клеммы разъема X2 и могут быть использованы для управления внешними цепями, в том числе и сетевым напряжением 220 В.
Звуковые сигналы подает пьезокерамический излучатель BQ2 (со встроенным звуковым генератором), который управляется выводом РС4 микроконтроллера. Питание на микроконтроллер (+5 В) подается с выхода интегрального стабилизатора DA1. Напряжение на вход DA1 подается либо с выхода интегрального стабилизатора DA2 (+12 В), либо с аккумулятора, выбор осуществляется с помощью перемычки J1.
Светодиод HL1 зеленого цвета индицирует наличие питающего напряжения. Светодиод HL2 красного цвета служит для индикации режима работы и количества включений реле в предыдущем цикле работы. При срабатывании реле (на время включения) светодиод HL2 загорается на 1,5 с и на 0,25 с гаснет, если реле обесточено (время паузы) светодиод загорается на 0,25 с и на 1,5 с гаснет. После окончания отсчета времени светодиод HL2 гаснет. Таким образом, по характеру свечения HL2 видно, в каком состоянии находится таймер.
Конденсаторы С2 – С6 блокировочные. Диоды VD2, VD3 служат защитой от ошибочной полярности источников напряжения, диод VD1 – защита от ЭДС самоиндукции, возникающей при коммутации реле.
Движковые DIP-переключатели SA1 — SA8 служат для задания величины времени включения, времени паузы и количества рабочих циклов. Такие же переключатели SB1 – SB4 служат для выбора программируемой величины — времени включения, времени паузы, режима работы, количества рабочих циклов и величины кванта времени. Соответствие переключателей программируемой величине приведено в табл. 1.
Задавать время включения/паузы и количества рабочих циклов надо в двоичном виде, что является некоторым неудобством. Но для перевода десятичных величин в двоичные можно использовать калькулятор, встроенный в Windows. При программировании следует помнить, что нулю двоичной величины соответствует положение ON переключателей, единице – положение OFF. Программирование производится с помощью кнопки программирования S1. Старт таймера осуществляется посредством стартовой кнопки S2.
Программировать таймер нужно перед стартом отсчета времени (сразу после включения) или после окончания рабочего цикла.
В процессе отсчета времени программирование невозможно. Если начался отсчет времени, таймер нечувствителен к нажатию кнопок и изменению положения DIP-переключателей. Таймер остановится после окончания отсчета времени или исчезновении напряжения питания.
Звуковая индикация таймера работает следующим образом. При нажатии на кнопку старта в течение менее 2 с (переход в рабочий режим) раздается короткий звуковой сигнал длительностью 0,1 с, свидетельствующий о начале отсчета времени. Если используется ограниченно-циклический режим, то сразу по окончании отсчета времени раздается звуковой сигнал длительностью 2 с. Если кнопка старта нажата более 2 с, раздается 5 звуковых сигналов длительностью 0,1 с — и таймер возвращается в исходный режим.
При программировании таймера процедура успешного программирования необходимой величины сопровождается двумя сигналами по 0,1 с. Если произошла ошибка (например, ошибочно задан нулевой интервал времени включения, чего быть не должно) раздается звуковой сигнал длительностью 1 с. При ошибке надо проверить положение DIP-переключателей SB1 – SB4.
При программировании микроконтроллера должны быть запрограммированы следующие фьюзы — SUT0, SUT1, CKSEL1, CKSEL2, CKSEL3, BODEN, BODLEVEL. Так как производится запись в энергонезависимую память (данные в которой могут искажаться при медленном снижении напряжения питания), то используется встроенная схема BOD (Brown-Out Detection) микроконтроллера, которая отслеживает питающее напряжение и производит сброс микроконтроллера при снижении его ниже 4 В.
Конструктивно таймер собран на плате из фольгированного стеклотекстолита толщиной 1,5 мм размерами 83×52 мм. Топология печатной платы изображена на рис. 3, расположение деталей на ней – на рис. 4. В исходном состоянии в EEPROM запрограммированы следующие значения констант: время включения – 10 с, время паузы – 10 с, количество циклов включения – 3, квант времени – одна секунда, режим работы – циклически-ограниченный.
Транзистор VT1 можно заменить на КТ3102 с любым буквенным индексом или аналогичным. В качестве светодиодов можно использовать любые современные высокоэффективные светодиоды с заметным свечением при токе 2-3 мА. Реле К1 – постоянного тока, типа JZC-22F, но можно использовать и другое с катушкой на 12 В, подходящее по току контактов и типоразмеру.
Рассмотрим примеры перепрограммирования таймера. Отметим, что при программировании следует учитывать внутреннюю логику встроенной в микроконтроллер программы. Рабочий цикл – это время включения плюс время паузы. Количество рабочих циклов может быть и нулевым – это означает, что реле включается однократно на время включения. Таким образом, чтобы включить реле N раз, надо задать N – 1 рабочих циклов, соответственно, если задать N рабочих циклов, реле включится N + 1 раз.
Пример 1. Время включения – 10 сек, время выключения – 8 сек, режим работы – циклически-ограниченный, количество рабочих циклов — 5.
Для начала запишем все числа в двоичном виде: число 10 – это 00001010, 8 – 00001000, 5 – 00000101. Включаем таймер, ставим переключатель SB3 – ON (квант времени – секунда), SB4 — ON (циклически-ограниченный режим), SB2/SB1 – ON/OFF (время включения), на переключателях SA1 – SA8 набираем число 00001010 (SA2, SA4 – OFF, все остальные – ON) и нажимаем кнопку программирования. Слышим два коротких сигнала.
Далее ставим SB2/SB1 – OFF/ON (время паузы), набираем на SA1 – SA8 число 00001000 (SA4 – OFF, остальные – ON), вновь нажимаем кнопку программирования, вновь слышим два коротких сигнала. Теперь ставим SB2/SB1 – OFF/OFF (количество рабочих циклов), набираем на SA1 – SA8 число 00000101 (SA1, SA3 – OFF, остальные – ON), вновь нажимаем кнопку программирования, слышим два коротких сигнала. Выключаем и вновь включаем питание – и таймер с новыми значениями констант готов к работе.
Пример 2. Время включения – 4 сек, время выключения – 3 сек, режим работы – циклически-непрерывный.
Число 4 – 00000100, число 3 – 00000011. Включаем таймер, ставим SB3 –ON (квант времени – секунда), SB4 – OFF (циклически-непрерывный режим), SB2/SB1 – ON/OFF (время включения), на переключателях SA1 – SA8 набираем число 00000100 (SA3 – OFF, все остальные — ON), нажимаем кнопку программирования, слышим два сигнала. Далее ставим SB2/SB1 – OFF/ON ( время паузы), набираем на SA1 – SA8 число 00000011 (SA1, SA2 – OFF, остальные – ON), нажимаем кнопку программирования, слышим два коротких сигнала. Выключаем и вновь включаем питания – и таймер с новыми значениями констант готов к работе.
Пример 3. Время включения – 20 мин однократно.
Число 20 – 00010100. Включаем таймер, ставим SB3 – OFF (квант времени — минута), SB4 – ON (циклически ограниченный режим), SB2/SB1 – ON/OFF (время включения), на переключателях SA1 – SA8 набираем 00010100 (SA3, SA5 – OFF, остальные – ON), нажимаем кнопку программирования, слышим два коротких сигнала. Ставим SB2/SB1 – OFF/OFF (количество рабочих циклов), набираем на SA1 – SA8 число 00000000 (все переключатели – ON), нажимаем кнопку программирования, слышим два коротких сигнала. Выключаем и вновь включаем питание – таймер с новыми значениями констант готов к работе.
Архив с описанием, топологией платы, программой и прошивкой можно скачать здесь.
До встречи на блоге!
Рассмотрена принципиальная схема реле времени для управления тепловыми пушками, она выполнена на базе микроконтроллера AVR. Описан принцип работы схемыреле времени, алгоритм его работы, а также рассмотрен программный код для микроконтроллера.
Конструкция тепловой пушки (тепловентиляторы) предусматривает наличие электронагревателя (нагревательного элемента) и вентилятора. У мощных тепловых пушек при выключении электронагревателя и во избежание его перегрева, а так же нагрева корпуса, и выхода из строя находящихся на нем конструктивных элементов, необходимо, сначала выключить электронагреватель, а потом с некоторой задержкой вентилятор.
То есть после выключения электронагревателя производится его обдув, до тех пор пока температура на выходе тепловой пушки не достигнет, например, комнатной (если тепловая пушка эксплуатируется в помещении с комнатной температурой). Понятно, что требуемая задержка по времени при выключении вентилятора зависит от технических характеристик тепловой пушки (мощность, производительность, габаритные размеры и т. д.). Предлагаемый вариант реле времени реализует задержку от 1 до 999 секунд. Устройство имеет следующие функции:
Принципиальная схема реле времени для управления тепловых пушек на базе микроконтроллера ATINY2313 представлена на рис. 1.
Канал управления нагревателем (канал управления № 1) собран на твердотельном реле VS1. Данный канал управляется с вывода 8 микроконтроллера DD1. Канал управления вентилятором (канал управления № 2) собран на твердотельном реле VS2. Канал управляется с вывода 9 микроконтроллера DD1.
Включение / выключение тепловой пушки осуществляется кнопкой S3 (С). Дистанционно устройство управляется кнопкой S4. Данная кнопка по схеме (рис. 1) для наглядности подключается через соединитель X3 (контакты 1, 2) и подключает вывод 11 микроконтроллера DD1 к общему проводнику.
В интерфейс реле времени входят клавиатура (кнопки S1…S3), и блок индикации (дисплей) из трех цифровых семисегментных индикаторах HG1…HG3. Кнопки клавиатуры имеют следующее назначение:
Разряды индикации интерфейса имеют следующее назначение:
Сразу после подачи питания на выводе 1 микроконтроллера DD1 через RC-цепь (резистор R2, конденсатор Сб) формируется сигнал системного аппаратного сброса микроконтроллера DD1.
В микроконтроллере инициализируются регистры, счетчики, стек, таймер T/C1, сторожевой таймер, порты ввода/вывода, на дисплее индицируется число 001, Временные диаграммы, поясняющие алгоритм работы приведены на рис. 2
Рис. 1. Принципиальная схема таймера (реле времени) для управления тепловой пушкой.
Алгоритм работы реле времени в рабочем цикле следующий. После инициализации на выводах 8, 9 микроконтроллера устанавливаются сигналы уровня лог.1 (каналы № 1 и №2 отключены). Далее кнопками SI, S2 необходимо задать временную задержку на выключение АТ канала № 2, заданное значение индицируется на дисплее.
При включении реле времени кнопкой S3 в момент времени tl, сразу включается каналы управления № 1 и № 2 (устанавливается лог. 0 на выводах 8 и 9 микроконтроллера DD1). То есть электронагреватель вентилятор в тепловой пушке включаются одновременно.
При выключении реле времени кнопкой S3 в момент времени t2, сразу выключается канал управления № 1 (устанавливается лог. 1 на выводе 8 микроконтроллера DD1), на дисплее индицируется временная задержка АТ. Заданное время АТ декрементируется с каждой секундой. И как только оно станет равным нулю, выключается канал управления № 2 (устанавливается лог. 1 на выводе 9 микроконтроллера DD1). На дисплее снова индицируется заданное значение АТ. Цикл завершен.
АТ задается в диапазоне от 1 до 999 с, с дискретностью задания 1 секунда.
С порта РВ микроконтроллер DD1 управляет клавиатурой (кнопки S1…S3) и динамической индикацией. Динамическая индикация собрана на транзисторах VT1…VT3, цифровых семисегментных индикаторах HG1…HG3. Резисторы R3…R10 — токоограничительные для сегментов индикаторов HG1…HG3.
Коды для включения индикаторов HG1…HG3 при функционировании динамической индикации поступают на вход РВ микроконтроллера DD1. Для функционирования клавиатуры задействован вывод 7 микроконтроллера DD1. Рабочая частота микроконтроллера DD1 задается генератором с внешним резонатором ZQ1 на 10 МГц.
При инициализации микроконтроллера DD1 все выводы порта В сконфигурированы как выходы. Выводы PD3, PD6 порта D сконфигурированы как входы, остальные как выходы. Как видно из принципиальной схемы аппаратная часть микроконтроллера DD1 задействована полностью.
Рис. 2. Временные диаграммы, поясняющие алгоритм работы.
Для перевода устройства в рабочий режим необходимо кнопками S1 ( Д ), S2 ( v ) установить необходимый интервал времени ДТ. Для включения устройства как указывалось выше необходимо нажать на кнопку S3 (С) или кнопку S4. Установленное время при этом заносится в ОЗУ микроконтроллера DD1. Если необходимо изменить заданное время, то для этого необходимо нажать на кнопку S3 (С). Потом кнопками S1 ( Д ), S2 ( v ) установить необходимый интервал времени ДТ и снова нажать на кнопку S3 (С).
Совсем коротко о программе. Программа состоит из трех основных частей; инициализации, основной программы, работающей в замкнутом цикле и подпрограммы обработки прерывания от таймера Т/C1 (соответственно метки INIT, SE1, ТІМ0). В основной программе происходит инкремент, декремент заданного значения времени и запись заданного интервала времени ДТ из буфера хранения в буфер отображения.
В памяти данных микроконтроллера с адреса $060 по $062 организован буфер отображения для динамической индикации. С адреса $064 по $66, организован буфер для хранения заданного интервала времени ДТ. В подпрограмме обработки прерывания осуществляется счет одной секунды, опрос клавиатуры, включение световых и звуковых сигналов и перекодировка двоичного числа значений времени в код для отображения информации на семисегментнных индикаторах.
Сразу при включении (после нажатия кнопки S3) происходит запись заданного интервала времени ДТ из буфера отображения в буфер хранения. При выключении устройства после того как ДТ станет равным нулю происходит перезапись из буфера хранения в буфер отображения. Таким образом, заданный интервал времени ДТ никуда «не теряется». И каждый раз после выключения,, ДТ индицируется на дисплее устройства.
Задача по формирование временных интервалов длительностью 1 с, решена с помощью прерываний от таймера Т/Cl, и счетчика на регистре R25. Счетчик на регистре R21 формирует интервал в одну минуту. Таймер Т/C1 формирует запрос на прерывание через каждые ~ 3900 мкс.
Счетчики на данных регистрах, подсчитывают количество прерываний и через каждую минуту, устанавливается флаг (PUSK), и текущее время декрементируется. Через каждые « 3900 мкс происходит отображения разрядов в динамической индикации устройства. Назначение флагов в регистрах flo и flo1 приведено в программе.
Алгоритм работы кнопки для быстрого увеличения задаваемого значения следующий. При нажатии на кнопку S1 текущее значение времени на дисплее увеличивается на единицу и устанавливается флаг, разрешающий увеличивать текущее значение времени, индицируемого на дисплее. Одновременно запускается счетчик, выполненный на R1, формирующий интервал 5 сек.
Если кнопка удерживается более 3 секунд, значение времени, индицируемое на дисплее увеличивается на 5 единиц за 1 секунду. (То есть, максимальное значение индицируемое на дисплее — 999 можно задать через я 200 секунд). Интервал времени в течении которого происходит увеличение времени организован на регистре R0. При отпускании кнопки 51 все вышеуказанные счетчики обнуляются. Совершенно аналогичным образом организована работа кнопки S2 для быстрого уменьшения текущего значения времени, индицируемого на дисплее.
При нажатии на кнопку S2 текущее значение времени на дисплее уменьшается на единицу. Если кнопка удерживается более 3 секунд, значение времени, индицируемое на дисплее уменьшается на 5 единиц за 1 секунду. Счетчики приведенного алгоритма для кнопки 52 организованы соответственно на регистрах R3 и R2. Кнопки 53 и S4 имеют одинаковое функциональное назначение в устройстве, но аппаратно-программная реализация механизма функционирования данных кнопок — разная.
Далее приведены фрагменты программ для кнопок S3 и S4.
Рис. 3. Фрагменты программ микроконтроллера для кнопок S3 и S4.
Разработанная программа на ассемблере занимает порядка 0,7 Кбайт памяти программ микроконтроллера. Для получения питающего напряжение +5В в устройстве задействован AC/DC преобразователь U1. Потребление тока по каналу напряжения:+5 В, не более 500 мА. В принципиальной схеме (рис.
1) применены следующие элементы. Конденсаторы С1, C3 типа К15-5 — ЗкВ, конденсатор С2 типа К73-11. Конденсаторы С4…С6 типа К10-17а. В схеме применены резисторы типа С2-ЗЗН-0.125. Индикаторы HG1…HG3 зеленого цвета типа HDSP-F501. Максимальный ток нагрузки для твердотельных реле D2425 (позиционные обозначения в принципиальной схеме VS1, VS2) — 25А.
Данный ток определяет мощность, подключаемых к устройству электронагревателя и вентилятора.
Шишкин С.
Литература: А. В. Белов Создаем устройства на микроконтроллерах.
Программируемые реле находят применение во многих приложениях автоматизации, таких как автоматическое управление уличным освещением, управление поливом и насосами, HVAC, домашняя автоматизация, автоматизация электростанций в промышленности и т. д. В этой статье описывается, как создать полнофункциональное одноканальное программируемое реле. коммутатор с помощью микроконтроллера PIC16F628A. Он позволяет установить время включения и выключения. Максимальный временной интервал, который вы можете установить для операций включения и выключения, составляет 99 часов 59 минут. Еще одна интересная особенность этого проекта заключается в том, что он предлагает циклическую опцию, что означает, что вы можете запускать его в непрерывном цикле циклов включения и выключения. Устройство можно запрограммировать с помощью 4 нажимных переключателей. Меню программирования и состояние устройства отображаются на ЖК-дисплее 16×2 символа. Временное разрешение этого релейного таймера составляет 1 минуту. Таймер также сохраняет введенные пользователем данные во внутреннюю память EEPROM, чтобы он мог сохранить эти значения после любого прерывания подачи питания. Вот краткое описание функций этого таймера:
Аппаратная часть этого проекта очень проста. Вся схема питается от регулируемого источника питания 5 В, полученного с использованием популярного чипа линейного стабилизатора LM7805 (рис. 1). Чтобы свести к минимуму тепловыделение в регуляторе напряжения, рекомендуемое входное постоянное напряжение для LM7805 составляет 9 В.V, который можно легко получить от настенного адаптера постоянного тока. Диод D1 (1N4001) служит для защиты от обратной полярности в схеме. S1 — ползунковый переключатель для включения и выключения питания.
На рис. 2 показаны настройки ввода и вывода. В этом проекте пять тактильных переключателей: один для сброса микроконтроллера и четыре для пользовательских входов. Четыре входных переключателя называются Menu/+, Select, Enter и Start/Stop. Их функции будут описаны в разделе программного обеспечения. Состояние 4-х входных переключателей считывается микроконтроллером PIC16F628A через порты RA2, RA3, RA4 и RB0. Выходной ЖК-дисплей представляет собой стандартный дисплей на основе HD44780 и работает в 4-битном режиме. Назначение контактов для данных ЖК-дисплея и управляющих сигналов показано на рисунке 2. S2 — еще один ползунковый переключатель, позволяющий вручную управлять подсветкой ЖК-дисплея.
Переключатель выходного реле управляется транзистором NPN (2N2222). Проект также включает в себя зуммер постоянного тока, который издает звуковой сигнал, когда релейный переключатель меняет свое состояние. Цепи реле и зуммера показаны на рисунке 3.
Микроконтроллер PIC16F628A работает на частоте 4,0 МГц с использованием внешнего резонатора. Контакты ввода/вывода PIC16F628A, подключение резонатора и разъем внутрисхемного последовательного программатора (ICSP) показаны на рисунке 4.
Рисунок 1. Регулируемый блок питания +5 В
Рисунок 2. Схема ввода-вывода с назначением контактов PIC16F628A
Рисунок 3. Схема управления реле и зуммером цепи реле и зуммера перечислены в следующей таблице.
На следующем рисунке показана полная схема реле времени, припаянная к макетной плате общего назначения.
Программируемый релейный таймер получает сигналы от 4 кнопок. Их функции описаны следующим образом:
Меню/+ : Эта кнопка позволяет перемещаться между различными опциями меню, такими как настройка времени включения, настройка времени выключения и настройка циклических параметров. Эти параметры отображаются на ЖК-дисплее. Эта кнопка также служит для увеличения цифры во время установки времени. Время задается в формате ЧЧ:ММ, что дает минимальное значение временного интервала равное 1 минуте.
Выберите : Это позволяет вам выбрать отображаемый пункт меню, а также отдельные цифры часов и минут. Выбранная цифра увеличивается на 1 при нажатии кнопки Меню/+.
Введите: Когда установлены соответствующие часы и минуты, нажатие кнопки «Ввод» завершает установку времени. Циклическая опция также вводится с помощью этой кнопки.
Старт/Стоп: Эта кнопка запускает и останавливает таймер. Если таймер уже включен, вы можете остановить его в любой момент во время его работы, нажав эту кнопку.
Теперь посмотрим, как это работает. Допустим, релейный выключатель нужно включить через 15 минут на 10 минут. Это означает, что время выключения составляет 15 минут, а время включения — 10 минут. После запуска таймера после ввода вышеуказанного времени устройство включится через 15 минут и останется включенным в течение 20 минут. После этого он снова будет выключен. Если для параметра Cyclic выбрано значение 1, таймер будет работать в цикле, и после следующих 15 минут выключения реле будет включено на следующие 10 минут и так далее.
Прошивка для этого проекта разработана с использованием компилятора mikroC Pro для PIC от микроЭлектроника. Хронометраж достигается с помощью модуля Timer 0, встроенного в PIC16F628A. Прерывание Timer0 включено и работает со значением предварительного делителя 1:256, чтобы создать точную продолжительность 500 мс (полсекунды). Символ двоеточия между цифрами HH и MM мигает с частотой 1 Гц. Полсекундная задержка повторяется 120 раз, чтобы создать минутную продолжительность. Вы можете загрузить полные файлы проекта, включая исходный код и скомпилированный HEX-файл, в прикрепленном файле.
На следующем видео показан таймер в действии.
Ключевые слова:
Автор: Радж Бхатт (энтузиаст электроники, производитель оборудования и основатель Embedded Lab; посетите мой магазин Tindie)
Подпишитесь на нас и поставьте лайк:
Это будет пятое руководство в нашей серии руководств по PIC , которое поможет вам изучить и использовать таймеры в PIC16F877A . В наших предыдущих руководствах мы начали с введения в PIC и MPLABX IDE, затем мы написали нашу первую программу PIC для мигания светодиода с помощью PIC, а затем создали последовательность мигания светодиода, используя функцию задержки в микроконтроллере PIC. Теперь давайте воспользуемся той же последовательностью мигания светодиодов, которую мы использовали в предыдущем руководстве по аппаратному обеспечению.0055 Узнайте, как использовать таймеры в нашем PIC MCU . Мы только что добавили еще одну кнопку на светодиодную панель для этого урока. Пройдите учебник, чтобы узнать больше.
Таймеры — одна из важных рабочих лошадок встроенного программатора. Каждое приложение, которое мы разрабатываем, так или иначе включает в себя приложение синхронизации, например, включение или выключение чего-либо через определенный интервал времени. Хорошо, но зачем нам таймеры, когда у нас уже есть макросы задержки (__delay_ms()), делающие то же самое!!
Макрос задержки называется задержкой «дампа». Поскольку во время выполнения функции задержки, микроконтроллер создает дамп, просто создавая задержку . Во время этого процесса MCU не может прослушивать значения своего АЦП или читать что-либо из своих регистров. Следовательно, не рекомендуется использовать функции задержки, за исключением таких приложений, как мигание светодиодов, где временная задержка не обязательно должна быть точной или длительной.
Макрос задержки также имеет следующие недостатки ,
Физически таймер представляет собой регистр, значение которого постоянно увеличивается до 255, а затем начинается сначала: 0, 1, 2, 3, 4…255….0, 1 , 2, 3 …… и т.д.
Микроконтроллер PIC PIC16F877A имеет три модуля таймера . Они называются Timer0, Timer1 и Timer2. Таймер 0 и Таймер 2 являются 8-битными Таймерами, а Таймер 1 является 16-битным Таймером. В этом уроке мы будем использовать Таймер 0 для нашего приложения. Как только мы поймем Таймер 0, будет легко работать с Таймером 1 и Таймером 2.
Таймер/счетчик модуля Timer0 имеет следующие функции:
Чтобы начать использовать таймер, мы должны понимать некоторые причудливые термины, такие как 8-битный/16-битный таймер , предварительный делитель, прерывания таймера и фокусы. Теперь давайте посмотрим, что на самом деле означает каждый из них. Как было сказано ранее, в нашем микроконтроллере PIC есть как 8-битные, так и 16-битные таймеры, основное различие между ними заключается в том, что 16-битный таймер имеет гораздо лучшее разрешение, чем 8-битный таймер.
Предварительный делитель — это название части микроконтроллера, которая делит тактовую частоту генератора до того, как она достигнет логики, увеличивающей состояние таймера. Диапазон идентификатора предварительного делителя составляет от 1 до 256, а значение предварительного делителя можно установить с помощью регистра OPTION (того же, который мы использовали для подтягивающих резисторов). Например, если значение предделителя равно 64, то для каждых 64 й импульс Таймер будет увеличиваться на 1.
По мере того, как таймер увеличивается и достигает своего максимального значения 255, он запускает прерывание и снова инициализируется до 0. Это прерывание называется прерыванием по таймеру. Это прерывание информирует MCU о том, что это конкретное время истекло.
Fosc означает частоту генератора , это частота используемого кристалла. Время, необходимое для регистра Timer, зависит от значения Prescaler и значения Fosc.
В этом уроке мы настроим две кнопки как два входа и 8 светодиодов как 8 выходов. Первая кнопка будет использоваться для установки временной задержки (500 мс на каждое нажатие), а вторая кнопка будет использоваться для запуска мигания последовательности таймера. Например, если первая кнопка нажата три раза (500*3 = 1500 мс), задержка будет установлена на 1,5 секунды, а при нажатии второй кнопки каждый светодиод будет включаться и выключаться с заданной временной задержкой. Проверьте Демонстрационное видео в конце этого урока.
Теперь, помня об этих основах, давайте посмотрим на нашу программу, приведенную в конце кода , раздел .
Ничего страшного, если вы не получили программу, но если вы ее получили!! Дайте себе куки и дамп программы, чтобы насладиться результатом. Для других я разобью программу на значимые части и объясню, что происходит в каждом блоке.
Как всегда, первые несколько строк кода — это настройки конфигурации и файлы заголовков, я не буду объяснять это, так как я уже делал это в своих предыдущих уроках.
Далее, давайте пропустим все строки и сразу перейдем к основной функции void, внутри которой у нас есть конфигурация PORT для Timer0.
пустая функция() { /*****Конфигурация порта для таймера ******/ OPTION_REG = 0b00000101; // Timer0 с внешней частотой и 64 в качестве предскаляра // Также включает PULL UP ТМР0=100; // Загрузить значение времени для 0,0019968 с; delayValue может быть только между 0-256 ТМР0ИЕ=1; //Включить бит прерывания таймера в регистре PIE1 ЭДД=1; //Включить глобальное прерывание ПЭИЭ=1; //Включить периферийное прерывание /************______************/
Чтобы понять это, мы должны посмотреть на регистр OPTION в нашей таблице данных PIC.
Как обсуждалось в предыдущем уроке, бит 7 используется для включения слабого подтягивающего резистора для PORTB. Посмотрите на приведенный выше рисунок, бит 3 сделан равным 0, чтобы указать MCU, что следующий установленный прескалер должен использоваться для таймера, а не для WatchDogTimer (WDT). Режим таймера выбирается очисткой бита 5 T0CS
(OPTION_REG<5>)
Теперь битов 2-0 используются для установки значения прескалера для таймера. Как показано в таблице выше, чтобы установить значение предварительного делителя 64, биты должны быть установлены как 101.
Далее давайте посмотрим на регистры, связанные с Timer0
Таймер начнет увеличиваться после установки и переполнения. после достижения значения 256, чтобы включить прерывание таймера в этот момент, регистр TMR0IE должен быть установлен на высокий уровень. Поскольку Таймер 0 сам по себе является периферийным устройством, мы должны включить периферийное прерывание, сделав PEIE=1 . Наконец, мы должны включить глобальное прерывание, чтобы MCU был уведомлен о прерывании во время любой операции, это делается путем установки GIE = 1.
Задержка = ((256-REG_val)*(Prescal*4))/Fosc
Приведенная выше формула используется для расчета значения задержки.
Где
REG_val = 100;
Prescal = 64
Fosc = 20000000
Это при расчете дает
Задержка = 0,0019968s
Следующий набор строк предназначен для установки портов ввода/вывода.
/*****Конфигурация порта для ввода/вывода ******/ ТРИСБ0=1; // Сообщаем MCU, что контакт 0 PORTB используется в качестве входа для кнопки 1. ТРИСБ1=1; // Сообщаем MCU, что контакт 1 PORTB используется в качестве входа для кнопки 1. ТРИСД = 0x00; // Сообщаем MCU, что все выводы на PORT D являются выходными ПОРТ=0x00; //Инициализируем все выводы в 0 /************______************/
Это то же самое, что и в нашем предыдущем руководстве, поскольку мы используем то же оборудование. За исключением того, что мы добавили еще одну кнопку для ввода. Это делается строкой ТРИСБ1=1.
Далее, в бесконечном цикле while у нас есть два блока кода. Один используется для получения ввода таймера от пользователя, а другой для выполнения последовательности задержки светодиодов. Я объяснил их, используя комментарии к каждой строке.
пока(1) { количество = 0; // Не запускать таймер в основном цикле //*******Получить номер задержки от пользователя****////// if (RB0==0 && flag==0) //При заданном вводе { get_scnds+=1; //get_scnds=get_scnds+1//Увеличить переменную флаг=1; } if (RB0==1) //Для предотвращения непрерывного увеличения флаг=0; /************______************/
Переменная с именем get_scnds увеличивается каждый раз, когда пользователь нажимает кнопку 1. Переменная флага (программно определяемая) используется для удержания процесса увеличения до тех пор, пока пользователь не уберет палец с кнопки.
//*******Выполнить последовательность с задержкой****////// пока (RB1==0) { ПОРТД = 0b00000001<
Следующий блок срабатывает при нажатии второй кнопки. Так как пользователь уже определил требуемое время задержки с помощью первой кнопки и оно было сохранено в переменной get_scnds. Мы используем переменную с именем hscnd , эта переменная управляется ISR (процедурой обслуживания прерываний).
Процедура обслуживания прерываний — это прерывание, которое будет вызываться каждый раз, когда таймер 0 переполняется. Давайте посмотрим, как он контролируется ISR в следующем блоке, например, мы хотим увеличить задержку на полсекунды (0,5 с) при каждом нажатии кнопки, тогда нам нужно увеличить переменную 9.0103 hscnd каждые полсекунды. Поскольку мы запрограммировали наш таймер на переполнение каждые 0,0019968 с (~ 2 мс), поэтому для подсчета полсекунды переменная count должна быть равна 250, потому что 250 * 2 мс = 0,5 секунды. Таким образом, когда счетчик достигает 250 (250 * 2 мс = 0,5 секунды), это означает, что прошло полсекунды, поэтому мы увеличиваем hscnd на 1 и инициализируем счетчик нулем.
недействительное прерывание timer_isr() { if(TMR0IF==1) // Флаг таймера сработал из-за переполнения таймера { ТМР0 = 100; //Загружаем значение таймера TMR0IF=0; // Очистить флаг прерывания таймера количество++; } если (количество == 250) { hscnd+=1; // hscnd будет увеличиваться каждые полсекунды количество=0; } }Итак, мы используем это значение и сравниваем его с нашим hscnd и сдвигаем наш светодиод в зависимости от времени, заданного пользователем. Он также очень похож на предыдущий урок.
Вот и все, наша программа понятна и работает.
Принципиальная схема и имитация Proteus:
Как обычно, сначала проверим вывод с помощью Proteus , здесь я разместил файлы схем Proteus.
Добавьте кнопку на нашу предыдущую светодиодную плату, и наше оборудование готово к работе. Это должно выглядеть примерно так:
После установления соединения загрузите код и проверьте вывод. Если у вас есть какие-либо проблемы, пожалуйста, используйте раздел комментариев. Также посмотрите видео ниже, чтобы понять весь процесс.
Код
// КОНФИГУРАЦИЯ
#pragma config FOSC = HS // Биты выбора генератора (генератор HS)
#pragma config WDTE = OFF // Бит включения сторожевого таймера (WDT отключен)
#pragma config PW RTE = ВКЛ // Бит включения таймера включения (PWRT включен)
#pragma config BOREN = ON // Бит разрешения сброса при снижении напряжения (BOR включен) , HV на MCLR должен использоваться для программирования)
#pragma config CPD = OFF // Бит защиты кода памяти EEPROM данных (защита кода EEPROM данных отключена) выкл; вся программная память может быть записана системой управления EECON)
#pragma config CP = OFF // Бит защиты кода флэш-памяти программ (защита кода отключена)// Операторы конфигурации #pragma должны предшествовать включению файла проекта.
// Используйте перечисления проекта вместо #define для ON и OFF.#include
#define _XTAL_FREQ 20000000//TIMER0 8-bit $$RegValue = 256-((Delay * Fosc)/(Prescalar*4)) delay in sec and Fosc в Hz 900 37 / /ФОРМУЛА для расчета задержки
//Задержка = ((256-REG_val)*(Prescal*4))/Foscсимвол hscnd = 0;
целочисленное количество = 0;
символов get_scnds = 0;
символов флаг =0;
символов i=0;void interrupt timer_isr()
{
if(TMR0IF==1) // Флаг таймера сработал из-за переполнения таймера
{
TMR0 = 100; //Загружаем значение таймера
TMR0IF=0; // Очистить флаг прерывания таймера
count++;
}
if (count == 250)
{
hscnd+=1; // hscnd будет увеличиваться каждые полсекунды
count=0;
}
}void main()
{
/***** Конфигурация порта для таймера ******/
OPTION_REG = 0b00000101; // Timer0 с внешней частотой и 64 в качестве предскаляра // Также включает PULL UP
TMR0=100; // Загрузить значение времени для 0,0019968 с; delayValue может принимать значения только от 0 до 256.