Mail to Author Main page

Пульт дистанционного управления

Пульт дистанционного упраления (ПДУ) предназначен для управления рядом устройств по принципу частотного разделения команд. Это значит, что каждой команде, формируемой ПДУ , соответствует своя излучаемая частота. Так в рассматриваемом варианте имеется четыре команды и соответсвующие им частоты равны 2, 7, 12 и 17 кГц. Приемное устройство содержит полосовой фильтр и интегрирующую цепочку с постоянной времени около 0,3 с, что позволяет при поступлении сигнала с частотой, например, 2 кГц и длительностью 1 с распознать команду 1. Рассматриваемый способ наверное самый неэкономичный и нерациональный, но рассматривается вследствие наличия нескольких экземпляров приемных устройств. Такую систему удобно применить для управления домашними устройствами в каждой комнате при их количестве до четырех, например: люстра, бра 1, бра 2 и привод штор.

После длительных попыток разработать компактную схему, было решено обратиться к микроконтроллеру PIC16F84A для разработки программы и в последствии переноса ее на более мелковыводный контроллер, например с 8-ю ногами. Сразу был принят для разработки PIC16F84A, поскольку мелковыводного не было под руками. Слева на рисунке представлена макетная плата, в качестве излучателя использовался наушник для визуального контроля работы схемы. Ниже приведены три варианта реализации ПДУ - генераторов прямоугольных импульсов на 4 фиксированных частоты.


Вариант 1. Наверное самый простой в плане программирования контроллера, но имеет один недостаток по сравнению со следующими вариантами - наличие 4 диодов, которые занимают лишнее место. Зато алгоритм работы контроллера наиболее простой, а поскольку это первый опыт автора работы с микроконтроллерами, то он рассматривается наравне с другими. Слева приведена схема первого варианта. При ненажатых кнопках питание на микроконтроллер не подается, чем обеспечивается минимальное энергопотребления, хотя в режиме SLEEP потребления контроллера доли микроампера, что несравнимо с десятками миллиампер для ИК-светодиодов, но все ж...

Время выдачи сигнала зависит от времени удержания кнопки в нажатом состоянии - пока нажата, контроллер генерирует частоту.

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

Единственное замечание - напряжение на любой ножке портов должно непревышать по абсолютному значению питающее напряжение более чем на 0,3 В (DS35007B p.34), а посему падение напряжения на диодах не должно быть более 0,3 В. Ниже приведен код программы.

LIST p= 16f84a
#INCLUDE <p16f84a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
org 0
FREQUENCY equ 0x0C
bcf STATUS,5 ;bank 0
clrf PORTA
clrf PORTB
bsf STATUS,5 ;bank 1
movlw 0x00
movwf TRISA ;all ports A on output
movlw B'11110000'
movwf TRISB ;RB<4:7> on inputs
bcf STATUS,5 ;bank 0
btfsc PORTB,4 ;check button 1
goto FREQ_1
btfsc PORTB,5 ;check button 2
goto FREQ_2
btfsc PORTB,6 ;check button 3
goto FREQ_3
btfsc PORTB,7 ;check button 4
goto FREQ_4
goto END_LABEL ;if none of the buttons not pushed then end of interrupt
FREQ_1
movlw 0x52 ;cofficient for 2 kHz
goto MAIN
FREQ_2
movlw 0x17 ;cofficient for 7 kHz
goto MAIN
FREQ_3
movlw 0x0D ;cofficient for 12 kHz
goto MAIN
FREQ_4
movlw 0x09 ;cofficient for 17 kHz
goto MAIN
MAIN
movwf FREQUENCY ;put cofficient to W
LABEL1
decfsz FREQUENCY
goto LABEL1 ;make the half of period
comf PORTA,1 ;invert the port
goto MAIN
goto END_LABEL
END_LABEL
end

Вариант 2. Вариант, схема которого наиболее проста. Вместо диодов предыдущей схемы содержит резисторы R4-R7, однако при правильной разводке платы думаю они не понадобятся. Контроллер постоянно находится под напряжением питания, но в режиме пониженного энергопотребления и просыпается только при нажатии кнопок и выдав 2 с необходимой частоты, вновь засыпает. Работа программы основана на обработке прерывания по изменению состояний порта В контроллера.

