Циклический таймер своими руками на микроконтроллере

Обновлено: 06.07.2024

Закончив первый учебный проект мы почувствовали, что со счетом времени надо что то делать. Использование машинных циклов слишком неудобно. Мало того, что этот метод зависит от тактовой частоты, так в STM8 еще и последовательность расположения команд влияние оказывает. Кроме того, даже простая модификация программы может изменить длительность выполнения основного цикла, что вносит еще большую сумятицу. Да и микроконтроллер вынужден большую часть времени проводить в бесполезных циклах ожидания. А ведь мог бы заняться чем то полезным, или просто заснуть экономя энергию батареи (при питании от батареи).

Решить большинство этих проблем помогают таймеры, специализированные модули микроконтроллера предназначенные для счета времени. И сегодня мы познакомимся, пока в самых общих чертах, с таймерами и некоторыми ( лишь некоторыми! ) из их возможностей.

При дальнейшем изучении микроконтроллером мы будем не раз возвращаться к таймерам, что бы узнать о все новых их возможностях. Так как применение таймеров в микроконтроллерах весьма разнообразно. И во многих микроконтроллерах имеется несколько таймеров, причем разных.

Что такое таймер?

В общем и целом, изначально, это устройство для отсчета требуемых интервалов времени. То есть, мы устанавливаем требуемый временной интервал и запускаем таймер. Когда заданное время (с момента запуска таймера) истечет, таймер "сработает" выдав какой либо сигнал.

Здесь сразу возникают вопросы, что считать, и как считать?

Что будем считать?

В наш цифровой век обычно считают импульсы. Но вот какие могут быть источники этих импульсов? Раз речь идет о времени, то источник импульсов должен быть достаточно стабильным. На роль такого источника хорошо подходят генераторы с кварцевыми резонаторами.

В микроконтроллере такой обычно есть - системный тактовый генератор. Да, он не всегда использует кварцевый резонатор (мы это видели в учебном проекте бегущих огней). Но все таки этот источник использовать имеет смысл. Правда тут есть одна тонкость, связанная с режимами энергосбережения. Если системный тактовый генератор останавливается в режимах сна, то и наш таймер работать не будет.

Кроме того, можно использовать внешний источник импульсов. Это может что угодно, например, TCXO. Главное, что это внешний источник импульсов, не зависящий от микроконтроллера. А значит, он не будет остановлен во время засыпания микроконтроллера и таймер может продолжить работу.

И, наконец, мы можем предоставить таймеру свой собственный генератор, включая внешний кварцевый резонатор. Этот вариант тоже позволит таймеру не зависеть от системного тактового генератора и продолжить работу во время засыпания микроконтроллера.

Как будем считать?

Для счета импульсов вполне разумно использовать счетчик. Именно счетчики лежат в основе таймеров в микроконтроллерах. И опять возникают вопросы, какова разрядность счетчика и каково направление счета?

А если и этого не хватает? Наращивать разрядность? И да, и нет. В большинстве случаев на входе счетчика стоит предварительный делитель, или предделитель. Который в документации обычно называется prescaler.

В общем и целом, это тоже счетчик. И его можно считать расширением разрядности счетчика таймера. Но только с точки зрения деления частоты, так как по сравнению со счетчиком таймера функционал делителя сильно ограничен.

Счетчики, как всем известно, могут работать в двух направлениях. Увеличивая, инкрементируя (+1), или уменьшая, декрементируя (-1), свое содержимое. А могут быть и реверсивными, меняя направление счета в процессе работы.

В большинстве случаев счетчики таймеров микроконтроллеров работают в сторону увеличения. Однако, мы сразу, в самом первом варианте блок-схемы таймера предусмотрим возможность смены направления счета. Нам это понадобится в дальнейшем.

Первый вариант построения таймера - базовый таймер

Такое построение таймера действительно используется в большинстве микроконтроллеров. Обычно, таймеров несколько, но самый простой из них устроен примерно так. Даже еще проще, иногда.

Почти все, что изображено на этой функциональной схеме мы уже кратко обсудили. В основе таймера лежит счетчик (двоичный) TMR_CNT. Я не стал указывать разрядность счетчика, это не важно, в данном случае. Причем это счетчик можно прочитать или записать в любой момент времени, даже не останавливая таймер.

