Проект Eldigi.ru пережил своё новое становление. В связи с этим на сайте могут быть ошибки. Нашли ошибку? Помогите проекту, выделите её и нажмите Ctrl+Enter. Подробнее...

Cхемотехника и программирование устройств фазового регулирования (ATtiny2313, C)

Кто из вас не хотел изготовить себе сенсорный диммер с возможностью дистанционного управления светом? Наверное, многие. Так вот и я однажды захотел изготовить себе этот несложный с точки зрения схемотехники девайс. Нашёл в сети интернет более десятка различных схем и решил выбрать для повторения те из них, прошивки которых находились бы в свободном доступе и обладали бы требуемыми мне функциональными возможностями. Но таковых не оказалось вовсе: Более чем из десятка всевозможных схем и программного обеспечения различных авторов те из них, что заслуживали бы повторения, оказались с платными прошивками. Тогда же я, в свою очередь, попытался узнать у авторов цену. Два из них на письма не ответили даже в течение полугода, а два других назвали следующие цены: первый - 12 usd за прошитый микроконтроллер PIC12С509, а второй 15 usd за hex файл прошивки для ATtiny2313. Оба диммера, если верить авторскому описанию, аналогичны по своим функциональным возможностям промышленно выпускаемому «Сапфиру», реализованному на наиболее дешёвом PIC микроконтроллере PIC12С509. Однако стоимость готового заводского диммера «Сапфир-2503» производства Минской компании «Ноотехника» составляет 15 – 17 usd, что сопоставимо со стоимостью предлагаемых прошивок. Так на что эти авторы надеются? Что их прошивки купят по цене на пару вечнозелёных меньше чем стоимость готового заводского устройства? А где гарантия, что предлагаемые ими программы не глючат? Я нарочно не привожу ссылки на эти разработки. Не хочу заниматься рекламой, а точнее антирекламой…

Так вот я и решил заняться разработкой общедоступного для повторения устройства с открытыми исходными кодами, аналогичного заводскому «Сапфиру». Учитывая мой богатый опыт по проектированию устройств и после удачного релиза заказного проекта 15-ти канального управляемого диммера, опубликованного здесь ранее, я решил реализовать упрощённый одноканальный диммер. Заодно снабдив его различными полезными функциями насколько, насколько позволит объем памяти наиболее дешёвого и распространённого микроконтроллера AVR ATtiny2313. Можно конечно реализовать устройство и на микроконтроллере PIC, но выбор, как говорится, моё право, а я сторонник микроконтроллеров AVR. Программа диммера написана в среде разработки WinAVR-20100110. Забегая вперёд, скажу, что прочтя статью до конца, читатель сможет не только повторить нормально работающее устройство, но и подправить программу под свои нужды. Желающие просто повторить устройство могут скачать hex файл прошивки по ссылке в конце статьи, запрограммировать микроконтроллер, собрать устройство по схеме на рисунке 1 или 2 ниже и дальше не читать эту статью.

Итак, основные возможности программы, заложенной в устройство следующие:

- регулировка яркости лампы накаливания в пределах 8 – 92% от номинальной для двухпроводного включения диммера;

- регулировка яркости лампы накаливания в пределах 10 – 99% от номинальной для трёхпроводного включения диммера;

- управление функциями устройства при помощи прикосновения к сенсору, от пульта дистанционного управления (ПДУ) или кнопочного выключателя;

- запоминание кода любой кнопки ПДУ, работающего в кодировке RC5, для управления устройством;

- регулирование яркости лампы при длительном касании сенсора, длительного нажатия на кнопку управления или удержании кнопки ПДУ в нажатом состоянии;

- включение и отключение лампы при кратковременном касании сенсора, нажатии на кнопку управления или запрограммированную кнопку ПДУ;

- функция имитации присутствия хозяев, включаемая и отключаемая при длительном прикосновении к сенсору (более 20 секунд);

- таймер автоматического отключения света при отсутствии команд управления диммером в течении заданного времени;

- функция рассвет (плавное нарастание яркости ламп), продлевающая срок службы ламп.

Начнём со схемотехники диммеров. Во-первых, необходимо чётко различать что диммеры бывают двух типов: с трёхроводной схемой включения и двухпроводной. Диммеры первого типа подключаются к электросети и лампе нагрузки тремя проводами (рисунок 2). 

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

Каждый из вариантов обладает своими преимуществами и недостатками. Трёхпроводные диммеры позволяют регулировать мощность нагрузки от 0 практически до 100%, но требуют наличия дополнительного провода для питания самого диммера и не могут устанавливаться вместо штатного выключателя освещения. Диммеры с двухпроводной схемой включения, напротив, могут устанавливаться вместо стандартного выключателя, но могут регулировать мощность нагрузки и, соответственно, яркость лампы от 0 до 90%, то есть лампа не сможет светиться на 100% яркости и будет работать с недокалом. Этот момент следует учесть при выборе лампы.

