Таймер на avr микроконтроллере своими руками

Добавил пользователь Алексей Ф.
Обновлено: 10.09.2024

Описание и характеристики двухканального термометра, термостата (терморегулятора), одноканального таймера реального времени
на ATmega8 и DS18B20

Так-как данная конструкция "вышла" из предыдущей - "Двухканальный термометр, термостат, терморегулятор", и подробно описана (все характеристики термометров и термостатов, режимы работы, реакция на ошибки - остались без изменений), я остановлюсь только на нововведении - таймере реального времени.

Таймер реального времени

В конструкцию введен таймер реального времени, который позволяет управлять своей, третьей нагрузкой, в режиме реального времени в течении 24 часов и позволяет в течении суток задать два временных интервала управления нагрузкой. Также таймер позволяет задать в течении суток для каждого канала термостатирования (терморегулирования) по одному временному интервалу управления нагрузками.
Что я подразумеваю под таймером реального времени. По сути, это внутренние часы с дискретностью 10 минут. При первоначальной настройки устройства устанавливается реальное текущее время с точностью до 10 минут, а дальше таймер отсчитывает 24 часовые интервалы с шагом в 10 минут как обыкновенные часы.

Дискретность отсчета временных интервалов 10 минут принята по двум причинам:
- удобство вывода информации на трехразрядном индикаторе, к примеру 22 часа 40 минут - 22,4
- управление нагрузкой с точностью до 10 минут вполне достаточна для большинства задач (реально точность составляет 5 минут - если вам надо включить нагрузку в 7 часов 35 минут, то можно установить или 7,4 или 7,3)

Введение таймера немного изменило алгоритм работы с устройством (об алгоритме работы я расскажу ниже). Теперь нажатием кнопки "Выбор" можно попасть в два меню:
- меню установки пределов температур работы термостатов и временных интервалов работы термостатов, временных интервалов управления нагрузкой по таймеру
- меню коррекции хода часов и установки текущего времени.
Так как МК работает от внутреннего RC-генератора (8 МГц), который не отличается стабильностью и зависит как от температуры МК, так и питающего напряжения, функция коррекции хода часов позволяет подстроить точность хода для конкретных условий. А функция установки текущего времени позволяет установить текущее реальное время при первоначальной настройке или уточнять его при сильном отличии от реального времени.
Показания таймера при работе устройства не высвечиваются, узнать "который час" можно только при входе в режим установки текущего времени.

Управление нагрузками по таймеру не осуществляется (выключено), если время включения и выключения установлены в ноль. В принципе, управление нагрузками по таймеру не осуществляется при равенстве времени включения и выключения.

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

Схема трехканального термометра, термостата, таймера на ATmega8

Схема трехканального термостата, терморегулятора, таймера на ATmega8

Схема устройства создана в программе "Cadsoft Eagle" и в принципе не отличается от схемы двухканального термостата (добавлен третий канал управления нагрузкой и изменены, для разнообразия, схемы управления нагрузками):

Так-как в схеме применены "выводные" детали, то для удобства размещения конструкции в подходящем корпусе схема разделена на две части:
- Блок индикации - индикаторы и кнопки
- Блок управления - все остальное
Надо было бы вывести в блок индикации и светодиоды, которые сигнализируют о включенных каналах, но это можно сделать и самостоятельно при разводке платы (добавить три пары контактных площадок для светодиодов и соединить их с блоком управления проводами).

Конструкция устройства

Основа устройства - микроконтроллер ATmega8 с тактовой частотой 8 МГц от встроенного генератора с внутренней RC-цепочкой.
Для подстройки частоты внутреннего генератора необходимо при программирование МК записать в EEPROM-память по нулевому адресу значение калибровочной ячейки для тактовой частоты 8 МГц. В выложенном ниже НЕХ-файле EEPROM-памяти по умолчанию записано число $В1 (В1) - среднее значение калибровочных ячеек 5 проверенных микроконтроллеров.
Кроме того, для правильной работы таймера реального времени, а работает он по прерываниям от таймера/счетчика Т1 при равенстве счетного регистра и регистра сравнения OCR1A, при программировании EEPROM-памяти следом за значением калибровочной ячейки записывается число 33050 (1А81) которое программным путем заносится в регистр сравнения OCR1A. При коррекции хода таймера меняется и значение этого числа.

HEX-файл в EEPROM

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

