Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
Карта сайта | Пишите нам | В избранное | eng     

Внимание! У нас изменились номера телефонов. Звоните:
(495) 638-88-00, (499) 940-95-75, факс (499) 735-04-91;
+7(909) 638-88-00 и +7(903) 530-10-01 (Билайн).
       о фирме        электроника     обратная связь

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

Часть 2., Часть 1.

    4. ПРОГРАММНАЯ ЧАСТЬ

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

    Код программы написан на языке ассемблера, содержит более 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 • p • 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 года производителя регуляторов освещения. По горизонтальной оси графика отложены значения яркости, воспринимаемые человеческим глазом, а по вертикальной – её реальные значения, измеренные прибором. Будем считать, что значения по вертикальной оси соответствуют напряжению на лампе. Экспериментальная проверка подтвердила, что это правомерно.
    Используя указанные на графике соотношения, требуется составить таблицу яркости 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\row 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ацп•К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).



    Соединения элементов выполнены навесным монтажом, с помощью термостойкого провода марки МГТФ, а также путём наплавления припоя между соседними дорожками.
    Для исключения короткого замыкания, между платой и корпусом проложен термоустойчивый диэлектрический материал. Автор использовал для этой цели кондитерскую бумагу для запекания.
    Провода сетевого шнура заведены в клеммник, но перед этим они проходят сквозь отверстия в плате. Такая мера повышает защиту сетевого шнура от обрыва.
    Для удобства монтажа применяются компоненты в выводном исполнении. Единственное исключение – 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
    --- Программатор – самодельный, с гальванической развязкой сигнальных цепей и шины питания. За основу был взят программатор из http://algrom.net/pgm.pdf.

    8.6. Сведения об авторе и условия распространения
    Автор проекта: Михаил Юрьевич Милославский, г.Москва,
    Полная и обновляемая версия проекта размещена по адресу mmiloslavsky.narod.ru
    Проект распространяется свободно для применения в некоммерческих целях. Исходный код может быть модифицирован без ограничений. При использовании материалов проекта ссылка на оригинал обязательна. Коммерческое использование допускается только после письменного согласования с автором.

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

    9. СПИСОК ЛИТЕРАТУРЫ

    Кликнув левой либо правой кнопкой мыши на заголовок статьи, можно скачать или открыть в новом окне её сохранённую копию. Это сделано на тот случай если по прошествии времени ссылка на оригинал окажется неработоспособной. Формат сохранённого файла и его размер сообщаются всплывающей подсказкой, которая появляется при наведении курсора мыши на заголовок статьи. Формат .mht открывается программой Internet Explorer.
    1. "Dimmable Fluorescent Ballast" – User Guide, 10/07, Atmel Corporation, http://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, http://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 http://www.edn.com/contents/images/6426883.pdf
    8. C. Hillman "Common mistakes in electronic design" // EDN, 12/14/2007 http://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, http://www.irf.com/technical-info/appnotes/an-936.pdf
    11. "TVS/Zener Theory and Design Considerations" – Handbook, Rev. 0, Jun2005, On Semiconductor, http://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, http://www.atmel.com/dyn/resources/prod_documents/doc2559.pdf
    13. "The Eye’s Response to Light" – Lutron Electronics, 8/97, http://www.lutron.com/product_technical/pdf/360-408.pdf
    14. Д. А. Гурский, Е. С. Турбина "Вычисления в Mathcad 12" – СПб.: Питер, 2006, http://www.piter.com/books/download/978546900639
    15. "Four Great Reasons to Dim" – Lutron Electronics, http://www.lutron.com/dim.htm
    16. "Frequently asked questions about dimmers" // http://www.lutron.com/product_technical/faq.asp
    17. "LEDs move from indication to illumination" // EDN, 8/2/2001 http://www.edn.com/contents/images/149134.pdf
    18. Л. Н. Кечиев, Е. Д. Пожидаев "Защита электронных средств от воздействия статического электричества" – М.: ИД "Технологии", 2005.
    Ссылки по теме:
    Lights and electronics – http://www.epanorama.net/links/lights.html
    Light dimmer circuits – http://www.epanorama.net/documents/lights/lightdimmer.html
    The Great Internet Light Bulb Book, Part I – http://members.misty.com/don/bulb1.html
    Lamp Experimental Data – http://alumni.imsa.edu/~ejohnson/light/

    10. ФАЙЛЫ ДЛЯ СКАЧИВАНИЯ

    Принципиальная схема (формат sPlan 5.0, размер менее 50 КБ; формат GIF 300dpi, размер менее 50 КБ).
    Спецификация (формат MS Excel 2002, размер менее 30 КБ).
    Исходные коды программы, прошивка МК, конфигурация среды VMLab (формат Zip, размер менее 100 КБ).
    Расчет балластного резистора, делителя напряжения, потребляемой мощности (формат MS Excel 2002, размер менее 30 КБ).
    Таблица значений псевдослучайной последовательности (формат MS Excel 2002, размер менее 30 КБ).
    Вычисление табличных значений яркости (формат Mathcad 13, размер менее 70 КБ).
    Конвертер таблицы яркости из формата Mathcad в формат МК (формат MS Excel 2002, размер менее 70 КБ).

    Описания активных компонентов:
    Защитный диод 1.5KE400CA (формат PDF, размер 205 КБ)
    Диодный мост KBPC610 (формат PDF, размер 409 КБ)
    Источник опорного напряжения LM4040 (формат PDF, размер 584 КБ)
    Микроконтроллер ATmega16 (формат ZIP, размер 3800 КБ, Revision 2466P-08/07)
    Транзистор 2SK2545 (формат PDF, размер 714 КБ)

     Разместите Ваш проект у нас на сайте и его смогут увидеть сотни посетителей в день. Ваши проекты присылайте вебмастеру.
Правила оформления проектов
  1. Необходимо наличие схемы, описания устройства и т.д. (для отдельных проектов - драйвера, программное обеспечение и их описание)
  2. Схемы и другие картинки должны быть в форматах .jpg или.gif. К ним обязательно должны идти подписи, поясняющие, что на данной схеме (картинке) изображено.
  3. Описание устройства - в форматах .doc, .txt или .html.
  4. Проект не должен нарушать чьих-либо авторских прав.
Ваши проекты присылайте вебмастеру
Приглашаем специалистов
В России кризис и увольнения персонала, а в Телесистемах, как обычно, не так как у всех: мы расширяем деятельность, набираем новых сотрудников и ищем новых партнеров.
Изделия для разработчиков
Программатор «PICPROG» «PICPROG» - универсальный промышленный программатор.
Копировщик PIC16x8x Копировщик PIC16x8x - тиражирование в автономном режиме.
Наши телефоны: (495) 638-88-00, (499) 940-95-75, факс (499) 735-04-91, мобильные: (903) 530-10-01 и (909) 638-88-00 (БиЛайн).
E-mail:

Copyright © ООО "Телесистемы", 1997 — 2024    Копируйте на здоровье! За ссылку на www.telesys.ru мы вам будем очень признательны.

Rambler's Top100