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

в 20:24, , рубрики: attiny13, avr, diy или сделай сам, diy умный дом, микроконтроллеры, программирование микроконтроллеров, умный дом, Электроника для начинающих, Энергия и элементы питания, энергонезависимый дом

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

Датчик положения выключателя для аварийного освещения - 1

Одно из решений под катом.

Предыстория

В современном мире очень много вещей стало завязано на беспрерывное энергоснабжение. Большинство видов интеллектуальной деятельности уже немыслимо без компьютера и коммуникаций, работающих в режиме 24/7. Это не хорошо и не плохо, это есть, и нужно с этим жить. Особенно, если твое рабочее место не в современном офисе, нафаршированном UPS и резервными дизель-генераторами, а в квартире обычной жилой многоэтажки. И так уж повелось, что надежность энергообеспечения жилого фонда в большинстве городов бывшего СССР оставляет желать много лучшего. В результате ниточка, связывающая домашнюю розетку и ближайшую электростанцию, имеет скверную привычку периодически рваться. Когда раз в полгода, а когда и три раза за сутки.

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

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

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

Вторая проблема – шум. Да, современные инверторные четырехтактные генераторы, когда их слышишь на улице, могут показаться очень тихими. А если навесить дополнительный глушитель, то и совсем бесшумными. Но поверьте, в обесточенном, а значит, совершенно притихшем многоквартирном доме, даже такое тихое тарахтение будет прекрасно слышно всем соседям.

Короче, идея с генератором умерла, так толком и не родившись. Из остальных реальных вариантов остались лишь аккумуляторы.

Далее позволю себе простое повествование о своих душевных мытарствах и принятых решениях от первого лица без всякой претензии на вселенскую истинность. И сразу предупреждаю, что доводы мои кому-то могут показаться неубедительными, а принятые решения – спорными. Но, тем не менее, все тут описанное на данный момент реализовано в железе и успешно выполняет поставленные задачи.

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

Кратко о выборе типа аккумуляторов

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

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

В моем случае ни о какой мини-электростанции речи идти не может в силу объективных причин, и интересен был лишь резервный источник, возобновляемый из обычной розетки во время «просветления». Поэтому всю электронную начинку квартирного UPS было решено колхозить самостоятельно. А раз руки мои оказались полностью развязанными, то первое, что нужно было решить – это какой же тип аккумуляторов использовать.

Поначалу я подумал так: «А почему бы и не литий? Стильно, модно, молодежно. Герметично, энергоэффективно, долговечно». Но когда посмотрел на цены, то мой литиевый пыл заметно поутих. Беглый поиск в сочетании со школьной арифметикой показали, что даже весьма «стремные» китайские банки 26650 на (конечно же) самые честные 5000 mAH обойдутся впятеро дороже кислотного аккумулятора той же энергоемкости. А если выбирать что-то не из самого дна отсортированного по цене прайса, то разница легко достигает 8-10 раз.

И каким же образом можно окупить настолько большую разницу стоимости?

Да, литий эффективнее хранит энергию на каждый килограмм и кубометр, и батарея размером с блок сигарет легко уделает десятикилограммовый свинцово-кислотный аккумулятор. Но так ли важен этот факт для стационарного применения?

Безусловно, хороший «литий», да при правильном подходе прослужит дольше. Но в десять ли раз?

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

Короче, по сумме факторов решил отложить идею с литием до следующей итерации. Может быть, через несколько лет что-то изменится, а пока свинец – это наше все.

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

Что касается свинцовых аккумуляторов, то тут тоже имеются несколько вариантов. «Правильный» вариант – специализированные батареи резервного питания, которые применяются в UPS, на базовых станциях сотовой связи, и других подобных местах, где от них требуется способность брать и отдавать большие токи, эпизодически переживать сильный разряд, да и вообще работать, не отвлекая людей на обслуживание.

Еще один «правильный» вариант – тяговые батареи для электро-автопогрузчиков или, чем черт не шутит, дизельной подводной лодки. Эти аккумуляторы обладают высокой долговечностью и хорошей толерантностью к глубокому разряду, при этом не отнимают у хозяина возможности «долить водички».

Ну и «неправильный» вариант – стартерная АКБ из ближайшего автомагазина. Такой аккумулятор может кратковременно выдать на гора до киловатта мощности, но любой разряд для него стресс, как работа для лентяя. А за современными кальциевыми аккумуляторами вообще закрепилась слава одноразовых батареек: «разрядил – меняй».