Датчики DS18B20 подсоединяются к устройству через 3-х контактные штыревые линейки DS1 и DS2, нумерация выводов которых соответствует нумерации выводов датчиков.

Управление разрядами осуществляется маломощными биполярными транзисторами NPN-типа.

Схемы управления нагрузками:
- для каналов термостатирования - через оптосимисторы МОС3063 и симисторы ВТ139-800Е по стандартной схеме включения, что позволяет управлять нагрузками мощностью до 3,5 кВт (если мощность нагрузки более 300-400 Вт - симисторы необходимо ставить на радиаторы)
- для канала от таймера - через миниатюрное механическое реле с напряжением питания катушки 5 Вольт, что позволяет, в зависимости от примененного реле, управлять нагрузкой до 2 - 2,5 кВт

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

Питание устройства осуществляется от любого источника постоянного тока напряжением 7-25 Вольт. Схему можно запитать и от ненужного зарядного устройства от сотового телефона с выходным напряжением 5 +-0,5 Вольт. В этом случае можно из схемы исключить стабилизатор 7805 и конденсаторы С4, С5. Средний ток потребления устройством 40 миллиампер.

При необходимости организации резервного питания (для бесперебойной работы таймера) можно применить, к примеру, такую схему:

Резервное питание устройства

Перечень деталей

Детали, примененные в конструкции:

Управление трехканальным термометром, термостатом, терморегулятором, таймером

В устройстве имеется два меню.
При "коротком" нажатии на кнопку "Выбор" на индикаторах высвечивается надпись "ON----OFF", входим в меню:
- установки пределов температур работы термостатов и временных интервалов работы термостатов, временных интервалов управления нагрузкой по таймеру
При "длинном" нажатии кнопки "Выбор" надпись "ON----OFF" сменяется надписью "Cor----USt", при этом надо отпустить кнопку, входим в меню:
- коррекции хода часов и установки текущего времени

Короткое нажатие кнопки Выбор

Длинное нажатие кнопки Выбор

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

2. Меню "Коррекции хода и установки текущего времени" (длинное нажатие кнопки "Выбор")

После входа в меню сразу попадаем в режим коррекции хода часов:
"Cor----00"
Повторным нажатием кнопки "Выбор" переходим в режим установки текущего времени:
"USt----00.0"
В режиме установки текущего времени смотрим на свои самые точные часы и кнопками "+" и "-" устанавливаем ближайшее время с точностью до 10 минут.
К примеру - текущее время 20 часов 37 минут, устанавливаем на индикаторе "20,4" (20 часов 40 минут) и ровно в 20.40, нажатием кнопки "Выбор" выходим из меню. Все, реальное время выставлено, часы запущены.
Корректировать ход часов можно от +50 единиц до -50 единиц. Первоначальное значение "00" ("00" появляется всегда при входе в этот режим)
При изменении установки на единицу ход часов увеличивается (+1) или уменьшается (-1) примерно на 4 секунды за 24 часа.
Точность хода часов можно проверить на канале управления нагрузкой по таймеру без подключенной нагрузки по зажиганию светодиода.
К примеру, в 21.00 мы установили текущее время, задали включение нагрузки - 8.50, выключение - 9.00. Утром замерили время выключения нагрузки. Допустим нагрузка отключилась в 8 часов 59 минут 20 секунд. Значит таймер отстал на 40 секунд за 12 часов. За 24 часа отставание составит уже 80 секунд. 80 секунд делим на 4 = 20. В режиме коррекции устанавливаем показание 20, затем переходим в режим установки текущего времени, устанавливаем ближайшее текущее время, например 9.1, и в 9 часов 10 минут, нажатием кнопки "Выбор" выходим в рабочий режим.

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

Меню коррекции и установки начального времени

3. Меню установки температурных и временных интервалов для термостатов

