Двухканальное устройство управления освещением (диммер) для бытового светильника

Регулятор яркости ламп накаливания: приоритетные требования к разработке. Долговечность, устойчивость к скачкам сетевого напряжения. Схема и принцип работы, управление. Диодный мост, блок питания, микроконтроллер. Защита от превышения сетевого напряжения.

Рубрика Физика и энергетика
Вид курсовая работа
Язык русский
Дата добавления 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.