Ну что же, я надеюсь, никто не сомневается в том, какой вариант был в итоге мною выбран для реализации? Правильно, третий. И причины тут кроются не только в известной бородавчатой амфибии, но и простом прагматическом расчете. Стартерные батареи в разы дешевле всех остальных вариантов, порой приближающихся по стоимости к литию. И вместо того, чтобы трястись над дорогим аккумулятором, гораздо свободнее себя чувствуешь в ситуации здорового пофигизма, когда замена оборачивается убытками в размере похода за продуктами на пару недель. Тем более, если не давать этим аккумуляторам разряжаться до потери пульса, то срок их службы в роли резервных исчисляется многими годами. Всегда ведь можно поставить аккумулятор большей емкости, установить ограничение разряда помягче, и все равно получить более выгодное соотношение цена/емкость, чем у «правильной» батареи, терпящей глубокий разряд.

Главное в этом деле – обеспечить в месте установки аккумуляторов вентиляцию хотя бы на уровне «дырка в стене». Ну и организовать банальную защиту от короткого замыкания, потому что низковольтность источника тока притупляет бдительность и все может закончиться очень хреново.

Война токов в отдельно взятой квартире

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

Напомню, изначально мне хотелось обзавестись генератором переменного тока на 230 В. Однако, после смирения с объективной реальностью и мысленного перехода на аккумуляторы, инерция мышления уже понесла меня на известный китайский интернет-маркет с целью выбора подходящего преобразователя постоянного тока в переменный. И вот в процессе изучения характеристик сначала всплыл забытый было термин «модифицированная синусоида», а затем здравый смысл начал подбрасывать неудобные вопросы.

Суть вопросов сводилась к следующему. Покрыть все энергетические потребности квартиры небольшой батареей все равно не выйдет. Бойлеры, микроволновка, стиральная машина, мощный десктопный компьютер все равно окажутся неподъемными по мощности. А холодильник, вытяжка, и даже банальный вентилятор не смогут нормально работать из-за этой самой модифицированной синусоиды. Конечно, есть инверторы и с истинной синусоидой, но они не только более дорогие, но и менее эффективные. Да и вопрос мощных потребителей все равно не решается.

Какие же потребители остаются в рамках бюджета? Их не так много на самом деле: бытовая электроника типа ноутбуков и телефонов/планшетов, роутер, ARM-сервер, по настроению – телевизор, ну, и, конечно, освещение. Тем более, что исходный посыл статьи (да и моя личная мотивация) заключается именно в обеспечении функционирования резервного рабочего места в виде ноутбука и минимальном бытовом комфорте, типа света в туалете.

Почти все эти приборы требуют для своей работы постоянное напряжение от 5 до 21 В и объективно нет никакой надобности сначала повышать напряжение аккумулятора до 230 В переменного тока, чтобы потом понизить и выпрямить его снова до плюс-минус исходного уровня. На этих преобразованиях легко потерять до 50% энергии, что мне совершенно не улыбалось.

Короче говоря, вот так плавно пришла мысль использовать в качестве альтернативной именно низковольтную сеть постоянного тока. А после примерного подсчета потерь в проводах, первоначальные 12 (13.8) В превратились в более практичные 24 (27.6) В.

Сначала хотелось взять даже 36 (41.4) В, но после изучения характеристик некоторых электронных компонентов, которые я планировал применять для работы со всем этим хозяйством, аппетит пришлось поумерить.

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

Кстати, при последовательном соединении крайне важна максимальная идентичность аккумуляторов. Поэтому так включать можно только аккумуляторы с полностью одинаковой маркировкой (желательно из одной партии) и только новые. При нарушении этих условий довольно скоро произойдет разбалансировка элементов и сильное нарушение их электрических режимов работы, вплоть до переполюсовки в процессе разряда.

Для включения потребителей в комнатах, в каждый «большой» блок розеток была добавлена еще одна. А чтобы никто не спутал обычную розетку с резервной, в качестве последних были установлены изделия «американского» типа с плоскими контактами разной ширины. Это, во-первых, не позволит включить пылесос в сеть постоянного тока, а, во-вторых, такая розетка, в отличие от европейской, при использовании «правильной» вилки сохраняет всегда одинаковую полярность включения.

Датчик положения выключателя для аварийного освещения - 2

Для этих розеток были изготовлены адаптеры ноутбуков, понижающие напряжение до нужных 18-20 В и оснащенные соответствующими разъемами. Понятно, был сделан пяток обычных пятивольтовых USB-зарядок для всякой мелочи. Ну и закуплена на всякий случай пара небольших преобразователей 24/230 В, мощностью 50 и 200 Вт.

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

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

Освещение

Итак, при разводке проводов по квартире параллельно с основной проводкой были протянуты провода альтернативной сети постоянного тока напряжением 24 (27.6) В. Среди прочего, петля, состоящая из пары таких проводов, была заведена в каждую коробку выключателя и затем вместе с проводами сети 230 В подведена к потолочным светильникам (если в комнате их было несколько, то альтернативный провод подводился только к одному).