Напомню режимы работы каналов термостатирования (терморегулирования):
- режим термостатирования - поддержание определенной температуры
- режим терморегулирования - поддержание температуры в определенных границах
- режим однократного нагрева (охлаждения)
Все эти режимы подробно описаны в статье "Двухканальный термостат/терморегулятор", там же приведены подробные инструкции и возможности каждого режима.
С введением в конструкцию таймера реального времени появилась возможность для каждого канала задавать в течении суток один временной интервал работы канала. Для этого в меню введены дополнительные строчки времени включения и выключения каналов.
К примеру, нам надо чтобы 1-й канала термостатирования работал только в ночное время с 23.00 до 6.30. Для этого в 1-м меню (короткое нажатие кнопки "Выбор"):
- после установки верхнего и нижнего температурного предела появятся еще две строчки: "t.On-----00,0" и "t.OF-----00,0" (тоже самое будет и для второго канала)
- кнопками "+" и "-" устанавливаем: "t.On-----23,0" и "t.OF-----06,3"
Теперь, в 23.00 1-й канал начнет работать в заданном режиме, а 6.30 канал будет отключен, и так каждые сутки.
По режиму однократного нагрева/охлаждения. Если временной интервал не выбран (время включения/выключения установлены в "0"), то запуск этих режимов осуществляется в ручном режиме, нажатием соответствующей кнопки. Этот режим может работать и по времени.
Допустим нам надо на 2-м канале термостатирования с утра, к 7.00, нагреть воду в баке до 45 градусов, учитывая, что вода в баке до этой температуры нагревается за 25 минут:
- устанавливаем "2.On-----00" и "2.OF-----45"
- устанавливаем "t.On-----06,3" а "t.OF" оставляем по умолчанию "t.OF-----00,0"
Теперь, 2-канал автоматически запуститься в 6.30 минут, и по достижению температуры воды 45 градусов отключится.
При использовании режима однократного нагрева/охлаждения совместно с таймером сохраняется возможность и ручного запуска режима, но при этом следует учитывать, что в промежуток времени "t.OF----t.On" (для предыдущего примера - с 24.00 до 6.30) ручной режим невозможен. Поэтому, для того, чтобы в любой момент времени запустить режим вручную, необходимо "t.OF" устанавливать на 10 минут меньше чем "t.On".

4. Меню установки временных интервалов для таймера

Таймер реального времени позволяет задать два временных интервала в течении суток для управления нагрузкой по таймеру.
Для этого в меню введены дополнительно четыре строчки:
- t1.1 - время включения для первого временного интервала
- t1.0 - время выключения для первого временного интервала
- t2.1 - время включения для второго временного интервала
- t2.0 - время выключения для второго временного интервала
Временные интервалы не должны пересекаться.
Допустим, нам необходимо включать освещение во дворе два раза в сутки: с 21.00 до 0.30 и с 5.30 до 7.00
Устанавливаем:
- t1.1 - 21,0
- t1.0 - 00,3
- t2.1 - 05,3
- t2.0 - 07,0
Теперь нагрузка по таймеру будет включена в 21.00 и в 5.30, и выключена в 0.30 и в 7.00

Когда я еще начинал изучать микроконтроллеры, мне захотелось сделать часовой таймер, чтобы управлять нагрузкой переменного тока. Честно признаюсь, я хотел попробовать включать телевизор только с 7 до 8 часов, а все остальное время он должен был быть отключен. Устройство я сделал, но так его и не применил.

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

  • Тактировать от внешнего часового кварца на 32768 герц
  • Считать разные временные интервалы
  • Считать внешние импульсы в режиме счетчика
  • Генерировать ШИМ-сигнал на определённых выводах МК
  • Генерировать прерывания по какому-то событию, например, при переполнению

Таймеры счетчики могут тактировать от внутреннего генератора тактовой частоты и от счетного входа. Давайте рассмотрим функционал таймера-счетчика 1 в микроконтроллере atmega8. Запускаем CodeVision AVR, создаем новый проект и соглашаемся на предложение запустить Code WizardAVR

Code WizardAVR

переходим во вкладку Timers, далее кликаем на timer2.

Code WizardAVR

    Clock Source - источник тактового сигнала, здесь в выпадающем списке можно выбрать

  • System Clock - таймер тактируeтся частотой, на которой работает микроконтроллер
  • TOSC1 pin - таймер будет работать от внешнего кварца на ножках TOSC1,TOSC2

Clock Value в Code WizardAVR

  • Normal top - счетчик считает от 0 до 255, после переполнения сбрасывается в 0 и счет повторяется
  • Fast PWM - счетчик считает от 0 до 255, после переполнения сбрасывается в 0 и счет повторяется. Когда значения в счетном регистре достигает значения в регистре сравнения (задается в строчке Compare), таймер выставляет определенный логический уровень (задается в выпадающем списке Output) на ножке OCxx
  • CTC - сброс при совпадении, когда значения в счетном регистре достигает значения в регистре сравнения счетный регистр сбрасывается в ноль и счет начинается сначала.
  • Phase Correct PWM - таймер сначала считает от 0 до 255, потом от 255 до 0. Вывод OCxx при первом совпадении сбрасывается, при втором устанавливается.

Давайте на примере timer2 реализуем часы реального времени с выводом на lcd дисплей, для этого выставляем таймер как показано на скриншоте

часы реального времени на avr

Code Wizard cгенерировал вот такой код

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


В микроконтроллерах avr есть такой периферийный модуль как таймер счетчик. В соответствии со своим названием он считает время. У таймер счетчика есть регистр TCNT из которого можно прочитать сколько времени прошло с момента запуска таймера. Значение в этом регистре не в минутах или секундах, а в ‘попугаях’ — ‘тиках’ таймера. Чему равен один тик — зависит от тактовой частоты, на которой работает микроконтроллер avr, и от настроек таймера.

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

Например:
Тактовая частота = 11059200 Гц ( 11.0592 МГц )
Делитель = 1024
Частота таймера счетчика = Тактовая частота/Делитель = 11059200/1024 = 10800 Гц
Длительность периода( тика ) = 1/10800 = 92.593*10^-6 секунды = 92.593 мкс

Для настройки делителя используются биты CS регистра TCCR.

Например для таймера 1 в atmega8 используются регистр TCCR1B и биты CS10, CS11, CS12.

Зависимость делителя от состояния бит CS для таймера 1 в atmega8

Пример кода настройки делителя для таймера 1 avr atmega8:

В avr таймеры могут быть 8 или 16 разрядными. Разрядность определяет максимальное количество тиков которые может сосчитать таймер. Для 8 разрядного это 256 тиков, для 16 это 65536.

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

Пример кода для разрешения прерываний таймера 1 avr atmega8:

TIMSK |= (1<<TOIE1); // разрешить прерывание по переполнению таймера счетчика sei(); // выставить бит общего разрешения прерываний

Так же надо определить обработчик данного прерывания — функцию которая будет вызвана при переполнении таймера.

Добавим в эту функцию код изменяющий состояние ножки PB0, к которой подключен светодиод.

Пример кода функции обработчика прерывания для таймера 1 avr atmega8:

Светодиод будет изменять свое состояние через каждые 6 секунд.

Чтобы светодиод менял свое состояние с частотой 10Гц, надо чтобы таймер отсчитывал не 65536 тиков а меньше. Рассчитаем необходимое число тиков:

Чтобы таймер считал не с нуля а с некоторого значения, при инициализации и при каждом срабатывании прерывания в регистр TCNT1 будем записывать число (65536 — 1080) = 64456.

Листинг итоговой программы для таймера 1 avr atmega8:

Архив с исходниками под avr-gcc (WinAvr) можно скачать тут.

P.S. Если Вам понравилась эта статья, или же наоборот, Вы считаете ее бесполезной, если у Вас есть какие-то вопросы или пожелания, пожалуйста, напишите комментарий.

Запись опубликована в рубрике Микроконтроллеры avr с метками atmega, avr. Добавьте в закладки постоянную ссылку.

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

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

Рассмотрим подробно принципиальную схему, функции меню и возможности устройства.

Принципиальная схема

В основе схемы устройства находится микроконтроллер производства фирмы ATMEL семейства AVR — ATMega8 (IC4). Микроконтроллер работает с цифровым датчиком температуры IC2 DS18B20 и микросхемой реального времени IC3 DS1307. Данные выводятся на жидкокристаллический дисплей на шестнадцать знаков в две строки. Нагрузка коммутируется с бытовой сетью переменного напряжения 220 В через симисторы VS1-VS3 (BT139), которые связаны с микроконтроллером через гальваническую развязку собранную на оптосимисторах ОС1-ОС3, в данном случае это МОС3061. Таким образом микроконтроллер управляет тремя устройствами, через отдельные функциональные возможности о которых говорится ниже.

схема таймер-термостат

Питание схемы осуществлено по классической схеме выпрямителя на базе интегрального стабилизатора напряжения TL7805 (IC1).

Отображение данных и настройка

В нормальном положении (главном меню) отображаются следующие данные:

  • текущее время (часы, минуты, секунды);
  • текущая температура в градусах Цельсия;
  • текущая дата (число, месяц, год);
  • текущие режимы (Р — расписание; Ц — цикл; Т — термостат;).

2

Режим отображения данных в главном меню

3

Отображение режимов для настройки

4

5

6

В настройке задаем сколько секунд добавить или отнять в сутки или в неделю.

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