Двухканальное устройство управления освещением (диммер) для бытового светильника
Регулятор яркости ламп накаливания: приоритетные требования к разработке. Долговечность, устойчивость к скачкам сетевого напряжения. Схема и принцип работы, управление. Диодный мост, блок питания, микроконтроллер. Защита от превышения сетевого напряжения.
Рубрика | Физика и энергетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 24.08.2012 |
Размер файла | 975,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
В ходе разработки выяснилось, что наибольшее влияние на колебание яркости оказывает включение мощной нагрузки при максимальном напряжении на лампе. Это позволило сделать вывод о том, что если обеспечить стабилизацию яркости для данного случая, то во всех других случаях стабилизация будет обеспечена автоматически.
Чтобы максимальная яркость оставалась неизменной при включении мощной нагрузки, максимальное напряжение на лампе должно быть изначально ограничено. За счёт образовавшейся разницы напряжений как раз и осуществляется стабилизация при уменьшении сетевого напряжения. Отсюда следует, что выбирать уровень максимального напряжения на лампе нужно как компромисс между максимальной яркостью и степенью её стабилизации.
Практическая проверка использованного алгоритма, выбранного компромиссного решения и методики подбора максимального напряжения показала, что при изменении напряжения сети в диапазоне от 198 до 242 В напряжение на лампе изменяется всего лишь на 1 В, что совершенно не заметно для глаза. Более того, при включении пылесоса мощностью 1,5 кВт, подсоединённого к тому же удлинителю, что и светильник, практически не заметно моргание лампы, работающей на полной яркости.
На основании полученных данных нетрудно оценить качество стабилизации количественно. Разница между максимальным и минимальным входным напряжением составляет 242 - 198 = 44 В. Если бы при изменении входного напряжения выходное оставалось неизменным, качество стабилизации составило бы 100%, т.е. было бы идеальным. Однако выходное напряжение изменяется на 1 В, отсюда 44 - 1 = 43 В. Для перевода этой разности в проценты, составим пропорцию: (43 100) / 44 = 97,73%. Округлив результат, получаем качество стабилизации на уровне 98%.
Полезно вспомнить, что снижение напряжения всего на 10% увеличивает срок службы лампы приблизительно в два раза, на 25% - в четыре раза [8]. И наоборот, повышение напряжения всего на несколько вольт сверх того, что указано на лампе, значительно сокращает её ресурс [10].
Чтобы выяснить, насколько оказалась уменьшена максимальная мощность лампы, необходимо узнать сопротивление её нити. Это можно сделать по формуле R = U2/P. Поскольку мощность лампы нормируется при напряжении 230 В (и это подтверждено экспериментально), сопротивление нити R = 2302/60 = 882 Ом. Тогда при напряжении 194 В мощность будет равна P = 1942/882 = 43 Вт, что ощутимо меньше исходных 60 Вт. По этой причине увеличивать допуск сетевого напряжения свыше ±10% нежелательно, т.к. в этом случае придётся ещё больше ограничить максимальное напряжение на лампе, что приведёт к ещё большему снижению её мощности.
С точки зрения стабилизации минимальная яркость не имеет ограничивающих факторов, т.к. промежуток времени, в течение которого лампа находится во включенном состоянии, невелик. За счёт получаемого в данном случае большого запаса по напряжению, для любого значения минимальной яркости обеспечивается отличная стабилизация во всём диапазоне напряжения сети. По этой причине выбор минимальной яркости - исключительно дело вкуса.
6. Настройка
Устройство не нуждается в настройке. Собранное безошибочно и из исправных деталей, оно должно начать работать сразу. При желании можно отрегулировать параметры, задаваемые пользователем, например, установить величину максимальной яркости.
Заключение
Недостатки
В дежурном режиме корпус устройства слегка нагревается от тепла, рассеиваемого балластным резистором.
Включение лампы происходит при напряжении в сети на 12 В выше нуля.
Большая ёмкость конденсатора фильтра и как следствие, задержка старта устройства при подключении к сети (около 4 секунд).
Нет полной уверенности в том, что транзистор не выйдет из строя в случае перегорания лампы при включенном канале.
Что можно добавить
Заменить кнопки энкодерами. С точки зрения эргономики последние предпочтительнее.
Добавить датчик освещённости, например на основе обычного светодиода. Попутно светодиод можно использовать как индикатор наличия напряжения питания. Если применить двух - или трёхцветный светодиод, можно отображать различные режимы работы устройства. Также светодиод можно использовать для подсветки органов управления. Наличие датчика освещённости позволит функции ИПХ работать только в тёмное время суток, устраняя напрасный расход электроэнергии в дневное время. Ещё одно применение фотодатчика - функция поддержания освещённости помещения на заданном уровне.
Реализовать плавное автоматическое включение в течение 30 минут через заданный интервал времени после выключения (имитация рассвета). Например, светильник выключается кнопкой в 24: 00. В 07: 30, когда зимой за окном ещё темно, он автоматически включается на минимальную яркость, и к 08: 00 достигает полной яркости. Такая условная имитация "восхода солнца" позволит организму адаптироваться к моменту просыпания, в том числе снизить или даже полностью исключить неприятную резь в глазах. Данная идея реализована в световом будильнике Philips HF3475.
Внедрить беспроводной интерфейс, например на основе модуля ZigBee, для оперативного изменения параметров настройки и обновления прошивки МК.
Уменьшить энергопотребление за счёт снижения напряжения питания схемы, скажем до 3,3 В. При этом, также уменьшится нагрев балластного резистора. Кроме того, можно перейти на более экономичные МК, такие как ATmega164PA, имеющие к тому же меньшее время записи EEPROM (правда, ток записи у них больше). Это позволит сократить время готовности устройства к работе после подключения к сети за счёт меньшей ёмкости фильтрующего конденсатора.
Устранить нагрев диодного моста, изменив схемотехнику выходного каскада. Вместо диодного моста применить схему из пары транзисторов с объединёнными истоками (на каждый канал).
Список литературы и полезные ссылки
Статьи:
1.А. Евсеев "Стабилизированный регулятор мощности" // Радио, 2002г., №4, стр. 36.
2.М. Марков "АЦП с интерфейсом RS-232" // Радио, 2005г., №2, стр. 26; файл ADC675. zip.
3. ГОСТ13109-97. Нормы качества электрической энергии в системах электроснабжения общего назначения.
4. G. Howell "Five questions about resistors" // EDN, 9/28/2006, http://www.edn.com/contents/images/6372835. pdf
5.П. Хоровиц, У. Хилл "Искусство схемотехники" - Изд. 6-е, М.: Мир, 2003.
6. "Characterization and Calibration of the ADC on an AVR" - Application Note AVR120, 02/06, Atmel Corporation, http://www.atmel.com/dyn/resources/prod_documents/doc2559. pdf
7. "The Eye's Response to Light" - Lutron Electronics, 8/97, http://www.lutron.com/product_technical/pdf/360-408. pdf
8. "Four Great Reasons to Dim" - Lutron Electronics, http://www.lutron.com/dim. htm
9. "Frequently asked questions about dimmers" // http://www.lutron.com/product_technical/faq. asp
10. "LEDs move from indication to illumination" // EDN, 8/2/2001 http://www.edn.com/contents/images/149134. pdf
11.Л.Н. Кечиев, Е.Д. Пожидаев "Защита электронных средств от воздействия статического электричества" - М.: ИД "Технологии", 2005.
Ссылки по теме:
1. Light dimmer circuits - http://www.epanorama.net/documents/lights/lightdimmer.html
2. Lamp Experimental Data - http://alumni. imsa.edu/~ejohnson/light/
3. Отечественный двухканальный диммер - http://eldigi.ru/site/house/28. php
4. Диммер 15-канальный - http://eldigi.ru/site/house/30. php
5. Диммер одноканальный - http://eldigi.ru/site/light/6. php
Приложение
Листинг основного функционального файла (Main. asm).
Main:
wdr
; ***********Обнаружение перехода сетевого напряжения через нуль*****************
clr Temp; Подготовка регистров, используемых в данной процедуре, а также в процедуре ADC_SAMPLING.
cpse Temp, rCh1OffTime; Если значение яркости канала равно нулю, то после обнаружения перехода фазы он не включится.
sbr rOutChannels, 1<<bChannel1
cpse Temp, rCh2OffTime
sbr rOutChannels, 1<<bChannel2
ldi ZL, LOW (cADCSamplesCount); Загрузка 16-ти разрядного счетчика преобразований АЦП
ldi ZH, HIGH (cADCSamplesCount); максимально допустимым количеством измерений.
clr rTotalVoltage1_3; Очистка накопителя напряжения первого канала.
clr rTotalVoltage2_3; Очистка накопителя напряжения второго канала.
ldi Temp, 255
PhaseDetect:; Определение фазы сети.
mov Tmp, Temp; Сохранение предыдущего результата измерения.
in Temp, ADCH; Если входное напряжение еще не начало повышаться,
cpc Temp, Tmp; значит переход фазы сети через нуль не наступил.
brlo PhaseDetect; В этом случае следует продолжить измерения.
out pMainOut, rOutChannels; Как только напряжение стало повышаться, происходит вывод состояния каналов в порт.
clr Tmp; Сбрасывание регистра Tmp, используемого далее при операции сложения с флагом переноса.
; **************************Стабилизация яркости******************************
ADCSampling:
mul Temp, Temp; Получение квадрата измеренного напряжения.
cp rTotalVoltage1_3, rCh1OffTime; Если накопленное напряжение сравнялось с заданным,
brlo PC+4
cbr rOutChannels, 1<<bChannel1; следует выключить канал,
nop; выровнять длительность выполнения процедуры ADCSampling (чтобы исключить
rjmp PC+4; мерцание ламп), и перейти к следующему каналу.
add rTotalVoltage1_1, R0; Если накопленное напряжение еще не достигло заданного,
adc rTotalVoltage1_2, R1; произвести последовательное суммирование предыдущего и
adc rTotalVoltage1_3, Tmp; текущего результата измерения напряжения.
cp rTotalVoltage2_3, rCh2OffTime
brlo PC+4
cbr rOutChannels, 1<<bChannel2
nop
rjmp PC+4
add rTotalVoltage2_1, R0
adc rTotalVoltage2_2, R1
adc rTotalVoltage2_3, Tmp
out pMainOut, rOutChannels; Вне зависимости от величины накопленных напряжений, состояние каналов выводится в порт после каждого измерения.
sbiw ZH: ZL, 1; Если число измерений АЦП достигло максимально допустимого значения,
breq ADCExit; процедура прерывается.
in Temp, ADCH; Иначе производится очередное измерение напряжения. В расчет принимаются только старшие 8 бит АЦП.
rjmp ADCSampling
ADCExit:
cbr rOutChannels, (1<<bChannel1) + (1<<bChannel2); Принудительное выключение каналов при
out pMainOut, rOutChannels; достижении максимально допустимого числа измерений.
clr rCh1OffTime
clr rCh2OffTime
; ******************Выполнение общих процедур для обоих каналов*******************
sbrs reSystemBits, ebOwnersAtHome; При включенном режиме Имитация Присутствия Хозяев (ИПХ)
rjmp Channel1Processing
lds Temp, mOwnersAtHomeSeconds; каждые 10мс происходит декремент счетчика этого режима.
dec Temp
sts mOwnersAtHomeSeconds, Temp
brne ExitOwnersAtHome
ldi Temp, 100
; ldi Temp, 5; уменьшение таймаута для ускорения тестирования
sts mOwnersAtHomeSeconds, Temp
lds Temp, mOwnersAtHomeMinutes
dec Temp
sts mOwnersAtHomeMinutes, Temp
brne ExitOwnersAtHome
ldi Temp, 60
sts mOwnersAtHomeMinutes, Temp
lds Temp, mOwnersAtHomeSharedCell
dec Temp
sts mOwnersAtHomeSharedCell, Temp
brne ExitOwnersAtHome; Как только счетчик отсчитает заданный интервал,
sbrc rBit1, bIsChannel1On; происходит включение,
rjmp OwnersAtHomeToOffState; или выключение обоих каналов,
sbr rBit1, (1<<bSoftTurnCh1) + (1<<bSoftTurnCh2) + (1<<bIsChannel1On) + (1<<bIsChannel2On) + (1<<bBrightVectorCh1) + (1<<bBrightVectorCh2)
sbr reSystemBits, (1<<ebPowerStateCh1) + (1<<ebPowerStateCh2); Если во время включения произойдет сбой питания, то после его восстановления каналы включаться.
lds Temp, meOwnersAtHomeOnPeriod; Если режим случайного выбора значений функции ИПХ не выбран,
sbrs reUserBits1, ebRandomOAH
rjmp OwnersAtHomeSharedCellWrite; то таймер будет отсчитывать заранее заданное значение длительности включенного состояния.
rcall RandomNumber8bit; Если выбран, то формируется случайное значение яркости.
cpi Temp, cMinBrightOAH; Если случайная яркость оказывается меньше cMinBrightOAH (примерно 25% от максимальной яркости),
brsh PC+2
ldi Temp, cMinBrightOAH; она становится равной cMinBrightOAH.
; ldi Temp, 150; заглушка режима случайного выбора яркости функции ИПХ, позволяющая задать требуемую яркость
sts meOwnersAtHomeBright, Temp
rcall RandomNumber8bit; Затем формируется случайное значение длительности работы во включенном состоянии.
cpi Temp, (cMaxDurationOAH + 1); Если случайная длительность превышает (cMaxDurationRndOAH + 1) (240 минут),
brlo PC+2
ldi Temp, cMaxDurationOAH; она заменяется на cMaxDurationRndOAH.
; ldi Temp, 4; заглушка режима случайного выбора длительности включенного состояния функции ИПХ
rjmp OwnersAtHomeSharedCellWrite; После этого происходит запись длительности в соответствующую ячейку памяти.
OwnersAtHomeToOffState:
lds Temp, meOwnersAtHomeOffPeriod;
sbrs reUserBits1, ebRandomOAH; Если режим случайного выбора яркости\длительностей в функции ИПХ включен,
rjmp OwnersAtHomeSetOffState
rcall RandomNumber8bit; происходит выбор случайного значения длительности выключенного состояния.
cpi Temp, (cMaxDurationOAH + 1); Если случайная длительность превышает (cMaxDurationRndOAH + 1) (240 минут),
brlo PC+2
ldi Temp, cMaxDurationOAH; она заменяется на cMaxDurationRndOAH.
; ldi Temp, 4; заглушка режима случайного выбора длительности выключенного состояния функции ИПХ
OwnersAtHomeSetOffState:
cbr rBit1, (1<<bIsChannel1On) + (1<<bIsChannel2On); При переходе в выключенное состояние для обоих каналов сбрасываются признаки включенного состояния
sbr rBit1, (1<<bSoftTurnCh1) + (1<<bSoftTurnCh2); и дается команда плавного выключения.
OwnersAtHomeSharedCellWrite:
sts mOwnersAtHomeSharedCell, Temp; Запись длительности включенного или выключенного состояния в ячейку оперативной памяти.
ExitOwnersAtHome:
; ******************Обработка первого канала****************************
Channel1Processing:
sbrs rBit1, bSoftTurnCh1; Если бит установлен, значит надо выполнить
rjmp CheckButton1; включение или выключение канала.
sbrs rBit1, bIsChannel1On; Если канал включен,
rjmp SoftTurnOffCh1; происходит его плавное выключение.
lds Temp, meOwnersAtHomeBright; При включении канала в режиме ИПХ,
sbrc reSystemBits, ebOwnersAtHome
rjmp CompareBrightnessCh1
lds Temp, meLastBright1_1; а также в обычном первом
sbrc reSystemBits, ebChannel1Mode
lds Temp, meLastBright1_2; или втором режиме
CompareBrightnessCh1:
cp Temp, rBrightnessCh1; происходит плавное нарастание яркости до тех пор,
brne SoftTurnOnCh1; пока ее текущее значение не сравняется с заданным (для режима ИПХ) или предыдущим (для первого или второго режима).
SoftTurnOnCh1Completed:
cbr rBit1, 1<<bSoftTurnCh1; Как только это произойдет, сбрасывается признак плавного режима,
sbr reSystemBits, 1<<ebPowerStateCh1; устанавливается признак включенного состояния,
ldi rButton1HoldTime, 255; и начинается ожидание момента отпускания кнопки.
lds Temp, meBrightnessMaxCh1; Если текущая яркость
cp rBrightnessCh1, Temp; больше или равна максимально допустимой,
brlo PC+2
cbr rBit1, 1<<bBrightVectorCh1; вектор изменения яркости направляется в сторону ее уменьшения.
rjmp GoOutCh1; Состояние кнопки опрашивается в следующем цикле чтобы учесть изменившееся состояние битов.
SoftTurnOnCh1:; Плавное увеличение яркости при включении канала.
lds Temp, meTurnOnSpeedMode1Ch1; Загрузка длительности нарастания яркости, заданной для первого
sbrc reSystemBits, ebChannel1Mode
lds Temp, meTurnOnSpeedMode2Ch1; или второго режима.
inc rSoftTurnSpeedCh1; Инкремент счетчика импульсов, определяющего скорость изменения яркости.
cp Temp, rSoftTurnSpeedCh1; Если значение счетчика еще не сравнялось с заданной длительностью,
brne ExitSoftTurnOnCh1; то выйти из процедуры, оставив текущую яркость неизменной.
clr rSoftTurnSpeedCh1; Если сравнялось, то сбросить счетчик,
inc rBrightnessCh1; и увеличить текущую яркость на единицу.
ExitSoftTurnOnCh1:
rjmp GoOutCh1; Во время плавного включения кнопка не опрашивается.
SoftTurnOffCh1:; Плавное уменьшение яркости при выключении канала.
cbr reSystemBits, 1<<ebPowerStateCh1; Сброс признака включенного состояния (чтобы канал не включился в случае прерывания питания во время плавного выключения канала).
sbrs rBit1, bTurnOffStartedCh1; При втором способе автоотключения яркость нужно снизить до значения, указанного в регистре rSoftOffBrightCh1.
clr rSoftOffBrightCh1; Если же автоотключение не активно, яркость нужно снизить до нуля.
cp rBrightnessCh1, rSoftOffBrightCh1; Если яркость еще не сравнялась
breq SoftTurnOffCh1Completed; с заданным значением,
lds Temp, meTurnOffSpeedMode1Ch1
sbrc reSystemBits, ebChannel1Mode
lds Temp, meTurnOffSpeedMode2Ch1
inc rSoftTurnSpeedCh1
cp Temp, rSoftTurnSpeedCh1
brne ExitSoftTurnOffCh1
clr rSoftTurnSpeedCh1
dec rBrightnessCh1; то уменьшить ее на один шаг, учитывая скорость снижения (аналогично процедуре SoftTurnOnCh1:).
ExitSoftTurnOffCh1:
rjmp GoOutCh1
SoftTurnOffCh1Completed:; Если яркость снизилась до требуемого значения,
cbr rBit1, 1<<bSoftTurnCh1; сбросить признак плавного выключения.
sbrc rBit1, bTurnOffStartedCh1; Если автоотключение активно,
sbr rBit1, 1<<bIsChannel1On; восстановить признак включенного канала.
ldi rButton1HoldTime, 255; Ждать пока кнопка не буден отпущена.
rjmp GoOutCh1
CheckButton1:; Определение нажатия кнопки первого канала.
sbic pKeyboardIn, sbChannel1; Если кнопка нажата, то:
rjmp Button1IsOff
ldi Temp, 255; 1) Начать отсчет времени (2,5 сек.) по истечении которого
sts mSaveBrightDelayCh1, Temp; значение яркости будет запомнено в eeprom;
rcall ResetAutoOffTimerCh1; 2) Начать заново отсчет времени непрерывной работы канала;
; 3) Определить дальнейшие действия в зависимости от значения счетчика времени удержания кнопки.
cpi rButton1HoldTime, cButtonOnHoldSense; Если счетчик достиг значения, обозначающего удерживание кнопки,
breq Button1OnHold; перейти к выполнению соответствующей процедуры.
cpi rButton1HoldTime, 255; Если в счетчике находится специальное значение (255),
breq PC+2; то ничего не делать - ждать пока кнопка не будет отжата.
inc rButton1HoldTime; Если же счетчик не содержит специального значения и пока еще не сравнялся с порогом удерживания кнопки в нажатом положении, то увеличить его значение на единицу.
rjmp IsChannel1On
Button1OnHold:
sbrc rBit1, bTurnOffStartedCh1; Если кнопка удерживается когда канал находится в состоянии автоотключения,
rjmp RestoreBrightnessCh1; нужно восстановить первоначальную яркость.
sbrc rBit1, bIsChannel1On; Если режим автоотключения не активен, удерживание кнопки в нажатом положении
rjmp ChangeBrightnessCh1; при включенном канале приводит к изменению яркости.
sbic pKeyboardIn, sbChannel2; Если в нажатом положении удерживаются обе кнопки
rjmp TurnCh1InSecondMode
mov Temp, rBit1; и все каналы
cbr Temp, (1<<bBrightVectorCh1) + (1<<bBrightVectorCh2); полностью выключены,
brne TurnCh1InSecondMode
sbr reSystemBits, (1<<ebOwnersAtHome) + (1<<ebPowerStateCh1) + (1<<ebPowerStateCh2); то они включаются в режиме ИПХ.
rcall OwnersAtHomeTimerTrigger; Для этого таймер функции ИПХ настраивается на срабатывание в следующем цикле.
rjmp Channel2Processing
TurnCh1InSecondMode:
sbr reSystemBits, 1<<ebChannel1Mode; При выключенном канале удерживание кнопки в нажатом положении приводит к включению канала во втором режиме.
cbr reSystemBits, 1<<ebOwnersAtHome; При этом режим ИПХ отключается.
rjmp TurnCh1On
RestoreBrightnessCh1:; Восстановление яркости.
rcall ResetAutoOffTimerCh1; Начать заново отсчет таймаута (времени непрерывной работы).
cbr rBit1, 1<<bTurnOffStartedCh1; Сбросить флаг состояния автоотключения.
sbr reSystemBits, 1<<ebPowerStateCh1; Восстановить флаг включенного состояния.
sbr rBit1, 1<<bSoftTurnCh1; Плавно восстановить яркость, существовавшую на момент истечения таймаута.
rjmp GoOutCh1
ChangeBrightnessCh1:
sbrc reSystemBits, ebOwnersAtHome; В режиме Имитация Присутствия Хозяев ручная регулировка яркости недоступна.
rjmp GoOutCh1
cp reBrightChangeSpeedCh1, rBrightCounterCh1; Если значение заданной скорости изменения яркости стало равно текущему значению счетчика-делителя,
breq BrightReadyToChangeCh1; значит пора перейти к увеличению, уменьшению, или удержанию яркости.
inc rBrightCounterCh1; Иначе увеличить значение счетчика-делителя.
rjmp IsChannel1On
BrightReadyToChangeCh1:
clr rBrightCounterCh1; Очистка счетчика-делителя для использования в следующем цикле.
sbrc rBit1, bBrightVectorCh1; Если бит сброшен, то уменьшить яркость,
rjmp IncreaseBrightnessCh1; иначе - увеличить.
DecreaseBrightnessCh1:
lds Temp, meBrightnessMinCh1
cp Temp, rBrightnessCh1
brsh MinBrightnessReachedCh1; Если текущая яркость больше минимальной,
dec rBrightnessCh1; уменьшить ее на один шаг.
rjmp GoOutCh1
MinBrightnessReachedCh1:; При достижении минимальной яркости, или если текущая яркость меньше минимальной, счетчик-делитель отключается
mov rBrightCounterCh1, reBrightChangeSpeedCh1; чтобы устранить влияние скорости регулировки яркости на длительность удержания ее минимального значения.
lds Temp, mBrightMinCounterCh1; Если яркость достигла минимальной,
dec Temp; но счетчик удержания минимальной яркости
breq BrightMinTimeoutIsUpCh1; еще не снизился до нуля,
sts mBrightMinCounterCh1, Temp; то сохранить в оперативной памяти декрементированное значение этого счетчика,
rjmp GoOutCh1; а яркость оставить неизменной.
BrightMinTimeoutIsUpCh1:
lds Temp, meMinBrightDelayCh1; Если же счетчик достиг нулевого значения,
sts mBrightMinCounterCh1, Temp; восстановить его исходное состояние,
sbr rBit1, 1<<bBrightVectorCh1; переключить направление изменения яркости на противоположное,
clr rBrightCounterCh1; и восстановить работоспособность счетчика-делителя скорости регулировки яркости.
rjmp GoOutCh1
IncreaseBrightnessCh1:
lds Temp, meBrightnessMaxCh1
cp rBrightnessCh1, Temp
brsh MaxBrightnessReachedCh1
inc rBrightnessCh1
rjmp GoOutCh1
MaxBrightnessReachedCh1:
mov rBrightCounterCh1, reBrightChangeSpeedCh1
lds Temp, mBrightMaxCounterCh1
dec Temp
breq BrightMaxTimeoutIsUpCh1
sts mBrightMaxCounterCh1, Temp
rjmp GoOutCh1
BrightMaxTimeoutIsUpCh1:
lds Temp, meMaxBrightDelayCh1
sts mBrightMaxCounterCh1, Temp
cbr rBit1, 1<<bBrightVectorCh1
clr rBrightCounterCh1
rjmp GoOutCh1
Button1IsOff:; Кнопка не нажата, или только что была отжата.
cpi rButton1HoldTime, 255; Если счетчик длительности удерживания кнопки содержит специальное значение (255),
brne PC+2; призванное блокировать обработку состояния кнопки пока она не будет отжата,
ldi rButton1HoldTime, 0; нужно снять эту блокировку путем обнуления счетчика, и выйти из процедуры.
cpi rButton1HoldTime, 0; Если счетчик изначально был равен нулю,
breq IsChannel1On; значит кнопка не была нажата.
cpi rButton1HoldTime, cButtonOnHoldSense; Если счетчик не равен нулю (т.е. кнопка только что была отжата),
ldi rButton1HoldTime, 0; то сбросить его (команду clr здесь применять нельзя, т.к. она влияет на флаги SREG),
breq HoldButton1; и выполнить действия, соответствующие отпусканию кнопки после ее нажатия
ClickButton1:; или удерживания.
sbrc rBit1, bIsChannel1On; Если канал включен (bIsChannel1On=0)
rjmp TurnCh1Off; значит надо его выключить.
cbr reSystemBits, (1<<ebChannel1Mode) + (1<<ebOwnersAtHome); Если канал выключен,
rjmp TurnCh1On; значит его надо включить в первом режиме. При этом режим ИПХ отключается.
HoldButton1:; Если было нажатие кнопки,
lds Temp, meMinBrightDelayCh1; то надо сбросить
sts mBrightMinCounterCh1, Temp; счетчик времени удержания минимальной яркости на исходное значение.
lds Temp, meMaxBrightDelayCh1; То же для
sts mBrightMaxCounterCh1, Temp; счетчика времени удержания максимальной яркости.
sbrc reUserBits1, ebBrightDirModeCh1; При ebBrightDirModeCh1=1 происходит
rjmp InvertBrightVectorCh1; смена направления изменения яркости, чтобы при следующем нажатии кнопки яркость изменялась в противоположную сторону.
lds Temp, meBrightnessMinCh1; При ebBrightDirModeCh1=0
cp rBrightnessCh1, Temp; направление изменения яркости сменится на противоположное только в том случае,
breq InvertBrightVectorCh1; если в момент отпускания кнопки яркость находилась на минимальном
lds Temp, meBrightnessMaxCh1; или максимальном значении. Это нужно для того чтобы
cp rBrightnessCh1, Temp; исключить задержку изменения крайнего значения яркости
breq InvertBrightVectorCh1; при следующем нажатии кнопки.
rjmp IsChannel1On
InvertBrightVectorCh1:; Смена направления изменения яркости на противоположное.
mov Temp, rBit1
cbr rBit1, 1<<bBrightVectorCh1
sbrs Temp, bBrightVectorCh1
sbr rBit1, 1<<bBrightVectorCh1
rjmp IsChannel1On
TurnCh1On:
sbr rBit1, (1<<bIsChannel1On) + (1<<bSoftTurnCh1) + (1<<bBrightVectorCh1); При включении канала устанавливаются признаки включенного канала, плавного включения, вектор яркости направляется в сторону увеличения.
clr rBrightnessCh1; Яркость увеличивается, начиная с нуля.
rjmp Channel2Processing
TurnCh1Off:
sbrs reSystemBits, ebOwnersAtHome; В режиме ИПХ
rjmp OwnersAtHomeNotSetCh1
cbr rBit1, (1<<bIsChannel1On) + (1<<bIsChannel2On); любое кратковременное нажатие кнопки
sbr rBit1, (1<<bSoftTurnCh1) + (1<<bSoftTurnCh2); выключает оба канала,
cbr reSystemBits, (1<<ebOwnersAtHome) + (1<<ebPowerStateCh1) + (1<<ebPowerStateCh2); а также сам режим.
rjmp GoOutCh1
OwnersAtHomeNotSetCh1:
cbr rBit1, (1<<bIsChannel1On) + (1<<bTurnOffStartedCh1); При выключении канала флаг автоотключения сбрасывается.
sbr rBit1, 1<<bSoftTurnCh1
rjmp GoOutCh1
IsChannel1On:; Данная процедура позволяет выполнять действия, требующие включенного
sbrs rBit1, bIsChannel1On; состояния канала при неактивном состоянии плавного включения/выключения.
rjmp Channel2Processing
sbrc reSystemBits, ebOwnersAtHome; Режим ИПХ не требует выполнения последующих команд
rjmp GoOutCh1; (запоминание яркости и режим автоотключения).
lds Temp, mSaveBrightDelayCh1
dec Temp; Декремент таймера запоминания яркости.
sts mSaveBrightDelayCh1, Temp
brne ExitSaveBrightDelayCh1; Как только истечет время таймаута (2,5 сек.), текущая яркость текущего режима будет запомнена в eeprom.
sbrc rBit1, bTurnOffStartedCh1; Но если канал находится в состоянии автоотключения,
rjmp ExitSaveBrightDelayCh1; яркость не запоминается.
sbrc reSystemBits, ebChannel1Mode
rjmp SaveBrightnessMode2Ch1
sbrc reUserBits2, ebSaveBrightM1Ch1; Также яркость не запоминается
sts meLastBright1_1, rBrightnessCh1
rjmp ExitSaveBrightDelayCh1; если это было запрещено пользователем.
SaveBrightnessMode2Ch1:
sbrc reUserBits2, ebSaveBrightM2Ch1
sts meLastBright1_2, rBrightnessCh1
ExitSaveBrightDelayCh1:
rcall TurnOffTimeoutCh1; Из-за малого допустимого смещения команд типа brne (максимум 64 байта) приходится использовать вызов подпрограммы.
GoOutCh1:
ldi ZH, HIGH (2*BrightnessTable)
ldi ZL, LOW (2*BrightnessTable)
add ZL, rBrightnessCh1; Значение регистра rBrightness задает величину смещения
ldi Temp, 0; в таблице яркости.
adc ZH, Temp
lpm rCh1OffTime, Z; Загрузка в регистр rCh1OffTime условного значения времени через которое канал должен быть погашен.
; ****************Обработка второго канала********************************
Channel2Processing:
sbrs rBit1, bSoftTurnCh2
rjmp CheckButton2
sbrs rBit1, bIsChannel2On
rjmp SoftTurnOffCh2
lds Temp, meOwnersAtHomeBright
sbrc reSystemBits, ebOwnersAtHome
rjmp CompareBrightnessCh2
lds Temp, meLastBright2_1
sbrc reSystemBits, ebChannel2Mode
lds Temp, meLastBright2_2
CompareBrightnessCh2:
cp Temp, rBrightnessCh2
brne SoftTurnOnCh2
SoftTurnOnCh2Completed:
cbr rBit1, 1<<bSoftTurnCh2
sbr reSystemBits, 1<<ebPowerStateCh2
ldi rButton2HoldTime, 255
lds Temp, meBrightnessMaxCh2
cp rBrightnessCh2, Temp
brlo PC+2
cbr rBit1, 1<<bBrightVectorCh2
rjmp GoOutCh2
SoftTurnOnCh2:
lds Temp, meTurnOnSpeedMode1Ch2
sbrc reSystemBits, ebChannel2Mode
lds Temp, meTurnOnSpeedMode2Ch2
inc rSoftTurnSpeedCh2
cp Temp, rSoftTurnSpeedCh2
brne ExitSoftTurnOnCh2
clr rSoftTurnSpeedCh2
inc rBrightnessCh2
ExitSoftTurnOnCh2:
rjmp GoOutCh2
SoftTurnOffCh2:
cbr reSystemBits, 1<<ebPowerStateCh2
sbrs rBit1, bTurnOffStartedCh2
clr rSoftOffBrightCh2
cp rBrightnessCh2, rSoftOffBrightCh2
breq SoftTurnOffCh2Completed
lds Temp, meTurnOffSpeedMode1Ch2
sbrc reSystemBits, ebChannel2Mode
lds Temp, meTurnOffSpeedMode2Ch2
inc rSoftTurnSpeedCh2
cp Temp, rSoftTurnSpeedCh2
brne ExitSoftTurnOffCh2
clr rSoftTurnSpeedCh2
dec rBrightnessCh2
ExitSoftTurnOffCh2:
rjmp GoOutCh2
SoftTurnOffCh2Completed:
cbr rBit1, 1<<bSoftTurnCh2
sbrc rBit1, bTurnOffStartedCh2
sbr rBit1, 1<<bIsChannel2On
ldi rButton2HoldTime, 255
rjmp GoOutCh2
CheckButton2:
sbic pKeyboardIn, sbChannel2
rjmp Button2IsOff
ldi Temp, 255
sts mSaveBrightDelayCh2, Temp
rcall ResetAutoOffTimerCh2
cpi rButton2HoldTime, cButtonOnHoldSense
breq Button2OnHold
cpi rButton2HoldTime, 255
breq PC+2
inc rButton2HoldTime
rjmp IsChannel2On
Button2OnHold:
sbrc rBit1, bTurnOffStartedCh2
rjmp RestoreBrightnessCh2
sbrc rBit1, bIsChannel2On
rjmp ChangeBrightnessCh2
sbic pKeyboardIn, sbChannel1
rjmp TurnCh2InSecondMode
mov Temp, rBit1
cbr Temp, (1<<bBrightVectorCh1) + (1<<bBrightVectorCh2)
brne TurnCh2InSecondMode
sbr reSystemBits, (1<<ebOwnersAtHome) + (1<<ebPowerStateCh1) + (1<<ebPowerStateCh2)
rcall OwnersAtHomeTimerTrigger
rjmp GoOut
TurnCh2InSecondMode:
sbr reSystemBits, 1<<ebChannel2Mode
cbr reSystemBits, 1<<ebOwnersAtHome
rjmp TurnCh2On
RestoreBrightnessCh2:
rcall ResetAutoOffTimerCh2
cbr rBit1, 1<<bTurnOffStartedCh2
sbr reSystemBits, 1<<ebPowerStateCh2
sbr rBit1, 1<<bSoftTurnCh2
rjmp GoOutCh2
ChangeBrightnessCh2:
sbrc reSystemBits, ebOwnersAtHome
rjmp GoOutCh2
cp reBrightChangeSpeedCh2, rBrightCounterCh2
breq BrightReadyToChangeCh2
inc rBrightCounterCh2
rjmp IsChannel2On
BrightReadyToChangeCh2:
clr rBrightCounterCh2
sbrc rBit1, bBrightVectorCh2
rjmp IncreaseBrightnessCh2
DecreaseBrightnessCh2:
lds Temp, meBrightnessMinCh2
cp Temp, rBrightnessCh2
brsh MinBrightnessReachedCh2
dec rBrightnessCh2
rjmp GoOutCh2
MinBrightnessReachedCh2:
mov rBrightCounterCh2, reBrightChangeSpeedCh2
lds Temp, mBrightMinCounterCh2
dec Temp
breq BrightMinTimeoutIsUpCh2
sts mBrightMinCounterCh2, Temp
rjmp GoOutCh2
BrightMinTimeoutIsUpCh2:
lds Temp, meMinBrightDelayCh2
sts mBrightMinCounterCh2, Temp
sbr rBit1, 1<<bBrightVectorCh2
clr rBrightCounterCh2
rjmp GoOutCh2
IncreaseBrightnessCh2:
lds Temp, meBrightnessMaxCh2
cp rBrightnessCh2, Temp
brsh MaxBrightnessReachedCh2
inc rBrightnessCh2
rjmp GoOutCh2
MaxBrightnessReachedCh2:
mov rBrightCounterCh2, reBrightChangeSpeedCh2
lds Temp, mBrightMaxCounterCh2
dec Temp
breq BrightMaxTimeoutIsUpCh2
sts mBrightMaxCounterCh2, Temp
rjmp GoOutCh2
BrightMaxTimeoutIsUpCh2:
lds Temp, meMaxBrightDelayCh2
sts mBrightMaxCounterCh2, Temp
cbr rBit1, 1<<bBrightVectorCh2
clr rBrightCounterCh2
rjmp GoOutCh2
Button2IsOff:
cpi rButton2HoldTime, 255
brne PC+2
ldi rButton2HoldTime, 0
cpi rButton2HoldTime, 0
breq IsChannel2On
cpi rButton2HoldTime, cButtonOnHoldSense
ldi rButton2HoldTime, 0
breq HoldButton2
ClickButton2:
sbrc rBit1, bIsChannel2On
rjmp TurnCh2Off
cbr reSystemBits, (1<<ebChannel2Mode) + (1<<ebOwnersAtHome)
rjmp TurnCh2On
HoldButton2:
lds Temp, meMinBrightDelayCh2
sts mBrightMinCounterCh2, Temp
lds Temp, meMaxBrightDelayCh2
sts mBrightMaxCounterCh2, Temp
sbrc reUserBits1, ebBrightDirModeCh2
rjmp InvertBrightVectorCh2
lds Temp, meBrightnessMinCh2
cp rBrightnessCh2, Temp
breq InvertBrightVectorCh2
lds Temp, meBrightnessMaxCh2
cp rBrightnessCh2, Temp
breq InvertBrightVectorCh2
rjmp IsChannel2On
InvertBrightVectorCh2:
mov Temp, rBit1
cbr rBit1, 1<<bBrightVectorCh2
sbrs Temp, bBrightVectorCh2
sbr rBit1, 1<<bBrightVectorCh2
rjmp IsChannel2On
TurnCh2On:
sbr rBit1, (1<<bIsChannel2On) + (1<<bSoftTurnCh2) + (1<<bBrightVectorCh2)
clr rBrightnessCh2
rjmp GoOut
TurnCh2Off:
sbrs reSystemBits, ebOwnersAtHome
rjmp OwnersAtHomeNotSetCh2
cbr rBit1, (1<<bIsChannel1On) + (1<<bIsChannel2On)
sbr rBit1, (1<<bSoftTurnCh1) + (1<<bSoftTurnCh2)
cbr reSystemBits, (1<<ebOwnersAtHome) + (1<<ebPowerStateCh1) + (1<<ebPowerStateCh2)
rjmp GoOutCh2
OwnersAtHomeNotSetCh2:
cbr rBit1, (1<<bIsChannel2On) + (1<<bTurnOffStartedCh2)
sbr rBit1, 1<<bSoftTurnCh2
rjmp GoOutCh2
IsChannel2On:
sbrs rBit1, bIsChannel2On
rjmp GoOut
sbrc reSystemBits, ebOwnersAtHome
rjmp GoOutCh2
lds Temp, mSaveBrightDelayCh2
dec Temp
sts mSaveBrightDelayCh2, Temp
brne ExitSaveBrightDelayCh2
sbrc rBit1, bTurnOffStartedCh2
rjmp ExitSaveBrightDelayCh2
sbrc reSystemBits, ebChannel2Mode
rjmp SaveBrightnessMode2Ch2
sbrc reUserBits2, ebSaveBrightM1Ch2
sts meLastBright2_1, rBrightnessCh2
rjmp ExitSaveBrightDelayCh2
SaveBrightnessMode2Ch2:
sbrc reUserBits2, ebSaveBrightM2Ch2
sts meLastBright2_2, rBrightnessCh2
ExitSaveBrightDelayCh2:
rcall TurnOffTimeoutCh2
GoOutCh2:
ldi ZH, HIGH (2*BrightnessTable)
ldi ZL, LOW (2*BrightnessTable)
add ZL, rBrightnessCh2
ldi Temp, 0
adc ZH, Temp
lpm rCh2OffTime, Z
; ********************Сохранение изменившихся значений в eeprom*******************
GoOut:
ldi Temp, eLastBright1_1; Если значение яркости после последней регулировки
lds Tmp, meLastBright1_1; не равно значению яркости после предшествующей регулировки,
rcall EepromWriteIfDifferent; сохранить последнее значение яркости в eeprom.
ldi Temp, eLastBright1_2; То же для второго режима.
lds Tmp, meLastBright1_2
rcall EepromWriteIfDifferent
ldi Temp, eLastBright2_1; То же для второго канала.
lds Tmp, meLastBright2_1
rcall EepromWriteIfDifferent
ldi Temp, eLastBright2_2
lds Tmp, meLastBright2_2
rcall EepromWriteIfDifferent
ldi Temp, eSystemBits; Если значение хотя бы одного бита в reBit
mov Tmp, reSystemBits; отличается от аналогичного бита в eeprom,
rcall EepromWriteIfDifferent; сохранить весь регистр reBit в eeprom.
rjmp Main
Размещено на Allbest.ru
Подобные документы
История изобретения ламп с металлическими нитями накала: первая практичная лампочка. Исследовательская работа Г. Гебеля, А. Лодыгина, Дж. Свана, Т. Эдисона и В. Кулиджа. Принцип действия, конструкция и долговечность современных ламп накаливания.
презентация [412,7 K], добавлен 07.01.2011Автоматизированная система управления освещением, ее алгоритм работы, аппаратная база и программное обеспечение. Вероятные проблемы при реализации и пути их решения. Расчет мощности стабилизаторов напряжения. Расчеты по регулированию напряжения.
дипломная работа [2,8 M], добавлен 01.07.2014Лампы общего назначения, их принцип действия, конструкция. Преимущества и недостатки ламп накаливания. Декоративные и иллюминационные лампы. Ограничения импорта, закупок и производства ламп накаливания. Утилизация отработавших люминесцентных ламп.
реферат [1020,9 K], добавлен 08.02.2012Определение максимального и минимального значений выпрямленного сетевого напряжения, диаграммы работы преобразователя. Выбор выпрямительных диодов, трансформатора, транзистора, выпрямителя и элементов узла управления. Расчет демпфирующей цепи и КПД.
курсовая работа [392,9 K], добавлен 18.02.2010Блок питания как устройство, преобразующее электрический ток по заданным параметрам. Применение и сущность сетевого и сглаживающего фильтров, трансформатора, стабилизатора, выпрямителя. Основные моменты, необходимые для понимания работы стабилизатора.
презентация [524,1 K], добавлен 14.02.2013Преимущества и недостатки ламп накаливания, их виды и применение, устройство и действие. Марки и характеристики проводов и кабелей, применяемых при электромонтажных работах. Применяемые механизмы, инструменты и приспособления; монтаж ламп накаливания.
реферат [2,0 M], добавлен 22.07.2010Изучение наиболее простых методов экономии электроэнергии. Преимущества и принцип работы люминесцентных ламп, проблема их утилизации. Различие между лампами накаливания и люминесцентными. Оценка эффективности практического применения данных ламп.
реферат [49,5 K], добавлен 18.01.2011Высокий спрос на энергосберегающие технологии. Устройство и принцип действия энергосберегающих ламп. Сравнительный анализ мощности и светоотдачи энергосберегающих ламп и ламп накаливания. Экономичность энергосберегающих ламп при их использовании.
презентация [640,7 K], добавлен 13.10.2016Требования к электроосвещению помещения ремонтной базы сетевого участка. Обоснования типа лампы и светильника. Выбор вида и системы электроосвещения. Расчет электроосвещения методом коэффициента использования светового потока, определения количества ламп.
курсовая работа [258,0 K], добавлен 22.05.2012История возникновения и устройство ламп накаливания и люминесцентной: принцип действия, устройство, условные обозначения и разновидности. Определение срока службы лампы и причин выхода ее из строя. Сравнение электронного и электромагнитного балласта.
курсовая работа [399,5 K], добавлен 22.12.2010