В начале программы происходит инициализация управляющих регистров микроконтроллера, затем он переходит в режим SLEEP. При нажатии любой из кнопок, состояние соответствующей ножки порта изменяется и вызывается прерывание. При обработке прерывания определяется номер нажатой кнопки и в аккумулятор загружается соответствующая необходимой частоте константа. Далее, как и в предыдущем случае, запускается цикл для получения необходимой последовательности единиц и нулей на выводах порта А. При этом в начале обработки прервыания происходит инициализация таймера TMR0 микроконтроллера и в процессе прокручивания цикла постоянно проверяется факт переполнения счетчика. При коэффициенте деления предделителя 1:256 счетчик переполняется один раз в 65,5 мс при кварце 4 Мгц, поэтому для выдержки прокручивания цикла в 2 секунды необходимо 35 переполнений таймера. При 35 переполнениях цикл прерывается и микроконтроллер засыпает до следующего нажатия кнопок.

LIST p= 16f84a
#INCLUDE
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
org 0
goto START
org 4
bsf STATUS,5 ;bank 0
movlw B'10000111' ;TMR0, prescaller 1:256
movwf OPTION_REG
bcf STATUS,5 ;bank 1
movlw 0xFF ;anti-flutter
movwf REG ;anti-flutter
DELAY
decfsz REG ;anti-flutter
goto DELAY ;anti-flutter
movlw 0x23 ;dec 35
movwf REG
btfsc PORTB,4 ;check button 1
goto FREQ_1
btfsc PORTB,5 ;check button 2
goto FREQ_2
btfsc PORTB,6 ;check button 3
goto FREQ_3
btfsc PORTB,7 ;check button 4
goto FREQ_4
goto END_INTR ;if none of the buttons not pushed then end of interrupt
FREQ_1
movlw 0x52 ;cofficient for 2 kHz
goto MAIN
FREQ_2
movlw 0x17 ;cofficient for 7 kHz
goto MAIN
FREQ_3
movlw 0x0D ;cofficient for 12 kHz
goto MAIN
FREQ_4
movlw 0x09 ;cofficient for 17 kHz
goto MAIN
MAIN
movwf FREQUENCY ;put cofficient to W
LABEL1
decfsz FREQUENCY
goto LABEL1 ;make the half of period
comf PORTA,1 ;invert the port
btfss INTCON,2 ;checking of timer overflow
goto MAIN ;no overflow
bcf INTCON,2 ;clear overflow flag
decfsz REG ;decreaze number of timer overflow,
goto MAIN ;define duration of output signal
goto END_INTR
END_INTR
bcf INTCON,RBIF ;clear interruption flag
retfie
START
FREQUENCY equ 0x0C
REG equ 0x0D
bcf STATUS,5 ;bank 0
clrf PORTA
clrf PORTB
bsf STATUS,5 ;bank 1
movlw 0x00
movwf TRISA ;all ports A on output
movlw B'11110000'
movwf TRISB ;RB<4:7> on inputs
movlw B'10000111' ;TMR0, prescaller 1:256
movwf OPTION_REG
bcf STATUS,5 ;bank 0
movlw B'10001000' ;enable RB-change interrupts
movwf INTCON
sleep
end

Вариант 3. Вариант, схема которого дополнена элементами R2, R3 и С4. Эти элементы позволяют аппаратным путем регулировать время выдачи сигнала команды.

Работа программы основана на тех же принципах, что и описанные выше, за исключением формирования выдержки времени сигнала. Для ее реализации применен следующий алгоритм: вывод RA1 устанавливается в единичное состояние, напряжение на выводе соответсвует лог. 1 и происходит заряд конденсатора С4, резистор R2 ограничивает ток зарядки до максимально возможного для микроконтроллера. Перед циклом генерации вывод переключается на вход и во время цикла постоянно проверяется его состояние. В то время как RA1 стал входом, происходит разряд конденсатора С2 на резистор R3 и через время равное трем постоянным времени R3C4 он разрядится, когда проверка состояния входа RA1 покажет что на нем лог. 0 будет произведен выход из прерывания и микроконтроллер перейдет в состояние SLEEP.

Главное достоинство такой схемы по сравнению с приведенными выше - это, как было сказано выше - возможность аппаратно влиять на длительность сигнала не вмешиваясь в код программы.

 

