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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Физика
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    724,58 Кб
  • Опубликовано:
    2012-08-23
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Содержание

 

Введение

1. Постановка задачи

1.1 Технические характеристики

1.2 Достоинства

1.3 Схема и принцип работы

2. Управление

2.1 Включение и выключение

2.2 Регулировка яркости

2.3 Автоотключение

2.4 Имитация присутствия хозяев

3. Аппаратная часть

3.1 Диодный мост

3.2 Блок питания

3.3 Микроконтроллер

3.4 Делитель напряжения

3.5 Выходной каскад

Транзисторы

Резисторы в цепи затвора

Лампы

3.6 Цепь защиты

Защита от короткого замыкания нагрузки и превышения её мощности

Защита от превышения сетевого напряжения

3.7 Расчёт потребляемой мощности

4. Программная часть

4.1 Блок-схема алгоритма

4.2 Описание программы

5. Особенности стабилизации яркости

6. Настройка

Заключение

Список литературы и полезные ссылки

Приложение

Введение

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

В последнее время управление яркостью света в помещении приобрело размах под эгидой проектов типа "Умный дом", призванных обеспечить автоматическое или автоматизированное управление бытовыми энергосистемами и иными удобствами. Отечественные и зарубежные регуляторы ламп накаливания имеют ряд недостатков:

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

Эти же недостатки (либо все сразу, либо по отдельности) присущи схемам, опубликованным в радиолюбительской литературе, периодической печати и в Интернете.

регулятор лампа накаливание напряжение

1. Постановка задачи


В рассмотрение взят регулятор яркости ламп накаливания (за рубежом называемый "диммер" - dimmer), свободный от указанных недостатков. Данное устройство создано для установки в двухканальный светильник промышленного производства.

Приоритетные требования к разработке:

Простота схемы (минимальное количество компонентов)

Малые размеры устройства - Широкий функционал, многообразие регулируемых параметров

Долговечность и устойчивость к скачкам сетевого напряжения - Отсутствие либо малый нагрев компонентов (пожаробезопасность)  - Низкое энергопотребление

При проектировании устройства не ставилась задача минимизировать его стоимость.

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

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

Небольшой нагрев компонентов:

во-первых, устройство должно работать круглосуточно, в том числе без присмотра,

во-вторых, для снижения потребляемой мощности (нагрев - это лишние потери),

в-третьих, для упрощения расчётов (везде подразумевалась температура окружающей среды 25°C).

Низкое энергопотребление и долговечность - без комментариев.

1.1 Технические характеристики


Разработанный в соответствии с перечисленными требованиями регулятор обладает следующими техническими характеристиками:

Количество каналов - 2

Мощность ламп - 60 Вт на каждый канал

Напряжение сети - 220 В±10%

Частота сетевого напряжения - 50 Гц±0,4 Гц

Потребляемая мощность - не более 0,92 Вт (при напряжении сети 220 В)

Диапазон регулировки напряжения - 12 - 88% (может быть расширен до 1,4 - 99,6%)

Изменение выходного напряжения в диапазоне входного от 198 В до 242 В - 1 В (при максимальной яркости лампы)

1.2 Достоинства


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

Два независимых режима работы каждого канала

Возможность отключения запоминания яркости (для любого режима любого канала)

Автоматическое включение при возобновлении подачи электроэнергии (отключаемое)

Автоотключение по прошествии заданного интервала времени (два способа)

Имитация присутствия хозяев (возможен случайный выбор яркости и интервалов времени)

Отсутствие остродефицитных элементов

Дистанционное управление в список не входит, т.к. устройство предназначено для использования на расстоянии вытянутой руки.

1.3 Схема и принцип работы


Основу устройства, принципиальная схема которого изображена на Рис. 1, составляет микроконтроллер (далее по тексту МК) ATmega16L семейства AVR корпорации ATMEL. Управление осуществляется двумя не фиксируемыми в нажатом положении кнопками, по одной на каждый канал.

 

Рис. 1. Принципиальная схема диммера.

 

Регулировка мощности основана на реверсивном принципе управления фазой. Нагрузка включается в каждом полупериоде сети в момент перехода сетевого напряжения через нуль и выключается через определённый интервал времени в зависимости от требуемого уровня яркости. Коммутация нагрузки осуществляется мощными MOSFET транзисторами. Существующие разработки в этой области позволяют отметить такие преимущества:

"мягкое" управление транзистором позволяет снизить уровень помех и звон нити лампы - не нужен громоздкий сетевой фильтр, снижающий эффективность и зачастую являющийся источником неприятного жужжания - благодаря нарастанию напряжения с нуля и малому звону нити, лампы служат намного дольше - для управления MOSFET транзистором требуется гораздо меньший ток - более низкое падение напряжения на переходе транзистора сокращает тепловыделение - отсутствие понятия "ток удержания" позволяет плавно регулировать малую яркость Стабилизация мощности (т.е. яркости) основана на использовании формулы P = U2/R. Сопротивление нити R, конечно, зависит от температуры, а также изменяется в некоторых пределах в течение каждого полупериода, но по исследованиям различных разработчиков установлено, что на качестве стабилизации это не отражается.

Вместо напряжения можно было бы измерять ток через нагрузку, в соответствии с формулой P = I2 R, но это требует дополнительного компонента (шунта), а выигрыша ни в чём не даёт.

Напряжение меряется не на самой лампе, а на выходе диодного моста, к которому она подключена. Это возможно, поскольку падение напряжения на канале транзистора мало и им можно пренебречь.

Максимальное напряжение, которое можно подать на лампу, несколько снижено, чтобы было за счёт чего осуществлять стабилизацию при уменьшении напряжения сети.

Диодный мост выполняет три функции:

создаёт пульсирующее однополярное напряжение для питания нагрузки - выпрямляет сетевое напряжение для питания схемы - обеспечивает сетевое напряжение удвоенной частоты (100 Гц), используемое МК для определения момента перехода фазы сети через нуль.

Детектирование перехода сетевого напряжения через нуль осуществляется тем же делителем напряжения и тем же каналом встроенного в МК аналого-цифрового преобразователя (АЦП), которые предназначены для измерения напряжения на лампе. Это позволяет отказаться от встроенного в МК компаратора и уменьшить тем самым потребляемый ток. Фильтрация сетевых помех реализуется программно.

Блок питания выполнен по бестрансформаторной схеме с гасящим резистором (балластом). Строить блок питания по трансформаторной схеме не получится, т.к. не существует достаточно малогабаритных трансформаторов (максимально допустимая высота 13 мм). Использовать в качестве балласта конденсатор в данной схеме не получится, т.к. для этого требуются два диодных моста (один для блока питания, другой для ламп), особенности подключения которых могут привести к короткому замыканию.

В качестве регулирующего элемента применён прецизионный микромощный источник опорного напряжения +5 В параллельного типа (далее по тексту ИОН). По сравнению с обычным стабилитроном, выбранный ИОН имеет два важных преимущества. Во-первых, одновременно со стабилизацией питания МК получается стабильное опорное напряжение АЦП [3]. Во-вторых, на порядок уменьшается потребляемый регулирующим элементом ток (примерно с 1 мА до 0,1 мА).