Что делать с выходом сети постоянного тока в области светильника – дело индивидуального подхода. В качестве источника света была выбрана обычная 24-вольтовая светодиодная лента. Ее отрезки разной длины (пропорционально площади комнаты) в зависимости от конструкции светильников были либо вмонтированы непосредственно в их корпуса, либо приклеены на те поверхности, с которых и светить будет хорошо, и откуда в глаза не сильно бросается.

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

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

В конечном итоге передо мной стала задача создать некое устройство, способное отделить друг от друга три состояния:

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

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

  1. Управление как основным, так и аварийным освещением должно осуществляться полностью прозрачно с одного органа управления, никакого «колхоза» из дополнительных кнопок.
  2. При прекращении, или наоборот, возобновлении подачи энергии, аварийное освещение должно наследовать текущее состояние основного освещения.
  3. Напряжение в сети постоянного тока присутствует всегда, а не только при аварии сети переменного тока.
  4. От обычной сети в большинстве коробок – только петля фазного провода, нуля нет.
  5. Какая-либо гальваническая связь между основной и аварийной сетями недопустима.
  6. Выключатели в разных комнатах разных моделей и конструкций (подбирались под дизайн самих комнат), есть сдвоенные.
  7. В коробках под выключателями полно свободного места.

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

Датчик

Но тем не менее альтернатива измерению напряжения сети существует. Мне не обязательно определять именно наличие напряжения, достаточно определить наличие тока в фазном проводе при замкнутых контактах выключателя. Ведь если есть ток, значит, есть и напряжение. Более того, «считывание» именно тока позволяет задействовать аварийное освещение не только при отказе энергоснабжения, но и при банальном перегорании лампочки. Этот метод не позволяет определить состояние сети переменного тока при выключенном выключателе, но меня это состояние и не волнует, т.к. раз выключатель выключен, то аварийное освещение тоже работать не должно.

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

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

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

Вторым «входным параметром» моего будущего устройства должно быть положение контактов выключателя.

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

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

Остальные варианты предполагали внедрение микропереключателя или геркона с магнитом в механизм выключателя. Но после изучения конструкций примененных выключателей эти варианты тоже отпали. Монолитное керамическое основание хорошего выключателя просто не оставляет шансов даже компактному микропереключателю, а магнит и геркон не сработали из-за слишком малого хода клавиши и гистерезиса в кривой срабатывания/отпускания геркона.

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

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

Выше я описал трансформатор тока, который позволяет определить наличие переменного тока в проводе без разрыва и гальванического контакта. А ведь любой трансформатор – устройство двунаправленного действия (в отличие от того же датчика Холла), его первичная и вторичные обмотки взаимозаменяемы.

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

И вот тут уже становится интереснее. Через кольцо продет провод, который тут же, в нескольких сантиметрах, подключен к одному из контактов выключателя. Остается только обеспечить этому току обратный путь с другой стороны выключателя, чтобы получить прибор для «зондирования» положения контактов. А по той причине, что ток этот переменный, мостом для него может стать обычный конденсатор.

Датчик положения выключателя для аварийного освещения - 3

В принципе, для замыкания этой цепи в определенных условиях конденсатор не нужен. Если «вкачать» в трансформатор ток достаточно высокой частоты, то паразитной емкости между проводами будет достаточно для прохождения.

Датчик положения выключателя для аварийного освещения - 4

Итак, что нужно для организации подобного детектора:

  1. Трансформатор тока.
  2. Измеритель напряжения на выходе трансформатора.
  3. Источник высокочастотного переменного тока.
  4. Измеритель тока, текущего по обмотке реверсивно включенного трансформатора.

Самая сложная в плане подбора оптимальных параметров – это трансформатор, который в режиме трансформатора тока должен давать приемлемое напряжение с частотой 50 Гц, а в режиме активного «зондирования» состояния выключателя иметь приемлемый коэффициент передачи на частоте в сотни КГц. Этот элемент не представляется возможным симулировать в программе моделирования электронных схем, да и с математическим расчетом все оказалось очень непросто. Пришлось брать паяльник в руки и часами «гонять» разные варианты в поисках наилучшего.

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

  • Магнитопровод из феррита с проницаемостью 10000, размером 10x6x4 мм.
  • Обмотка 30 витков эмалированным проводом 0.25 мм.
  • Активная нагрузка обмотки – 1 кОм.

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

Множественные эксперименты подтвердили реальность идеи и были получены такие результаты:

  • В режиме трансформатора тока коэффициент передачи получился около одного милливольта на Ватт протекающей мощности (напряжение 220-230 В).
  • В режиме зонда, в зависимости от частоты и емкости утечки, разница тока при замкнутых и разомкнутых контактах выключателя достигала двух-трех раз.

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