Как показала практика, для обеспечения нормального питания диммера при указанных на схеме (рисунок 1), номиналах элементов, обеспечивающих приемлемые массогабаритные показатели готового устройства, необходимо, что бы среднее значение напряжения на выходе диммера не превышало 205 В. при входном напряжении 220 В. и мощности нагрузки 40 Вт. При этом, включенная последовательно с диммером лампа накаливания, будет излучать световой поток 72% от номинального, при максимальном напряжении на лампе 205 В. (93% от номинального напряжения 220 В.). На лицо ещё один недостаток двухпроводных диммеров: значительное снижение светоотдачи лампы, так что заявленная производителями экономия электроэнергии представляется сомнительной. Диммер трёхпроводного подключения позволяет установить максимальное выходное напряжение и, соответственно, яркость лампы накаливания, лишь незначительно меньше номинала. Разница между напряжением в электросети и выходным напряжением диммера в этом случае не превысит 1-2 В., которые падают на регулирующем элементе – симмисторе.

Изображённая на рисунке 1 схема подходит как для диммера трёхпроводного, так и двухпроводного включения. Как показано на рисунке 4, немного другая схема подключения сетевого помехоподавляющего фильтра L1C8 и предохранителя FU1 позволяет реализовать трёхпроводной вариант подключения диммера.

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

Теперь немного теории регулирования переменного напряжения.

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

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

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

Форма напряжения Uн на нагрузке и ток фазы Iн показаны на рис. 6а и 6б для активной и активно-индуктивной нагрузки, соответственно.

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

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

Теперь о назначении различных элементов схемы (рисунок 1).

Центральной частью устройства является микроконтроллер DD1 ATtiny2313, но подойдёт и более новый ATtiny2313A. На вход внешнего прерывания микроконтроллера INT0 (PD4) через делитель напряжения, образованный элементами R8 – R10 поступает сетевое напряжение. Падающий фронт напряжения вызывает возникновение прерывания в работе программы микроконтроллера. Именно таким образом управляющая программа микроконтроллера определяет момент перехода сетевым напряжением нулевого значения. Конденсатор С7, ёмкостью 100 пФ. сглаживает короткие импульсные помехи, возникающие при работе импульсных источников питания в электросети и генерируемые симистором самого диммера, для устранения ложного детектирования перехода сетевого напряжения через ноль. Если попытаться рассчитать выходное напряжение делителя, образованного резисторами R8 – R10, то будет понятно, что оно многократно превышает допустимый для микроконтроллера уровень 5,5 В. Однако это не выводит его из строя благодаря находящимся внутри микроконтроллеров AVR защитных диодов. Данные диоды способны длительно выдерживать ток, не превышающий 10 мА., а при указанных номиналах резисторов он менее 0,3 мА. По большому счёту резистор R8 можно исключить из схемы и всё будет работать. Однако для увеличения надёжности устройства лучше его оставить. В схеме делителя нарочно использовано последовательное соединение двух резисторов R9-R10. Применение в верхнем плече делителя двух одинаковых резисторов существенно увеличивает надёжность устройства. При подобном схемотехническом решении возможно использовать резисторы для поверхностного монтажа типоразмера 1206, рассчитанных на номинальное рабочее напряжение не более 250 В. Поскольку амплитудное значение напряжения в корень из двух раз больше среднеквадратичного, то получается что к резисторам приложено напряжение 310 В. при входном 220 В. Отсюда и необходимость применения двух резисторов. При использовании стандартных резисторов мощностью 0,25 Вт. и выше – можно ограничиться одним сопротивлением удвоенного номинала.

На элементах VD3 VD4 реализован стабилизированный однополупериодный выпрямитель. Конденсатор С6, совместно с резистором R6, образуют гасящее сопротивление для параметрического стабилизатора напряжения на стабилитроне VD3. Возможно, стоило бы ограничиться лишь гасящим конденсатором, однако, необходимо помнить, что при подключении к электросети переменного тока незаряженный конденсатор имеет практически нулевое сопротивление. Так что бросок тока при подключении устройства к электросети способен вывести из строя как диод VD4, так и стабилитрон VD4. Так что применение этого резистора – жизненная необходимость. Обращаю ваше внимание на мощность R6: не менее 0,5 Вт. Если при сборке устройства будут использоваться элементы поверхностного монтажа, то допускается вместо одного резистора R6 мощностью 0,5 Вт., устанавливать четыре резистора сопротивлением 100 Ом типоразмера 1206.

Конденсаторы С1 и С2 выполняют роль фильтра питания и служат, соответственно, для сглаживания пульсаций выпрямленного напряжения. Номинал конденсатора С1 на схеме указан с четырёхкратным запасом. Как показывает практика, нормальная работоспособность устройства обеспечивается при ёмкости 220 мкФ. и более.

Элементы VD1 C5 R4 образуют цепочку сброса микроконтроллера при подаче напряжения питания. Диод VD1 служит для быстрого разряда конденсатора С5 при отключении напряжения в электросети. Это позволяет избежать сбоев в работе устройства при кратковременных провалах сетевого напряжения.