Если счетчик работает в направлении увеличения, то на его выходе возникает сигнал переполнения OF (overflow), а если в направлении уменьшения, то сигнал опустошения UF (underflow). Эти сигналы возникают при переходе счетчика через 0. Мультиплексор, стоящий после счетчика, выбирает один из этих сигналов, в зависимости от направления счета (DIR), для формирования сигнала TE - событие таймера.

Три возможных источника импульсов для счета, которые мы ранее рассматривали, выбираются мультиплексором. Main CLK это системный тактовый сигнал, а TI это вход внешнего сигнала. Сигнал с выбранного источника поступает на предварительный делитель.

При этом, дополнительный мультиплексор позволяет выбрать, нужно ли использовать делитель. Выход этого мультиплексора и является тактовым сигналом (CLK) для счетчика таймера.

Я специально использовал обозначения отличные от тех, которые используются в документации на рассматриваемые микроконтроллеры. Так как мы пока рассматриваем таймеры в самом общем виде.

Совершенно не обязательно в реальном таймере реального микроконтроллера есть все эти элементы. Но именно так, в общем случае, устроены их таймеры, которые называют базовыми.

Незапланированный бонус - расширенные функциональные возможности базового таймера

Итак, мы получили не просто таймер, а таймер-счетчик. И можем использовать его не только для отсчета временных интервалов. Но и для подсчета чего угодно! И для определения наполнения/опустошения чего либо на объекте автоматизации. Или для отсчета нужной дозы, например, лекарства. Или для определения того, что мы залили в бак автомобиля оплаченное клиентом АЗС количество топлива. Всего и не перечислить.

Расширяем функциональность для измерения интервалов времени. Захват.

Чем таймер отличается от секундомера? Только тем, что первый отсчитав требуемый интервал времени подает сигнал, а второй нужно остановить вручную, что позволит измерить временной интервал. То есть, просто небольшие отличия в функционале. А значит, имеет смысл попробовать усовершенствовать наш таймер, что бы он мог использоваться и для отсчета, и для измерения временных интервалов.

Тут нужно сделать небольшое уточнение. Да, в большинстве случаев мы можем остановить таймер сбросив/установив специальный бит в управляющем регистре. Но то ли это, что нам требуется? Даже если останов таймера просто отключает поступление импульсов счета, а не отключает питание таймера.

А это не совсем то. Хотя бы по той причине, что останов таймера будет выполняться программно, с непредсказуемой задержкой. Даже при использовании прерываний. А это снижает точность. Поэтому нужно именно аппаратное решение. Примерно такое

Функциональная упрощенная схема таймера с возможностью измерения временных интервалов. Пунктиром показаны границы микроконтроллера. Иллюстрация моя

Функциональная упрощенная схема таймера с возможностью измерения временных интервалов. Пунктиром показаны границы микроконтроллера. Иллюстрация моя

Даже функциональная схема показана очень упрощенно. В данном случае мы добавили управляющий вход (вывод TG - Timer Gate) и мультиплексор, который позволяет выбрать источник сигнала управляющего прохождением счетных импульсов.

Для сигнала TG, для разных микроконтроллеров, можно задать работу по уровню (0 или 1) или по фронту (нарастающий спадающий). Я не стал показывать на иллюстрации, как это делается. Для нас это не важно, в данном случае.

Внутренние сигналы EV1 и EV2 это формируемые модулями микроконтроллера сигналы, их может быть разное количество. И для них тоже можно задать различные условия, как и для TG. Эти сигналы соответствуют каким то событиям, которые фиксируются модулями микроконтроллера. Например, изменение состояния вывода порта. Или превышение порогового уровня напряжения на аналоговом входе.

Таким образом, становится возможным, например, определение емкости конденсатора измерением времени его заряда или разряда. Или размера предмета, проезжающего по ленте конвейера мимо датчика, что можно использовать для сортировки.

На этой иллюстрации есть еще одно упрощение. Дело в том, что задание периода счета (через TG) это одно, а вот останов счета по событию, которое может быть кратковременным, это немного другое. Поэтому управление поступлением импульсов счета не ограничивается одним элементом И. Оно сложнее, и может включать в себя триггеры. Более подробно все условия и их обработку мы будем рассматривать в последующих статьях, для каждого семейства микроконтроллеров в отдельности.

Два варианта обработки событий

Выше мы рассмотрели решение, при котором таймер останавливает счет при наступлении события. Это позволяет легко прочитать остановленный счетчик таймера. Но такой останов не всегда приемлем. Иногда нужно продолжить счет, или перезапустить таймер.