LIST p= 16f84a
#INCLUDE
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
org 0
goto START
org 4
bsf PORTA,1 ;set POTRA<1>
movlw 0xFF
movwf REG ;anti-flutter
DELAY
decfsz REG ;anti-flutter
goto DELAY ;anti-flutter
btfsc PORTB,4 ;check button 1
goto FREQ_1
btfsc PORTB,5 ;check button 2
goto FREQ_2
btfsc PORTB,6 ;check button 3
goto FREQ_3
btfsc PORTB,7 ;check button 4
goto FREQ_4
goto END_INTR ;if none of the buttons not pushed then end of interrupt
FREQ_1
movlw 0x52 ;cofficient for 2 kHz
goto MAIN
FREQ_2
movlw 0x17 ;cofficient for 7 kHz
goto MAIN
FREQ_3
movlw 0x0D ;cofficient for 12 kHz
goto MAIN
FREQ_4
movlw 0x09 ;cofficient for 17 kHz
goto MAIN
MAIN
movwf FREQUENCY ;put cofficient to W
bsf STATUS,5 ;bank 1
bsf TRISA,1 ;set PORTA<1> as input
bcf STATUS,5 ;bank 0
LABEL1
decfsz FREQUENCY
goto LABEL1 ;make the half of period
comf PORTA,1 ;invert the port
btfsc PORTA,1 ;checking value of PORTA<1>
goto MAIN ;if PORTA<1> set
goto END_INTR ;if PORTA<1> clear
END_INTR
bcf INTCON,RBIF ;clear interruption flag
bsf STATUS,5 ;bank 1
bcf TRISA,1 ;set PORTA<1> as output
bcf STATUS,5 ;bank 0
clrf PORTA

retfie
START
FREQUENCY equ 0x0C
REG equ 0x0D
bcf STATUS,5 ;bank 0
clrf PORTA
clrf PORTB
bsf STATUS,5 ;bank 1
movlw 0x00
movwf TRISA ;all ports A on output
movlw B'11110000'
movwf TRISB ;RB<4:7> on inputs
bcf STATUS,5 ;bank 0
movlw B'10001000' ;enable RB-change interrupts
movwf INTCON
sleep

end

Далее предполагается перевод программы на восьминогий микроконтроллер, например PIC12F629, это позволит уменьшить габариты, снизить стоимость (восьминогий стоит раза в 2 меньше F84A), у 629-го есть встроенный RC-генератор на 4 МГц, что вполне приемлемо (плюс освобождаются две ноги кварцевого генератора). Таким образом две ноги тратится на питание, одна на выход на ИК светодиод, 4 на подключение кнопок и одна, если нужно, на подключение RC-цепи.

Вот и схема на восьминогом контроллере. За счет внутреннего генератора на 4 МГц не требуется внешнего кварца, также были использованы pull-up резисторы, которые позволили избавиться от резисторов в цепи кнопок. Один все же остался но это вынужденная необходимость - на порту GP3 подтягивающего резистора нет. Была переписана программа под контроллер PIC12F629. Был подключен ключ на транзисторе КП505Г и ИК-светодиод. Это, вероятно, окончательная схема пульта дистанционного управления. Ниже приведен программный код.

Емкость конденсатора С2 - 220 мкФ. Резисторы - для поверхностного монтажа.







LIST p= 12f629
#INCLUDE <p12f629.inc>
org 0
goto START
org 4
movlw 0x23 ;dec 35
movwf REG
btfss GPIO,5 ;check button 1
goto FREQ_1
btfss GPIO,4 ;check button 2
goto FREQ_2
btfss GPIO,3 ;check button 3
goto FREQ_3
btfss GPIO,2 ;check button 4
goto FREQ_4
goto END_INTR ;if none of the buttons not pushed then end of interrupt

FREQ_1
movlw 0x61 ;cofficient for 2 kHz
goto MAIN
FREQ_2
movlw 0x1B ;cofficient for 7 kHz
goto MAIN
FREQ_3
movlw 0x0F ;cofficient for 12 kHz
goto MAIN
FREQ_4
movlw 0x0A ;cofficient for 17 kHz
MAIN
movwf FREQUENCY ;put cofficient to FREQUENCY
LABEL11
decfsz FREQUENCY
goto LABEL11 ;make the half of period
comf GPIO,1 ;invert the port
btfss INTCON,2
goto MAIN
bcf INTCON,2 ;clear overflow flag
decfsz REG ;decreaze number of timer overflow,
goto MAIN
goto END_INTR
END_INTR
bcf INTCON,0 ;clear interruption flag
retfie
START
FREQUENCY equ 0x20
REG equ 0x21
bcf STATUS,5 ;bank 0
clrf GPIO ;clear IO-port
clrf PIR1 ;all interrupt flags are cleared
movlw 0x07
movwf CMCON ;comparator is disabled
bsf STATUS,5 ;bank 1
movlw 0x00
movwf PIE1 ;all peripheral interruptions are disabled
movlwB'00111110'
movwf WPU ;GP<1:5> pull-up is enabled
movwf IOC ;GP<1:5> interrupt is enabled
movlwB'11111110' ;GP<5:1> are inputs,GP<0> is outputs
movwf TRISIO
andwf GPIO,0
movlw B'01000111'
movwf OPTION_REG
movlw B'10001000'
movwf INTCON ;interruption from GP is enabled, others are disabled.
bcf STATUS,5 ;bank 0
sleep
end
Внешний вид платы пульта

2005©Electricianman



Сайт управляется системой uCoz