Резистор R5 служит для ограничения тока через светодиод VD2. Пусть вас не смущает его номинал 3,3 кОма. При данном номинале резистора через светодиод протекает ток порядка 1,5 мА., чего вполне достаточно для нормального свечения. Светодиод можно использовать в схеме любой, но желательно сверхяркий. Уменьшение номинала резистора R5 повлечёт за собой увеличение яркости свечения светодиода и рост потребляемого устройством тока. При трёхпроводном подключении устройство остаётся работоспособным при увеличении тока через светодиод до 5 мА., однако при двухпроводном подключении диммера уже при токе 2 мА. начинает сказываться нехватка напряжения питания микропроцессора при максимальных значениях яркости прибора, что проявляется в мерцании лампы.

На транзисторе VT1 собран ключ, который разряжает конденсатор С4 при прикосновении к сенсорной пластине. Это происходит благодаря тому, что наведённая в теле человека ЭДС при прикосновении его к сенсорной пластине или пластиковой крышке вблизи ее, поступая на базу транзистора через резистор R1, открывает транзистор VT1. Обратный заряд конденсатора С4 до напряжения источника питания происходит через резистор R3. Для нормальной работоспособности и высокой чувствительности сенсорного управления необходимо, что бы используемый транзистор обладал значительным (несколько сотен) коэффициентом усиления. Из отечественных на эту роль неплохо подходят транзисторы серии КТ3102. Ёмкость конденсатора С4 возможно придётся подбирать по устойчивому распознаванию длительных и коротких прикосновений к сенсору. Поскольку иногда применение сенсорного управления нежелательно, а предпочтительно использовать кнопочное, эта возможность так же предусмотрена в устройстве. Схема подключения кнопки, заворачивающей цепь коллектор-эмиттер транзистора VT1, приведена на рисунке 4. Как уже говорилось ранее в этом случае VT1 и резистор R1 можно не устанавливать.

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

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

Теперь о фотоприёмнике. Как видно из схемы в качестве фотоприёмника может использоваться практически любой интегральный ФП. Однако для обеспечения максимальной дальности работы желательно убедиться, что он рассчитан на работу с несущей частотой ИК сигнала равной 36 кГц. Об этом свидетельствует наличие чисел xx36 в его маркировке. Его тип и номера выводов нарочно не указаны на схеме. Цоколёвка наиболее распространённых из них приведена в предыдущей моей статье, посвящённой диммерам [1]. Элементы R2C3 выполняют роль простейшего RC-фильтра в цепи питания микросхемы фотоприемника, и служит для разделения цепей питания аналоговой и цифровой части устройства.

Теперь о подключении симистора. Поскольку у начинающих радиолюбителей довольно часто возникает путаница с расположением выводов симистора укажу, что нумерация выводов стандартных симисторов в корпусах ТО-220 обычно следующая (слева направо): М1-M2-G, где М1, М2 – силовые выходы, а G – управляющий электрод. Для обеспечения нормального включения симистора необходимо учесть следующее: нижний по схеме вывод симистора должен быть обязательно подключен к центральному выводу корпуса. В противном случае нормальная работа устройства не гарантируется. Учтите это при проектировании печатной платы устройства.

Для управления симистором используется вывод 4 порта PORTD микроконтроллера. Управляющий электрод симистора VS1 подключен непосредственно к порту микроконтроллера через токоограничивающий защитный резистор R7. На схемах многих самодельных диммеров изображают промежуточный транзисторный ключ. Обычно на транзисторе КТ361 или другом маломощном. Глядя на эти схемы у меня, невольно, возникают сомнения в части, знают ли их авторы закон Ома и нагрузочные характеристики порта микроконтроллера. Даже простые расчёты уровня 8-го класса средней школы, где изучают закон Ома для участка цепи, показывают, что при указанных на схеме номиналах элементов R6C6 и частоте напряжения в электросети 50 Гц. значение сопротивления этой гасящей цепочки составляет около 15 кОм. При напряжении 220 В. ток, короткого замыкания, протекающий через элементы схемы не превысит 15 мА. Порт микроконтроллера, в свою очередь, способен обеспечить выходной ток 40 мА. на вывод, но не более 200 мА. на весь порт. или 400 мА. на весь микроконтроллер. Так зачем городить транзисторы, если даже при возникновении внештатной ситуации микроконтроллер не выйдет из строя?! При указанном на схеме номинале резистора R7 и напряжении питания микроконтроллера 5 В. и вовсе получается, что ток в управляющей цепи симистора не превысит 5,5 мА. в импульсе.

Тип симистора опять же не указан на схеме нарочно. Это сделано потому, что подойдет практически любой из серий BT136, BT137, ВТА41, BTA140, ВТА12, BTB16 и многие другие. Следует лишь убедиться, что максимальное рабочее напряжение не менее 600 В., а максимальный рабочий ток в два раза превышает требуемое нагрузкой значение. Например, популярный симистор BT137-600E рассчитан на напряжение 600 В., о чём говорят три последние цифры его маркировки, и средний прямой ток 8 А., при максимальном импульсном значении тока 71 А. Диммер с данным симистором, установленном на небольшой радиатором согнутый из листа алюминия размером 50x30x2 мм. способен продолжительное время работать при нагрузке мощностью 1 кВт. Размеры радиатора можно приближенно прикинуть из расчета, что на 1 Вт рассеиваемой мощности, что эквивалентно 100 Вт. нагрузки, необходимо около 10 см2 эффективной поверхности радиатора (сам корпус симистора рассеивает 10 Вт мощности).