В железе

В отличие от большинства других своих конструкций, тут уже на ранних этапах обдумывания, было принято решение сразу использовать микроконтроллер. Исходя из потребностей и опыта, выбор пал на ATtiny13A. В этом кристалле есть АЦП, причем с возможностью использовать внутренний опорный источник 1.1 В вместо питающего напряжения. Есть ШИМ, который отлично подходит для генерации сигнала зондирования. И, что, как оказалось впоследствии, немаловажным, есть EEPROM, позволяющая хранить калибровочные данные.

Обычно, при обдумывании подобных простых устройств я действую по принципу «приложи все силы, чтобы сделать устройство на непрограммируемой элементной базе, и только если не удается обойтись одним-двумя «активными» корпусами, бери контроллер».

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

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

Напряжение от трансформатора тока при нагрузке 10-20 Вт равно 10-20 мВ и оно слишком мало, чтобы подавать его на вход ЦАП с пределом даже 1.1 В. Поэтому кроме контроллера нужен еще и усилитель с коэффициентом передачи около 100, чтобы увеличить напряжение сигнала минимум до сотен милливольт.

Вообще, напряжение выходного сигнала трансформатора тока зависит не только от мощности нагрузки, но и от ее характера. Чисто активная нагрузка типа лампочки Ильича, например, дает синусоиду милливольтного уровня. А светодиодная лампочка той же мощности с простым импульсным питанием дает короткие всплески до вольта и выше. На этом можно было бы сыграть, но, во-первых, хотелось сделать универсальное устройство, а во-вторых, в квартире оказался один светильник с внешним блоком питания, оснащенным цепью PFC (то есть имеющим близкую к активной характеристику потребления).

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

Датчик положения выключателя для аварийного освещения - 5

Тут напряжение сети постоянного тока через экономичный линейный стабилизатор LM2931-5.0 питает контроллер. Этот стабилизатор по корпусу, функционалу, и цоколевке аналогичен популярному 78L05, но отличается от него более низким собственным потреблением (около 500 мкА при нагрузке в 10 мА) и большей толерантностью к коротким всплескам входного напряжения. Если предполагается работа при напряжении не больше 20 В, можно использовать еще более экономичный аналог LP2950-5.0.

Согласно даташиту микросхема LP2950-5.0 тоже может использоваться при входном напряжении до 30 В. Но на практике уже при 24 В это превращается в русскую рулетку. Первое же выключение мало-мальски заметной нагрузки в одной из комнат, создало в проводке индукционный выброс, выбивший мне оба установленных на тестирования датчика, причем погорели не только стабилизаторы, но и контроллеры. Поэтому запас по входному напряжению должен быть не менее 50%, а лучше 100%.

Трансформатор на схеме не показан, но его обмотка подключается к пинам TR1 и TR2.

В качестве ключевого элемента для коммутации нагрузки использован слаботочный P-канальный MOS-транзистор 2SJ196 (ток до 1 А должен быть достаточным для любого светодиодного светильника), но может быть использован любой другой, подходящий по цоколевке, максимальному току и предельному напряжению стока.

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

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

Еще на АЦП подается не сам усиленный сигнал с трансформатора, а его огибающая, которую можно измерить одиночной выборкой, а не «потоковым» оцифровыванием на протяжении некоторого времени. Для выделения огибающей использованы два диода Шоттки, включенных по схеме удвоения напряжения. Такое включение образует классический амплитудный детектор, у которого в значительной мере скомпенсировано падение напряжения на самих диодах.

Принцип действия датчика прост. Сперва рассмотрим алгоритм действий, необходимых для измерения тока в проводе.

В режиме измерения тока пин PB0 переводится в режим выхода и заземляется подачей логического нуля. Это исключает подачу в точку TR1 каких-либо сигналов из контроллера. Параллельно те же действия выполняются над пином PB3, в результате чего верхний по схеме вывод конденсатора C2 оказывается заземлен. Этот конденсатор совместно с резистором R1 создает ФНЧ с частотой среза около 1500 Гц. Благодаря этому фильтру сильно уменьшается роль различных высокочастотных помех в формировании измеряемого сигнала.

Затем подается высокий уровень на PB4 для запитки усилителя сигнала. После завершения переходных процессов ток частотой 50 Гц с выхода трансформатора усиливается и попадает на выпрямитель, где заряжает конденсатор C8.

Заряд конденсатора C8 измеряется при помощи ADC1 и из полученного значения напряжения делается вывод о протекающем через трансформатор «первичном» токе.