2. Управление


Каждый из двух каналов диммера имеет два режима работы. Каналы и их режимы работают одинаково, но независимо друг от друга, каждый со своими настройками.

Порядок изменения значений некоторых из них приведён в разделе "Описание программной части".

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

 

2.1 Включение и выключение


Режим, в котором включится канал, определяется способом управления кнопкой. При нажатии кнопки включается первый режим, при удерживании - второй.

Яркость нарастает плавно, что в значительной степени продлевает срок службы лампы, и благоприятнее воспринимается. Яркость увеличивается до тех пор, пока не сравняется с той, которая была при последнем использовании данного режима.

Благодаря раздельным настройкам каналов и их режимов, появляется возможность задать четыре разных уровня освещения для различных ситуаций. Например: просмотр телепередач, чтение, ночное освещение, дежурный свет в комнате.

Выключается канал нажатием на кнопку. Скорость спада яркости определяется программно, в зависимости от текущего режима. Это позволяет настроить наиболее комфортное изменение яркости с точки зрения восприятия или в зависимости от ситуации. Например, минимальная скорость будет полезна, чтобы после выключения канала успеть выйти из комнаты не в темноте или чтобы плавным гашением воссоздать атмосферу кинозала.

 

2.2 Регулировка яркости


Регулировка яркости происходит при удерживании кнопки. Через 2,5 секунды после окончания регулировки установленная яркость сохраняется в энергонезависимой памяти, её уровень записывается.

Имеется возможность отключить запоминание. Это может оказаться полезно, если, например, требуется, чтобы тот или иной режим того или иного канала всегда включался на максимальную яркость, но при этом сохранялась возможность регулировки. Возможен также и другой сценарий: предположим, что первый режим используется для чтения (яркость чуть выше средней), а второй - для просмотра телепередач (яркость чуть ниже средней). Иногда требуется, к примеру, что-то зашить. Для этого нужно включить максимальную яркость. Если запоминание яркости не отключать, то при следующем включении, например, первого режима яркость будет максимальной, а надо, чтобы она была, как и раньше, чуть выше средней, т.к. чтение используется намного чаще шитья.

 

2.3 Автоотключение


Если канал не был выключен в течение количества часов, заданных в программе, он выключается автоматически. Отсчёт времени начинается сразу после отпускания кнопки при включении канала. Чтобы отменить автоотключение, следует удерживать кнопку. При этом яркость восстановится до исходного уровня, и начнется новый отсчёт времени. Нажатие кнопки вместо её удерживания приведёт к немедленному выключению канала.

Если во время автоотключения произойдёт пропадание напряжения сети, то после его возобновления канал не включится. Если же напряжение пропадёт в момент отмены автоотключения, то канал включится.

2.4 Имитация присутствия хозяев


Данная функция (сокращённо ИПХ) предназначена для автоматического включения и выключения светильника через заданные промежутки времени. Эта функция - единственное исключение из общего правила, согласно которому оба канала работают независимо друг от друга. В данном случае они управляются одновременно, при этом используется единый набор настроек. Ручная регулировка яркости (путём удерживания кнопок) недоступна. Это сделано специально, для того чтобы отличать функцию ИПХ от других функций и режимов работы устройства. Стабилизация яркости также не гарантируется, т.к. её уровень может принимать любое значение, вплоть до максимального (255). Однако, по большому счёту, стабилизация в данном случае не нужна, т.к. функция используется, когда никого нет дома.

Включается функция ИПХ удерживанием обеих кнопок, когда оба канала выключены. При этом оба канала включаются на одинаковую яркость.

Продолжительность работы во включенном состоянии задаётся программно от 1 до 240 мин. Отсчёт времени начинается с начала включения каналов. По истечении заданного времени оба канала выключаются. Продолжительность выключенного состояния имеет аналогичный диапазон длительности (1…240 мин.). Отсчёт времени начинается с начала выключения каналов. Как только это время истечёт, оба канала снова включаются. Цикл будет повторяться до тех пор, пока функция не будет отключена вручную.

Отключается функция нажатием любой кнопки. Если в этот момент каналы были включены, они выключаются. Если же каналы были выключены, то тот канал, которому соответствует нажатая кнопка, включается в обычном первом режиме. При выключенных каналах функцию можно также отключить удерживанием кнопки. В этом случае соответствующий канал включится в обычном втором режиме.

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

Независимо от того, включен ли режим случайного выбора или нет, минимальная яркость составляет примерно 25% от максимально возможной. В данном случае под максимально возможной понимается яркость лампы, включенной в сеть напрямую, поскольку в функции ИПХ яркость может принимать значения вплоть до максимального уровня 255. Такое ограничение минимальной яркости позволяет убедиться в работе функции при ярком внешнем освещении. Кроме того, если яркость сделать меньшей, то её уровня будет недостаточно для заметного освещения окна комнаты в тёмное время суток.

Отключение электроэнергии не влияет на работу функции. Если питание пропадёт при включенных каналах, то после его возобновления каналы включатся. Если питание пропадёт при выключенных каналах, то после его возобновления каналы не включатся, однако начнётся новый отсчёт времени работы в выключенном состоянии.

Аналогично этому, если питание пропадёт в момент включения каналов (во время нарастания яркости), то после его возобновления каналы включатся, а если в момент выключения - то нет.

Если питание пропадёт в момент включения самой функции, то после его возобновления каналы включатся. Во всех случаях отсчёт времени работы во включенном и выключенном состоянии после возобновления подачи электроэнергии начинается заново.

3. Аппаратная часть


Устройство предназначено для управления стандартными лампами накаливания. Подключение другой нагрузки, например энергосберегающей лампы или электродвигателя, может вывести устройство и (или) нагрузку из строя.

 

3.1 Диодный мост


Применение диодного моста VD2, рассчитанного на ток 6 А, для работы с небольшим током нагрузки (максимум 0,55 А) объясняется тем, что лампы иногда перегорают во время работы. Возникающий при этом импульс тока амплитудой более 10.. 20 А способен повредить одноамперные мосты, такие как КЦ402 или КЦ405.

Ещё одна причина большого запаса по току - это гораздо меньшая степень нагрева моста. Впрочем, полностью устранять нагрев не имеет смысла, т.к. корпус устройства всё равно немного нагревается от ламп, особенно когда они включены на максимальную яркость.

 

3.2 Блок питания


Источник опорного напряжения

Особенностью схемы является использование для питания МК не обычного стабилитрона, а интегрального источника опорного напряжения DA1 параллельного типа. Как уже отмечалось, это позволяет отказаться от отдельного ИОН и снизить потребляемый ток. Помимо этого, если напряжение на выходе параллельного ИОН повысится по каким-либо причинам, возникшим со стороны шины питания схемы, это не приведёт к нарушению стабилизации, а лишь увеличит ток через ИОН. Это общая особенность параллельных стабилизаторов напряжения [2].