Теперь от теории схемотехники перейдём к программированию микроконтроллеров. Первое что необходимо твёрдо уяснить, что при стандартной схеме включения симистора, которая и используется в данном устройстве, включение симистора должно производиться выводом на порт микроконтроллера логического нуля! Именно нуля, а не единицы. При наличии на выводе 4 PORTD микроконтроллера логической единицы симистор надёжно заперт! Следует учесть так же и тот факт, что нет необходимости обеспечивать наличие логического нуля всё время пока симистор должен быть открыт. Для надёжного отпирания последнего достаточно сформировать на управляющем электроде импульс напряжения продолжительностью не менее 15 мкс. Данное значение справедливо для симисторов семейств BT136, BT137. Для надёжности отпирания симисторов других марок будем подавать на управляющий электрод импульс длительностью 50 мкс.

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

В [2] приведена зависимость параметров ламп накаливания от напряжения питания (рисунок 10).


Рисунок 10 – Зависимость параметров ламп накаливания от напряжения питания:

1 - срок службы; 2 — световой поток; 3 — световая отдача; 4 - потребляемая мощность; 5 — потребляемый ток

Однако восприятие уровня яркости человеческим глазом имеет нелинейную логарифмическую зависимость. Например, уменьшение яркости до 25% от максимальной, воспринимается человеком примерно как половинное. График этой зависимости приведён на рисунке 11. Он взят из документа [3] компании Lutron Electronics –производителя регуляторов освещения. По горизонтальной оси графика отложены значения яркости, воспринимаемые человеческим глазом, а по вертикальной – её реальные значения, измеренные люксометром.

Экспериментально установлено, что снижение напряжения на лампах накаливания с номинальным рабочим напряжением 220 В., до уровня 18 В. приводит к полному отсутствию свечения спирали в тёмном помещении. Исходя из этого, решено программно установить минимальное выходное напряжение канала на уровне 20 В. Максимальное выходное напряжение канала, при  напряжении в питающей электросети 220 В., следует программно ограничить на уровне 218 В., так как дальнейшее повышение уровня напряжения не приведёт к росту яркости лампы накаливания ввиду падения напряжения на регулирующем элементе (симисторе).

Рассчитанная и построенная в программе Microsoft Excel кривая регулирования выходного напряжения каналов, обеспечивающая визу-альное равномерное изменение яркости лампы накаливания для 50 шагов регулирования яркости приведена на рисунке 12.

Таблица времени задержки угла отпирания силового симистора получена путем вычисления в программе Microsoft Excel 50-ти интервалов времени за полупериод сетевого напряжения. Интервалы времени рассчитывались из условия равенства интегралов мгновенного значения синусоиды. При этом получаются неравномерные интервалы времени, соответствующие различным уровням мощности. Максимальному уровню мощности соответствует минимальная задержка. При этом каждый последующий шаг регулирования напряжения рассчитывался исходя из условия повышения видимой яркости лампы накаливания на 5% к предыдущему значению.

Графическая иллюстрация результата расчета приведена на рисунке 12. Как видно из графиков интервал времени между соседними точками на максимуме синусоиды почти в три раза меньше времени первого интервала.

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

Таблица 1 содержит значения задержки угла отпирания тиристора. Значения в крайнем правом столбце получены путём расчёта и предназначены для занесения в счётный регистр TCNT1 таймера-счётчика Т1 управляющего микроконтроллера.

N U(В) -t,мс t, мс n счета
0 20,0 1,950 8,050 57386
1 21,0 2,000 8,000 57436
2 22,0 2,051 7,949 57487
3 23,1 2,103 7,897 57539
4 24,2 2,157 7,843 57593
5 25,4 2,213 7,787 57649
6 26,6 2,270 7,730 57706
7 27,9 2,328 7,672 57764
8 29,3 2,389 7,611 57825
9 30,7 2,451 7,549 57887
10 32,2 2,515 7,485 57951
11 33,7 2,580 7,420 58016
12 35,4 2,648 7,352 58084
13 37,1 2,718 7,282 58154
14 38,9 2,789 7,211 58225
15 40,8 2,863 7,137 58299
16 42,8 2,939 7,061 58375
17 44,9 3,018 6,982 58454
18 47,1 3,099 6,901 58535
19 49,4 3,182 6,818 58618
20 51,8 3,268 6,732 58704
21 54,3 3,357 6,643 58793
22 56,9 3,449 6,551 58885
23 59,7 3,544 6,456 58980
24 62,6 3,643 6,357 59079
25 65,7 3,744 6,256 59180
26 68,9 3,850 6,150 59286
27 72,2 3,959 6,041 59395
28 75,7 4,073 5,927 59509
29 79,4 4,190 5,810 59626
30 83,3 4,313 5,687 59749
31 87,3 4,440 5,560 59876
32 91,6 4,573 5,427 60009
33 96,1 4,712 5,288 60148
34 100,7 4,857 5,143 60293
35 105,6 5,009 4,991 60445
36 110,8 5,169 4,831 60605
37 116,2 5,337 4,663 60773
38 121,8 5,515 4,485 60951
39 127,8 5,703 4,297 61139
40 134,0 5,903 4,097 61339
41 140,5 6,118 3,882 61554
42 147,4 6,349 3,651 61785
43 154,5 6,600 3,400 62036
44 162,1 6,876 3,124 62312
45 170,0 7,184 2,816 62620
46 178,2 7,537 2,463 62973
47 186,9 7,957 2,043 63393
48 196,0 8,501 1,499 63937
49 205,6 9,461 0,539 64897

