РадиоКот :: Двухканальный стабилизированный диммер.
Например TDA7294

РадиоКот >Схемы >Цифровые устройства >Бытовая техника >

Теги статьи: Добавить тег

Двухканальный стабилизированный диммер.

Автор: Михаил Юрьевич Милославский
Опубликовано 19.11.2009

1. Общие сведения.

1.1. Введение
Несмотря на бурное развитие сверхярких светодиодов, в широкой продаже пока не появились светодиодные лампы, способные заменить бытовые лампы накаливания. Получившие довольно широкое распространение энергосберегающие люминесцентные лампы, при всех своих достоинствах, обладают, во-первых, высокой стоимостью, во-вторых, требуют сложную схему управления яркостью [1]. Отечественные и зарубежные регуляторы ламп накаливания имеют ряд недостатков:
- управление только одним каналом
- отсутствие стабилизации яркости
- наличие помех радиоприёму, звон нитей ламп, жужжание встроенного фильтра
Эти же недостатки (либо все сразу, либо по отдельности) присущи схемам, опубликованным в радиолюбительской литературе, периодической печати и в Интернете.

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

Разработка устройства велась с учётом следующих требований (все с одинаковым приоритетом):
     Простота схемы (минимальное количество компонентов)
     Функциональная насыщенность, многообразие регулируемых параметров
     Устойчивость к броскам сетевого напряжения, долговечность
     Отсутствие либо минимальный нагрев компонентов (пожаробезопасность)
     Низкое энергопотребление
При проектировании устройства не ставилась задача минимизировать его стоимость.

Несколько слов о том, откуда и почему взялись эти требования. Малое число используемых деталей - это необходимость, вызванная малыми размерами корпуса светильника. Расширенный список функций и обилие всевозможных регулируемых параметров - не что иное, как желание дать возможность любому пользователю настроить и использовать устройство в соответствии со своими потребностями и желаниями, а не ограничиваться тем набором, который обычно закладывают производители в свои изделия. Защита от повышения напряжения в сети - насущная необходимость, связанная с невысоким качеством российского электроснабжения. Долговечность - без комментариев. Небольшой нагрев компонентов - во-первых, из-за плотного примыкания к обоям на стенах (учитывается круглосуточный режим работы, в том числе без присмотра), во-вторых, для снижения потребляемой мощности (нагрев - это лишние потери), в-третьих, для упрощения расчётов (везде подразумевалась температура окружающей среды 25°C). Низкое энергопотребление - в первую очередь забота об окружающей среде.

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

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

2

Мощность ламп

60 Вт на каждый канал

Напряжение сети

220 В +/-10%

Частота сетевого напряжения

50 Гц +/-0,4 Гц

Потребляемая мощность

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

Диапазон регулировки напряжения

12 - 88% (может быть расширен до 1,4 - 99,6%)

Изменение выходного напряжения в диапазоне входного от 198 В до 242 В

1 В (при максимальной яркости лампы)

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

Два независимых режима работы каждого канала
Возможность отключения запоминания яркости (для любого режима любого канала)
Автоматическое включение при возобновлении подачи электроэнергии (отключаемое)
Автоотключение по прошествии заданного интервала времени (два способа)
Имитация присутствия хозяев (возможен случайный выбор яркости и интервалов времени)
Хорошая повторяемость, не требуется налаживание схемы
Отсутствие дефицитных элементов (свободно приобретены в московской розничной сети)

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

Работа устройства описана максимально подробно. Автор исходил из принципа "лучше избыток информации, чем её недостаток". Тем не менее, некоторые очевидные моменты опускаются в расчёте на то, что читатель имеет опыт работы с микроконтроллерами. Рекомендуется прочитать проект от начала и до конца, т.к. он содержит интересные оригинальные решения, а также ссылки на опыт зарубежных авторов, не публиковавшийся ранее на русском языке.
Основные расчёты, выделенные в тексте жирным шрифтом, сведены в прилагаемый файл Excel. Небольшое расхождение между результатами в файле и в описании проекта связано с погрешностями округления.

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

Рис. 2

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

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

Стабилизация мощности (т.е. яркости) основана на использовании формулы P = U2/R. Если принять, что сопротивление нити накала постоянно [2], то, измеряя и корректируя в каждом полупериоде среднее напряжение на лампе, можно добиться стабилизации яркости. Изменение сопротивления нити при включении не учитывается, т.к. при этом, равно как и при регулировке яркости, стабилизация не нужна. Строго говоря, сопротивление нити зависит от температуры, а также изменяется в некоторых пределах в течение каждого полупериода [3]. Однако практическая проверка показала, что эти факторы можно не принимать во внимание - на качестве стабилизации они не отражаются.
В принципе вместо напряжения можно измерять ток через нагрузку, в соответствии с формулой P = I2*R. Но это требует дополнительного компонента (шунта), а выигрыша ни в чём не даёт.
Напряжение меряется не на самой лампе, а на выходе диодного моста, к которому она подключена. Это возможно, поскольку падение напряжения на канале транзистора мало и им можно пренебречь. Максимальное напряжение, которое можно подать на лампу, несколько снижено, чтобы было за счёт чего осуществлять стабилизацию при уменьшении напряжения сети.

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

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

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

Устройство имеет защиту от короткого замыкания, превышения мощности нагрузки и повышения сетевого напряжения.

1.6. Терминология
Использованные в описании термины имеют следующие значения:

Функция (feature) - то или иное удобство, предоставляемое пользователю. Пример функции - Имитация Присутствия Хозяев. Функция может иметь несколько режимов.
Режим (mode) - это выбираемый пользователем способ поведения функции. Например, функция Имитация Присутствия Хозяев может работать в режиме постоянных значений яркости, длительности включенного и выключенного состояний, или в режиме, когда эти значения выбираются случайно.
Состояние (state) - это составная часть каждого режима. Примеры: канал может находиться во включенном или выключенном состоянии (в любом режиме); при включении/выключении канала он находится в состоянии плавного увеличения/уменьшения яркости; при включенном канале и нажатой кнопке канал находиться в состоянии изменения яркости.
Нажать кнопку (ClickButton) - означает нажать её и затем отпустить не позже чем через 1 секунду (это время определяется значением константы cButtonOnHoldSense).
Удерживать кнопку (HoldButton) - значит нажать её и удерживать в нажатом положении не менее 1 секунды (это время определяется значением константы cButtonOnHoldSense).
Процедура - фрагмент кода, который начинается с одноимённой метки, и продолжается, как правило, до следующей метки. Например, процедура PhaseDetect - это участок кода программы от метки "PhaseDetect:" до метки "ADCSampling:".
Основная программа - участок кода в блоке Main.asm от первой команды процедуры ADCExit до первой команды процедуры PhaseDetect.

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

Каждый из двух каналов диммера имеет два режима работы. Каналы и их режимы работают одинаково, но независимо друг от друга, каждый со своими настройками. Поэтому далее рассматривается работа на примере одного канала или режима. Названия ячеек EEPROM, в которых хранятся настройки, даны в общем виде. Номер канала/режима либо не указывается совсем, либо обозначается буквой "X" или "x".

Допустимый диапазон настроек, их размерность, а также значения по умолчанию указаны в описании соответствующих ячеек EEPROM в файле Dimmer.asm. Порядок изменения значений некоторых из них приведён в разделе Настройка.

Существует несколько общих правил, которые относятся к любым функциям и режимам работы:
- Если не указано иное, длительность нарастания и спада яркости при включении и выключении определяется значениями ячеек eTurnOnSpeedModeXChX
- Во время включения и выключения канала он не реагирует на манипуляции с кнопкой
- Точность выдерживаемых интервалов зависит от стабильности частоты питающей сети и, как правило, составляет не хуже +/-10 секунд в сутки

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

2.1. Включение и выключение
Режим, в котором включится канал, определяется способом управления кнопкой. При нажатии кнопки включается первый режим, при удерживании - второй.
Яркость нарастает плавно, что в значительной степени продлевает срок службы лампы, и благоприятнее воспринимается. Яркость увеличивается до тех пор, пока не сравняется с той, которая была при последнем использовании данного режима. Уровень яркости сохраняется в ячейке eLastBright. Эта же ячейка определяет величину яркости при первом включении диммера в сеть, а также, если запоминание яркости было отключено.
Благодаря раздельным настройкам каналов и их режимов, появляется возможность задать четыре разных уровня освещения для различных ситуаций. Например: просмотр телепередач, чтение, ночное освещение, дежурный свет в комнате.

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

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

Если бит ebTurnPrevState установлен, то при возобновлении подачи электропитания после сбоя канал включится автоматически (через 4 сек.). При этом будет восстановлен тот режим и та яркость, которая существовала на момент сбоя. Если же отключение электроэнергии произошло во время включения или выключения канала, то после её возобновления канал не включится.

2.2. Регулировка и запоминание яркости
Регулировка яркости происходит при удерживании кнопки. Скорость изменения яркости определяется значением ячейки eBrightChangeSpeed.
Диапазон регулировки яркости задаётся ячейками eBrightnessMin и eBrightnessMax, причём даже том случае, когда уровень яркости, запомненный в ячейке eLastBrightX_X, лежит за пределами этого диапазона (о назначении ячейки eLastBrightX_X см. далее).
По достижении крайних значений изменение яркости на короткое время приостанавливается, чтобы иметь возможность зафиксировать её на минимальном или максимальном уровне. Длительность этой задержки определяется значениями ячеек eMinBrightDelay и eMaxBrightDelay.
Направление изменения яркости при удерживании кнопки зависит от состояния бита ebBrightDirMode. Если бит равен 0, направление не меняется, т.е. остаётся таким же каким было во время предыдущей регулировки. Если бит равен 1, направление изменяется на противоположное. Первая регулировка после включения канала всегда направлена в сторону увеличения яркости (если, конечно, её текущий уровень ниже максимального).