Активное зондирование выполняется по-другому. Первым делом пин PB0 переводится в решим ШИМ, и на него подается сигнал с частотой от сотен килогерц до единиц мегагерц. Этот сигнал несколько ослабляется резистивным делителем и подается на обмотку трансформатора тока в точке TR1. Конденсатор C1 совместно с одним верхним плечом делителя R4 создают ФНЧ с частотой среза около 1.5 МГц, который уменьшает уровень высокочастотных гармоник от прямоугольных импульсов.

Пройдя через обмотку трансформатора зондирующий сигнал из точки TR2 попадает на все тот же усилитель и детектор, точно так же в итоге заряжая конденсатор C8 до напряжения, пропорционального нагрузке во «внешней» цепи трансформатора. Точно так же заряд конденсатора измеряется при помощи АЦП микроконтроллера.

Теперь пояснения по некоторой «рассыпухе».

Резистор R5 призван ограничить напряжение на затворе силового ключа, которое для низковольтных MOSFET обычно не должно превышать 20 В. В моем случае сеть постоянного тока имеет напряжение до 30 В, что и продиктовало необходимость делителя 1:3, который получается совместно с R3. При питании от источника менее 20 В резистор R5 не нужен (заменяется перемычкой).

Конденсаторы C4 и C5 соединены параллельно для достижения емкости 2 мкФ. Эта пара конденсаторов примечательна тем, что должна одинаково хорошо пропускать сигналы и низких и высоких частот. Тут можно было бы использовать параллельное соединение электролитического конденсатора на несколько микрофарад и керамического на сотню-другую нанофарад, но «электролит» такой малой емкости уже не дает выигрыша по размерам, если сравнивать его с микрофарадной «керамикой». Правда, керамического конденсатора на 2 мкФ купить не удалось, поэтому и поставил два одинаковых.

Конечно, для частоты 50 Гц проходной конденсатор на 2 мкФ маловат, но тут пришлось идти на компромисс. Для экономии энергии, питание на усилитель подается только во время измерений. А большое значение емкости разделительного конденсатора обозначает длительный переходной процесс выхода усилителя в рабочий режим. При емкости в 100 мкФ это время, например, достигает нескольких секунд. Вот и пришлось поступиться эффективностью ради скорости.

Резисторы R4 и R1 образуют делить напряжения, который более-менее уравнивает пятивольтовое переменное напряжение на выходе ШИМ с выходным напряжением трансформатора тока.

Конденсатор C8, как было сказано ранее, накапливает напряжение, подлежащее измерению. Лучше, если это будет качественный конденсатор с минимальным током утечки.

Отдельного упоминания заслуживает двухштырьковая «гребенка» TP1/TP2, подключенная к ножке сброса микроконтроллера. Эти контакты используются не просто для перезагрузки, а для входа в режим калибровки, о котором ниже. Просто после реализации всех хотелок у контроллера уже не оставалось свободных пинов, а необходимость добавления одного простейшего органа управления возникла в процессе отладки прошивки. Вот и пришлось использовать для этой цели ножку сброса контроллера.

Все «мелкие» контроллеры AVR имеют возможность отключения входа RESET и перевода соответствующего пина в режим GPIO. Однако в тогда контроллер утрачивает возможность прошивки обычным программатором, и поэтому данный режим не пользуется популярностью. Но если стоит задача просто добавить в схему кнопку, то можно обойтись и без столь радикальных мер. Дело в том, что у управляющей программы всегда есть возможность узнать, что именно послужило источником последнего сброса, и в зависимости от этой информации, выполнять разные действия при простом включении и при принудительной перезагрузке сигналом RESET.

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

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

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

Датчик положения выключателя для аварийного освещения - 6

Конденсатор C10 должен быть рассчитан на напряжение не менее киловольта, а его емкость была выбрана по компромиссному принципу так, чтобы и надежность срабатывания была достаточная для практического использования, и чтобы паразитный емкостный ток через лампу был не слишком велик. На практике можно попробовать «поиграться» этим номиналом, если на то будет необходимость.

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

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

Дроссели L1 и L2 должны быть силовыми, намотанными проводом заметной толщины на сердечники типа «гантель» или «кольцо». Сигнальные дроссели в «резисторном» аксиальном исполнении использовать нельзя.

Первичный виток трансформатора тока теперь представляет собой отрезок провода, продетый через кольцо и припаянный к точкам TR3 и TR4 на плате. Лучше, если этот провод будет экранированным, экран при этом подключаем к TR5 и TR6 с двух сторон от кольца.

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

Софт

Код прошивки и собранный HEX-файл приложены в конце статьи вместе со схемой и разводкой печатной платы.

