Всем знакома такая ситуация: открываешь дверь в темном помещении и судорожно ищешь кнопку выключателя что бы зажечь свет… Или наоборот, уютно устроившись в теплом кресле, начинаешь дремать, и так не охота вставать и выключать свет…
А если снабдить выключатель специальной приставкой, то достаточно всего лишь хлопнуть в ладоши и свет погаснет сам. Идея такого автомата не нова. Я лишь попытался сделать его компактным и легко повторяемым.
В основе автомата-приставки микроконтроллер серии Microchip – PIC12F629. Аналоговая часть – усилитель звуковой частоты и исполнительная цепь – ключевой транзистор и реле, коммутирующее питание нагрузки. В качестве реле я использовал TRM3003 на 110 В с гасящим резистором (R8)16 kOm (2 Вт). Устройство питается от параметрического стабилизатора, собранного на стабилитроне и сглаживающих пульсации конденсаторах.
Устройство работает так: в режиме ожидания на порту GP0 микроконтроллера присутствует лог. «1», а на порту GP2 – лог. «0». Таким образом аналоговая часть работает в режиме усилителя звуковой частоты. Сигнал от пьезоэлемента подается на базу первого транзистора КТ3102Б. Смещение на базу подается через резистор 3,3 М. С коллекторной нагрузки первого транзистора сигнал через развязывающую емкость подается на базу второго транзистора обратной структуры. Его база приоткрыта резистором 2 М. С коллекторной нагрузки второго транзистора усиленный сигнал подается через емкость 510 пФ на порт GP1 контроллера. Резистор 20 К совместно с емкостью выполняет роль дифференцирующей цепочки, что снижает реакцию усилителя на посторонние шумы.
При поступлении громкого сигнала свиста либо хлопка в ладоши на выходе усилителя появляется напряжение, которое поступает на порт GP1 контроллера. Контроллер «просыпается», изменяет напряжения на порту GP0 на противоположные, а через порт GP2 начинает генерировать сигнал звуковой частоты – пакеты длительностью 200 mS, заполненные частотой 5000 Гц, с интервалами в 100 mS. Это своего рода сигнал о том, что команда принята. Всего 3 пакета общей длительностью около 1 S. Затем на GP5 формируется лог.«1» и включается нагрузка. Наличие диода в базовоколлекторном переходе первого транзистора позволяет сигналу проходить через пьезоизлучатель. Диод необходимо подобрать по наименьшему сопротивлению в прямом состоянии, в этом случае сигнал будет звучать громче.
Устройство питается от сети 220 В. Напряжение выпрямляется 2-хполупериодным выпрямителем и гасится на резисторе 100 кОм, далее стабилизируется стабилитроном КС 106 Б.
О программе: в контроллере задействован внутренний тактовый генератор на 4 МГц. В режиме ожидания контроллер находится в спящем состоянии и потребляет ток примерно 4 мкА, не считая потребления от портов питания усилителя и ключевого транзистора. В общем, суммарный ток потребления в режиме ожидания не превышает 100 мкА. В программе реализовано прерывание по изменению состояния порта GP1. Сразу после пробуждения и сброса флага прерывания от порта, запрещаются дальнейшие прерывания от порта, изменяется уровень логики на GP0 и начинается генерация частотнозаполненных пакетов. Пакеты формируется посредством простых циклов. После окончания формирования звуковых пакетов контроллер включает нагрузку, устанавливает первоначальное состояние на портах питания усилителя, разрешает прерывания от GP1 и уходит в сон… Последующая подача сигнала в виде хлопка и свиста повторяет алгоритм и приводит к выключению нагрузки.
Основные моменты программы
Для разрешения прерываний от периферии необходимо настроить регистр INTCON.
Это можно сделать сразу в подпрограмме инициализации:
MOVLW B’10001000′
MOVWF INTCON ; разрешаем глобальные прерывания и прерывания от портов
Здесь установлен быт разрешения глобальных прерываний и прерываний от портов
Непосредственно разрешить прерывания от конкретного порта можно в регистре IOCB.
Нужно, при этом, помнить что IOCB находится в первом банке памяти!
START_
BSF GPIO,0 ; УСТ. В «1»
BCF GPIO,2 ; УСТ. В «0»
BSF STATUS, RP0 ; банк 1
bsf IOCB,1 ; вкл. прервывание от GP1
BCF STATUS, RP0 ; банк 0
;******************ОЖИДАНИЕ******************
SLEEP
NOP
;********************ОТВЕТ*******************
BSF STATUS, RP0 ; банк 1
bcf IOCB,1 ; выкл. прервывание от GP1
BCF STATUS, RP0 ; банк 0
BCF GPIO,0 ; УСТ. В «0»
Программа устанавливает GP0 в «1», GP2 в «0», т.е. включает аналоговую часть устройства в режим микрофона, разрешает прерывания от порта GP1 и уходит в сон.
При пробуждении от прерывания программа запрещает прерывание от GP1 и устанавливает на GP0 «0», т.е. отключает питание усилителя.
Вход в прерывание
; ВХОД В ПРЕРЫВАНИЕ ОТ ПОРТОВ
PER
MOVF GPIO,0
BCF INTCON,0 ; сбросим флаг прерывания от портов
RETFIE
Необходимо выполнить чтение порта, чтобы исключить несоответствие и сбросить флаг прерывания.
Генерирование сигнала (отклик брелка)
Происходит чисто программно, без использования прерываний. Задержки формируются посредством вложенных циклов. Цикл реализованный на переменной «TEMP» формирует задержку, равную половине периода частоты 500 Гц (т.е. 1 миллисекунда). После выполнения задержки порт GP2 изменяет свое состояние на противоположное и т.д…
Цикл реализованный на переменных «TEMP1» и «TEMP2» формирует повторение внутреннего цикла на «TEMP» в течении 200 миллисекунд.
;**********СИГНАЛ 5000 Гц (100 mS)***********
MOVLW .9
MOVWF TEMP1
MOVLW .10
MOVWF TEMP2
MOVLW .30
MOVWF TEMP
DECFSZ TEMP
GOTO $-1
BTFSS GPIO,2 ; ЕСЛИ ПОРТ В «0»
GOTO $+2
GOTO $+3
BSF GPIO,2 ; УСТ. В «1»
GOTO $+2
BCF GPIO,2 ; УСТ. В «0»
DECFSZ TEMP2
GOTO $-.11
DECFSZ TEMP1
GOTO $-.13
;******************************************
Пауза формируется все теми же вложенными циклами:
;*************ПАУЗА (100 mS)***************
MOVLW .200
MOVWF TEMP1
MOVLW .170
MOVWF TEMP2
DECFSZ TEMP2
GOTO $-1
DECFSZ TEMP1
GOTO $-5
;******************************************
Объединив оба блока (звук + пауза) в один и задав количество повторений через переменную «TEMP3» равную 3 получаем:
;**********ЦИКЛ ПОВТОРА — 3 РАЗ***********
MOVLW .10
MOVWF TEMP3
;**********СИГНАЛ 5000 Гц (100 mS)***********
MOVLW .9
MOVWF TEMP1
MOVLW .10
MOVWF TEMP2
MOVLW .30
MOVWF TEMP
DECFSZ TEMP
GOTO $-1
BTFSS GPIO,2 ; ЕСЛИ ПОРТ В «0»
GOTO $+2
GOTO $+3
BSF GPIO,2 ; УСТ. В «1»
GOTO $+2
BCF GPIO,2 ; УСТ. В «0»
DECFSZ TEMP2
GOTO $-.11
DECFSZ TEMP1
GOTO $-.13
;******************************************
;*************ПАУЗА (100 mS)***************
MOVLW .200
MOVWF TEMP1
MOVLW .170
MOVWF TEMP2
DECFSZ TEMP2
GOTO $-1
DECFSZ TEMP1
GOTO $-5
;******************************************
DECFSZ TEMP3
GOTO $-.27
Таким образом будет сформирован прерывистый звуковой сигнал частотой 500 Гц, длительностью 200 миллисекунд с интервалом следования 100 миллисекунд. Всего 10 пакетов. Общей длительностью: (0,2+0,1)х3 = 0,9 секунды
Далее следует блок, включающий или выключающий нагрузку:
;************ВКЛ./ОТКЛ. нагрузку***********
BTFSS GPIO,5 ; ЕСЛИ ПОРТ В «0»
GOTO $+2
GOTO $+3
BSF GPIO,5 ; УСТ. В «1»
GOTO $+2
BCF GPIO,5 ; УСТ. В «0»
;******************************************
Переключение состояния порта происходит по принципу: если был «0» — установить «1», если был «1» — установить «0». Я называю такой принцип переключения – триггерным.
При повторении устройства крайне важно подобрать транзисторы по наибольшему коэффициенту усиления: КТ3102 – не менее 500, КТ3107 – не менее 1000. Допускается использовать любые другие маломощные низкочастотные транзисторы с подобными коэффициентами усиления. Наладка устройства сводится к подбору резисторов смещения на базы усилительных каскадов по наибольшему усилению сигнала.
Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот
МК PIC 8-битPIC12F6291
Биполярный транзисторКТ3102Б1
Биполярный транзисторКТ3102Е1
Биполярный транзисторKSE130031
СтабилитронКС106Б1
ДиодКД512А1
Выпрямительный диод1N40075
R*
Резистор16 кОм1
Резистор100 кОм1
Резистор10 кОм1
Резистор3.3 МОм1
Резистор100 кОм1
Резистор2 МОм1
Резистор47 кОм1
Резистор20 кОм1
Конденсатор100 мкФ х 6 В1
Конденсатор100 нФ1
Конденсатор1000 пФ1
Конденсатор510 пФ1
Пьезоизлучатель1
РелеTRM 30031
Добавить все
Скачать список элементов (PDF)
Прикрепленные файлы:
- Avtomat_svist.asm (4 Кб)
- Avtomat_svist.HEX (1 Кб)