Через 2,5 секунды после окончания регулировки установленная яркость сохраняется в энергонезависимой памяти, её уровень записывается в ячейку eLastBrightX_X.
Имеется возможность отключить запоминание. Это может оказаться полезно, если, например, требуется, чтобы тот или иной режим того или иного канала всегда включался на максимальную яркость, но при этом сохранялась возможность регулировки. Возможен также и другой сценарий: предположим, что первый режим используется для чтения (яркость чуть выше средней), а второй - для просмотра телепередач (яркость чуть ниже средней). Иногда требуется, к примеру, что-то зашить. Для этого нужно включить максимальную яркость. Если запоминание яркости не отключать, то при следующем включении, например, первого режима яркость будет максимальной, а надо, чтобы она была, как и раньше, чуть выше средней, т.к. чтение используется намного чаще шитья.
Отключить запоминание яркости можно сбросом бита ebSaveBrightMхChх. В этом случае уровень яркости будет определяться значением той же самой ячейки eLastBrightХ_Х с тем лишь отличием, что её содержимое не будет перезаписываться. При этом пределы регулировки яркости остаются в диапазоне, определяемом ячейками eBrightnessMin и eBrightnessMax.
Если требуется чтобы яркость, задаваемая в ячейке eLastBrightХ_Х, была стабилизирована, следует выбирать её значение с учётом рекомендаций, относящихся к подбору максимальной яркости (см. раздел Настройка).

2.3. Автоотключение
Если канал не был выключен в течение количества часов, заданных в ячейке eOffTimeoutHours (1...24 ч.), он выключается автоматически. Отсчёт времени начинается сразу после отпускания кнопки при включении канала. Возможны два способа автоотключения, выбираемые с помощью бита ebAutoOffMode.

Способ 1 (ebAutoOffMode = 0). Яркость постепенно уменьшается до полного выключения канала. Время, за которое это происходит, определяется значением ячейки eOffTimeMode1. Время выключения зависит также от исходного уровня яркости.

Способ 2 (ebAutoOffMode = 1). Сначала яркость уменьшается на фиксированное значение, задаваемое в процентах от исходной яркости в ячейке eBrightDecrPercent (10...90%). Если после этого в течение количества минут, указанных в ячейке eOffTimeMode2 (1...240 мин.), автоотключение не будет отменено, канал выключается.

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

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

Стоит отметить, что помимо предоставляемого удобства и обеспечения безопасности, функция автоотключения отвечает требованию европейской директивы 1275/2008/ЕС от 17 декабря 2008 года, согласно которой все новые устройства, производимые с 2012 года, должны автоматически переключаться в режим пониженного энергопотребления.

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

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

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

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

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

Длительность нарастания и спада яркости при включении и выключении функции, а также во время её работы зависит от того, в каком режиме последний раз использовались каналы. Например, если первый канал был задействован в первом режиме, а второй канал во втором, то длительность нарастания и спада яркости первого канала будет определяться значениями ячеек eTurnOnSpeedMode1Ch1 и eTurnOffSpeedMode1Ch1, а второго канала - значениями ячеек eTurnOnSpeedMode2Ch2 и eTurnOffSpeedMode2Ch2.

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

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

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

ВНИМАНИЕ! Устройство не имеет гальванической развязки от сети. Элементы схемы находятся под сетевым напряжением! Поэтому до закрепления светильника на стене следует соблюдать соответствующие меры предосторожности. Программировать установленный на плату МК можно только программатором с полной гальванической развязкой.

Полный перечень использованных компонентов (спецификация) прилагается. Также прилагаются описания (datasheets) активных компонентов, задействованных в схеме.

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

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

По причине, указанной в разделе Защита от превышения сетевого напряжения, диодный мост должен быть рассчитан на обратное напряжение не менее 600 В. Использование моста на 1000 В вызвано отсутствием в продаже экземпляров с меньшими напряжениями на момент сборки устройства.

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

3.2.1. Источник опорного напряжения
Особенностью схемы является использование для питания МК не обычного стабилитрона, а интегрального источника опорного напряжения DA1 параллельного типа. Как уже отмечалось, это позволяет отказаться от отдельного ИОН и снизить потребляемый ток. Помимо этого, если напряжение на выходе параллельного ИОН повысится по каким-либо причинам, возникшим со стороны шины питания схемы, это не приведёт к нарушению стабилизации, а лишь увеличит ток через ИОН. Это общая особенность параллельных стабилизаторов напряжения [3]. Нерегулируемый двухвыводной ИОН выбран специально - нет необходимости подбирать и устанавливать два дополнительных высокоточных резистора. Для стабильной работы данного ИОН не требуется конденсатор с низким эквивалентным последовательным сопротивлением (ESR), что тоже является плюсом.
ИОН серии LM4040 выпускаются с различным классом точности и, соответственно, стоимости. Для данного применения достаточно класса точности 1%.
В качестве замены можно порекомендовать более дорогой прибор LT1634, хотя на практике его работа не проверялась.

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

R = (Uвх - Uст) / (Iн + Iст), где
Uвх - входное (ограничиваемое) напряжение, снимаемое с выхода диодного моста
Uст - напряжение стабилизации стабилитрона
Iн - ток нагрузки
Iст - ток стабилитрона

Изменим формулу с учётом падения напряжения на двух диодах диодного моста:
R = (Uвх - 2*Uд - Uст) / (Iн + Iст). Падение напряжения на предохранителе не учитываем, т.к. по результатам измерений оно составило всего 0,2 В при максимальной нагрузке. Добавив коэффициент, учитывающий разброс сопротивления резистора, получаем конечную формулу:

R = [(Uвх - 2*Uд - Uст) / (Iн + Iст)] * Кr

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

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

Минимальное среднее значение выпрямленного напряжения Uвх при 10%-ном допуске на напряжение сети [4] составит 198 В. Но здесь следует также учесть снижение напряжения под воздействием мощной нагрузки. В расчёте максимальной яркости лампы указано снижение на 4 В. Значит Uвх = 198 - 4 = 194 В.

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

Отклонение стабилизированного напряжения равно 1% (по описанию LM4040, класс точности D). Значит Uст = 5 + 0,05 = 5,05 В.

Минимальный ток, требуемый для работы стабилитрона, в соответствии с его описанием, составляет Iст = 0,1 мА.

Поскольку в схеме используются два резистора, каждый из которых имеет допуск 5%, принимаем Кr = 0,9. Старение резисторов (увеличение сопротивления со временем) не учитывается, т.к. они не будут подвергаться ни максимально допустимому напряжению, ни высокой температуре.

Измеренный мультиметром ток потребления схемы при напряжении 5,0 В составил 2,2 мА. Практическая проверка показала, что установка различных экземпляров ATmega16, в т.ч. без индекса L, имеющих revision J и дату производства 2006-2007 гг., практически не влияет на ток потребления. Небольшим влиянием (десятки микроампер), которые вызваны разбросом тактовой частоты внутреннего генератора, можно пренебречь.
Потребляемый ток также почти не зависит от того, включены ли каналы, в каком количестве и на какой яркости.
В силу малых величин обратные токи защитного диода, диодного моста, транзисторов, а также токи утечки конденсаторов не учитываются.
В значительной степени на ток потребления влияет нажатие кнопок. В этом случае ток протекает от плюса источника питания через внутренний (pull-up) резистор МК и замкнутую кнопку на землю. Указанное в описании МК минимальное сопротивление внутреннего резистора составляет 20 кОм. Если нажаты обе кнопки, ток составит 2 * (5 / 20000) = 0,5 мА.
Таким образом, суммарный максимальный ток потребления по цепи +5 В (при напряжении ровно 5,0 В) равен 2,2 + 0,5 = 2,7 мА (напомним, что это без учёта тока стабилитрона). Значит, в худшем случае, т.е. при напряжении 5,05 В, потребляемый ток составит Iн = 5,05 * 2,7 / 5 = 2,73 мА.
Если бы в схеме использовался однополупериодный выпрямитель, этот ток нужно было бы удвоить.

Подставим полученные данные в исходную формулу:

R = [(194 - 2*0,73 - 5,05) / (0,00273 + 0,0001)] * 0,9 = [187,49 / 0,00283] * 0,9 = 66251 * 0,9 = 59626 Ом

Таким образом, балласт должен иметь сопротивление не более 60 кОм. Его можно получить, соединив последовательно два резистора по 30 кОм (о том, почему нельзя обойтись одним резистором, рассказано далее при расчёте его мощности). То, что сопротивление 60 кОм немного больше расчётного, допускается. По теории вероятности, вряд ли возможна ситуация, когда сопротивление обоих резисторов на 5% меньше, и вместе с этим напряжение стабилизатора на 1% больше.

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

Iст = [(Uвх - 2*Uд - Uст) / (R * Кr)] - Iн

Для расчёта принимаем следующие численные значения:
Максимальное напряжение ограничения защитного диода Uвх = 548 В.
При отсутствии нагрузки падение напряжения на одном диоде диодного моста составит Uд = 0,65 В.
Минимальное напряжение стабилизации стабилитрона Uст = 5 - 0,05 = 4,95 В.
Так как шунт составлен из двух резисторов, R = 30000 + 30000 Ом.
Коэффициент сопротивления Кr принимаем равным 0,95, т.к. при этом ток стабилитрона будет больше.
Минимальный ток нагрузки будет при не нажатых кнопках. При номинальном напряжении питания 5 В этот ток равен 2,2 мА. Значит при минимальном напряжении 4,95 В ток будет равен Iн = 4,95 * 2,2 / 5 = 2,18 мА.


Iст = [(548 - 2*0,65 - 4,95) / ((30000 + 30000) * 0,95)] - 0,00218 = [541,75 / 57000] - 0,00218 = 7,3 мА

Полученное значение меньше 12 мА - величины максимального тока ИОН, рекомендованного в его описании. Мощность ИОН, рассеиваемая при таком токе, составит 5 * 0,007 = 35 мВт. Это более чем на порядок меньше его максимальной мощности 500 мВт. Следовательно, выбранное сопротивление балластного резистора нам подходит.

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

P = (Uвх - 2*Uд - Uст)2 / R
P = (242 - 2*0,65 - 4,95)2 / 60000 = 0,93 Вт.

Однако оказалось, что мощности резистора 1 Вт тоже недостаточно. Экспериментальная проверка показала, что даже резистор 2 Вт (отечественный, серии МЛТ-2) сопротивлением 56 кОм сильно нагревается. Согласно требованиям проекта, это недопустимо. Нагрев балластного резистора является единственной причиной нагрева корпуса устройства в ждущем режиме. Поэтому необходимо этот нагрев устранить.
Попытка использования 5 Вт импортного резистора серии SQP сопротивлением 50 кОм проблему не решила - он нагревается почти до той же температуры, что и МЛТ-2.
В результате было решено использовать два 2 Вт резистора, соединив их последовательно. Помимо снижения температуры, это повышает надёжность устройства, т.к. в случае пробоя одного из резисторов, второй предотвратит выход ИОН из строя. Чтобы обеспечить равномерный нагрев, номиналы резисторов должны быть одинаковыми.
Предпочтительны отечественные 2 Вт резисторы серии МЛТ-2. Их габариты несколько больше импортных аналогов серии С2-23, зато они меньше нагреваются. Однако на момент сборки устройства найти в продаже резисторы МЛТ-2 номиналом 30 кОм не удалось, хотя отечественной промышленностью они вроде как выпускаются.
Численные значения температуры корпусов различных резисторов не приводятся в связи с большой погрешностью измерений. Показания менялись от случая к случаю, причём независимо от типа измерительного прибора - термопара, подключенная к цифровому мультиметру, или цифровой термометр. Поэтому выводы о степени нагрева делались субъективно - сколько секунд можно держать палец на корпусе резистора пока не станет горячо.