Алгоритм работы настроенного детектора прост. Раз в три секунды контроллер просыпается от глубокого сна, делает измерения, и, если нужно, изменяет состояние управляющего ключа в ту или иную сторону. Таким образом, реакция на изменение положения выключателя может иметь задержку до трех секунд. Не очень удобно, но сделано это, во-первых, для экономии энергии резервного источника, а во-вторых, сильно уменьшить интервал опроса не дает длительность переходных процессов на разных этапах измерения. Минимальный интервал можно считать равным одной секунде, но тогда схема почти все время будет в активном режиме потребления.

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

В режим калибровки датчик входит при каждом включении, пока отсутствуют калибровочные данные, или же после замыкания контактов TP1 и TP2. Вход в первый этап калибровки отмечается пятикратным миганием аварийной лампы.

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

Далее начинается второй этап калибровки и аварийная лампа мигает дважды. 7.5 секунд времени дается на перевод выключателя в положение «включено» и по истечении таймаута программа производит измерение потребляемого лампой тока. Если лампа имеет несколько уровней яркости, то после включения нужно сразу же переключить ее на минимум, чтобы в дальнейшем датчик корректно работал с любым из имеющихся уровней.

Начало третьего и последнего этап калибровки отмечается трехкратным миганием аварийной лампы и требует, чтобы выключатель оставался в режиме «включено», а осветительная сеть была обесточена уровнем выше (т.е. главным или второстепенным автоматом на щитке) не позже, чем через все те же 7.5 секунд. При этом производится вторичное зондирование уже включенного выключателя на разных частотах и с учетом полученных на первом этапе значений, производится выбор той частоты, при которой разница токов через включенный и выключенный выключатель максимальная.

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

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

В случае упорного нежелания датчика калиброваться с двукратным миганием в финале, нужно попробовать увеличить емкость C10.

Итог

Устройство получилось довольно простое, достаточно компактное для размещения в коробке выключателя, но не сказать, чтобы совсем простое в настройке. На компонент современного «умного дома» оно конечно не тянет, ведь в нем нет 5G, облачного управления, и даже банальных WiFi с GPS не предусмотрено. Но тем не менее свою единственную функцию восемь таких девайсов выполняют, а ничего другого от них в условиях блекаута и не требуется.

Исходный код прошивки (Atmel Studio 7)

#define F_CPU 9600000 // частота ядра (команда установки фъюзов: avrdude.exe -U lfuse:w:0x7a:m -U hfuse:w:0xff:m)

#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>

//#define PROTEUS

typedef unsigned char bool; // просто булевый тип
#define true  (0 == 0)
#define false (0 != 0)

#define MAX_U10BIT 0b0000001111111111 // максимально возможное значение на выходе АЦП

#define INTERVAL         3   // интервал опроса, сек
#define CUR_MINIMAL_DIFF 50  // минимальная разница при измерении тока потребления, LSB
#define RES_MINIMAL_DIFF 50  // минимальная разница при измерении сопротивления выключателя, LSB
#define FREQ_DIV_OFFSET  2   // начальное значение делителя частоты ШИМ
#define FREQ_MAXIMAL_DIV 6   // максимальное значение делителя частоты ШИМ

EEMEM unsigned int  EEPROM_cur_edge;
EEMEM unsigned int  EEPROM_res_edge; 
EEMEM unsigned char EEPROM_frequency_dividor;

unsigned int cur_edge, res_edge; // пороги срабатывания датчиков, извлекаются из EEPROM или определяются при калибровке
unsigned char frequency_dividor; // делитель чатоты ШИМ, извлекается из EEPROM или определяется при калибровке
unsigned char clk = 0; // счетчик циклов watchdog
bool tp_reset = false; // признак замыкатия TP1 и TP2

// инициализация некоторых переменных
static void init_vars(void) {
  if(MCUSR & (1 << EXTRF)) { // определяем, был ли последний сброс результатом замыкания TP1 и TP2
    tp_reset = true;
    MCUSR &= ~(1 << EXTRF); // бит EXTRF не сбрасывается даже после перезагрузки другим способом, делаем это вручную
  }
}

// инициализация пинов
static void init_pins(void) {
  DDRB |= (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB4); // все выходные пины остаются с логическим нулем
}

// инициализация прерываний и watchdog
static void init_interrupts(void) {
  sleep_enable(); // разрешаем спящий режим

  WDTCR = (1 << WDCE) | (1 << WDE); // подготавливаем watchdog
  WDTCR = (1 << WDTIE) | WDTO_1S; // watchdog генерирует прерывание вместо сброса всего контроллера, интервал 1 секунда

  sei(); // разрешаем прерывания
}

// считываем калибровочные данные
void init_settings(void) {
  cur_edge = eeprom_read_word(&EEPROM_cur_edge); // пороговое значение тока
  res_edge = eeprom_read_word(&EEPROM_res_edge); // пороговое значение сопротивления
  frequency_dividor = eeprom_read_byte(&EEPROM_frequency_dividor); // делитель частоты зондирования
}

