Пожарная сигнализация на микроконтроллере AVR ATmega8

В этой статье мы рассмотрим пожарную сигнализацию на микроконтроллере ATmega8 (семейство AVR) и датчике огня. Датчик огня может быть любого типа, мы в нашей схеме будем использовать инфракрасный датчик огня – он не отличается точностью, но зато он самый дешевый среди всех других подобных датчиков.

Пожарная сигнализация на микроконтроллере AVR ATmega8: внешний вид

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

Необходимые компоненты

Аппаратное обеспечение

Микроконтроллер ATmega8
Источник питания с напряжением 5 Вольт
Программатор AVR-ISP, USBASP или другой подобный
Сервомотор sg90
Конденсатор 100 нФ
Звонок (сирена)
Резистор 220 Ом
Резистор 1 кОм
Резистор 10 кОм
Кнопка

Программное обеспечение

Atmel Studio версии 6.1 (или выше)
Progisp или flash magic (необязательно)

Работа схемы

Схема устройства приведена на следующем рисунке.

Схема пожарной сигнализации на микроконтроллере AVR ATmega8

Вращать ось сервомотора на 180 градусов и потом обратно до 0 градусов с определенной задержкой мы будем с помощью широтно-импульсной модуляции (ШИМ, от англ. PWM – Pulse Width Modulation), присутствующей в микроконтроллере ATmega8. Чтобы повернуть ось сервомотора влево до конца нам нужна ШИМ с длительностью 1/18, а чтобы повернуть ось сервомотора от крайнего правого до крайнего левого положения, нам потребуется ШИМ с длительностью 2/18.

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

В микроконтроллере ATmega8 три ШИМ (PWM) канала могут быть задействованы на трех его контактах. На этих контактах мы можем использовать только выход ШИМ. Поскольку мы решили использовать PWM1 мы должны использовать ШИМ сигнал с контакта OC1 (PORTB 2-й контакт). Как показано на представленной схеме, мы соединяем сервомотор с контактом OC1A. В микроконтроллере ATmega8 из трех ШИМ каналов два 8-битные и один 16-битный. Мы в нашем примере будем использовать 16-битный канал.

В микроконтроллерах ATmega есть два способа генерации ШИМ:

  1. Фазовая (правильная) ШИМ.
  2. Быстрая ШИМ.

Мы будем использовать более простой способ – быстрый метод формирования ШИМ.

Сначала необходимо выбрать частоту ШИМ, которая будет зависеть от используемого приложения (применения). Мы выберем частоту 1 МГц без использования коэффициента деления предделителя. Коэффициент деления предделителя используется для того, чтобы получить нужную нам частоту. К примеру, если у нас частота кварцевого резонатора равна 8 МГц, то с использованием коэффициента деления предделителя, равного 8, мы можем получить нужную нам частоту 1 МГц. Коэффициент деления предделителя выбирается исходя из необходимой нам частоты. Если мы хотим получить больший период следования импульсов (то есть частота должна быть меньше), то нам следует использовать больший коэффициент деления предделителя.

Теперь чтобы получить частоту импульсов ШИМ 50 Гц мы должны установить соответствующие биты в регистре TCCR1B микроконтроллера. Состав битов данного регистра представлен на следующем рисунке.

Регистр управления таймером в микроконтроллере AVR

CS10, CS11, CS12 (желтый, YELLOW) – задают коэффициент деления предделителя счетного регистра таймера/счетчика. Таблица для установки данных битов представлена на следующем рисунке.

Биты установки коэффициента деления таймера в микроконтроллере AVR

Таким образом, чтобы задать коэффициент деления предделителя равный 1 необходимо установить бит CS10 в 1, а биты CS11 и CS12 – в 0.

RED (красный, WGM10-WGM13) – задают режим генерации ШИМ. Как следует из нижеприведенной таблицы для получения быстрой ШИМ мы должны WGM11, WGM12 и WGM12 установить в 1.

Биты установки режима генерации ШИМ в микроконтроллере AVR

Теперь мы знаем, что ШИМ – это сигнал с различными интервалами ON и OFF сигнала (различными продолжительностями включения). Для получения различных продолжительностей включения (отношение длительности импульса к периоду повторения) нам необходимо выбрать значение между 0 и 255 (от 0 до 2^8 поскольку мы используем 8 битную ШИМ). Допустим мы выбрали значение 180, это значит что счетчик начинает счет от 0 и когда он достигает значения 180, то отклик на выходе может быть приведен в действие (запустится триггер). Этот триггер может быть инвертирующим и неинвертирующим, соответственно можно получить инвертированный и неинвертированный ШИМ-сигнал. То есть выход ШИМ можно сконфигурировать таким образом, чтобы счет шел либо в прямом направлении (прямой счет), либо в обратном направлении (обратный счет). Этот выбор производится с помощью установки битов COM1A0 и COM1A1 (выделены зеленым цветом на рисунке выше).

Биты установки режима ШИМ (инвертированный, не инвертированный) в микроконтроллере AVR

Как следует из приведенной таблицы для необходимых нам параметров (сигнал сравнивается с граничным значением отсечки при нарастании, инвертированный ШИМ сигнал) нам необходимо установить COM1A0=1; COM1A1=1.

За установку того самого значения, которое задает различные продолжительности включения (отношение длительности импульса к периоду повторения), в микроконтроллере ATmega8 отвечает байт OCR1A (Output Compare Register 1A) – в нем сохраняется нужное нам значение от 0 до 255. Пример выбранного нами режима ШИМ (с инвертированием) показан на рисунке ниже. Таким образом, если мы запишем в OCR1A=180, то микроконтроллер будет изменять уровень сигнала на выходе когда счетчик досчитает до 180 (начиная с 0).

Принцип расчета скважности ШИМ в микроконтроллере AVR

OCR1A должен быть 19999-600 для 180 градусов и 19999-2400 для 0 градусов.

Исходный код программы на языке С (Си) с пояснениями

Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

#include <avr/io.h> // заголовок чтобы задействовать контроль данных на контактах
#define F_CPU 1000000 // задание тактовой частоты микроконтроллера
#include <util/delay.h> // заголовок чтобы задействовать функции задержки в программе
int main(void)
{
DDRB = 0xFF; //установка portb на вывод данных, выход PWM0 будет на контакте 3
DDRD = 0x00; // установка portd на ввод данных
// задание значений битов в регистре таймера
TCCR1A |=(1<<WGM11)|(1<<COM1A1)|(1<<COM1A0);
TCCR1B |=(1<<WGM12)|(1<<WGM13)|(1<<CS10);
ICR1 =19999;
while(1)
{
if (i<500)
{
OCR1A = 19999-600;// каждые 500 мс серво мотор будет поворачиваться на 180 градусов
}
i++;
_delay_ms(1);
if (bit_is_set(PIND,0))
{
PORTB|=(1<<PINB2); // если датчик огня обнаружил огонь включаем звонок
}
if (bit_is_clear(PIND,1)) // если кнопка нажата
{
PORTB&=~(1<<PINB2); // выключаем звонок
}

if ((i<1000)&&(i>500))
{
OCR1A = 19999-2400; // каждые 500 мс поворачивать серво мотор в положение 0 градусов
}
if (i==1000)
{
i=0;
}
} }

Видео, демонстрирующее работу схемы



Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *