Несмотря на кажущееся сходство битов 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.
Для повышения скорости выполнения подпрограммы и сокращения количества кода содержимое регистра SREG не сохраняется, хотя подпрограмма изменяет состояние некоторых его флагов.
2.6 Выбор, описание и расчеты элементной базы
Устройство предназначено для управления стандартными лампами накаливания. Подключение другой нагрузки, например энергосберегающей лампы или электродвигателя, может вывести устройство и (или) нагрузку из строя.
Полный перечень использованных компонентов (спецификация) прилагается (Приложение В). Также прилагаются описания активных компонентов, задействованных в схеме (Приложение Г).
а) Диодный мост
Применение диодного моста VD2, рассчитанного на ток 6 А, для работы с небольшим током нагрузки (максимум 0,55 А) объясняется тем, что лампы иногда перегорают во время работы. Возникающий при этом импульс тока амплитудой более 10...20 А способен повредить одноамперные мосты, такие как КЦ402 или КЦ405.
Ещё одна причина большого запаса по току – это гораздо меньшая степень нагрева моста. Впрочем, полностью устранять нагрев не имеет смысла, т.к. корпус устройства всё равно немного нагревается от ламп, особенно когда они включены на максимальную яркость.
По причине, указанной в разделе Защита от превышения сетевого напряжения, диодный мост должен быть рассчитан на обратное напряжение не менее 600 В.
б) Блок питания
Источник опорного напряжения
Особенностью схемы является использование для питания МК не обычного стабилитрона, а интегрального источника опорного напряжения DA1 параллельного типа. Как уже отмечалось, это позволяет отказаться от отдельного ИОН и снизить потребляемый ток. Помимо этого, если напряжение на выходе параллельного ИОН повысится по каким-либо причинам, возникшим со стороны шины питания схемы, это не приведёт к нарушению стабилизации, а лишь увеличит ток через ИОН. Это общая особенность параллельных стабилизаторов напряжения [3].
Нерегулируемый двухвыводной ИОН выбран специально – нет необходимости подбирать и устанавливать два дополнительных высокоточных резистора. Для стабильной работы данного ИОН не требуется конденсатор с низким эквивалентным последовательным сопротивлением (ESR), что тоже является плюсом.
Выбираем ИОН серии LM4040 с классом точности 1%.
в) Балластный резистор
Для гашения избытка сетевого напряжения, поступающего на вход ИОН, используется балластное сопротивление, образованное резисторами R1 и R2. Принцип действия ИОН параллельного типа совпадает с обычным стабилитроном, поэтому для расчёта гасящего резистора можно применить классическую формулу:
R = (Uвх – Uст) / (Iн + Iст), (2.1)
где Uвх – входное (ограничиваемое) напряжение, снимаемое с выхода диодного моста;
Uст – напряжение стабилизации стабилитрона;
Iн – ток нагрузки;
Iст – ток стабилитрона.
Изменим формулу с учётом падения напряжения на двух диодах диодного моста:
R = (Uвх – 2•Uд – Uст) / (Iн + Iст). (2.2)
Падение напряжения на предохранителе не учитываем, т.к. оно составляет всего 0,2 В при максимальной нагрузке. Добавив коэффициент, учитывающий разброс сопротивления резистора, получаем конечную формулу:
R = [(Uвх – 2•Uд – Uст) / (Iн + Iст)] • Кr (2.3)
Сопротивление резистора должно быть, с одной стороны, достаточно низким, чтобы обеспечить минимальный ток стабилитрона при максимальном токе нагрузки и минимальном напряжении сети, но, с другой стороны, достаточно высоким, чтобы при максимальном напряжении сети и минимальном токе нагрузки не превысить максимально допустимый ток стабилитрона.
Начнём с выяснения максимального сопротивления резистора, обеспечивающего минимальный ток стабилитрона при наихудших условиях.
Минимальное среднее значение выпрямленного напряжения Uвх при 10%-ном допуске на напряжение сети [4] составит 198 В. Но здесь следует также учесть снижение напряжения под воздействием мощной нагрузки. В расчёте максимальной яркости лампы указано снижение на 4 В. Значит
Uвх = 198 – 4 = 194 (В).
Наибольшее падение напряжения на диодном мосту Uд будет при максимальной нагрузке. Согласно графику из описания моста, при токе нагрузки 0,55 А, когда обе лампы включены на максимальную яркость, прямое напряжение для одного диода составляет около 0,73 В.
Отклонение стабилизированного напряжения равно 1% (по описанию LM4040, класс точности D). Значит
Uст = 5 + 0,05 = 5,05 (В).
Минимальный ток, требуемый для работы стабилитрона, в соответствии с его описанием, составляет Iст = 0,1 мА.
Поскольку в схеме используются два резистора, каждый из которых имеет допуск 5%, принимаем Кr = 0,9. Старение резисторов (увеличение сопротивления со временем) не учитывается, т.к. они не будут подвергаться ни максимально допустимому напряжению, ни высокой температуре.
Потребляемый ток почти не зависит от того, включены ли каналы, в каком количестве и на какой яркости.
В силу малых величин обратные токи защитного диода, диодного моста, транзисторов, а также токи утечки конденсаторов не учитываются.
В значительной степени на ток потребления влияет нажатие кнопок. В этом случае ток протекает от плюса источника питания через внутренний (pull-up) резистор МК и замкнутую кнопку на землю. Указанное в описании МК минимальное сопротивление внутреннего резистора составляет 20 кОм. Если нажаты обе кнопки, ток составит I=2 • (5 / 20000) = 0,5 (мА).