// переключение состояния нагрузки
static void toggle_load(bool state) {
  if(state) {
    PORTB |= (1 << PB1);
  } else {
    PORTB &= ~(1 << PB1);
  }
}

// мигание нагрузкой
static void blink_load(unsigned char count) {
  for(unsigned char i = 0; i < count; ++i) {
    _delay_ms(200);
    toggle_load(true);
    _delay_ms(200);
    toggle_load(false);
  }
}

// останавливаем работу (используется при невозможности калибровки)
static void stop(void) {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  while(true) sleep_cpu();
}

// управление питанием усилителя
static void toggle_amp(bool state) {
  if(state) {
    PORTB |= (1 << PB4); // подаем высокий уровень на PB4
    _delay_ms(250);      // переходные процессы в усилителе длятся около 200 мс.
  } else {
    PORTB &= ~(1 << PB4);
  }
}

// управление ФНЧ
static void toggle_lpf(bool state) {
  if(state) {
    DDRB |= (1 << PB3); // переводим PB3 в режим выхода (с логическим "0") для заземления верхнего вывода C2
  } else {
    DDRB &= ~(1 << PB3); // переводим PB3 в режим входа (без подтяжки) для отключения C2 от земли
  }
}

// управление генератором зонзирующего сигнала
static void toggle_gen(bool state) {
  if(state) {
    TCCR0A |= (1 << COM0A0) | (1 << WGM01); // активируем генератор меандра (без ШИМ) с инверсией выхода OC0A при достижении счетчика значения из OCR0A
#ifndef PROTEUS
    TCCR0B |= (1 << CS00); // делитель частоты счетчика 1
#else
    TCCR0B |= (1 << CS00) | (1 << CS02); // делитель частоты счетчика 1024
#endif
    OCR0A = FREQ_DIV_OFFSET + frequency_dividor; // максимальное знаение счетчика, при котором и происходит инверсия сигнала на выходе OC0A
  } else {
    TCCR0A = 0; // отключаем генератор
  }
}

// управление АЦП
static void toggle_adc(bool state) {
  if(state) {
    DDRB &= ~(1 << PB2); // переводим PB2 в режим входа (без подтяжки)
    ADMUX = 0b01 | (1 << REFS0); // PB2, 1.1v reference
    ADCSRA = (1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2) | // коэффициент деления тактовой частоты для АЦП = 128 (75 КГц)
             (1 << ADIE) |  // режим оповещения через прерывание
             (1 << ADEN);   // активация АЦП
  } else {
    ADCSRA = 0; // отключаем АЦП
    DDRB |= (1 << PB2); // переводим PB2 в режим выхода (с логическим "0") для разряда C8
    _delay_ms(50); // ждем немного чтобы гарантированно разрядить C8
  }
}

// выполнение преобразования
static unsigned int do_adc(void) {
  set_sleep_mode(SLEEP_MODE_ADC); // подготавливаем режим "тихого" преобразования
  do {
    sleep_cpu(); // запуск АЦП происходит после засыпания контроллера, а после завершения преобразования генерируется прерывание, которое будит контроллер
  } while(ADCSRA & (1 << ADSC)); // если после пробуждения преобразование все еще не завершено, продолжаем спать

  return ADC;
}

/*
// для отладки
static void blink_bin(unsigned int value, unsigned char count) {
  for(unsigned char i = 0; i < count; ++i) {
    _delay_ms(1000);
    toggle_load(true);
    if(value & (1 << (count - i - 1))) {
      _delay_ms(500);
    } else {
      _delay_ms(50);
    }
    toggle_load(false);
  }
}
*/

// измеряем потребляемый ток
static unsigned int get_current(void) {
  unsigned int cur;

  toggle_lpf(true); // включаем ФНЧ
  _delay_ms(150);
  toggle_adc(true); // включаем ЦАП
  _delay_ms(50); // накапливаем заряд в C8
  cur = do_adc(); // выполняем измерение
  toggle_adc(false);
  toggle_lpf(false);

  return cur;
}

// измеряем эквивалентное сопротивление выключателя
static unsigned int get_resistance(void) {
  unsigned int res;

  toggle_gen(true); // включаем генератор
  _delay_ms(150);
  toggle_adc(true); // включаем ЦАП
  _delay_ms(50); // накапливаем заряд в C8
  toggle_gen(false); // генератор можно выключить, заряд на C8 держится достаточно долго для измерения
  res = do_adc(); // выполняем измерение тока через обмотку
  toggle_adc(false);

  return MAX_U10BIT - res; // возвращаем результат не в виде тока, а в виде эквивалентного сопротивления выключателя
}

