Расчет системы подачи звонков на основе МК AVR
Часть 1 – Теоретическая
Целью данного
курсового проекта является создание
системы, способной автоматически
давать звонки по заданному расписанию.
Часть 2 – Выбор элементов, расчет электрических соединений, разводка платы
Предполагается использовать:
Atmel AVR Mega48 P – 1 шт.
Кварцевый резонатор на 32768 гц – 1 шт.
Выходной каскад – твердотельное реле КП 17Р
Резистор – 1 шт.
Рисунок 1 – схема КП17Р
Входной ток Iвх 5-25 мА
Входное напряжение
Uвх 1.1 - 1.8 В
Параметры выходного каскада аврки:
Ic= -20mA, VCC = 5V
Зададимся напряжением включения в 1,5 В при токе 20 мА. Для того, чтобы не спалить оптопару последовательно к ней включим резистор номиналом
R=(5-1,5)В/0,02 A = 175 Ом
Сделаем разводку
платы в программе Sprint-
Рисунок 2 – Разводка платы в программе SL и распиновка нашего микроконтроллера
Размер
платы – 27x40 мм, дорожки толщиной по
0,65 мм – легко травить методом лазерного
утюга.
Часть 3 – Программная
Необходимо изменить Fuse биты МК, отвечающие за источник тактового сигнала. Согласно даташиту - CKSEL3..0 = 0100 для кварца в 32768 гц.
Это делается из любой подходящей среды (avrdude\avrstudio\etc).
Пин
PC0 подтягивается резистором на 400 Ом к
земле, так же он подключен к кнопке на
корпусе устройства, которая ведет к +5В.
Служит эта кнопка для сброса времени
на 8 часов 00 мин 00 сек.
Далее разработаем прошивку для нашего микроконтроллера:
#include "m48pdef.inc"
rjmp start ; Reset Handler
rjmp start ; IRQ0 Handler
rjmp start ; IRQ1 Handler
rjmp start ; PCINT0 Handler
rjmp start ; PCINT1 Handler
rjmp start ; PCINT2 Handler
rjmp start ; Watchdog Timer Handler
rjmp start ; Timer2 Compare A Handler
rjmp endl ; Timer2 Compare B Handler
rjmp endl
rjmp endl ; Watchdog Timer Handler
rjmp endl ; PCINT0 Handler
rjmp endl ; PCINT1 Handler
rjmp endl ; PCINT2 Handler
rjmp timer_sec ; Watchdog Timer Handler
rjmp timer_sec ; A
rjmp timer_sec; B
rjmp timer_sec; OF
//rjmp endl
timer_sec: // Это обработчик прерывания таймера, вызывается раз в секунду
in r22,sreg
push r22
mov r22, r1
inc r22
mov r1,r22
ldi r21,0xFF //был ли начат звонок?
cp r21,r24
brne nex1
ldi r23,0x03
cp r1,r23 // Прошло 3 секунды?
brne nex1
clr r24
out pind, r24 //Отключаем звонок
out portd, r24
nex1:
ldi r17, 0x3c //60 секунд?
cp r1,r17
brne n11
clr r1 //0 секунд +1 минута
inc r2
n11:
ldi r17, 0x3c //60 минут?
cp r2,r17
brne n22
clr r2 //0 минут +1 час
inc r3
n22:
ldi r17, 0x18 //24 часа?
cp r3,r17
brne r33
clr r3 // 00 часов
r33:
//Далее идет сравнение текущего времени с временем начала звонка, в случае совпадения вызывается ф-ция zvonokbeg1
ldi r17,0x08
cp r17,r3
brne not1
clr r17
cp r17,r2
brne not1
cp r17,r1
brne not1
rcall zvonokbeg1 // 8:00
not1:
ldi r17,0x08
cp r17,r3
brne not2
ldi r17,0x2D
cp r17,r2
brne not2
clr r17
cp r17,r1
brne not2
rcall zvonokbeg1 // 8:45
not2:
ldi r17,0x08
cp r17,r3
brne not3
ldi r17,0x32
cp r17,r2
brne not3
clr r17
cp r17,r1
brne not3
rcall zvonokbeg1 // 8:50
not3:
ldi r17,0x09
cp r17,r3
brne not4
ldi r17,0x23
cp r17,r2
brne not4
clr r17
cp r17,r1
brne not4
rcall zvonokbeg1 // 9:35
not4:
ldi r17,0x09
cp r17,r3
brne not5
ldi r17,0x2D
cp r17,r2
brne not5
clr r17
cp r17,r1
brne not5
rcall zvonokbeg1 // 9:45
not5:
ldi r17,0x0A
cp r17,r3
brne not6
ldi r17,0x1E
cp r17,r2
brne not6
clr r17
cp r17,r1
brne not6
rcall zvonokbeg1 // 10:30
not6:
ldi r17,0x0A
cp r17,r3
brne not7
ldi r17,0x23
cp r17,r2
brne not7
clr r17
cp r17,r1
brne not7
rcall zvonokbeg1 // 10:35
not7:
ldi r17,0x0B
cp r17,r3
brne not8
ldi r17,0x14
cp r17,r2
brne not8
clr r17
cp r17,r1
brne not8
rcall zvonokbeg1 // 11:20
not8:
ldi r17,0x0B
cp r17,r3
brne not9
ldi r17,0x1E
cp r17,r2
brne not9
clr r17
cp r17,r1
brne not9
rcall zvonokbeg1 // 11:30
not9:
ldi r17,0x0C
cp r17,r3
brne not10
ldi r17,0x0F
cp r17,r2
brne not10
clr r17
cp r17,r1
brne not10
rcall zvonokbeg1 // 12:15
not10:
ldi r17,0x0C
cp r17,r3
brne not11
ldi r17,0x14
cp r17,r2
brne not11
clr r17
cp r17,r1
brne not11
rcall zvonokbeg1 // 12:20
not11:
ldi r17,0x0D
cp r17,r3
brne not12
ldi r17,0x05
cp r17,r2
brne not12
clr r17
cp r17,r1
brne not12
rcall zvonokbeg1 // 13:05
not12:
ldi r17,0x0D
cp r17,r3
brne not13
ldi r17,0x1E
cp r17,r2
brne not13
clr r17
cp r17,r1
brne not13
rcall zvonokbeg1 // 13:30
not13:
ldi r17,0x0E
cp r17,r3
brne not14
ldi r17,0x0F
cp r17,r2
brne not14
clr r17
cp r17,r1
brne not14
rcall zvonokbeg1 // 14:15
not14:
ldi r17,0x0E
cp r17,r3
brne not15
ldi r17,0x14
cp r17,r2
brne not15
clr r17
cp r17,r1
brne not15
rcall zvonokbeg1 // 14:20
not15:
ldi r17,0x0F
cp r17,r3
brne not16
ldi r17,0x05
cp r17,r2
brne not16
clr r17
cp r17,r1
brne not16
rcall zvonokbeg1 // 15:05
not16:
ldi r17,0x0F
cp r17,r3
brne not17
ldi r17,0x0F
cp r17,r2
brne not17
clr r17
cp r17,r1
brne not17
rcall zvonokbeg1 // 15:15
not17:
ldi r17,0x10
cp r17,r3
brne not18
ldi r17,0x00
cp r17,r2
brne not18
clr r17
cp r17,r1
brne not18
rcall zvonokbeg1 // 16:00
not18:
ldi r17,0x10
cp r17,r3
brne not19
ldi r17,0x05
cp r17,r2
brne not19
clr r17
cp r17,r1
brne not19
rcall zvonokbeg // 16:05
not19:
ldi r17,0x10
cp r17,r3
brne not151
ldi r17,0x32
cp r17,r2
brne not151
clr r17
cp r17,r1
brne not151
rcall zvonokbeg // 16:50
not151:
ldi r17,0x11
cp r17,r3
brne not152
ldi r17,0x00
cp r17,r2
brne not152
clr r17
cp r17,r1
brne not152
rcall zvonokbeg // 17:00
not152:
ldi r17,0x11
cp r17,r3
brne not153
ldi r17,0x2D
cp r17,r2
brne not153
clr r17
cp r17,r1
brne not153
rcall zvonokbeg // 17:45
not153:
ldi r17,0x11
cp r17,r3
brne not154
ldi r17,0x32
cp r17,r2
brne not154
clr r17
cp r17,r1
brne not154
rcall zvonokbeg // 17:50
not154:
ldi r17,0x12
cp r17,r3
brne not155
ldi r17,0x23
cp r17,r2
brne not155
clr r17
cp r17,r1
brne not155
rcall zvonokbeg // 18:35
not155:
ldi r17,0x12
cp r17,r3
brne not1541
ldi r17,0x2D
cp r17,r2
brne not1541
clr r17
cp r17,r1
brne not1541
rcall zvonokbeg // 18:45
not1541:
ldi r17,0x13
cp r17,r3
brne not1542
ldi r17,0x1E
cp r17,r2
brne not1542
clr r17
cp r17,r1
brne not1542
rcall zvonokbeg // 19:30
not1542:
ldi r17,0x13
cp r17,r3
brne not1543
ldi r17,0x23
cp r17,r2
brne not1543
clr r17
cp r17,r1
brne not1543
rcall zvonokbeg // 19:35
not1543:
ldi r17,0x14
cp r17,r3
brne not1544
ldi r17,0x14
cp r17,r2
brne not1544
clr r17
cp r17,r1
brne not1544
rcall zvonokbeg // 20:20
not1544:
pop r21
ldi r19,0x80
or r19,r21
out sreg, r19
reti
zvonokbeg1:
//звоним
ldi r23, 0x01
out portd, r23
ser r24
ret
start: //точка входа в программу
cli
ldi r17, 0x02
out spl, r17
out sph, r17 // жахнули поинтер на стэк
// запретили прерывания к чортям
clr r17
out EIMSK, r17
ldi r17,0x00
out TCCR0A, r17 //после 32 тыс тактов вызываем прерывание
ldi r17,0x04 //делим на 256, каждые 128 по 256 вызываем прерывание
out TCCR0B, r17
ldi r17, 0x05
sts TIMSK0, r17
ldi r17, 0x7F
out OCR0B, r17
ldi r23, 0x01
out ddrd, r23
ldi r23, 0x00
out portd, r23
ldi r17, 0x80
out sreg, r17 //приривания Пщель!
sei
endl:
nop //В случае если нажата кнопка, сбрасываем время на 8:00
in r11, pind
ldi r18, 0x02
and r11,r18
clr r18
cp r11,r18
breq neep
nop
ldi r17, 0x3B
mov r1,r17
mov r2,r17
ldi r17, 0x07
mov r3, r17
//clr r17
//out pinc, r17
neep:
rjmp endl
rjmp endl
nop
zvonokbeg:
nop
//звоним
//Устанавливаем выходной пин PIND1 в 5 В, Взводим флаг начала звонка
ldi r23, 0x01
out portd, r23
ser r24
ret
Часть 4 - Отладка
Предлагается
использовать электромагнитное реле в
выходном каскаде, т.к. потребляемый звонками
ток превышает 300 мА. Для этого
выходной каскад оптопары подключаем
последовательно к обмотке реле и источнику
питания (12 Вольт). Нормально разомкнутые
контакты реле подключаем параллельно
кнопке звонка. Так же следует сделать
двухпозиционный выключатель, служащий
для отключения контакта реле от выходного
каскада. Это позволит не отключать устройство
в случае наступления выходных\праздников\каникул.
Часть 5 - Заключение
Мы получили устройство, дающее звонки по расписанию. Максимальная мощность нагрузки которого составляет 1,1 кВт. Точность устройства определяется точностью используемого кварцевого резонатора, используемого в качестве источника тактовых сигналов. Т.к. кварцевый резонатор взят из часов, то устройство дает погрешность +\- 1 сек в сутки, что не критично для заданного процесса. Если на основе данной схемы предполагается собирать другие устройства, более критичные ко времени срабатывания, можно использовать кварцевый резонатор\стабилизатор с тепловой стабилизацией частоты.
Данное
устройство введено в эксплуатацию
1.10.11 г. Никаких недостатков или
трудностей выявлено не было.