Данные значения задержек заносятся в программе обработки внешнего прерывания INT0 в счётный регистр счётчика Т1 и инкрементируются в каждом следующем такте работы микроконтроллера (с частотой 1 МГц.) Применение 16-ти разрядного счётчика для отсчёта интервалов времени позволяет достаточно точно установить время отпирания симистора. В случае использования 8-ми разрядного счётчика Т0 микроконтроллера ATtiny2313 не удаётся достичь необходимой плавности регулирования яркости.

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

Ниже приведён массив значений счётчика для двухпроводной схемы включения диммера, обеспечивающей регулировку яркости лампы накаливания в пределах 8 – 92% от номинальной для двухпроводного включения диммера. Обратите внимание, что значения в массив lig[50] записаны начиная с последнего. Для дальнейшего пояснения работы программы диммера необходимо условиться, что максимальная яркость лампы будет устанавливаться при счётчике яркости равном нулю, а минимальная при значении 49. 

F const unsigned int lig[50] = {63787, 63294, 62901, 62566, 62271, 62005, 61763, 61539, 61331, 61136, 60952, 60779, 60615,60459, 60310, 60168, 60031, 59901, 59776, 59655, 59539, 59428, 59320, 59216, 59115, 59018, 58924, 58834, 58746, 58660, 58578, 58497, 58420, 58344, 58271, 58200, 58130, 58063, 57998, 57934, 57873, 57812, 57754, 57697, 57642, 57588, 57535, 57484, 57434, 57386};

Теперь пришла пора определиться с внешним прерыванием. Здесь существует один «подводный камень», который может поставить даже опытного С-программиста в тупик. Казалось бы, логичным настроить внешнее прерывание микроконтроллера на срабатывание по падающему фронту импульса, что бы иметь определённый запас времени для подготовки данных к началу следующего полупериода сетевого напряжения. При этом при снижении напряжения на входе схемы синхронизации до уровня порядка 26 В. запустится программа обработки прерывания в которой можно подготавливать счётчик и отсчитывать моменты времени до отпирания симистора. Для трёхпроводной схемы подключения диммера это действительно логично, работоспособно и способствует достижению максимально возможного значения яркости лампы. Однако при двухпроводном включении начинается довольно весёлая картинка (рисунок 13).

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

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

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

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

//Настройка оборудования
wdt_enable(WDTO_1S);//Настройка сторожевого таймера

Для снижения потребляемого тока отключим аналоговый компаратор микроконтроллера:

ACSR = 0x80;			 //отключение аналогового компаратора

Теперь настроим порты ввода вывода:

DDRD = 0b00010010;
PORTD = 0b00010011;

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

Здесь резонно возникает вопрос: А зачем устанавливать физический внешний резистор R3, если можно обойтись внутренним. Всё дело в том, что сопротивление внутреннего резистора не нормируется и может лежать в пределах от 5 до 200 кОм. Кроме того оно сильно зависит от температуры. В нашем случае необходимо обеспечить определенную величину постоянной времени RC-цепочки, образованной элементами R3C4 для нормального распознавания кратковременных и длительных прикосновений к сенсору. Если использовать внутренний подтягивающий резистор – это становится проблематичным.

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

//Настройки внешних прерываний
MCUCR = (1 << ISC00) | (1 << ISC01) | (1 << ISC11);
GIMSK = (1 << INT0) | (1 << INT1);

Запись GIMSK = | (1 << INT0) означает, что бит INT0 в регистре GIMSK установлен в единицу.

Далее необходимо разрешить обработку прерывания по переполнению таймера-счётчика 1:

//Настройки таймеров
TIMSK = (1 << TOIE1);

И разрешить общую обработку прерываний:

sei();

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

if((PIND&0b1) == 0)		//если это первое включение
{
    PORTD &=~(1 << LED);
    while(rc5_code == 0) wdt_reset(); //ждать приёма команды от пульта
    eprom_write_word(&E_key_on_off, (rc5_code & 0b1111100111111));
    eeprom_write_byte(&E_out, 49);
}

Теперь получается, что если при подаче питания обнаруживается прикосновение к сенсорному контакту или нажатие на кнопку, то программа микроконтроллера гасит светодиод, который по умолчанию при запуске микроконтроллера светится, ожидает в бесконечном цикле принятия кода от пульта дистанционного управления и после принятия такового сохраняет его в eeprom памяти. После этого программа устанавливает минимальную яркость лампы равную 49 (если вы помните то отсчёт уровней яркости ведётся от 49 до 0, где 0 – максимальная яркость).

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

Далее рассмотрим момент программы, ответственный за управление светодиодом:

//Управление светодиодом
if(imitaciya == 0)
 {
    if(led) PORTD &=~(1 << LED);        //выключить светодиод
    else
    {
        if (out_flag == 0) PORTD |= (1 << LED);   //включить светодиод если лампа выключена
        else PORTD &=~(1 << LED); //выключить светодиод если лампа включена
    }
}

Получается, что светодиод будет светиться, если выключен режим имитации присутствия (imitaciya = 0), переменная led = 0, (она используется для кратковременного гашения светодиода при приёме команды ДУ или касании сенсора) и выключена лампа (out_flag = 0), которая подключена к диммеру.

Если сделать так:

if(imitaciya == 0)
{
    if(led) PORTD &=~(1 << LED);        //выключить светодиод
    else PORTD |= (1 << LED);              //включить светодиод
}

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

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

//Индикация имитации присутствия быстрым миганием светодиода
if(imitaciya)
{
    PORTD ^=(1 << 2);        //выключить светодиод
}

Он вызывает инвертирование состояния бита порта, к которому подключен светодиод, что вызывает его мигание с частотой 2,5 Гц. если включен режим имитации присутствия.

Теперь о включении этого режима. Режим имитации присутствия включится, если более 20 секунд непрерывно касаться сенсора. Этот момент реализован в главном цикле программы:

//Включение имитации присутствия при удержании кнопки в нажатом состоянии более 20 секунд
if(imitaciya_on_count > 100)
{
    if(imitaciya == 0)
    {
        imit_start();
    }
    else
    {
        imitaciya = imit_timer = 0; //выключить
    }
    imitaciya_on_count = 0;
    eeprom_write_byte(&E_imitaciya, imitaciya);  
}

Получается, что когда счётчик imitaciya_on_count превысит значение 100, а это случиться после того как 100 вызовов подряд программа обработки данных от сенсора обнаружит длительное касание, включится или выключится режим имитации присутствия, в зависимости от того, включен ли он был ранее. Данное значение соответствует 20 секундам реального времени, так как программа опроса клавиатуры вызывается каждые 20 мс. в момент определения перехода сетевого напряжения через ноль, что так же способствует «отлавливанию» и игнорированию ложных электромагнитных помех, в том числе генерируемых собственным сисистором.

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

// Имитация присутствия
if(imitaciya)
{
	if(imit_timer--);
	else   
	{
		lfsr = 5 + GaloisLfsr16(lfsr); 	//генерируем новое число
		imit_timer = imit_mask & lfsr;  //загрузить в таймер имитации время
		time_current = TIME_AP_OFF; 	//загрузить время в таймер автоотключения
		inv_on_off(out_flag); 			//переключить канал
	}
}

Функция генерации случайных чисел GaloisLfsr16(); была сильно упрощена по сравнению с 15-канальной версией управляемого диммера [1]. Это пришлось сделать из-за малого объёма памяти микроконтроллера ATtiny2313 (всего 2 кБ). Однако, даже такая урезанная функция генерации случайных чисел, неплохо справляется с поставленной задачей.

Итак, каждую секунду декрементируется переменная imit_timer. Когда она достигнет нулевого значения, т.е. сгенерированное в предыдущий раз значение времени закончится, будет выполнена генерация нового случайного числа. Данной значение будет загружено в счётчик после наложения маски, ограничивающей максимальное время на которое может включаться и выключаться лампа imit_timer = imit_mask & lfsr. Значение маски imit_mask определяется в заголовочном файле программы «main.h», как и все другие константы программы. При значении imit_mask равном 0x3FFF максимальное генерируемое время составит 16383 секунд или чуть более 4,5 часов. Если вам необходимо увеличить или уменьшить максимальное генерируемое число, следует изменить данную константу. Однако важно понять, что данное значение не должно превышать заданное время автоматического отключения лампы при отсутствии команд управления, заданное константой TIME_AP_OFF во всё том же заголовочном файле «main.h». Из-за малого объёма памяти программ у микроконтроллера пришлось пойти на данное ограничение. В устройстве [1] такого ограничения нет. Я время автоматического отключения равным 43200UL, что соответствует 43 200 секунд или 12 часам ровно. Символы UL обозначают, что данная константа типа unsigned long, т.е. целое длинное. Без добавления данного индекса к целым большим числам нет никакой гарантии, что компилятор интерпретирует данное число как 16-ти разрядное.

