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

Автор: Tonich от 17-11-2011, 19:50

Кто из вас не хотел изготовить себе сенсорный диммер с возможностью дистанционного управления светом? Наверное, многие. Так вот и я однажды захотел изготовить себе этот несложный с точки зрения схемотехники девайс. Нашёл в сети интернет более десятка различных схем и решил выбрать для повторения те из них, прошивки которых находились бы в свободном доступе и обладали бы требуемыми мне функциональными возможностями. Но таковых не оказалось вовсе: Более чем из десятка всевозможных схем и программного обеспечения различных авторов те из них, что заслуживали бы повторения, оказались с платными прошивками. Тогда же я, в свою очередь, попытался узнать у авторов цену. Два из них на письма не ответили даже в течение полугода, а два других назвали следующие цены: первый - 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.

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


Из рисунка 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).


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


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

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

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

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



Данные значения задержек заносятся в программе обработки внешнего прерывания 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();
//ждать приёма команды от пульта

eeprom_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

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

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



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

Прошивка и исходный код

Список использованных источников:


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

Лучший каталог сайтов

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

  • 13 декабря 2011 20:10
  • Группа: Посетители
  • ICQ:
  • Регистрация: 13.12.2011
  • Статус:
  • Комментариев: 2
  • Публикаций: 0
^
Почему на схеме земля контроллера висит в воздухе?
  • antfom

  • 13 декабря 2011 20:12
  • Группа: Посетители
  • ICQ:
  • Регистрация: 13.12.2011
  • Статус:
  • Комментариев: 2
  • Публикаций: 0
^
Можно ли использовать at90s2313 без изменения прошивки?
  • Tonich

  • 13 декабря 2011 23:32
  • Группа: Администраторы
  • ICQ:
  • Регистрация: 18.10.2012
  • Статус: Пользователь offline
  • Комментариев: 160
  • Публикаций: 320
^
Спасибо за заметку, схема исправлена, по поводу замены попробую связаться с автором
  • Группа: Администраторы
  • ICQ:
  • Регистрация: 18.10.2012
  • Статус: Пользователь offline
  • Комментариев: 60
  • Публикаций: 26358
^
Ответ автора:"Не знаю. Попробуйте. Я с такими старыми не работал. Отпишитесь, пожалуйста как попробуете. Если не заработает - перекомпилирую вам под AT90..."

--------------------
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.