// признак наличия тока
static bool is_current(void) {
  return (get_current() >= cur_edge);
}

// признак включенности выключателя
static bool is_toggled_on(void) {
  return (get_resistance() <= res_edge);
}

// основной блок
static void do_main(void) {
  toggle_amp(true); // включаем усилитель

  if(is_current()) {
    toggle_load(false); // есть ток, выключаем нагрузку
  } else {
    if(is_toggled_on()) {
      toggle_load(true); // тока нет, выключатель включен
    } else {
      toggle_load(false); // тока нет, выключатель выключен
    }
  }

  toggle_amp(false); // выключаем усилитель
}

// признак отсутствия калибровочных данных
static bool first_on(void) {
  return (frequency_dividor == 0xff); // пустая ячейка EEPROM имеет значение 0xFF, реальное значение делителя не может быть выше FREQ_MAXIMAL_DIV
}

// процедура калибровки
static void calibrate(void) {
  unsigned int cur_off, cur_on, res_off, res_on, res_on_tmp, res_off_array[FREQ_MAXIMAL_DIV + 1], diff, max_diff, frequency_dividor_tmp;

  blink_load(5); // сигнализируем о начале калибровки, выключатель должен быть выключен
  _delay_ms(7500); // даем пользователю время на выключение выключателя

  toggle_amp(true); // включаем усилитель

  cur_off = get_current(); // измеряем ток при выключенном выключателе (уровень шума)

  // измеряем сопротивление выключателя на разных частотах
  for(frequency_dividor = 0; frequency_dividor <= FREQ_MAXIMAL_DIV; ++frequency_dividor) {
    res_off_array[frequency_dividor] = get_resistance();
  }

  blink_load(2); // сигнализируем о необходимости включения выключателя
  _delay_ms(7500); // даем пользователю время на включение выключателя

  cur_on = get_current(); // измеряем ток при включенном выключателе

  blink_load(3); // сигнализируем о необходимости выключения сети
  _delay_ms(7500); // даем пользователю время на выключение сети

  
  res_off = MAX_U10BIT;
  res_on = MAX_U10BIT;
  frequency_dividor_tmp = 0;
  max_diff = 0;
  // снова проводим измерения на разных частотах
  for(frequency_dividor = 0; frequency_dividor <= FREQ_MAXIMAL_DIV; ++frequency_dividor) {
    res_on_tmp = get_resistance();

    // далее определяем частоту, при которой разница сопротивлений выключателя максимальная
    if(res_off_array[frequency_dividor] > res_on_tmp) {
      diff = res_off_array[frequency_dividor] - res_on_tmp;
      if(diff > max_diff) {
        res_off = res_off_array[frequency_dividor];
        res_on = res_on_tmp;
        frequency_dividor_tmp = frequency_dividor;
        max_diff = diff;
      }    
    }
  }
  frequency_dividor = frequency_dividor_tmp;

  toggle_amp(false); // выключаем усилитель
  
  if(cur_on > cur_off + CUR_MINIMAL_DIFF) { 
    cur_edge = cur_off + (cur_on - cur_off) / 2; // если разница токов достаточная, определяем порог срабатывания датчика тока
 
    if(res_on + RES_MINIMAL_DIFF < res_off) {
      res_edge = res_off - (res_off - res_on) / 2; // если разница сопротивлений достаточная, определяем порог срабатывания датчика положение выключателя

      // сохраняем калибровочные данные
      eeprom_write_word(&EEPROM_cur_edge, cur_edge);
      eeprom_write_word(&EEPROM_res_edge, res_edge);
      eeprom_write_byte(&EEPROM_frequency_dividor, frequency_dividor);
      
      blink_load(1); // калибровка завершена
    } else {
      blink_load(2); // ошибка определения положения выключателя
      if(first_on()) stop();
    }
  } else {
    blink_load(3); // ошибка определения тока нагрузки
    if(first_on()) stop();
  }
}

ISR(WDT_vect) {
  WDTCR |= (1 << WDTIE); // после каждого срабатывания watchdog нужно заново "заказывать" прерывание вместо сброса контроллера
}

EMPTY_INTERRUPT(ADC_vect); // АЦП работает в режиме прерывания, но вектор нам не нужен

int main(void)
{
  init_vars();
  init_pins();       
  init_interrupts(); 
  init_settings();

  if(tp_reset || first_on()) {
    calibrate(); // калибровку запускаем при отсутствии калибровочных данных или после ручного сброса
  }

  // основной цикл
  while(true) {
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_cpu(); // ждем срабатывания watchdog

    if(++clk >= INTERVAL) {
      do_main(); // выполняем работу
      clk = 0;
    }
  }
}

Архив со схемой, разводкой, и полным проектом Atmel Studio 7

Автор: quwy

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js