Итак, манипулируя двумя данными константами теперь каждый читатель этой статьи, желающий повторить диммер, сможет установить данные временные интервалы по своему усмотрению. Только не вздумайте установить время автоматического отключения равным нулю, а то и включить лампу то не получится ;-), не следует так же превышать значение 2^16 - 1 = 65535, а то числа более 65535 компилятор округлит до 2-х байт.

Теперь самое главное: о том, как же регулируется яркость лампы. Всё управления яркостью лампы основано на задержке отпирания симистора относительно момента перехода сетевым напряжением нулевого значения. Данное управление целиком реализовано внутри двух обработчиков прерывания: обработчик внешнего прерывания INT0 и обработчик прерывания по переполнению таймера-счётчика Т1.

При переходе сетевым напряжением нулевого значения с задержкой около 30 мкс. вызывается обработчик прерывания INT0:

// Обработчик прерывания от INT0 при переходе сетевого напряжения через 0
SIGNAL (SIG_INTERRUPT0)
{
	TCCR1B = 0;
	if(out_flag)
	{
		count1 = pgm_read_word(&lig[out1]);    
		TCNT1 = count1;//начальная яркость
		TCCR1B = 1;                                  //запуск таймера 1                                  
		i = 0;
	}
	skan_key();                             //опрос кнопки
}       

Вначале обработчик прерывания останавливает таймер Т1 микроконтроллера записью в регистр TCCR1B нуля. Затем производится проверка необходимости включения лампы. Если переменная out_flag не равна нулю в переменную count1 считывается из flash памяти микроконтроллера значение задержкиlig[out1] соответствующее текущему необходимому значению яркости лампы out1. Далее это значение заносится в счётный регистр TCNT1 таймера-счётчика Т1, после чего записью в регистр таймера TCCR1B значения 1 он запускается на счёт с коэффициентом целения частоты внутреннего генератора микроконтроллера равным 1, т.е. с частотой счёта 1 МГц. С момента выполнения данной команды счётчик Т1 начинает отсчёт первого интервала времени. Далее переменная i, содержащая номер вызова таймера Т1 обнуляется и независимо от состояния лампы вызывается программа опроса сенсора ручного управления skan_key();.

При достижении таймером-счётчиком Т1 максимального значения счёта он переполняется и генерирует прерывание. Программа обработки прерывания по переполнению счётчика Т1 определяет, путём наложения маски, равен ли последний бит переменной i, содержащей номер вызова таймера Т1 нулю. Если он окажется равен нулю (сброшен), то значит это чётный вызов программы обработки прерывания по переполнению счётчика Т1. Следовательно, симистор необходимо включить путём формирования низкого логического уровня на выводе 4 порта PORTD микроконтроллера, что и делается командой установки битаPORTD &=~(1<<4);. Но перед этим в счётный регистр TCNT1 таймера Т1 загружается константа triac_open, равная 65516. При указанном значении данной константы таймер счётчик переполнится в следующий раз через 50 мкс. В конце обработчика прерывания инкрементируется значение переменной i.

SIGNAL (SIG_OVERFLOW1) //управление моментом отпирания симистора и яркостью
{
	if((i & 1) == 0)
	{
		TCNT1 = triac_open;
		PORTD &=~(1<<4); //ВКЛЮЧИТЬ ТИРИСТОР              
	}                         
	else
	{
		TCNT1 = t10ms + triac_delay; //задержка 10 мс - 50 мкс.
		PORTD |= (1<<4); //ВЫКЛЮЧИТЬ ТИРИСТОР
	}
	i++;
	return;
}

При следующем переполнении таймера Т1 последний бит окажется равным единице, так как переменная i после инкремента при предыдущем вызове стала равной 1. Теперь условие if((i & 1) == 0) не выполниться и программа обработчика прерывания Т1 микроконтроллера пойдёт по дугой ветви. В этом случае в счётный регистр таймера TCNT1 вновь будет загружено новое значение, но оно будет соответствовать задержке в 10 мс. за вычетом значения задержки, соответствующего 50 мкс. импульсу отпирания симистора. После этого командой PORTD &=~(1<<4); будет установлен высокий логический уровень на управляющем выводе симистора.

Таким образом и формируется импульс низкого логического уровня и длительностью 50 мкс. для отпирания симистора с необходимой задержкой. Следующий отпирающий импульс будет сформирован аналогично через 10 мс. после начала первого и будет соответствовать следующему (отрицательному) полупериоду сетевого напряжения.

В дальнейшем вновь сработает внешнее прерывание INT0 микроконтроллера и цикл вновь повторится. Таймер Т1 не успеет отсчитать второй 10 мс. цикл. Программа-обработчик внешнего прерывания INT0 остановит его до окончания второй 10-ти мс. задержки и перезапустит таймер инициализировав его новым значением счёта, соответствующим текущей установленной яркости лампы или остановит его если лампа должна быть выключена.