Такой вариант тоже возможен, просто нужно добавить еще один регистр, в который и будет копироваться содержимое счетчика таймера при наступлении события. Вместо остановки счета. Примерно так.

Функциональная упрощенная схема таймера с возможностью измерения временных интервалов без остановки счета. Пунктиром показаны границы микроконтроллера. Иллюстрация моя

Функциональная упрощенная схема таймера с возможностью измерения временных интервалов без остановки счета. Пунктиром показаны границы микроконтроллера. Иллюстрация моя

Здесь регистр EV_CNT используется для хранения копии содержимого TMR_CNT при наступлении события. И его можно прочитать в любой момент времени, главное, успеть до наступления очередного события.

Захват (capture)

В таком использовании таймера собственно таймер, его счетчик, не является главным действующим лицом. Он используется совместно с другими модулями для измерения продолжительности какого либо события.

В документации это часто называют захватом события. Такой способ использования таймера может описываться или в разделах описания собственно таймера, или в разделах описаний других модулей, которые и генерируют события. Например, в микроконтроллере может быть отдельный модуль Capture/Compare/PWM, который в своей работе используется один из таймеров.

Использование таймеров для захвата событий мы изучим позднее. Уже после изучения таймеров. Так как для этого потребуется знать модули, которые эти события формируют. Но мы это сделаем обязательно.

Что происходит после окончания счета

Начав рассматривать таймер я сказал, что после окончания счета таймер выдает сигнал. Или событие. Но что происходит дальше? Таймер останавливается или продолжает счет?

Немного мы коснулись этого вопроса рассматривая режим захвата, когда добавили регистр EV_CNT. Но как ведет себя таймер в обычном режиме?

Но таймер при этом не остановится, а продолжит счет . И следующее событие таймера возникнет через 256 импульсов. Для 16 битного таймера, разумеется, через 65536 импульсов.

Такой режим счета называется обычным. Он самый простой и вполне подходит для формирования одиночный временных интервалов. А для периодических требуется повторная установка начального значения счетчика, программная.

При этом в период будет входить и время переустановки начального значения счетчика. А это снижает точность формирования периодических временных интервалов.

Расширяем функциональность формирования интервалов времени. Сравнение.

Для периодических временных интервалов нам надо как то обеспечить автоматическую перезагрузку начального значения счетчика. Для этого можно добавить еще один регистр и сравнивать содержимое счетчика таймера а этим регистром. Примерно так

Функциональная схема части таймера обеспечивающая формирование периодических временных интервалов. Иллюстрация моя

Функциональная схема части таймера обеспечивающая формирование периодических временных интервалов. Иллюстрация моя

Я показал лишь часть таймера, так нас, в данном случае, не интересует формирование импульсов счета. Здесь есть уже знакомый нам счетчик таймера TMR_CNT. Регистр TMR_RR (Reload Register), в который записывается максимальное значение счетчика таймера для формирования заданного временного интервала. И компаратор (цифровой), который сравнивает содержимое счетчика и регистра TMR_RR.

В данном случае принято, что таймер может считать только вверх, а начальное значение счетчика равно 0. Как только счетчик таймера достигнет записанного в TMR_RR значения, он будет сброшен на 0 и сформируется событие таймера. И счет начнется с начала.

Вот такое сравнение с содержимого счетчика и дополнительного регистра и дало название режиму работы - сравнение (compare). И точно так же, как в случае режима захвата, таймер может быть лишь частью отдельного модуля, например, того самого Capture/Compare/PWM.

Можно сэкономить один регистр если вспомнить, что режимы захвата и сравнения не могут использоваться одновременно. А значит, в качестве EV_CNT и TMR_RR моно использовать один и тот же аппаратный регистр. И так действительно делают.

Альтернативные режимы сравнения и автоперезагрузки

Таймер может работать не на увеличение, а на уменьшение. В этом случае содержимое TMR_RR будет автоматически записываться в счетчик таймера, как начальное значение. При этом для нашего примера с временным интервалом из 59 импульсов ничего не изменится. Абсолютно ничего. Хотя схемотехника модуля будет иная. Зачем это нужно?

Это влияет на момент синхронизации сигнала таймера и других модулей микроконтроллера. Например, на модуль ШИМ. Когда мы до него доберемся, мы и рассмотрим этот момент более подробно.

