скачать рефераты

скачать рефераты

 
 
скачать рефераты скачать рефераты

Меню

Разработка устройства автоматического регулирования света на микроконтроллере скачать рефераты

p align="left">Принимая во внимание ограниченное количество циклов перезаписи 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 Вт с сопротивлением нити 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.

Для повышения скорости выполнения подпрограммы и сокращения количества кода содержимое регистра 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). Значит

Страницы: 1, 2, 3