Декодирование команд дистанционного управления довольно сложная и запутанная вещь. Первоначально в программе одноканального диммера предполагалось использовать помехозащищённый декодер 15-ти канальной версии диммера [1], однако не удалось разместить его в малом объёме flash-памяти микроконтроллера ATtiny2313. Поэтому был использован свободно распространяющийся в сети интернет декодер команд RC-5 автора Mark Haemmerling [4], несколько оптимизированный по размеру программы. Данный декодер команд ДУ системы RC-5, обладающий меньшей помехозащищённостью и худшей распознаваемостью кода, по сравнению со старшим собратом [1], занимает в микроконтроллере в полтора раза меньший объём памяти, что и позволяет его использовать.

Однако здесь необходимо учесть некоторый момент. Дело в том, что стандартная посылка формата RC-5 содержит два стартовых бита, бит повтора, изменяющийся при каждом новом нажатии на кнопку ПДУ, пять бит адреса устройства и шесть бит кода команды. Код ПДУ после окончания декодирования помещается в глобальную двухбайтную переменную rc5_code, причём младший байт содержит 6 бит команды и два незадействованных байта, а старший всё остальное вышеперечисленное. Для отделения кода команды и адреса от «лишних» информационных бит используется наложение на принятую последовательность маски:

rc5_code & 0b1111100111111

Вот мы и рассмотрели основные моменты работы программы и схемы диммера. Надеюсь, с помощью моей статьи читатели смогут не только повторить, но и модернизировать устройство. Вопросы и дополнения можно присылать на e-mail: servissistemy <собачка> narod.ru. Читателей, которые повторят устройство и захотят поделиться, к примеру, рисунком печатной платы, прошу писать туда же.

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

Список использованных источников: 
1. Умный Дом своими руками часть II  или 15-ти канальный управляемый диммер
2. ГОСТ 2239-79. Лaмпы нaкaливaния oбщегo нaзнaчения. Tеxничеcкие уcлoвия
3. lutron.com - "The Eye’s Response to Light"

Скачать прошивку микроконтроллера в формате hex и исходные коды (97 Кб). Загрузок: 404
Архив с декодером RC-5 (3 Кб). Загрузок: 312

Автор статьи: Филипович Алексей Игоревич E-mail: servissistemy@narod.ru

Просмотров: 5792

Splan 7.0.0.9 Rus + Portable + Viewer Fiinal
26.04.2014
sPlan – удобный инструмент для черчения электронных схем. Имеет простой и интуитивно понятный интерфейс. В программе заложены... подробнее...

Очень удобная программа для чтения pdf Foxit Reader
26.04.2014
Foxit Reader - Компактная и шустрая программа для чтения PDF файлов. Может служить альтернативой для популярного просмотрщика PDF - Adobe Reader.... подробнее...

Proteus 7.7 SP2 + Crack v1.0.2 + RUS
22.04.2014
Proteus VSM - программа-симулятор микроконтроллерных устройств. Поддерживает МК: PIC, 8051, AVR, HC11, ARM7/LPC2000 и другие распространенные процессоры.... подробнее...

Новое становление сайта Eldigi.ru
01.04.2014
Проект Eldigi.ru который долгое время находился в застывшем состоянии снова принимается за работу с новымы силами, с новыми статьями и с... подробнее...

Proteus 7.7 SP2 + Crack v1.0.2 + RUS
22.04.2014
Proteus VSM - программа-симулятор микроконтроллерных устройств. Поддерживает МК: PIC, 8051, AVR, HC11, ARM7/LPC2000 и другие распространенные процессоры.... подробнее...

Splan 7.0.0.9 Rus + Portable + Viewer Fiinal
26.04.2014
sPlan – удобный инструмент для черчения электронных схем. Имеет простой и интуитивно понятный интерфейс. В программе заложены... подробнее...

Цифровая паяльная станция своими руками (ATmega8, C)
27.05.2012
Состав: ATmega8, LM358, IRFZ44, 7805, мост, 13 резисторов, один потенциометр, 2 электролита, 4 конденсатора, трехразрядный светодиодный семисегментный... подробнее...

Тахометр на AVR микроконтроллере (ATtiny2313, C)
13.01.2010
Данное устройство представляет собой неплохой тахометр, предел его измерений составляет 100 - 9990 об/мин. Точность измерения - ± 3 об/мин.... подробнее...

Релейный регулятор громкости по схеме Никитина с LCD, ПДУ (RC5) и кнопками (ATmega8, C)
16.02.2011
Как следует из названия, в данной статье представляется устройство для регулирования громкости, собранное по схеме Никитина. В этой... подробнее...

Кабельный пробник на микроконтроллере (PIC16F84A, asm)
28.08.2010
Устройство состоит из двух частей: передающей и приемной. Жилы кабеля с одной стороны подключают к контактам Х1—Х8 передатчика, с другой... подробнее...

Цифровая паяльная станция своими руками (v1.0) (ATmega8, C)
09.08.2008
Начать нужно с того, что однажды я озадачился приобретением паяльной станции, ибо "вечные" жала портятся от перегрева, а мой... подробнее...

Часы на ATmega8 (ATmega8, C)
21.06.2008
Два датчика температуры DS18B20 (дома и на улице). 5 будильников. Отсрочка сигнала, если будильник не отключить, срабатывает примерно... подробнее...