3.2.3. Фильтрующий конденсатор
Конденсатор С1 сглаживает пульсации выпрямленного напряжения. Хотя для расчёта его ёмкости можно было воспользоваться методикой из [6, стр.52, раздел 1.27 "Фильтрация в источниках питания"], конденсатор подбирался эмпирическим путём. Это вызвано следующим обстоятельством.

Через несколько секунд после окончания регулировки яркости её значение запоминается в EEPROM. Согласно описанию МК, ток программирования составляет 6 мА (при 5 В, 25°С). Отсюда следует, что по сравнению с током потребления в обычном режиме ток при записи возрастает почти в четыре раза: (2,2 мА + 6 мА) / 2,2 мА = 3,7. Цикл записи, согласно описанию МК, длится 8,5 мс, т.е. почти целый полупериод (10 мс). При таких условиях накопленный заряд конденсатора быстро истощается, что приводит к уменьшению напряжение питания МК и образцового напряжения АЦП. Визуально это выглядит как кратковременное однократное моргание лампы через несколько секунд после окончания регулировки яркости (эффект заметен при уровне яркости выше среднего).
Код программы построен таким образом, что циклы записи в EEPROM следуют друг за другом через каждые 10 мс. Если регулировка яркости прекращается одновременно для двух каналов, запись в память будет длиться на 8,5 мс больше. За 1,5 мс (10 мс - 8,5 мс) конденсатор не успеет полностью зарядиться, соответственно, напряжение опустится ещё ниже, и моргание лампы будет ещё заметнее, особенно при пониженном напряжении сети.
Поскольку заранее неизвестно, при какой амплитуде пульсаций моргание становится заметно (а именно к амплитуде пульсаций привязана формула в [6]), пришлось подбирать конденсатор экспериментально.

Конденсатор подбирался при минимальном напряжении сети 198 В и окончании регулировки яркости по достижении максимального значения на обоих каналах. Номинал 1000 мкФ позволил устранить моргание после окончания регулировки яркости одного канала, и сделать моргание почти не заметным после одновременного окончания регулировки яркости обоих каналов. Дальнейшему повышению ёмкости конденсатора препятствуют малые габариты устройства.

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

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

После подключения устройства к сети, чтобы к началу основного цикла программы напряжение питания МК успело стабилизироваться на номинальном уровне, требуется организовать задержку старта. Если этого не сделать, то вследствие заниженного опорного напряжения АЦП нарушится плавность автоматического включения каналов.
Время задержки старта определялось экспериментально (хотя правильнее было бы найти подходящую для расчёта формулу). Согласно показаниям мультиметра, напряжение питания МК достигало 5 В через примерно 3 секунды после подключения устройства к сети с минимальным напряжением 198 В. Учитывая прямую зависимость частоты внутреннего RC-генератора МК от напряжения питания, а также погрешность измерений, была выбрана задержка с запасом, равная 4 секундам. Часть этой задержки обеспечивается внутренними узлами МК Power-on Reset и Brown-out Detection (BOD, супервизор питания). Оставшаяся часть реализована программно.

Переходим к выбору номинального напряжения конденсатора. Этот параметр в значительной степени определяет срок его службы. В [8] рекомендуется, чтобы рабочее напряжение составляло 80...100% от номинального. С другой стороны, в [9] рекомендуется, чтобы рабочее напряжение было в два раза меньше номинального. Поскольку экземпляр, рассчитанный на 10 В, всё равно не подходит по своим габаритам (если устанавливать его как положено вертикально), выбираем конденсатор с номинальным напряжением 6,3 В.
Здесь имеет смысл обратить внимание на следующий факт. В описаниях электролитических конденсаторов фирмы Jamicon указано, что, начиная с рабочего напряжения 25 В, их ёмкость изменяется со временем на 20%. Для меньших же напряжений это значение равно 25%.

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

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

3.3. Микроконтроллер
Несмотря на то что напряжение питания схемы составляет 5 В, используемый МК U1 имеет индекс L, означающий возможность работы при напряжении питания от 2,7 до 5 В. Это связано с большой ёмкостью фильтрующего конденсатора, т.е. с плавным нарастанием напряжения питания при подключении устройства к сети.
Порог встроенного в МК супервизора питания выставлен в соответствии с описанием на 2,7 В. Если же этот порог сделать равным 4,0 В, или использовать обычный МК (без индекса L) с порогом 4,0 В, или вообще отказаться от встроенного супервизора, некоторые экземпляры МК могут не запуститься, особенно при минимальном напряжении сети 198 В. Использовать же обычный МК с порогом 2,7 В нельзя, т.к. это может привести, в частности, к искажению данных EEPROM, если во время сохранения информации произойдёт отключение питания.

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

Производитель МК рекомендует предпринять следующие меры при работе с АЦП:
- установить между выводом REF и общим проводом фильтрующий конденсатор
- соединить вывод AGND с аналоговой землёй
- использовать LC фильтр питания в цепи AVCC
- при измерении не переключать выводы АЦП порта, если они настроены как цифровые выходы
Поскольку высокая достоверность результата измерения не требуется, то с целью упрощения схемы, вышеуказанные меры не соблюдаются. Калибровка АЦП тоже не требуется, в том числе потому, что используется обычный канал, а не дифференциальный [12, раздел 2.3].
Несмотря на принятые упрощения, точность, т.е. повторяемость схемы, от этого не ухудшается. Благодаря внешнему ИОН, используемому также в роли стабилизатора питания МК, результаты измерений АЦП всегда остаются стабильными вплоть до младшего значащего разряда, даже при 10-битном разрешении АЦП.

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

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

Состояние фьюзов МК соответствует значениям по умолчанию, за исключением запрограммированного фьюза BODEN, разрешающего использование встроенного супервизора питания (Рис. 3):

Рис. 3

Ранее отмечалось, что МК с незадействованным супервизором питания может не запуститься. Чтобы обойти это ограничение и иметь возможность запрограммировать фьюз, следует после появления напряжения питания кратковременно соединить вывод Reset МК с общим проводом.

Несмотря на то, что скриншот Рис. 3 получен из программатора PonyProg2000, пользоваться им не рекомендуется. Эта программа до сих пор находится в статусе бета-версии, редко обновляется, и нестабильно работает, особенно если компьютер параллельно выполняет другие задачи. Были случаи вывода МК из строя. Вместо PonyProg2000 автор рекомендует использовать другой свободно распространяемый программатор - avrdude. В частности, он входит в состав бесплатной среды разработки WinAVR.

Заменить МК можно на ATmega16 (без индекса L). Но в этом случае потребуется внешний супервизор питания (встроенный супервизор следует отключить). Дополнительные сведения о замене МК приведены в описании программной части.

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

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

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

Согласно описанию МК, АЦП рассчитан на обработку низкоомных сигналов (10 кОм и менее). Поэтому для нижнего плеча делителя напряжения выберем номинал равный 9,1 кОм, чтобы предусмотреть 5%-ный допуск сопротивления.

Для вычисления минимального сопротивления верхнего плеча делителя воспользуемся стандартной формулой: 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 - 2*Uд - Uвых) * R2) / Uвых
Падение напряжения на предохранителе не учитывается, т.к. по результатам измерений оно составило всего 0,2 В при максимальной нагрузке.
Осталось добавить коэффициенты Кr, определяющие отклонение резисторов от номинала:

R1 = ((Uвх*Квх*1,41 - 2*Uд - 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 = ((220*1,1*1,41 - 2*0,65 - 4,95) * 9,1*103 * 0,95) * 1,05 / 4,95 = (334,97 * 8,658103) * 1,05 / 4,95 = 3042,37*103 / 4,95 = 614,6*103 Ом

Ближайшим сопротивлением из стандартного ряда, превышающим полученное значение, является номинал 620 кОм.
Поскольку падение напряжения на резисторе верхнего плеча делителя может достигать 242 * 1,41 = 341 В, резистор должен иметь мощность 0,5 Вт. Как было показано при расчёте балластного резистора, на паспортную мощность можно ориентироваться только тогда, когда сопротивление резистора больше критического. Для резистора серии С2-23 мощностью 0,5 Вт критическое сопротивление Rк = 3502 / 0,5 = 245 кОм, что почти в три раза меньше чем 620 кОм. Значит, мощность резистора 0,5 Вт в данном случае выбрана правильно.

3.5. Выходной каскад
Нагрузка коммутируется N-канальными MOSFET транзисторами VT1 и VT2. Особенностью схемы является отсутствие драйвера, что в соответствии с требованием проекта уменьшает количество используемых компонентов. Транзисторы управляются напрямую выходами МК.
Как выяснилось, при напряжении на затворе 5 В и мощности нагрузки 60 Вт канал транзистора почти полностью открывается, даже несмотря на довольно высокое сопротивление резистора в цепи затвора. Так происходит благодаря тому, что ток нагрузки (около 0,25 А) составляет величину примерно в 20 раз меньшую максимально допустимого тока стока транзистора. При таких условиях падение напряжения на переходе сток-исток транзистора составляет менее 1 В, что не приводит к заметному на глаз снижению максимальной яркости лампы.
Тока выхода МК оказывается достаточно для перезарядки ёмкости затвора благодаря невысокой частоте переключения (100 Гц). Это примерно на два порядка меньше частоты, на которой работают MOSFET транзисторы в традиционных переключательных схемах, например в импульсных источниках питания.

Отсутствие драйвера может привести к самопроизвольному включению транзистора в случае резкого всплеска напряжения на стоке. Этот эффект, известный под названием CdVdt turn-on, вызван наличием ёмкости между затвором и стоком (ёмкость Миллера). Иногда вернуть транзистор в нормальный режим работы удаётся лишь после отключения схемы от сети на несколько минут (на время остывания транзистора). Одним из лучших способов предотвратить случайное включение является выбор транзистора, у которого соотношение Qgd / Qgs1 составляет величину менее 1,4 [7]. Здесь Qgd - это величина заряда затвор-сток, Qgs1 - это величина заряда, при котором напряжение на затворе достигает порогового значения (определяется по графику Total Gate Charge). К сожалению, транзисторы, соответствующие данному правилу, встречаются крайне редко. С другой стороны, случаи резких всплесков напряжения на стоке тоже крайне редки.

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

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

3.5.1. Транзисторы
Для того чтобы транзистор был пригоден для использования в данном устройстве, он должен обладать следующими характеристиками:
- ток стока - не менее 6 А, типовое сопротивление канала - не более 1 Ом
- напряжение сток-исток - не менее 600 В
- двусторонний ограничитель напряжения на затворе - есть
- максимальное пороговое напряжение затвор-исток - менее 5 В
- график зависимости тока стока от напряжения на затворе - нормирован для напряжения затвора 5 В или меньше. То же относится к графику зависимости тока стока от напряжения сток-исток.

Кроме этого, в соответствии с требованием к проекту транзистор не должен сильно нагреваться, в идеале - не нагреваться вообще. Величина нагрева Tja характеризуется формулой:
Tja = P * Rth = R * I2 * Rth + 25°C, где
R - сопротивление канала сток-исток
I - ток нагрузки
Rth - тепловое сопротивление транзистора (корпус-окружающая среда)
Так как частота переключения транзистора не превышает 100 Гц, его динамические потери малы, на нагрев не влияют, и поэтому в формуле не учитываются.
Из формулы следует, что транзистор должен иметь как можно меньшее значение теплового сопротивления. Выбранный транзистор имеет корпус практически идентичный корпусу TO220, и обладает относительно невысоким тепловым сопротивлением (62,5°C). Эксплуатация выбранного транзистора в составе устройства показала полное отсутствие нагрева при любом уровне яркости.

По причине, указанной далее в разделе Защита от превышения сетевого напряжения, транзистор должен быть рассчитан на напряжение сток-исток не менее 600 В. Помимо этого, в случае обрыва защитного диода транзистор не выйдет из строя при аварийном повышении напряжения сети вплоть до 380 В+/-10%.

По результатам изучения продукции основных производителей 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. Следует отметить, что рекомендация основана только на изучении описаний транзисторов. На практике их работа не проверялась. В частности, может потребоваться подбор резистора в цепи затвора.

Теоретически в устройстве можно применить и IGBT транзисторы. Однако найти такие экземпляры, которые удовлетворяли бы всем вышеперечисленным требованиям, не удалось. Кроме того, MOSFET транзисторы, как правило, дешевле. К сожалению, так называемые logic level транзисторы, управляемые цифровыми уровнями сигналов и подходящие по остальным параметрам, в частности, рассчитанные на напряжение 600 В, пока не существуют.

3.5.2. Резисторы в цепи затвора
Сопротивление резисторов R5 и R6 оказывает влияние на следующие факторы:
- защиту выхода МК от броска тока при перезарядке входной ёмкости транзистора (чем больше сопротивление, тем меньше ток)
- защиту выхода МК от превышения напряжения на затворе, которое возникает из-за ёмкости Миллера (чем больше сопротивление, тем лучше защита)
- степень нагрева транзисторов (чем меньше сопротивление, тем меньше нагрев)
- уровень помех радио- и ИК-приёму, а также в электросети (чем больше сопротивление, тем меньше помех)
- силу звона нитей ламп накаливания (чем больше сопротивление, тем меньше звон)

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

Для начала выясним минимально допустимое сопротивление резистора в цепи затвора. Оно определяется безопасным уровнем тока выхода МК при перезарядке ёмкости затвора транзистора. В этот момент выход МК оказывается кратковременно замкнут на землю. Учитывая ток выхода по описанию МК 20 мА и напряжение питания 5 В, по закону Ома получаем минимально допустимое сопротивление 250 Ом.

Теперь попробуем определить номинальное сопротивление резистора с точки зрения ограничения напряжения на выводе МК. В описании МК сказано, что уровень безопасного тока, протекающего через внутренние диоды, составляет 1 мА. Максимально допустимое напряжение на затворе транзистора, указанное в его описании, составляет +30 В. Встроенный в транзистор двусторонний ограничитель не позволяет напряжению превысить эту величину. Следовательно, чтобы обеспечить безопасный ток через внутренние диоды МК потребуется сопротивление R = 30 / 0,001 = 30 кОм. При таком высоком сопротивлении в цепи затвора увеличится сопротивление канала сток-исток. Это приведёт к уменьшению яркости лампы и нагреву транзистора. Следовательно, выбирать сопротивление по данному критерию нельзя. Кроме того, как было отмечено ранее, вряд ли в бытовой электросети встретятся ситуации, вызывающие значительное повышение напряжения на затворе.

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

Подбор сопротивления по степени нагрева транзистора более затратный по времени, поэтому резистор подбирался по отсутствию слышимых помех. Для этого использовался встроенный в носимый плеер радиоприёмник АМ диапазона, настроённый на частоту 520 кГц. На самом деле, спектр излучаемых помех достаточно широк, поэтому частота настройки значения не имеет, она может лежать в диапазоне 520...1710 кГц. Яркость лампы во время подбора сопротивления может быть любая, кроме максимальной, т.к. в этом случае помехи исчезают даже при нулевом сопротивлении. Сопротивление резистора увеличивалось, начиная с нуля, до тех пор, пока в расположенном на расстоянии 5 см от устройства радиоприёмнике не перестал слышаться низкочастотный фон, причём при любой ориентации плоскости радиоприёмника относительно плоскости печатной платы устройства. После этого яркость лампы устанавливалась на уровень примерно 75% (это точка наибольшего нагрева транзистора), и через 15 минут контролировалась температура корпуса транзистора. Если она превышала температуру окружающей среды более чем на 1°С, сопротивление резистора уменьшалось. В завершение устройство располагалось так, чтобы лампа оказывалась на расстоянии примерно 5 см от уха. Если во время изменения яркости от минимума до максимума и наоборот был слышен звон нити лампы, сопротивление резистора увеличивалось. Последняя настройка производилась со штатной лампой светильника и штатной проводкой. Иначе результат подбора сопротивления искажался из-за отличающегося типа лампы и иной индуктивности проводников, соединяющих лампу со схемой.

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

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

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

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

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

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

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

Короткое замыкание в цепи питания +5 В устройству не страшны, т.к. в этом случае роль ограничителя тока играет балластный резистор.

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

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

3.6.2. Защита от превышения сетевого напряжения
Для защиты от высоковольтных помех, возникающих в электрической сети, например при грозовых разрядах, применяется двусторонний полупроводниковый ограничитель напряжения - защитный диод. По сравнению с варисторами защитные диоды обладают более высоким быстродействием, что позволяет использовать их для предохранения высокочувствительных полупроводниковых приборов, к которым, в частности, относятся и микроконтроллеры. Кроме того, в отличие от варисторов их характеристики не ухудшаются со временем [11]. Справедливости ради следует отметить, что среди примеров использования (application notes) защитных диодов таких производителей, как ON Semiconductors и ST Microelectronics, нет примеров, в которых на защитный диод подавалось бы сетевое напряжение.

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

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

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

При воздействии высоковольтного импульса напряжение на входе диодного моста не превысит максимальное напряжение ограничения защитного диода. Это подтвердилось в ходе экспериментов с низковольтным аналогом на примере Р6КЕ6.8А.

Напряжение ограничения защитного диода зависит от длительности импульса, и для указанного на схеме типа составляет 548 В для 1000 мкс и 706 В для 20 мкс (приведены амплитудные значения из описания). В большинстве случаев, описанных в [11], при выборе защитного диода следует руководствоваться напряжением, которое соответствует длительности импульса 1000 мкс. Поэтому будем считать, что напряжение на входе диодного моста, ни при каких обстоятельствах не превысит порог 548 В.

Теперь проанализируем, выдержат ли компоненты устройства напряжение ограничения 548 В. Лампы и предохранитель не учитываются, т.к. их выход из строя не является фатальной неисправностью и легко устраняется заменой. Также можно не учитывать балластный резистор и резистор верхнего плеча делителя напряжения, поскольку высоковольтные и углеродистые (film) резисторы хорошо переносят кратковременные (до 5 секунд) перегрузки, превышающие номинальное напряжение в 1,5 и 2,5 раза соответственно [5]. Долговременной перегрузки в данном случае не будет, т.к. сработает предохранитель.
Диодный мост и транзисторы рассчитаны на 600 В. Как было показано ранее при расчёте балластного резистора, при напряжении 548 В ток через ИОН не превысит 7 мА, что на 5 мА меньше его максимального рабочего тока 12 мА. Ток внутренних диодов МК при сопротивлении верхнего плеча делителя напряжения 620 кОм не превысит I = 548 / 620000 = 0,88 мА, что укладывается в допустимый предел 1 мА.
Таким образом, повышение сетевого напряжения до уровня ограничения защитного диода не приведёт к выходу из строя элементов схемы.

Заменять выбранный диод, например на 1.5КЕ350СА нежелательно. Во-первых, номинальное рабочее напряжение последнего составляет 300 В, что меньше номинального напряжения питания устройства (220 * 1,41 = 310 В). Во-вторых, минимальное напряжение, при котором он начинает пропускать ток, равно 332 / 1,41 = 236 В. Это меньше максимально допустимого напряжения питания устройства (220 * 1,1 = 242 В). Обе причины могут привести к возрастанию тока и нагреву диода (проверено экспериментально), что противоречит требованиям проекта. Также нежелательно использовать Р6КЕ400СА, т.к. он имеет в 2,5 раза меньшую мощность. В качестве замены можно выбрать 1.5КЕ400С, 1.5КЕ440СА, 1.5КЕ440С. Но тогда все компоненты устройства должны быть рассчитаны на амплитудное напряжение 572 В, 600 В и 630 В соответственно.

3.7. Расчёт потребляемой мощности
Как следует из анализа принципиальной схемы, потребляемый ток складывается из следующих составляющих: ток делителя напряжения Iд, ток стабилитрона Iст, и ток нагрузки блока питания Iн. В силу малых величин, обратные токи защитного диода, выпрямительного моста, транзисторов, а также токи утечки конденсаторов не учитываются. Итак, P = Uвх * (Iд + Iст + Iн).
Ток делителя напряжения определим по закону Ома с учётом падения напряжения на диодах выпрямительного моста: P = Uвх * (((Uвх - Uд) / Rд) + Iст +Iн).
Для расчёта тока стабилитрона и тока нагрузки преобразуем формулу, использованную при расчёте балластного резистора, к виду: Iст + Iн = (Uвх - 2*Uд - Uст) / Rб.
С учётом коэффициента, учитывающего отклонение сопротивлений резисторов, конечная формула будет иметь вид:

P = Uвх * [((Uвх - 2*Uд) / Rд*Кr) + ((Uвх - 2*Uд - 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 - 2*0,65) / 629100*0,95) + ((220 - 2*0,65 - 4,95) / 60000*0,95)] = 220 * [0,00037 + 0,0038] = 0,92 ВА

По данным измерений ток, потребляемый устройством от сети в ждущем режиме при номинальном сетевом напряжении, составил 4,0 мА. Отсюда P = 220 * 0,004 = 0,88 ВА, что находится в пределах рассчитанной величины.
Поскольку в ждущем режиме устройство представляет собой чисто активную нагрузку, активная мощность в данном случае эквивалентна полной мощности: Р = 0,92 ВА = 0,92 Вт.
Интересно отметить, что при увеличении яркости канала с минимума до максимума коэффициент мощности (power factor) увеличивается с 0,22 до 0,98.

Рассчитанная потребляемая мощность соответствует европейской директиве 1275/2008/ЕС от 17 декабря 2008 года, согласно которой уровень энергопотребления устройств, выпускаемых с 07 января 2010 года, не должен превышать 1 Вт в ждущем режиме. К слову, с 2013 года этот уровень огранивается ещё больше - до 0,5 Вт.

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

Программа составлена и отлажена в бесплатной среде разработки VM Lab версии 3.14 (в окне "About Visual Micro Lab" эта версия указана как 3.12). Описание среды разработки и её дистрибутив доступны на сайте.

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

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

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

4.1. Блок-схема алгоритма
Структура программы показана на Рис. 4. Каждый блок начинается с названия файла, в котором размещён программный код данного блока. Подпрограммы обозначены блоком меньшего горизонтального размера. Среди них есть функции, т.е. подпрограммы, возвращающие значения. Для упрощения они тоже называются подпрограммами. Отличие подпрограмм, расположенных в файле ProceduresINT.asm, от подпрограмм в файле ProceduresEXT.asm заключается в том, что первые предназначаются только для данного проекта, а вторые являются универсальными и могут найти применение в других проектах. Блок Startup.asm тоже использует некоторые подпрограммы, но для упрощения восприятия рисунка эти связи на блок-схеме не показаны.
Файл определений m16def.inc (на схеме не показан) модифицирован с учётом используемых в проекте ресурсов МК. В файле закомментированы ресурсы, которые определяются проектом и используются под другими названиями. Помимо этого, поставляемый в составе VMLab файл определений устарел (файл датирован 2001 годом), он не содержит определения некоторых регистров, битов, и областей памяти. Применять новый файл определений из состава последней версии AVR Studio нельзя, т.к. в нём есть команды, не поддерживаемые ассемблером VMLab. Вариант использования нового ассемблера из AVR Studio тоже не проходит - VMLab выдаёт ошибку несовместимости.

Рис. 4

4.2. Описание программы
Далее кратко рассмотрены ключевые моменты программной части проекта. Дополнительная информация содержится в комментариях, которыми снабжена практически каждая строка программы. Алгоритм работы второго канала полностью аналогичен алгоритму работы первого, поэтому комментарии приводятся только для первого канала. По этой же причине в названиях регистров, процедур и т.п. номер канала либо не указывается совсем, либо обозначается буквой "X" или "x". Команды, начинающиеся с символа комментария (";") в начале строки, предназначены для облегчения разработки, отладки и тестирования. Они ускоряют ход выполнения программы на этапе отладки. Закомментированные команды, перед которыми есть несколько знаков пробела, не используются в данном проекте, но оставлены в качестве шаблона для применения того же кода в других проектах. Для поддержания совместимости символы табуляции заменены знаками пробела.

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

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

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

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

Сторожевой таймер настроен на максимальный период срабатывания (2 секунды). Чем больше интервал, тем легче заметить срабатывание таймера. Особенно это помогает на этапе отладки.

Супервизор питания запрограммирован на минимальный порог 2,7 В. За счёт этого обеспечивается надёжный запуск МК с учётом большой ёмкости конденсатора, установленного в фильтре питания. Супервизор гарантирует стабильный запуск независимо от того, на какое время пропадёт напряжение в сети.

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

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

АЦП, имеющий разрешение 10 бит, используется в режиме 8-битного преобразования, поскольку высокая точность измерений не требуется. Это позволяет ему работать на максимальной частоте (500 кГц), что обеспечивает высокое быстродействие. Согласно [12, раздел 2.8], допускается работа АЦП на частотах до 1 МГц. Уменьшенное до 8 бит разрешение служит также дополнительной защитой от помех. Для сокращения количества команд управления, АЦП работает в режиме автозапуска, сигналом которому является окончание предыдущего цикла преобразования. Первое преобразование запускается при инициализации МК.

Таймеры не используются. Как выяснилось, они создают помехи работе АЦП. Для исключения этого явления существует специальный энергосберегающий режим АЦП "ADC Noise Reduction". Но поскольку режимы энергосбережения по причинам, указанным ранее, не используются, временные задержки пришлось реализовать на основе регистров или ячеек ОЗУ.

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

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

Для повышения быстродействия задействованные ячейки EEPROM копируются перед началом работы либо в регистры, либо в ОЗУ (блок Startup.asm). В большинстве случаев для этой цели используется специальный макрос EEPROMtoSRAM, находящийся в файле Macros.asm (на блок-схеме алгоритма не показан).
При таком подходе появляется возможность проверки считанных из EEPROM данных. Если введённый пользователем параметр настройки является недопустимым, он преобразуется к ближайшему допустимому значению (меньшему или большему). Это действие, условно называемое нормализация, выполняется не для всех ячеек, а только для тех, допустимые значения которых однозначны, а также для тех, недопустимые значения которых могут привести к явным ошибкам в работе устройства.
Допустимые значения ячеек EEPROM, а также значения по умолчанию указаны при описании ячеек в комментариях (блок Dimmer.asm). Значения некоторых ячеек умышленно ограничены диапазоном, удобным для восприятия и запоминания. Например, продолжительность включенного состояния функции ИПХ, задаваемая ячейкой eOwnersAtHomeOnPeriod, ограничена значением 240 минут, хотя функция могла бы исправно работать и при eOwnersAtHomeOnPeriod = 255. Однако значение 240 минут (4 часа) более привычно для запоминания и использования, нежели 255 минут (4,25 часа).

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

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

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

Первоначально для детектирования момента перехода сетевого напряжения через нуль использовался следующий алгоритм: АЦП циклически производил считывание входного напряжения и сравнивал результат преобразования с заданной константой. Как только происходило совпадение, подавалась команда на включение каналов, и цикл завершался. Из-за отсутствия кварцевой стабилизации тактовой частоты МК, для точного обнаружения момента перехода фазы сети через нуль требовался подбор константы под конкретный экземпляр МК. Был альтернативный вариант: вместо подбора константы осуществлять калибровку внутреннего RC генератора. И то и другое отрицательно сказывалось на повторяемости устройства. Но основная причина, побудившая изменить алгоритм, заключалась в невысокой помехоустойчивости. Действительно, если помеха (всплеск сетевого напряжения) возникала близко к моменту перехода фазы сети через нуль, МК продолжал измерять входное напряжение, ожидая его совпадения с константой. Поскольку после прекращения помехи входное напряжение оказывалось больше заданного константой, МК был вынужден оставаться в цикле измерений до следующего перехода фазы. Так как во время измерения напряжения каналы находятся в выключенном состоянии, визуально такой "простой" выглядел как моргание ламп(ы), т.к. в течение как минимум 10 мс напряжение на нагрузке отсутствовало.
Изменённый алгоритм основан на сравнении не с константой, а с предыдущим результатом измерения. Команда на включение каналов подаётся только тогда, когда текущий результат измерения становится больше предыдущего. В рассмотренном только что примере МК будет детектировать помеху как напряжение, превышающее предыдущее. Это приведёт к моментальному выходу из цикла, что визуально будет практически не заметно. В обычном режиме (без воздействия помех) МК осуществит выход из цикла, как только сетевое напряжение сменит направление с убывающего на возрастающее, т.е. сразу после перехода сетевого напряжения через нуль. Таким образом, отпадает необходимость в кварцевом резонаторе, калибровке внутреннего генератора и в калибровке АЦП. Также не требуется дополнительная константа и настройка устройства под конкретный экземпляр МК.
Погрешность нового алгоритма нетрудно подсчитать. Для определения момента, когда сетевое напряжение начало возрастать, достаточно двух измерений. Время одного преобразования АЦП составляет 27 мкс (см. раздел Выбор константы cADCSamplesCount). Время на обработку полученного результата (первые 5 команд процедуры PhaseDetect) составит в худшем случае 8 мкс. Значит, максимальная погрешность равна 27 + 27 + 8 = 62 мкс. Согласно формуле U = A * sin(2 * π * f * t), при такой задержке мгновенное напряжение в сети будет находиться на уровне U = 310 * sin(2 * 3,14 * 100 * 62*10-6) = 12 В (относительно номинального сетевого напряжения). Это совпадает с данными, полученными экспериментально с помощью осциллографа. Результат оставался стабильным независимо от экземпляра МК.
Включение с интервалом 10 мс лампы мощностью 60 Вт с сопротивлением нити 2302 / 60 = 882 Ом при напряжении 12 В создаст ток всего 12 / 882 = 14 мА. Такой малый ток не способен заметно повлиять на сокращение срока службы лампы, создать помехи, и т.п.

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

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

В функции автоотключения процентное значение, на которое уменьшается яркость, умышленно ограничено интервалом от 10 до 90%. Такой диапазон хорошо подходит для визуального восприятия. Кроме того, уменьшение яркости менее чем на 10% недостаточно заметно.
Для определения значения регистра rSoftOffBrightChХ, хранящего величину уменьшенной яркости с учётом заданного пользователем процента, в целях ускорения программы используется табличный метод (таблица PercentageTable). Для каждого заданного пользователем значения процента Y, в таблице находится округлённое число Х, заранее вычисленное по формуле: X = ((100 - Y) / 100) * 256. Таблица состоит из (90 - 10) + 1 = 81 ячейки. Когда истекает время непрерывной работы канала, происходит обращение к таблице, затем текущее значение яркости умножается на полученное из таблицы число. Поскольку это число предварительно было умножено на 256, результат делится на 256 путём простого отбрасывания старшего байта, после чего результат округляется. Например, предположим, что текущая яркость, т.е. число в регистре rBrightnessChХ, равно 200, а заданный пользователем процент снижения яркости равен 25%. По истечении времени непрерывной работы канала программа обратится к таблице, в которой смещению 25 соответствует число 192. Программа произведёт умножение (200 * 192 = 38400), разделит результат на 256 (38400 / 256 = 150), округлит его (в данном примере в этом нет необходимости) и запишет итог в регистр rSoftOffBrightChХ. Нетрудно подсчитать, что исходная яркость 200, уменьшенная на 25%, действительно равна 150.
Несмотря на кажущееся сходство битов bIsChannelOn и ebPowerState, объединять их воедино нельзя. Вместе они предотвращают включение канала, если во время его выключения по истечении времени непрерывной работы был сбой в электросети.

Дребезг контактов кнопок SB1 и SB2 устраняется благодаря тому, что основная программа опрашивает их состояние каждый полупериод, т.е. каждые 10 мс. Устранению дребезга также способствует наличие внутреннего триггера Шмитта и линии задержки на входах МК.
Обработка состояния кнопок построена таким образом, что так называемое вторичное действие не поддерживается. Пример: в выключенном состоянии удерживание кнопки приводит к включению канала во втором режиме. Если продолжать удерживать кнопку, то после того как канал включился, его яркость не начнёт изменяться, как это обычно происходит при удерживании кнопки и включенном канале. Яркость можно будет изменить только после отпускания кнопки и повторного её удерживания. Такой подход более эргономичен, к тому же он позволяет исключить ошибки, связанные с детектированием нажатия и удерживания кнопок в зависимости от функции, режима, и текущего состояния устройства.
Реализация обработчика кнопок основана на анализе значения регистра rButtonХHoldTime, в котором хранится длительность удерживания кнопки в нажатом положении, а также на сравнении его значения с константой cButtonOnHoldSense, определяющей временной порог, начиная с которого нажатие на кнопку распознаётся как удерживание. Этот порог равен 1 секунде. В текущей версии он определён в коде программы, т.е. не может быть изменён конечным пользователем.
Регистр rButtonХHoldTime может иметь четыре значения:
1. rButtonХHoldTime = 0 (кнопка не нажата)
2. 0 < rButtonХHoldTime < cButtonOnHoldSense (кнопка нажата)
3. rButtonХHoldTime = cButtonOnHoldSense (кнопка удерживается)
4. rButtonХHoldTime = 255 (кнопка остаётся в нажатом положении после удерживания)
Последнее значение сигнализирует о том, что надо дождаться отпускания кнопки. Пока этот момент не наступит, никакие действия, связанные с обработкой состояния кнопки, не выполняются.

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

В основе подпрограммы генерации псевдослучайного числа RandomNumber8bit лежит алгоритм, описанный в [6, раздел 9.33 "Последовательности, генерируемые регистрами сдвига с обратными связями"]. Используется программно реализованный 8-ми разрядный регистр сдвига с отводами от 7-го, 5-го, 4-го и 3-го разряда, над которыми производится логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR, в МК соответствует команде EOR).
Входными данными подпрограммы является т.н. seed - число, определяющее начало псевдослучайной последовательности. Это число должно быть отлично от нуля. В противном случае оно заменяется числом 113. Почему именно 113? Потому что это первое число от начала списка, удачно располагающееся с точки зрения возвращаемого результата, умноженного на два (см. замечание о недостатке ниже). Первоначально seed генерируется путём измерения сетевого напряжения в момент подключения устройства к сети, что гарантирует действительно случайный характер seed.
Подпрограмма возвращает псевдослучайное число в диапазоне от 1 до 255. Период повторения чисел равен (28 - 1) = 255.
Для повышения скорости выполнения подпрограммы и сокращения количества кода содержимое регистра SREG не сохраняется, хотя подпрограмма изменяет состояние некоторых его флагов.
Практическая проверка алгоритма показала, что распределение случайных чисел получается достаточно равномерным во всём диапазоне. Таблицу всех значений псевдослучайной последовательности можно посмотреть в прилагаемом файле. В таблице перечислены числа, возвращаемые при каждом вызове подпрограммы, начиная с seed=1.
Если внимательно проанализировать последовательность чисел, то можно заметить следующий недостаток. Возвращаемое значение зачастую равно (или примерно равно) предыдущему значению, умноженному на два. Всего насчитывается 61 такая комбинация. При этом количество последовательных повторений (т.е. когда такой результат получается при каждом последующем вызове функции) варьируется от 1 до 7. Статистика повторов распределяется следующим образом:

Количество последовательных повторений

Число комбинаций

1

30

2

15

3

8

4

4

5

2

6

1

7

1

4.3. Таблица яркости
Восприятие уровня яркости человеческим глазом имеет нелинейную зависимость. График этой зависимости приведён на Рис. 5. Он взят из документа [13] компании Lutron Electronics - известного с 1961 года производителя регуляторов освещения. По горизонтальной оси графика отложены значения яркости, воспринимаемые человеческим глазом, а по вертикальной - её реальные значения, измеренные прибором. Будем считать, что значения по вертикальной оси соответствуют напряжению на лампе. Экспериментальная проверка подтвердила, что это правомерно.

Рис. 5

Используя указанные на графике соотношения, требуется составить таблицу яркости BrightnessTable, т.е. перейти от указанных на рисунке значений в процентах к числам из диапазона 1...255, пригодным для дальнейшей обработки в МК.

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

y(x) = k1*x2 + k2*x + k3, где k1, k2, k3 - неизвестные коэффициенты

Для нахождения коэффициентов воспользуемся средствами программы Mathcad [14, глава 16]. Файл с описываемым далее расчётом в формате Mathcad прилагается. Взяв за основу значения трёх точек, указанных на рисунке, задаём векторы экспериментальных данных, дополнив их минимальными и максимальными значениями. В точке х=0, значение y равно 1, а не 0, т.к. понятия "нулевая яркость" не существует:

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

Функция возвращает вектор из пяти элементов, последние три из которых являются искомыми коэффициентами (k1, k2, и k3 соответственно):

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

y(x) = 3,961*10-3*x2 - 0,013*x + 0,87

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

Здесь по горизонтальной оси отложены значения регистра rBrightnessChХ, обозначающие текущую яркость и задающие смещение при обращении к таблице BrightnessTable, а по вертикальной - ответные значения таблицы, записываемые в регистр rChХOffTime, определяющие величину напряжения на лампе. Как видно из графика, приближение к исходным данным получилось достаточно точным. Кроме того, внешний вид графика совпадает с тем, который был взят за основу.

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

В соответствии с графиком функции первые 12 значений равны 1. Пользуясь линейкой прокрутки таблицы, можно просмотреть все 256 её значений. Поскольку дробная часть полученных данных нас не интересует, опции "Number of decimal places" присвоено значение 0. При этом происходит автоматическое округление. Данная опция доступна на вкладке "Number Format", попасть на которую можно, дважды кликнув на таблице. Для отображения номеров строк, в свойствах таблицы на вкладке "Display" установлена опция "Show column ow labels".

Записывать полученные табличные данные в память программ МК напрямую нельзя, т.к. для этого они должны быть представлены в специальном формате:
.db число 1, число 2
...
.db число 254, число 255
Для преобразования к такому формату можно воспользоваться средствами программы Excel. Файл, осуществляющий такое конвертирование, прилагается. Данные из таблицы Mathcad следует скопировать в столбец A этого файла, после чего столбцы B, C и D будут содержать те же данные, но в формате, пригодном для записи в память МК.

Следует иметь в виду, что поскольку минимальная и максимальная яркость являются величинами переменными, задаваемыми пользователем в ячейках eBrightnessMin и eBrightnessMax соответственно, результирующий график яркости будет отличаться от приведённого выше. Чтобы выяснить насколько, воспользуемся тем же файлом конвертера формата Mathcad в формат МК. Скопируем содержимое столбца "Данные Mathcad" из первого листа файла в одноимённый столбец второго листа. Примем в качестве исходных данных eBrightnessMin=35 и eBrightnessMax=200. Выясним, какому значению соответствует ячейка 35, и заполним этим значением (в данном случае числом 5) все ячейки диапазона 35...0. По аналогии заполним все ячейки диапазона 200...255 значением 156. В результате, график яркости будет выглядеть, как показано на Рис. 6.

Рис. 6

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

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

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

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

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

Решением послужила наиболее часто встречающаяся бытовая ситуация - включение электрочайника. Путём измерений было установлено, что при включении на кухне чайника мощностью 2 кВт, напряжение в комнатной розетке, предназначенной для подключения светильника, падает с 233 до 228 В. Значит в худшем случае, т.е. при напряжении сети 198 В, напряжение упадёт до (198 * 228) / 233 = 193,75 В. Следовательно, для обеспечения стабилизации максимальное напряжение на лампе должно быть ограничено уровнем 194 В. Разумеется, такое напряжение должен поддерживать и блок питания, что было учтено при его расчёте.

Практическая проверка использованного алгоритма, выбранного компромиссного решения и методики подбора максимального напряжения показала, что при изменении напряжения сети в диапазоне от 198 до 242 В напряжение на лампе изменяется всего лишь на 1 В, что совершенно не заметно для глаза. Более того, при включении пылесоса мощностью 1,5 кВт, подсоединённого к тому же удлинителю, что и светильник, практически не заметно моргание лампы, работающей на полной яркости.

На основании полученных данных нетрудно оценить качество стабилизации количественно. Разница между максимальным и минимальным входным напряжением составляет 242 - 198 = 44 В. Если бы при изменении входного напряжения выходное оставалось неизменным, качество стабилизации составило бы 100%, т.е. было бы идеальным. Однако выходное напряжение изменяется на 1 В, отсюда 44 - 1 = 43 В. Для перевода этой разности в проценты, составим пропорцию: (43 * 100) / 44 = 97,73%. Округлив результат, получаем качество стабилизации на уровне 98%. Расчёт эффективности приведён в конце следующего раздела.

По отношению к номинальному напряжению сети (220 В) максимальное напряжение на лампе оказывается уменьшенным на (220 - 194) * 100 / 220 = 12%. Здесь полезно вспомнить, что снижение напряжения всего на 10% увеличивает срок службы лампы приблизительно в два раза, на 25% - в четыре раза [15]. И наоборот, повышение напряжения всего на несколько вольт сверх того, что указано на лампе, значительно сокращает её ресурс [17].

Чтобы выяснить насколько оказалась уменьшена максимальная мощность лампы, необходимо узнать сопротивление её нити. Это можно сделать по формуле R = U2 / P. Поскольку мощность лампы нормируется при напряжении 230 В (и это подтверждено экспериментально), сопротивление нити R = 2302 / 60 = 882 Ом. Тогда при напряжении 194 В мощность будет равна P = 1942 / 882 = 43 Вт, что ощутимо меньше исходных 60 Вт. По этой причине увеличивать допуск сетевого напряжения свыше +/-10% нежелательно, т.к. в этом случае придётся ещё больше ограничить максимальное напряжение на лампе, что приведёт к ещё большему снижению её мощности.

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

С порядком перевода максимального и минимального напряжения на лампе в соответствующие значения ячеек eBrightnessMax и eBrightnessMin можно ознакомиться в разделе Настройка.
По умолчанию первый канал (ячейка eBrightnessMaxCh1) настроен на максимальное выходное напряжение 194 В в соответствии с вышеприведённым расчётом. Второй канал (ячейка eBrightnessMaxCh2) настроен на 215 В, в расчёте на то, что номинальное напряжение сети не опуститься ниже 220 В. Правильный подбор значения этих ячеек, при котором максимальное выходное напряжение ограничено уровнем 230 В или менее, гарантирует продление срока жизни ламп, т.к. благодаря стабилизации на лампы не попадут всплески напряжения, периодически возникающие в бытовой электросети.
Значение ячейки eBrightnessMinCh1 обеспечивает минимальное напряжение на лампе 33 В, eBrightnessMinCh2 - 35 В. Интересно отметить, что для едва заметного в полной темноте свечения нити накала требуется напряжение 27 В, т.е. 12% от номинального напряжения сети. Это говорит о том, что использовать несколько первых значений таблицы яркости (которые меньше 3...5) не имеет смысла - напряжения на лампе окажется недостаточно для получения видимого света.

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

6. Настройка.

Устройство не нуждается в настройке. Собранное безошибочно и из исправных деталей оно начинает работать сразу. При желании можно отрегулировать параметры, задаваемые пользователем, например, установить величину максимальной яркости.
Следует помнить о том, что фьюз, разрешающий работу встроенного в МК супервизора питания, должен быть запрограммирован. При этом порог срабатывания супервизора должен составлять 2,7 В.

6.1. Подбор максимальной яркости
Предположим, требуется обеспечить стабилизацию яркости при воздействии мощной нагрузки, когда минимально допустимое напряжение сети (198 В) снижается до 194 В. Первым делом убеждаемся, что запоминание яркости для данного режима данного канала активировано (соответствующий бит ebSaveBright равен 1). После этого программируем ячейку eBrightnessMax значением $FF. Затем подключаем устройство к ЛАТРу, на котором выставляем напряжение 198 В. Далее подключаем параллельно лампе TrueRMS AC+DC вольтметр. Регулируя яркость лампы удерживанием кнопки, добиваемся показания вольтметром 194 В. После паузы, необходимой для запоминания текущей яркости (не менее 2,5 секунд), считываем с помощью программатора содержимое ячейки eLastBright. Полученное значение записываем в ячейку eBrightnessMax. При необходимости осуществляем конвертацию между шестнадцатеричным и десятичным форматом. Для удобства можно на время подбора уменьшить скорость регулирования яркости, присвоив ячейке eBrightChangeSpeed максимальное значение (5).
Необходимо помнить, что блок питания рассчитан на минимальное сетевое напряжение 194 В. Поэтому воздействие мощной нагрузки не должно вызывать уменьшение напряжения сети ниже этого значения. В противном случае стабилизация яркости будет нарушена из-за снижения опорного напряжения АЦП.

6.2. Подбор минимальной яркости
По аналогии с подбором максимальной яркости, первым делом убеждаемся, что запоминание яркости для данного режима данного канала активировано (соответствующий бит ebSaveBright равен 1). После этого программируем ячейку eBrightnessMin значением $00. Затем, регулируя яркость лампы удерживанием кнопки, выбираем желаемую минимальную яркость. После паузы, необходимой для запоминания текущей яркости (не менее 2,5 секунд), считываем содержимое ячейки eLastBright и записываем его в ячейку eBrightnessMin, осуществляя при необходимости конвертацию между шестнадцатеричным и десятичным форматом.

6.3. Выбор константы cADCSamplesCount
В случае модификации программного кода основного цикла программы необходимо заново рассчитать значение константы сADCSamplesCount. Данная константа определяет количество проходов процедуры ADCSampling, т.е. продолжительность измерения сетевого напряжения, в т.ч. при выключенных каналах, когда значения rChХOffTime равны нулю. В целом, чем больше значение константы, тем лучше, т.к. лампа будет дольше находиться во включенном состоянии, что позволит достичь большей максимальной яркости. Однако суммарная длительность процедуры ADCSampling, определяемая константой сADCSamplesCount, ограничена длительностью выполнения основной программы. Например, если основная программа выполняется в течение Tоп=500 мкс, то суммарная длительность процедуры ADCSampling не может быть больше 9500 мкс, т.к. один полный цикл выполнения всего кода программы при частоте сети 100 Гц занимает Т=10000 мкс. Если же процедура ADCSampling будет выполняться дольше, возникнут сбои, проявляющиеся в виде моргания ламп.

Чтобы определить значение константы сADCSamplesCount, требуется знать время Tпр, затрачиваемое на однократное выполнение процедуры ADCSampling. Таким образом, первоначально формула для вычисления константы выглядит следующим образом:
сADCSamplesCount = (Т - Tоп) / Tпр.
Помимо времени выполнения основной программы, формула должна также учитывать время, затрачиваемое на процедуру PhaseDetect. Поскольку эта процедура основана на сравнении двух чисел, последовательно получаемых с АЦП, минимальное время её выполнения равно удвоенному времени преобразования АЦП tацп, плюс время tо, необходимое для обработки результата:
cADCSamplesCount = (Т - (Tоп + 2*Tацп + Tо)) / Tпр.
Ещё один участок кода, который должен быть учтён в формуле, это команды, находящиеся между процедурами PhaseDetect и ADCSampling. С учётом времени их выполнения Tд:
cADCSamplesCount = (Т - (Tоп + 2*Tацп + Tо + Tд)) / Tпр.
Коэффициент Кч учитывает отклонение частоты сети от номинальной:
сADCSamplesCount = (Т*Кч - (Tоп + 2*Tацп + Tо + Tд)) / Tпр

Полученная формула пригодна для расчёта, если время выполнения одной команды составляет ровно 1 мкс. Но поскольку тактовая частота МК не стабилизирована кварцевым резонатором, для обеспечения хорошей повторяемости устройства требуется ввести поправочный коэффициент Кrc, учитывающий погрешность внутреннего RC-генератора МК:

cADCSamplesCount = (Т*Кч - (Tоп*Кrc + 2*Tацпo*Кrc + Tо*Кrc + Tд*Кrc)) / (Tпр*Кrc)

Теперь можно перейти к подстановке числовых значений. Расчёт следует вести, исходя из минимального значения константы cADCSamplesCount, т.к. именно в этом случае можно быть уверенным, что перечисленные выше обстоятельства не приведут к морганию ламп.
Под временем выполнения основной программы tоп подразумевается максимальное время её выполнения за один проход. В силу разветвлённости алгоритма и отсутствия пригодного профайлера, определить аналитически, в каком именно случае программа выполняется дольше всего, чрезвычайно сложно. Поэтому был применён эмпирический метод. Было установлено, что максимальное время выполнения основной программы соответствует режиму, когда яркость обоих каналов регулируется одновременно. Конкретное численное значение времени можно определить при симуляции этого режима в среде VMLab. Измерение следует повторить не менее eBrightChangeSpeedCh1+eBrightChangeSpeedCh2+1 раз подряд. Значения eLastBright и eBrightnessMax при этом могут быть любыми. Из полученных результатов нужно выбрать наибольший. В текущем варианте программы измеренное время принимало значения 311...351 мкс. Поэтому tоп=351 мкс. Ниже для справки приведено максимальное время выполнения основной программы в различных режимах (без учёта команды LDI Temp, 255, расположенной перед процедурой PhaseDetect, и выполняемой за 1 мкс):
- при выключенных каналах 223 мкс
- при включении одного канала 254 мкс
- при включенном одном канале 257 мкс
- при включенных обоих каналах 291 мкс
- при одновременной регулировке яркости обоих каналов до начала её изменения 335 мкс
- при одновременной регулировке яркости обоих каналов во время её изменения 351 мкс.
При допуске на частоту сети 0,4 Гц [4] её максимальное значение составит 50,4 + 50,4 = 100,8 Гц. Значит, период будет равен Т = 1 / 100,8 = 9920 мкс. Согласно описанию МК, допуск на отклонение частоты внутреннего RC генератора составляет +/-3%. Добавим сюда ещё 1%, чтобы учесть влияние температуры, а также допуск на напряжение питания МК. Одного процента вполне достаточно, т.к. нагревание компонентов устройства и его корпуса невелико, равно как невелико и отклонение напряжения питания, благодаря использованию прецизионного источника опорного напряжения. Графики зависимостей частоты МК показывают, что влияние температуры и напряжения питания не слишком значительно. Суммируя изложенное, принимаем Кrc=1,04, чтобы учесть максимальное время выполнения команд.
Предделитель АЦП запрограммирован на деление входной частоты в два раза. Входной частотой предделителя является тактовая частота МК 1 МГц. Значит, на выходе предделителя будут импульсы с периодом следования 2 мкс. Длительность одного преобразования АЦП в режиме Free Running Mode составляет 13,5 тактов предделителя. Отсюда время преобразования Tацп = 13,5 * 2 = 27 мкс. В процедуре PhaseDetect время обработки результата преобразования АЦП to определяется для худшего случая, когда результат второго преобразования становится доступен на следующей команде после чтения АЦП. Поэтому To=7.
Между процедурами PhaseDetect и ADCSampling находятся всего две команды. Значит Tд=2.
Время Tпр, затрачиваемое на однократное выполнение процедуры ADCSampling, нетрудно подсчитать вручную или с помощью симулятора. Задача облегчается тем, что, несмотря на наличие команд условного перехода, процедура всегда выполняется в течение одного и того же времени. Для этого применяются выравнивающие команды NOP. Время выполнения процедуры ADCSampling составляет Tпр=21 мкс.
Подставляя полученные данные в формулу, получаем:

cADCSamplesCount = (9920 - (351*1,04 + 2*27*1,04 + 7*1,04 + 2*1,04)) / (21*1,04) = 434,49

Для надёжности значение константы следует округлить в меньшую сторону, даже если это противоречит правилам арифметики.

После изменения константы cADCSamplesCount подстройка значений eBrightnessMin и eBrightnessMax не требуется.
Интересно заметить, что при значении константы сADCSamplesCount=434, т.е. когда длительность включенного состояния канала составляет примерно 434 х 21 = 9114 мс, и при eBrightnessMax=255, т.е. когда эта длительность не ограниченна, максимальное напряжение на лампе меньше номинального напряжения сети всего приблизительно на 1 В. Таким образом, эффективность диммера равна (219 * 100) / 220 = 99,6%. Если замкнуть выводы сток-исток транзистора, можно убедиться, что разница в яркости при уменьшенном на 1 В сетевом напряжении практически незаметна.
Также интересно отметить, что при тех же условиях уменьшение константы cADCSamplesCount на 7 единиц почти не уменьшает напряжение на лампе.

7. Конструкция.

Учитывая малое количество деталей, печатная плата не разрабатывалась. Устройство собрано на односторонней макетной плате, выпиленной лобзиком по габаритным размерам данного конкретного варианта светильника (см. Рис. 7).

Рис. 7

Соединения элементов выполнены навесным монтажом, с помощью термостойкого провода марки МГТФ, а также путём наплавления припоя между соседними дорожками.
Для исключения короткого замыкания, между платой и корпусом проложен термоустойчивый диэлектрический материал. Автор использовал для этой цели кондитерскую бумагу для запекания.
Провода сетевого шнура заведены в клеммник, но перед этим они проходят сквозь отверстия в плате. Такая мера повышает защиту сетевого шнура от обрыва.
Для удобства монтажа применяются компоненты в выводном исполнении. Единственное исключение - SMD конденсатор С3. Он припаян непосредственно к соответствующим выводам панельки МК со стороны монтажа.
МК установлен в цанговую панельку. Конденсатор С2 располагается внутри неё. Благодаря малым габаритам, конденсатор не мешает корпусу МК до конца садиться в панельку.
Транзисторы закреплены в винтовых клеммниках серии 308-031. Это удобно, т.к. для замены транзистора не нужно извлекать плату из корпуса светильника и прибегать к пайке - достаточно открутить три винта клеммной колодки.
Верхняя часть платы зарезервирована для дальнейшего расширения возможностей устройства, например для установки модуля ZigBee.

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

Желательно чтобы конструкция светильника, в особенности его плафонов, не препятствовала отводу тепла, т.к. высокая температура сокращает срок службы ламп [16]. В этом отношении вариант, выбранный автором, следует признать не слишком удачным.

Поскольку светильники, как правило, оформлены в металлических корпусах, следует принять меры по защите устройства от воздействия статического электричества [18].

8. Заключительные положения.

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

Симптом: при записи данных в EEPROM (например через 2,5 секунды после окончания регулировки яркости) сильно заметно моргание ламп(ы).
Причина: уменьшилась (высохла) ёмкость электролитического конденсатора фильтра питания.
Решение: заменить фильтрующий конденсатор.

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

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

Включение лампы происходит при напряжении в сети на 12 В выше нуля.

Большая ёмкость конденсатора фильтра и как следствие, задержка старта устройства при подключении к сети (около 4 секунд).

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

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

Недостаток описания проекта: лимит времени не позволил привести математические формулы и html код сайта в более достойный вид.

8.3. Что следовало бы сделать иначе
В списке рекомендаций производителя МК по работе с АЦП имеется такой пункт: выводы АЦП, сконфигурированные как цифровые выходы, не должны переключаться во время процесса измерения. В данной схеме эта рекомендация не соблюдается. Это связано с исторически сложившейся неправильной по сути, но удобной с точки зрения разводки платы, конфигурацией выводов МК, изначально выбранной автором. Впрочем, на качестве стабилизации это не отражается.

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

Функция ИПХ не учитывает повторяющиеся последовательности чисел, возвращаемые подпрограммой RandomNumber8bit (об этом шла речь в конце раздела Описание программы). Кроме этого, в текущей реализации случайные значения времени работы во включенном и выключенном состояниях, а также уровня яркости вычисляются на основе одной и той же последовательности. Лучшим решением было бы использование отдельных последовательностей для каждого из этих трёх значений.

8.4. Дальнейшие усовершенствования
Заменить кнопки энкодерами. С точки зрения эргономики последние предпочтительнее.

Добавить датчик освещённости, например на основе обычного светодиода. Попутно светодиод можно использовать как индикатор наличия напряжения питания. Если применить двух- или трёхцветный светодиод, можно отображать различные режимы работы устройства. Также светодиод можно использовать для подсветки органов управления. Наличие датчика освещённости позволит функции ИПХ работать только в тёмное время суток, устраняя напрасный расход электроэнергии в дневное время. Ещё одно применение фотодатчика - функция поддержания освещённости помещения на заданном уровне.

Реализовать плавное автоматическое включение в течение 30 минут через заданный интервал времени после выключения (имитация рассвета). Например, светильник выключается кнопкой в 24:00. В 07:30, когда зимой за окном ещё темно, он автоматически включается на минимальную яркость, и к 08:00 достигает полной яркости. Такая условная имитация "восхода солнца" позволит организму адаптироваться к моменту просыпания, в том числе снизить или даже полностью исключить неприятную резь в глазах. Данная идея реализована в световом будильнике Philips HF3475.

Внедрить беспроводной интерфейс, например на основе модуля ZigBee, для оперативного изменения параметров настройки и обновления прошивки МК.

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

Устранить нагрев диодного моста, изменив схемотехнику выходного каскада. Вместо диодного моста применить схему из пары транзисторов с объединёнными истоками (на каждый канал).

8.5. Перечень измерительных приборов и оборудования
При разработке устройства использовались следующие приборы и оборудование:
- Мультиметр - Uni-Trend UT71E TrueRMS AC+DC. Высокая точность позволила не учитывать в расчётах погрешность измерительного прибора. В частности, при измерении постоянного тока отклонение, согласно паспорту мультиметра, не превышает 0,15%
- Осциллограф - С1-94
- Автотрансформатор лабораторный (ЛАТР) - TDGC2-1A
- Термометр цифровой - Velleman DTP3
- Программатор - самодельный, с гальванической развязкой сигнальных цепей и шины питания. За основу был взят программатор из https://algrom.net/pgm.pdf.

8.6. Сведения об авторе и условия распространения
Сведения об авторе указаны в начале статьи. Прим. Кота.
Проект распространяется свободно для применения в некоммерческих целях. Исходный код может быть модифицирован без ограничений. При использовании материалов проекта ссылка на оригинал обязательна. Коммерческое использование допускается только после письменного согласования с автором.

8.7. Благодарности
Автор благодарит тех, кто помогал в работе над проектом: Васильчикова Н.В., Веселовацкая Е.В., Екимов И.Б., Корнюхин С.В., Милославский В.Ю. Отдельная благодарность Леониду Ивановичу Ридико за ценные замечания по технической части проекта.

9. Список литературы.

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

1. "Dimmable Fluorescent Ballast" - User Guide, 10/07, Atmel Corporation, https://www.atmel.com/dyn/resources/prod_documents/doc7597.pdf
2. А. Евсеев "Стабилизированный регулятор мощности" // Радио, 2002г., №4, стр.36.
3. М. Марков "АЦП с интерфейсом RS-232" // Радио, 2005г., №2, стр.26; файл ADC675.zip.
4. ГОСТ13109-97. Нормы качества электрической энергии в системах электроснабжения общего назначения.
5. G. Howell "Five questions about resistors" // EDN, 9/28/2006, https://www.edn.com/contents/images/6372835.pdf
6. П. Хоровиц, У. Хилл "Искусство схемотехники" - Изд. 6-е, М.: Мир, 2003.
7. J. Israelsohn "Miller on edge: The role of Miller capacitance in nonlinear circuits" // EDN, 3/29/2007 https://www.edn.com/contents/images/6426883.pdf
8. C. Hillman "Common mistakes in electronic design" // EDN, 12/14/2007 https://www.edn.com/contents/images/6512156.pdf
9. А. Колпаков "Особенности применения электролитических конденсаторов" // Схемотехника, 2000г., №2, стр.30.
10. "The Do"s and Don"ts of Using MOS-Gated Transistors" - Application Note AN-936, International Rectifier, https://www.irf.com/technical-info/appnotes/an-936.pdf
11. "TVS/Zener Theory and Design Considerations" - Handbook, Rev. 0, Jun?2005, On Semiconductor, https://www.onsemi.com/pub/Collateral/HBD854-D.PDF
12. "Characterization and Calibration of the ADC on an AVR" - Application Note AVR120, 02/06, Atmel Corporation, https://www.atmel.com/dyn/resources/prod_documents/doc2559.pdf
13. "The Eye"s Response to Light" - Lutron Electronics, 8/97, https://www.lutron.com/product_technical/pdf/360-408.pdf
14. Д. А. Гурский, Е. С. Турбина "Вычисления в Mathcad 12" - СПб.: Питер, 2006, https://www.piter.com/books/download/978546900639
15. "Four Great Reasons to Dim" - Lutron Electronics, https://www.lutron.com/dim.htm
16. "Frequently asked questions about dimmers" // https://www.lutron.com/product_technical/faq.asp
17. "LEDs move from indication to illumination" // EDN, 8/2/2001 https://www.edn.com/contents/images/149134.pdf
18. Л. Н. Кечиев, Е. Д. Пожидаев "Защита электронных средств от воздействия статического электричества" - М.: ИД "Технологии", 2005.


ССЫЛКИ ПО ТЕМЕ:
Lights and electronics - https://www.epanorama.net/links/lights.html
Light dimmer circuits - https://www.epanorama.net/documents/lights/lightdimmer.html
The Great Internet Light Bulb Book, Part I - https://members.misty.com/don/bulb1.html
Lamp Experimental Data - https://alumni.imsa.edu/~ejohnson/light

Файлы:
Прошивка МК с исходником.
Куча екселевских файлов (те, что в тексте).
Таблица яркости (MathCad).

Вопросы, как обычно, складываем тут.




Как вам эта статья?

Заработало ли это устройство у вас?

11 1 0
1 0 0