ИОН серии LM4040 выпускаются с различным классом точности и, соответственно, стоимости. Для данного применения достаточно класса точности 1%.

Балластный резистор

Согласно рекомендациям предыдущих разработчиков, балласт должен иметь сопротивление не более 60 кОм. Его можно получить, соединив последовательно два резистора по 30 кОм. То, что сопротивление 60 кОм немного больше расчётного, допускается.

В [4] сказано, что мощность резистора, указываемая в его описании, действительна лишь в том случае, если его сопротивление выше так называемого критического. Последнее вычисляется по формуле: Rк = Uпасп2/Pпасп, где Uпасп - паспортное рабочее напряжение резистора, Pпасп - его паспортная мощность. Для резистора серии С2-23 мощностью 0,5 Вт критическое сопротивление Rк = 3502/0,5 = 245 кОм. Если сопротивление резистора, как в нашем случае, меньше критического, расчёт мощности следует производить по формуле: P = U2/R. Учитывая максимальное напряжение сети, минимальное падение напряжения на диодном мосту, и минимальное напряжение стабилизации, мощность резистора будет равна 0,93 Вт.

Фильтрующий конденсатор

Конденсатор С1 сглаживает пульсации выпрямленного напряжения. Для расчёта его ёмкости можно воспользоваться методикой из [5, стр. 52, раздел 1. 27 "Фильтрация в источниках питания"].

На функционировании ИОН большая величина ёмкости не отражается, т.к. в его описании сказано, что допустима ёмкостная нагрузка любого номинала.

Верхний предел температурного диапазона, на который рассчитан выбранный конденсатор, составляет 105°С. Это ещё один параметр, в значительной степени влияющий на срок службы конденсатора. Выбор обусловлен также тем, что корпус устройства немного нагревается от ламп, диодного моста и балластного резистора.

Уменьшение ёмкости конденсатора, связанное с разбросом номинала или старением, не нарушит работоспособность устройства. Возможно лишь чуть более заметное моргание ламп в момент запоминания яркости.

 

.3 Микроконтроллер


Несмотря на то что напряжение питания схемы составляет 5 В, используемый МК U1 имеет индекс L, означающий возможность работы при напряжении питания от 2,7 до 5 В. Это связано с большой ёмкостью фильтрующего конденсатора, т.е. с плавным нарастанием напряжения питания при подключении устройства к сети.

МК тактируется внутренним RC генератором на частоте 1 МГц. Этого достаточно чтобы получить среднее время выполнения основной программы около 0,5 мс. Здесь важно помнить о том, что повышение тактовой частоты увеличивает ток потребления. Стабилизировать частоту кварцевым или керамическим резонатором не требуется, т.к. в данном применении высокая точность не нужна. Также не требуется калибровка внутреннего генератора.

Производитель МК рекомендует предпринять следующие меры при работе с АЦП:

установить между выводом REF и общим проводом фильтрующий конденсатор

соединить вывод AGND с аналоговой землёй

использовать LC фильтр питания в цепи AVCC

при измерении не переключать выводы АЦП порта, если они настроены как цифровые выходы

Поскольку высокая достоверность результата измерения не требуется, то с целью упрощения схемы, вышеуказанные меры не соблюдаются. Калибровка АЦП тоже не требуется, в том числе потому, что используется обычный канал, а не дифференциальный [6, раздел 2. 3].

По рекомендации ATMEL, для обеспечения надёжной работы МК, в непосредственной близости от его выводов питания установлены блокировочные конденсаторы С2 (керамический) и С3 (танталовый электролитический). В данной схеме это особенно актуально, т.к. при коммутации затворов транзисторов, обладающих довольно высокой ёмкостью, возникают значительные импульсные токи.

Для программирования МК предусмотрен разъём JS4 "ISP" (In-System Programming, внутрисхемное программирование). Так же, как и при программировании EEPROM самой программой во время работы, во время внутрисхемного программирования ток МК, согласно его описанию, составляет 6 мА (при 5 В и 25°С). По результатам измерений максимальный потребляемый ток находился в интервале от 4,3 мА до 5,8 мА. Из-за малой мощности блока питания напряжение во время программирования снижалось примерно до 3,3 В. Однако в Интернете встречаются сообщения о том, что МК нормально программируется при напряжении вплоть до 3 В. Поэтому лучшим вариантом, возможно, окажется запрограммировать МК до установки в схему.

Не показанные на схеме выводы МК никуда не подключены.

3.4 Делитель напряжения


Резисторы R3 и R4 образуют делитель, необходимый МК для измерения напряжения сети и определения момента перехода фазы через нуль. Обычно резистор между выходом диодного моста и входом МК рекомендуется составлять из двух включенных последовательно (на случай пробоя одного из них), но поскольку перед диодным мостом установлен защитный диод, эта рекомендация не выполняется.

Для вычисления минимального сопротивления верхнего плеча делителя воспользуемся стандартной формулой:

Uвых = (Uвх R2) / (R1 + R2).

Отсюда: R1 = ( (Uвх - Uвых) R2) / Uвых.

Введём коэффициент Квх, определяющий максимальное отклонение сетевого напряжения:

R1 = ( (UвхКвх - Uвых) R2) / Uвых.

Поскольку нас интересует полный размах сетевого напряжения, перепишем формулу с учётом амплитудного значения:

R1 = ( (UвхКвх1,41 - Uвых) R2) / Uвых.

Учтём падение напряжения на двух диодах диодного моста:

 

R1 = ( (UвхКвх1,41 - 2Uд - Uвых) R2) / Uвых

Падение напряжения на предохранителе не учитывается, т.к. по результатам измерений оно составило всего 0,2 В при максимальной нагрузке.

Осталось добавить коэффициенты Кr, определяющие отклонение резисторов от номинала:

 

R1 = ( (UвхКвх1,41 - 2Uд - Uвых) R2 Кr2) Кr1/Uвых

Переходим к подстановке численных значений.

Входное напряжение Uвх = 220 В, его отклонение Квх = 10%.

В качестве значения Uд берём минимальное падение напряжения, т.к. в этом случае сопротивление резистора R1 будет больше. Минимальное падение напряжения на диодах моста будет при минимальном токе, т.е. при отключенной нагрузке. Падение напряжения на одном элементе при токе нагрузки 10 мА равно примерно Uд = 0,65 В.

Благодаря использованию фильтрующего конденсатора большой ёмкости, пульсациями БП можно пренебречь. Поэтому минимальное напряжение питания МК определяется минимальным напряжением стабилизации ИОН, что, согласно описанию последнего, равно Uвых = 5 - 1% = 4,95 В.

Стандартный допуск на отклонение сопротивления резисторов равен Кr = 5%. Нужно предусмотреть ситуацию, когда сопротивление R2 (R3 по схеме) будет больше, т.к. при этом Uвых тоже увеличится. Это, как было отмечено ранее, может привести к неверному результату измерения. Поэтому принимаем Кr2 = 0,95. С сопротивлением R1 (R4 по схеме) ситуация противоположная - важно учесть уменьшение сопротивления. Поэтому Кr1 = 1,05.

Подставляя численные значения в формулу, получаем:

R1 = ( (2201,11,41 - 20,65 - 4,95) 9,1103 0,95) 1,05/4,95 = (334,97 8,65103) 1,05/4,95 = 3042,37103/4,95 = 614,6103 Ом.

Ближайшим сопротивлением из стандартного ряда, превышающим полученное значение, является номинал 620 кОм.

3.5 Выходной каскад


Нагрузка коммутируется N-канальными MOSFET транзисторами VT1 и VT2. Особенностью схемы является отсутствие драйвера, что в соответствии с требованием проекта уменьшает количество используемых компонентов. Транзисторы управляются напрямую выходами МК.

При напряжении ограничения встроенного в транзистор ограничителя около 30 В и сопротивлении резистора в цепи затвора 10 кОм ток через выход МК составит примерно 3 мА, что в три раза превышает допустимый. Поэтому для повышения надёжности схемы между затвором и истоком транзистора можно поставить дополнительный ограничитель с максимальным напряжением ограничения до 10 В. При таком напряжении ток через внутренние защитные диоды МК будет находиться на безопасном уровне 1 мА.

Транзисторы

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

ток стока - не менее 6 А, типовое сопротивление канала - не более 1 Ом

напряжение сток-исток - не менее 600 В

двусторонний ограничитель напряжения на затворе - есть

максимальное пороговое напряжение затвор-исток - менее 5 В

график зависимости тока стока от напряжения на затворе - нормирован для напряжения затвора 5 В или меньше. То же относится к графику зависимости тока стока от напряжения сток-исток.

Кроме этого, в соответствии с требованием к проекту транзистор не должен сильно нагреваться, в идеале - не нагреваться вообще. Величина нагрева Tja характеризуется формулой:

 

Tja = P Rth = R I2 Rth + 25°C,

где R - сопротивление канала сток-исток I - ток нагрузки Rth - тепловое сопротивление транзистора (корпус-окружающая среда)

Так как частота переключения транзистора не превышает 100 Гц, его динамические потери малы, на нагрев не влияют, и поэтому в формуле не учитываются.

Из формулы следует, что транзистор должен иметь как можно меньшее значение теплового сопротивления. Выбранный транзистор имеет корпус, практически идентичный корпусу TO220, и обладает относительно невысоким тепловым сопротивлением (62,5°C). По результатам изучения продукции основных производителей MOSFET транзисторов (Infineon, International Rectifier, Ixys, Fairchild, NEC, NXP, ON Semiconductors, Renesas, Toshiba, Vishay) выяснилось, что встроенный ограничитель напряжения на затворе имеется только у транзисторов фирмы Toshiba (данные 2007 года). Далее перечислены транзисторы этой фирмы, подходящие по остальным параметрам и рекомендуемые в качестве замены: 2SK2544, 2SK2777, 2SK3130, 2SK3947, 2SK4013, 2SK4014, 2SK3799, 2SK2843, 2SK2866, 2SK2889, 2SK2996, 2SK3265, 2SK3797. Следует отметить, что рекомендация основана только на изучении описаний транзисторов.

 

Резисторы в цепи затвора

Сопротивление резисторов R5 и R6 оказывает влияние на следующие факторы:

защиту выхода МК от броска тока при перезарядке входной ёмкости транзистора (чем больше сопротивление, тем меньше ток)

защиту выхода МК от превышения напряжения на затворе, которое возникает из-за ёмкости Миллера (чем больше сопротивление, тем лучше защита)

степень нагрева транзисторов (чем меньше сопротивление, тем меньше нагрев)

уровень помех радио - и ИК-приёму, а также в электросети (чем больше сопротивление, тем меньше помех)

силу звона нитей ламп накаливания (чем больше сопротивление, тем меньше звон)

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

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

Лампы

Следует отметить, что помимо неприятного жужжания, звон нити лампы резко сокращает её ресурс. Тестирование ламп различных производителей на минимальный уровень звона нити позволило расположить их в следующем порядке предпочтений: Osram, Philips, General Electric. В результате выбор остановился на матовых лампах Osram Classic B FR 60 230V E14/SES, 660lm, Energy index E.

 

.6 Цепь защиты


Предохранитель F1 и защитный диод VD1 формируют цепь защиты, которая предохраняет устройство от выхода из строя при коротком замыкании нагрузки, превышения её мощности, а также при бросках напряжения в сети, и аварийного повышения её напряжения до 380 В.

Предохранитель рассчитывается, исходя из максимальной нагрузки, по стандартной формуле I = P / U. Отсюда I = 2 60/220 = 0,55 А. Ток потребления схемы при этом не учитывается, т.к. в сравнении он пренебрежимо мал. Вполне допустимо выбрать предохранитель на 0,5 А. Эксплуатация устройства подтвердила, что такой номинал выдерживает долговременную (не менее 24 часов) максимальную яркость обеих ламп при максимально допустимом напряжении сети.

Чтобы защитить чувствительные полупроводниковые приборы, используется быстродействующий предохранитель. Для отечественного предохранителя серии ВП2Б-1В время срабатывания при превышении номинального тока в 2,75 раза равно 1 секунде.

Использовать современные полимерные предохранители в данной схеме не представляется возможным из-за их сильного нагрева и невысокой скорости срабатывания. Например, для предохранителя LB600LV время срабатывания при токе нагрузки 3 А составляет 36 секунд.

Защита от короткого замыкания нагрузки и превышения её мощности

Возможны два варианта короткого замыкания: при выключенной нагрузке и при включенной нагрузке.

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

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

 

Защита от превышения сетевого напряжения

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

Защитный диод устанавливается параллельно входу устройства непосредственно за предохранителем. Выводы защитного диода служат теплоотводом. Согласно описанию, длина каждого вывода должна составлять 10 мм.

Если в течение некоторого времени ток через защитный диод будет превышать ток срабатывания предохранителя, последний перегорает, защищая устройство. Чем больше превышение тока, тем быстрее сработает предохранитель. Как уже отмечалось, применённый в схеме быстродействующий предохранитель имеет время срабатывания 1 сек. при превышении номинального тока в 2,75 раза.

3.7 Расчёт потребляемой мощности


Как следует из анализа принципиальной схемы, потребляемый ток складывается из следующих составляющих: ток делителя напряжения Iд, ток стабилитрона Iст, и ток нагрузки блока питания Iн. В силу малых величин, обратные токи защитного диода, выпрямительного моста, транзисторов, а также токи утечки конденсаторов не учитываются.

Итак, P = Uвх (Iд + Iст + Iн).

Ток делителя напряжения определим по закону Ома с учётом падения напряжения на диодах выпрямительного моста:

P = Uвх ( ( (Uвх - Uд) / Rд) + Iст +Iн).

Для расчёта тока стабилитрона и тока нагрузки преобразуем формулу, использованную при расчёте балластного резистора, к виду:

Iст + Iн = (Uвх - 2Uд - Uст) / Rб.

С учётом коэффициента, учитывающего отклонение сопротивлений резисторов, конечная формула будет иметь вид:

P = Uвх [ ( (Uвх - 2Uд) / RдКr) + ( (Uвх - 2Uд - Uст) / RбКr)]

Рассчитаем максимальную мощность, потребляемую устройством в ждущем режиме, при номинальном напряжении сети Uвх = 220 В и минимальном напряжении стабилизации Uст = 4,95 В. Падение напряжения на диоде выпрямительного моста составит Uд = 0,65 В. Общее сопротивление делителя напряжения определяется суммой последовательно включенных сопротивлений:

Rд = 620000 + 9100 = 629100 Ом.

По аналогии:

Rб = 30000 + 30000 = 60000 Ом.

Отклонение номиналов резисторов 5%, т. е Кr = 0,95.

Подставляем данные в формулу:

P = 220 [ ( (220 - 20,65) / 6291000,95) + ( (220 - 20,65 - 4,95) / 600000,95)] = 220 [0,00037 + 0,0038] = 0,92 ВА

По данным измерений ток, потребляемый устройством от сети в ждущем режиме при номинальном сетевом напряжении, составил 4,0 мА. Отсюда P = 220 0,004 = 0,88 ВА, что находится в пределах рассчитанной величины.

Поскольку в ждущем режиме устройство представляет собой чисто активную нагрузку, активная мощность в данном случае эквивалентна полной мощности:

Р = 0,92 ВА = 0,92 Вт.

4. Программная часть


Код программы написан на языке ассемблера, занимает в памяти программ МК более 3 КБ. Задействованы все 32 регистра, 51 байт оперативной памяти (SRAM, ОЗУ), 45 байт энергонезависимой памяти EEPROM.

МК ATmega16 имеет 16 КБ программной памяти, 1 КБ SRAM, 512 байт EEPROM, и богатый набор периферийных устройств, из-за чего он с лихвой покрывает требования к устройству. Выбор МК "с запасом" сделан умышленно, чтобы иметь возможность совершенствовать устройство и наращивать его функциональные возможности (см. заключение).

При необходимости код может быть перенесён на другие МК семейства ATmega.

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

 

4.1 Блок-схема алгоритма


Структура программы показана на Рис. 4. Каждый блок начинается с названия файла, в котором размещён программный код данного блока. Подпрограммы обозначены блоком меньшего горизонтального размера. Среди них есть функции, т.е. подпрограммы, возвращающие значения. Для упрощения они тоже называются подпрограммами. Отличие подпрограмм, расположенных в файле ProceduresINT. asm, от подпрограмм в файле ProceduresEXT. asm заключается в том, что первые предназначаются только для данного проекта, а вторые являются универсальными и могут найти применение в сходных проектах. Блок Startup. asm тоже использует некоторые подпрограммы, но для упрощения восприятия рисунка эти связи на блок-схеме не показаны.

 

Рис. 4. Блок-схема алгоритма.

4.2 Описание программы


Далее кратко рассмотрены ключевые моменты программной части проекта. Дополнительная информация содержится в комментариях, которыми снабжено большинство строк программы.

Адресное пространство энергонезависимой памяти разделено на три области. В первой хранятся настраиваемые пользователем параметры устройства, во второй - системные переменные, в третьей - результаты диагностики. Первая область отделена от второй несколькими пустыми ячейками, значения которых равны $FF. Третья область находится в конце адресного пространства. Первые 16 ячеек EEPROM не используются. Помимо удобства восприятия, это предохраняет содержимое первой ячейки от случайного изменения, когда регистр адреса EEPROM равен нулю. Нулевое значение присваивается этому регистру во время инициализации (блок Reset. asm). По той же самой причине не используется и последняя ячейка EEPROM, чтобы исключить изменение её содержимого, когда регистр адреса равен максимальному значению $01FF.

Принимая во внимание ограниченное количество циклов перезаписи EEPROM (100 000 согласно описанию), в памяти сохраняются только самые необходимые данные, а именно уровень установленной пользователем яркости и текущее состояние устройства.

Прерывания не задействованы. Программный код, расположенный в блоке Main. asm, выполняется в бесконечном цикле. Тем самым удаётся повысить быстродействие за счёт отказа от команды RETI и команд работы со стеком. Тем не менее, в целях диагностики неисправностей, срабатывание любого прерывания фиксируется и запоминается в EEPROM (подпрограмма WrongINT. asm). Также в целях диагностики запоминается причина, вызвавшая сброс МК (блок ResetCause. asm).

Энергосберегающие режимы не используются. Это связано с тем, что в течение примерно 9,5мс каждого полупериода ведётся непрерывное измерение сетевого напряжения, а в оставшиеся 0,5мс выполняется основная программа. Переводить МК в спящий режим на столь короткое время не имеет смысла. К тому же, возврат МК из любого спящего режима требует дополнительных затрат времени, что сказывается на быстродействии.

Выключение АЦП на время выполнения основной программы тоже не имеет смысла. В ходе измерений было установлено, что потребляемый МК ток снижается при этом всего на 10мкА.

Выходы МК переключаются одновременно. Это необходимо для того, чтобы оба канала имели равные временные задержки и работали одинаково.

По окончании инициализации всем регистрам и ячейкам ОЗУ присваивается нулевое значение (блок SRAMInit. asm). В результате, не нужно помнить о том, чтобы все переменные были проинициализированы, т.е. не содержали бы случайных значений.

После инициализации регистров и ОЗУ продолжение программы приостанавливается на несколько секунд (осуществляется программная задержка). За это время напряжение питания МК и образцовое напряжение АЦП успевают достигнуть номинального уровня.

При таком подходе появляется возможность проверки считанных из EEPROM данных. Если введённый пользователем параметр настройки является недопустимым, он преобразуется к ближайшему допустимому значению (меньшему или большему). Это действие, условно называемое нормализация, выполняется не для всех ячеек, а только для тех, допустимые значения которых однозначны, а также для тех, недопустимые значения которых могут привести к явным ошибкам в работе устройства.

Одной из задач инициализации является однократное измерение сетевого напряжения. Поскольку заранее невозможно предсказать, в какой момент времени светильник будет подключен к сети, результатом этого измерения является случайное число, используемое далее в подпрограмме генератора псевдослучайных чисел как точка отсчёта seed (блок Procedures. EXT. asm).

Перед тем как передать управление основному блоку, программа определяет, в каком состоянии находилось устройство перед отключением питания. В зависимости от результата устанавливаются те или иные флаги, сообщающие основной программе о том, какие действия необходимо предпринять. Например, если в момент пропадания сетевого напряжения был включен первый канал, то после восстановления электроснабжения он включится автоматически (если это было предварительно разрешено пользователем в настройках устройства).

Как уже отмечалось, код основного блока Main. asm выполняется в бесконечном цикле. Так как детектирование перехода сетевого напряжения через нуль осуществляется в каждом полупериоде, цикл Main. asm повторяется каждые 10 мс.

Первая команда основного блока - сброс сторожевого таймера. Следует отметить, что это единственное место во всей основной программе, где осуществляется сброс сторожевого таймера.

Алгоритм основан на сравнении не с константой, а с предыдущим результатом измерения. Команда на включение каналов подаётся только тогда, когда текущий результат измерения становится больше предыдущего. В обычном режиме (без воздействия помех) МК осуществит выход из цикла, как только сетевое напряжение сменит направление с убывающего на возрастающее, т.е. сразу после перехода сетевого напряжения через нуль. Таким образом, отпадает необходимость в кварцевом резонаторе, калибровке внутреннего генератора и в калибровке АЦП. Также не требуется дополнительная константа и настройка устройства под конкретный экземпляр МК.

Погрешность нового алгоритма нетрудно подсчитать. Для определения момента, когда сетевое напряжение начало возрастать, достаточно двух измерений. Время одного преобразования АЦП составляет 27 мкс. Время на обработку полученного результата (первые 5 команд процедуры PhaseDetect) составит в худшем случае 8 мкс. Значит, максимальная погрешность равна 27 + 27 + 8 = 62 мкс. Согласно формуле U = A sin (2 p f t), при такой задержке мгновенное напряжение в сети будет находиться на уровне U = 310 sin (2 3,14 100 6210-6) = 12 В (относительно номинального сетевого напряжения).

Ввиду разветвлённости алгоритма основной программы его наглядное изображение в графическом виде не приводится, т.к. будет затруднительно для восприятия. Отдельные процедуры основной программы описаны далее. Облегчить понимание логики работы призваны комментарии к программному коду, а также раздел Управление.

Функция ИПХ (Имитация Присутствия Хозяев) использует в качестве счётчика времени во включенном и выключенном состоянии отдельную процедуру. В функции ИПХ практически везде опрашивается бит лишь одного (первого) канала. Это допустимо благодаря идентичности каналов, а также благодаря тому, что в данном режиме каналы управляются синхронно.

В момент включения функции ИПХ устанавливаются биты ebPowerState. Это сделано на случай пропадания сетевого напряжения в момент включения. Таким образом, при восстановлении напряжения работа функции будет продолжена.

В функции автоотключения процентное значение, на которое уменьшается яркость, умышленно ограничено интервалом от 10 до 90%. Такой диапазон хорошо подходит для визуального восприятия. Кроме того, уменьшение яркости менее чем на 10% недостаточно заметно.

Дребезг контактов кнопок SB1 и SB2 устраняется благодаря тому, что основная программа опрашивает их состояние каждый полупериод, т.е. каждые 10 мс. Устранению дребезга также способствует наличие внутреннего триггера Шмитта и линии задержки на входах МК.

Подпрограммы чтения и записи EEPROM работают только с первыми 256 байтами. Это упрощает адресацию, т.к. старший регистр адреса всегда равен нулю и не используется.

Если в момент обращения к EEPROM идёт обработка предыдущего запроса, то подпрограмма чтения дожидается его окончания. Подпрограмма записи в аналогичной ситуации немедленно прекращается. Это вполне допустимо, поскольку задержка записи даже в несколько десятков миллисекунд не нарушает работу основной программы, и не заметна для пользователя.

Как уже отмечалось, согласно описанию МК, гарантированное число циклов перезаписи EEPROM составляет не более 100 000. По этой причине запись в ячейку осуществляется лишь в том случае, если записываемый байт данных отличается от того, что в ней уже записан.

5. Особенности стабилизации яркости


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

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

Чтобы максимальная яркость оставалась неизменной при включении мощной нагрузки, максимальное напряжение на лампе должно быть изначально ограничено. За счёт образовавшейся разницы напряжений как раз и осуществляется стабилизация при уменьшении сетевого напряжения. Отсюда следует, что выбирать уровень максимального напряжения на лампе нужно как компромисс между максимальной яркостью и степенью её стабилизации.

Практическая проверка использованного алгоритма, выбранного компромиссного решения и методики подбора максимального напряжения показала, что при изменении напряжения сети в диапазоне от 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.

.М. Марков "АЦП с интерфейсом RS-232" // Радио, 2005г., №2, стр. 26; файл ADC675. zip.

. ГОСТ13109-97. Нормы качества электрической энергии в системах электроснабжения общего назначения.

4. G. Howell "Five questions about resistors <http://eldigi.ru/site/house/download/dimmer/Five_questions_about_resistors.rar>" // EDN, 9/28/2006, http://www.edn.com/contents/images/6372835. pdf <http://www.edn.com/contents/images/6372835.pdf>

5.П. Хоровиц, У. Хилл "Искусство схемотехники" - Изд. 6-е, М.: Мир, 2003.

6. "Characterization and Calibration of the ADC on an AVR <http://eldigi.ru/site/house/download/dimmer/Characterization_and_Calibration_of_the_ADC.rar>" - Application Note AVR120, 02/06, Atmel Corporation, http://www.atmel.com/dyn/resources/prod_documents/doc2559. pdf <http://www.atmel.com/dyn/resources/prod_documents/doc2559.pdf>

. "’The Eyes Response to Light <http://eldigi.ru/site/house/download/dimmer/The_Eyes_Response_to_Light.rar>" - Lutron Electronics, 8/97, http://www.lutron.com/product_technical/pdf/360-408. pdf <http://www.lutron.com/product_technical/pdf/360-408.pdf>

. "Four Great Reasons to Dim <http://eldigi.ru/site/house/download/dimmer/Four_Great_Reasons_to_Dim.rar>" - Lutron Electronics, http://www.lutron.com/dim. htm <http://www.lutron.com/dim.htm>

. "Frequently asked questions about dimmers <http://eldigi.ru/site/house/download/dimmer/Frequently_asked_questions_about_dimmers.rar>" // http://www.lutron.com/product_technical/faq. asp <http://www.lutron.com/product_technical/faq.asp>

. "LEDs move from indication to illumination <http://eldigi.ru/site/house/download/dimmer/LEDs_move_from_indication_to_illumination.rar>" // EDN, 8/2/2001 http://www.edn.com/contents/images/149134. pdf <http://www.edn.com/contents/images/149134.pdf>

11.Л.Н. Кечиев, Е.Д. Пожидаев "Защита электронных средств от воздействия статического электричества" - М.: ИД "Технологии", 2005.

Ссылки по теме:

1. Light dimmer circuits - <http://www.epanorama.net/documents/lights/lightdimmer.html>

. Lamp Experimental Data - http://alumni. imsa.edu/~ejohnson/light/ <http://alumni.imsa.edu/~ejohnson/light/>

3. Отечественный двухканальный диммер - http://eldigi.ru/site/house/28. php

. Диммер 15-канальный - http://eldigi.ru/site/house/30. php

. Диммер одноканальный - http://eldigi.ru/site/light/6. php

Приложение

Листинг основного функционального файла (Main. asm).

Main:

wdr

; ***********Обнаружение перехода сетевого напряжения через нуль*****************

clr Temp; Подготовка регистров, используемых в данной процедуре, а также в процедуре ADC_SAMPLING.

cpse Temp, rCh1OffTime; Если значение яркости канала равно нулю, то после обнаружения перехода фазы он не включится.

sbr rOutChannels, 1<<bChannel1Temp, rCh2OffTimerOutChannels, 1<<bChannel2ZL, LOW (cADCSamplesCount); Загрузка 16-ти разрядного счетчика преобразований АЦП 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, rCh2OffTimePC+4rOutChannels, 1<<bChannel2PC+4rTotalVoltage2_1, R0rTotalVoltage2_2, R1 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 TempmOwnersAtHomeSeconds, TempExitOwnersAtHome Temp, 100

; ldi Temp, 5; уменьшение таймаута для ускорения тестирования

sts mOwnersAtHomeSeconds, TempTemp, mOwnersAtHomeMinutesTempmOwnersAtHomeMinutes, TempExitOwnersAtHomeTemp, 60mOwnersAtHomeMinutes, TempTemp, mOwnersAtHomeSharedCellTempmOwnersAtHomeSharedCell, TempExitOwnersAtHome; Как только счетчик отсчитает заданный интервал,rBit1, bIsChannel1On; происходит включение,OwnersAtHomeToOffState; или выключение обоих каналов,rBit1, (1<<bSoftTurnCh1) + (1<<bSoftTurnCh2) + (1<<bIsChannel1On) + (1<<bIsChannel2On) + (1<<bBrightVectorCh1) + (1<<bBrightVectorCh2) 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); и дается команда плавного выключения.

sts mOwnersAtHomeSharedCell, Temp; Запись длительности включенного или выключенного состояния в ячейку оперативной памяти.

ExitOwnersAtHome:

; ******************Обработка первого канала****************************Processing: rBit1, bSoftTurnCh1; Если бит установлен, значит надо выполнить

rjmp CheckButton1; включение или выключение канала.

sbrs rBit1, bIsChannel1On; Если канал включен,

rjmp SoftTurnOffCh1; происходит его плавное выключение.

lds Temp, meOwnersAtHomeBright; При включении канала в режиме ИПХ,

sbrc reSystemBits, ebOwnersAtHome

rjmp CompareBrightnessCh1

lds Temp, meLastBright1_1; а также в обычном первом

sbrc reSystemBits, ebChannel1ModeTemp, meLastBright1_2; или втором режиме1:

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, ebChannel1ModeTemp, meTurnOnSpeedMode2Ch1; или второго режима. 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, meTurnOffSpeedMode1Ch1reSystemBits, ebChannel1ModeTemp, meTurnOffSpeedMode2Ch1rSoftTurnSpeedCh1Temp, rSoftTurnSpeedCh1ExitSoftTurnOffCh1rSoftTurnSpeedCh1rBrightnessCh1; то уменьшить ее на один шаг, учитывая скорость снижения (аналогично процедуре SoftTurnOnCh1:).:GoOutCh1Completed:; Если яркость снизилась до требуемого значения, 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 TurnCh1InSecondModeTemp, rBit1; и все каналыTemp, (1<<bBrightVectorCh1) + (1<<bBrightVectorCh2); полностью выключены,TurnCh1InSecondModereSystemBits, (1<<ebOwnersAtHome) + (1<<ebPowerStateCh1) + (1<<ebPowerStateCh2); то они включаются в режиме ИПХ. OwnersAtHomeTimerTrigger; Для этого таймер функции ИПХ настраивается на срабатывание в следующем цикле.

rjmp Channel2Processing

TurnCh1InSecondMode:

sbr reSystemBits, 1<<ebChannel1Mode; При выключенном канале удерживание кнопки в нажатом положении приводит к включению канала во втором режиме.

cbr reSystemBits, 1<<ebOwnersAtHome; При этом режим ИПХ отключается.

rjmp TurnCh1On:; Восстановление яркости. 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; иначе - увеличить.:Temp, meBrightnessMinCh1Temp, rBrightnessCh1 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:Temp, meBrightnessMaxCh1rBrightnessCh1, TempMaxBrightnessReachedCh1rBrightnessCh1GoOutCh1:rBrightCounterCh1, reBrightChangeSpeedCh1Temp, mBrightMaxCounterCh1TempBrightMaxTimeoutIsUpCh1mBrightMaxCounterCh1, TempGoOutCh1:Temp, meMaxBrightDelayCh1mBrightMaxCounterCh1, TemprBit1, 1<<bBrightVectorCh1rBrightCounterCh1GoOutCh11IsOff:; Кнопка не нажата, или только что была отжата.

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); Если канал выключен, 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 rBrightnessCh1, Temp; направление изменения яркости сменится на противоположное только в том случае,

breq InvertBrightVectorCh1; если в момент отпускания кнопки яркость находилась на минимальном

lds Temp, meBrightnessMaxCh1; или максимальном значении. Это нужно для того чтобы

cp rBrightnessCh1, Temp; исключить задержку изменения крайнего значения яркости

breq InvertBrightVectorCh1; при следующем нажатии кнопки.

rjmp IsChannel1On

InvertBrightVectorCh1:; Смена направления изменения яркости на противоположное.

mov Temp, rBit1rBit1, 1<<bBrightVectorCh1Temp, bBrightVectorCh1rBit1, 1<<bBrightVectorCh1 IsChannel1On

TurnCh1On:

sbr rBit1, (1<<bIsChannel1On) + (1<<bSoftTurnCh1) + (1<<bBrightVectorCh1); При включении канала устанавливаются признаки включенного канала, плавного включения, вектор яркости направляется в сторону увеличения.

clr rBrightnessCh1; Яркость увеличивается, начиная с нуля.

rjmp Channel2ProcessingOff:reSystemBits, ebOwnersAtHome; В режиме ИПХOwnersAtHomeNotSetCh1rBit1, (1<<bIsChannel1On) + (1<<bIsChannel2On); любое кратковременное нажатие кнопкиrBit1, (1<<bSoftTurnCh1) + (1<<bSoftTurnCh2); выключает оба канала,reSystemBits, (1<<ebOwnersAtHome) + (1<<ebPowerStateCh1) + (1<<ebPowerStateCh2); а также сам режим.GoOutCh1:rBit1, (1<<bIsChannel1On) + (1<<bTurnOffStartedCh1); При выключении канала флаг автоотключения сбрасывается. 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:reUserBits2, ebSaveBrightM2Ch1meLastBright1_2, rBrightnessCh11:

rcall TurnOffTimeoutCh1; Из-за малого допустимого смещения команд типа brne (максимум 64 байта) приходится использовать вызов подпрограммы.

GoOutCh1:ZH, HIGH (2*BrightnessTable)ZL, LOW (2*BrightnessTable)ZL, rBrightnessCh1; Значение регистра rBrightness задает величину смещения Temp, 0; в таблице яркости.

adc ZH, Temp

lpm rCh1OffTime, Z; Загрузка в регистр rCh1OffTime условного значения времени через которое канал должен быть погашен.

; ****************Обработка второго канала********************************Processing:rBit1, bSoftTurnCh2CheckButton2rBit1, bIsChannel2OnSoftTurnOffCh2Temp, meOwnersAtHomeBrightreSystemBits, ebOwnersAtHomeCompareBrightnessCh2Temp, meLastBright2_1reSystemBits, ebChannel2ModeTemp, meLastBright2_2:Temp, rBrightnessCh2SoftTurnOnCh2Completed:rBit1, 1<<bSoftTurnCh2reSystemBits, 1<<ebPowerStateCh2rButton2HoldTime, 255Temp, meBrightnessMaxCh2rBrightnessCh2, TempPC+2rBit1, 1<<bBrightVectorCh2GoOutCh2:Temp, meTurnOnSpeedMode1Ch2reSystemBits, ebChannel2ModeTemp, meTurnOnSpeedMode2Ch2rSoftTurnSpeedCh2Temp, rSoftTurnSpeedCh2ExitSoftTurnOnCh2rSoftTurnSpeedCh2rBrightnessCh2:GoOutCh2:reSystemBits, 1<<ebPowerStateCh2rBit1, bTurnOffStartedCh2rSoftOffBrightCh2rBrightnessCh2, rSoftOffBrightCh2SoftTurnOffCh2CompletedTemp, meTurnOffSpeedMode1Ch2reSystemBits, ebChannel2ModeTemp, meTurnOffSpeedMode2Ch2rSoftTurnSpeedCh2Temp, rSoftTurnSpeedCh2ExitSoftTurnOffCh2rSoftTurnSpeedCh2rBrightnessCh2:GoOutCh2Completed:rBit1, 1<<bSoftTurnCh2rBit1, bTurnOffStartedCh2rBit1, 1<<bIsChannel2OnrButton2HoldTime, 255GoOutCh2:pKeyboardIn, sbChannel2Button2IsOffTemp, 255mSaveBrightDelayCh2, TempResetAutoOffTimerCh2rButton2HoldTime, cButtonOnHoldSenseButton2OnHoldrButton2HoldTime, 255PC+2rButton2HoldTimeIsChannel2OnOnHold:rBit1, bTurnOffStartedCh2RestoreBrightnessCh2rBit1, bIsChannel2OnChangeBrightnessCh2pKeyboardIn, sbChannel1TurnCh2InSecondModeTemp, rBit1Temp, (1<<bBrightVectorCh1) + (1<<bBrightVectorCh2)TurnCh2InSecondModereSystemBits, (1<<ebOwnersAtHome) + (1<<ebPowerStateCh1) + (1<<ebPowerStateCh2)OwnersAtHomeTimerTriggerGoOutInSecondMode:reSystemBits, 1<<ebChannel2ModereSystemBits, 1<<ebOwnersAtHomeTurnCh2On:ResetAutoOffTimerCh2rBit1, 1<<bTurnOffStartedCh2reSystemBits, 1<<ebPowerStateCh2rBit1, 1<<bSoftTurnCh2GoOutCh2:reSystemBits, ebOwnersAtHomeGoOutCh2reBrightChangeSpeedCh2, rBrightCounterCh2BrightReadyToChangeCh2rBrightCounterCh2IsChannel2On:rBrightCounterCh2rBit1, bBrightVectorCh2IncreaseBrightnessCh2:Temp, meBrightnessMinCh2Temp, rBrightnessCh2MinBrightnessReachedCh2rBrightnessCh2GoOutCh2:rBrightCounterCh2, reBrightChangeSpeedCh2Temp, mBrightMinCounterCh2TempBrightMinTimeoutIsUpCh2mBrightMinCounterCh2, TempGoOutCh2:Temp, meMinBrightDelayCh2mBrightMinCounterCh2, TemprBit1, 1<<bBrightVectorCh2rBrightCounterCh2GoOutCh2:Temp, meBrightnessMaxCh2rBrightnessCh2, TempMaxBrightnessReachedCh2rBrightnessCh2GoOutCh2:rBrightCounterCh2, reBrightChangeSpeedCh2Temp, mBrightMaxCounterCh2TempBrightMaxTimeoutIsUpCh2mBrightMaxCounterCh2, TempGoOutCh2:Temp, meMaxBrightDelayCh2mBrightMaxCounterCh2, TemprBit1, 1<<bBrightVectorCh2rBrightCounterCh2GoOutCh2IsOff:rButton2HoldTime, 255PC+2rButton2HoldTime, 0rButton2HoldTime, 0IsChannel2OnrButton2HoldTime, cButtonOnHoldSenserButton2HoldTime, 0HoldButton2:rBit1, bIsChannel2OnTurnCh2OffreSystemBits, (1<<ebChannel2Mode) + (1<<ebOwnersAtHome)TurnCh2On:Temp, meMinBrightDelayCh2mBrightMinCounterCh2, TempTemp, meMaxBrightDelayCh2mBrightMaxCounterCh2, TempreUserBits1, ebBrightDirModeCh2InvertBrightVectorCh2Temp, meBrightnessMinCh2rBrightnessCh2, TempInvertBrightVectorCh2Temp, meBrightnessMaxCh2rBrightnessCh2, TempInvertBrightVectorCh2IsChannel2On:Temp, rBit1rBit1, 1<<bBrightVectorCh2Temp, bBrightVectorCh2rBit1, 1<<bBrightVectorCh2IsChannel2OnOn:rBit1, (1<<bIsChannel2On) + (1<<bSoftTurnCh2) + (1<<bBrightVectorCh2)rBrightnessCh2GoOutOff:reSystemBits, ebOwnersAtHomeOwnersAtHomeNotSetCh2rBit1, (1<<bIsChannel1On) + (1<<bIsChannel2On)rBit1, (1<<bSoftTurnCh1) + (1<<bSoftTurnCh2)reSystemBits, (1<<ebOwnersAtHome) + (1<<ebPowerStateCh1) + (1<<ebPowerStateCh2)GoOutCh2:rBit1, (1<<bIsChannel2On) + (1<<bTurnOffStartedCh2)rBit1, 1<<bSoftTurnCh2GoOutCh2On:rBit1, bIsChannel2OnGoOutreSystemBits, ebOwnersAtHomeGoOutCh2Temp, mSaveBrightDelayCh2TempmSaveBrightDelayCh2, TempExitSaveBrightDelayCh2rBit1, bTurnOffStartedCh2ExitSaveBrightDelayCh2reSystemBits, ebChannel2ModeSaveBrightnessMode2Ch2reUserBits2, ebSaveBrightM1Ch2meLastBright2_1, rBrightnessCh2ExitSaveBrightDelayCh2Ch2:reUserBits2, ebSaveBrightM2Ch2meLastBright2_2, rBrightnessCh2:TurnOffTimeoutCh2:ZH, HIGH (2*BrightnessTable)ZL, LOW (2*BrightnessTable)ZL, rBrightnessCh2Temp, 0ZH, TemprCh2OffTime, 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_1EepromWriteIfDifferentTemp, eLastBright2_2Tmp, meLastBright2_2EepromWriteIfDifferentTemp, eSystemBits; Если значение хотя бы одного бита в reBit Tmp, reSystemBits; отличается от аналогичного бита в eeprom,

rcall EepromWriteIfDifferent; сохранить весь регистр reBit в eeprom.

rjmp Main

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!