Расчет системы подачи звонков на основе МК 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-Layout:

Рисунок 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 г. Никаких недостатков или  трудностей выявлено не было. 
 
 

Расчет системы подачи звонков на основе МК AVR