Возможен и режим, когда таймер сначала считает от 0 до значения в TMR_RR, а потом направление счета меняется и таймер начинает считать вниз, до 0. И так до бесконечности, с постоянной сменой направления счета. Этот режим возможен далеко не во всех микроконтроллерах. И мы тоже рассмотрим его подробнее при знакомстве с модулями ШИМ.

Дополнительные усовершенствования

Рассмотреть все варианты дело не такое простое. Да и особого смысла не имеет. Но все таки одно дополнение хочу затронуть. Мы можем установить еще один делитель, но уже после таймера. Поэтому его называют postscaler. Этот делитель может использоваться для формирования сигнала TE не на каждое переполнение таймера, а лишь через определенное их число. Иногда этот делитель называют счетчиком повторений.

Такой счетчик повторений может оказаться полезным, если нужно сформировать определенное количество одинаковых импульсов. И мы обязательно познакомимся с этим делителем/счетчиком повторений при рассмотрении реализации таймеров в конкретных моделях микроконтроллеров.

Заключение

Мы, пока довольно кратко и в общих чертах, познакомились с таймерами, которые есть в подавляющем большинстве микроконтроллеров. Простейший счетчик, на первый взгляд, оказался довольно сложным и многофункциональным устройством. Настолько многофункциональным, что мы будем знакомиться с его возможностями при изучении различных модулей микроконтроллеров. И не раз убедимся в их пользе и удобстве.

Схема цифрового таймера на PIC16F628a, приведенная в данной статье, позволяет включать и выключать по расписанию нагрузку (бытовые приборы и электронные устройства). Нагрузка управляется посредством электромагнитного реле.

С этим программируемым цифровым таймером можно установить как время включения, так и время выключения. Это означает, что вы можете установить время, когда нагрузка должна быть включена и время отключения, то есть как долго она должна пробыть во включенном состоянии.

Предельный интервал времени, который вы можете установить для включения и выключения нагрузки — 99 часов и 59 минут. Для удобства работы таймер снабжен ЖК-дисплем 16×2 и 4-мя кнопками. Принципиальная схема данного цифрового таймера показана на рисунке ниже.

Реле с рабочим напряжением 5В коммутируется с помощью NPN транзистора BC337, управление самим же транзистором происходит сигналом с вывода 9 (RB3) микроконтроллера PIC16F628A.

Цифровые сигналы от 4-х кнопок считываются через входы 1, 2, 3 и 6. Стандартный LCD индикатор 16×2 работает в 4-битном режиме, поэтому задействованы только 6 контактов ввода/вывода микроконтроллера. Зуммер обеспечивает звуковой сигнал в момент, когда таймер запускается и останавливается. Он также издает звуковой сигнал, когда нагрузка включена или выключена.

Работа таймера просимулирована в Proteus:

programmiruemyj-cifrovoj-tajmer-na-pic16f628a-do-100-chasov-prot

Работа таймера

Все управление таймером осуществляется четырьмя кнопками:

  • Кнопка SA1 (on/off) — позволяет устанавливать как время включения, так и время выключения таймера. При подаче питания на таймер, нагрузка находится в выключенном состоянии, и оба времени (включения и выключения) равны 0. При нажатии на кнопку SA1, вы можете переключаться между режимами включения и выключения.
  • Кнопка SA2 (select) — позволяет выбирать во время установки цифры часов и минут включения и выключения таймера. Выбранная цифра увеличивается на единицу при нажатии SA1.
  • Кнопка SA3 (enter) — позволяет выйти из режима установки таймера.
  • Кнопка SA4 (start/stop) — запускает и останавливает работу таймера.

Теперь давайте посмотрим, как это работает. Предположим, что мы хотим включить нагрузку через 2 минуты и отключить ее после 20 минут работы. В этом случае время включения (ON) будет 00:02, а время выключения (OFF) 00:20, в формате чч: мм. После нажатия на кнопку SA4 запуститься таймер, и нагрузка включится через 2 минуты, и отключиться через 20 минут.

На микроконтроллерах Схемы на ATtiny Микроконтроллерный таймер с удобным управлением

Микроконтроллерный таймер с удобным управлением

Звезда активна
Звезда активна
Звезда активна
Звезда активна
Звезда не активна


Б. КЕЛЕХСАШВИЛИ, г. Волгодонск Ростовской обл.
Сегодня радиолюбители делают таймеры, как правило, на основе микроконтроллеров. Это не удивительно, поскольку они позволяют создать устройство с минимальным числом элементов и реализовать в нём функции, ограниченные только фантазией разработчика программы.

Универсальный одноканальный циклический таймер.


Экономичный универсальный одноканальный циклический таймер на PIC12F629


Возможности устройства:
- настраиваемая при прошивке длительность цикла таймера до 4млрд секунд (4х-байтная переменная).
- два действия на цикл (включить и выключить нагрузку), задаваемые с помощью трех кнопок.
- возможность включать/отключать нагрузку минуя таймер.
- дискретность счета 1 секунда.
- среднее потребление тока без нагрузки 11 микроампер (примерно 2 года работы от CR2032).
- коррекция хода (грубая).
- сброс от пониженного питания 2,1 вольта (BOD) отключен, т.к. жрет 120мкА.

Принцип работы: таймер повторяет записанные действия (вкл/откл) с определенным периодом (цикл), задаваемым пользователем в памяти EEPROM при прошивке контроллера.
Пример задачи: необходимо включить нагрузку в 21:00 и отключить ее в 7:00 и так делать каждые три дня.
Решение: прошиваем таймер с циклом "3 дня", запускаем. Первый раз подходим к таймеру в 21:00, зажимаем кнопку PROG и не отпуская ее нажимаем кнопку ON, светодиод засветится на 0,5 секунды и выход включится. Второй раз подходим к таймеру в 7:00, зажимаем кнопку PROG и не отпуская ее нажимаем кнопку OFF, светодиод засветится на 0,5 секунды и выход отключится. Все, таймер запрограммирован и будет выполнять эти действия каждые три дня в тоже самое время.
Если нагрузку необходимо включить или отключить минуя таймер, необходимо нажать кнопки ON или OFF без кнопки PROG, программа не собьется и нагрузка в следующий раз включится/выключится в ранее установленное время..
Проверить работоспособность таймера можно нажав кнопку PROG, светодиод будет мигать раз в секунду.

Описание тестирования с разными конденсаторами в предыдущей статье.

Для более простой настройки устройства так же был написан калькулятор (генератор кода EEPROM). С помощью него можно создать HEX-файл для замены части кода в файле прошивки.

Конфигуратор универсального одноканального циклического таймера с микропотреблением

Прошивка, исходник, схема, калькулятор, v1.0 (описание в архиве, читать перед прошивкой в контроллер)

0 -->

Собрал данный таймер на НГ, гирлянду включать. (МК 12f675) Первый день он отработал нормально, второй день не включился, на кнопки вкл выкл реакции нет, при нажатии на прог. диод мигает. Воопсчем мучаюсь с ним самого НГ, закономерность какую нибудь хотел отловить но тчетно, Работает какое то время стабильно (день, два,) а потом какбудто зависает, реагирует только на прог., а на вкл и выкл нет реакции. Если сбросить питание, то начинает опять работать и реагировать на кнопки. Сейчас апрель, отпуск, собрал второй такой же таймер, вытравил печатку, взял совершенно другой мк, детали тоже другие, дабы избежать эффекта брака в партии., но собственно дефект проявляется сразу же: как только прикасаешься к контакту вкл рукой (провод висит в воздухе, без кнопок) то сразу же таймер включается и зависает, далее не реагирует на вкл и выкл, только на прог. Как это побороть?

UPD: 22 апр. Воопщем сам спросил, и сам увидел ответ: "Висящий" в воздухе вывод 4 МК, навел меня на мысль, зашунтировать его к минусу кондером 0,1 после этого ситуация исправилась. Второй день полет нормальный, оба таймера работают без сбоя. Почему я его назвал "висящий", если он подтянут резистором к плюсу питания?, да потому что как я уже описывал выше, прикосновение рукой к данному контакту вызывает хаотичное состояние на выводе 7 МК, он то вкл, то выкл, либо вообще зависает. Возможно нужно просто уменьшить сопротивление R1 47K, но это я еще не проверял.

0 -->

0 -->

на кнопку дало импульс в 1 секунду дворник начал свой цикл до стартовой и снова ждет импульса, например через 5 секунд и тд, просто бывает при штатных релле дворник виснет на начале из за контактов и мертвой зоне, если бы еще б регулятор цикличности то не заменимая вещь на авто

0 -->

Эммм. А куда какие кнопки-то цеплять? Он же постоянно цикл крутит и у него нет ни старта, ни остановки. Может мы не про тот таймер говорим?

0 -->

0 -->

Э. а как? Оно же генерирует импульсы постоянно. А при отключении питания уставки сбрасываются, сохраняется только длительность цикла.

Читайте также: