Довольно давно, еще в середине 2021 года, я описывал простой вариант совместной передачи данных и питания "по одному проводу", который рассчитан на применение в любительских конструкциях
Однако, рассмотренный в той статье способ позволял подключить лишь один внешний блок/модуль. Для простоты будем называть внешний модуль датчиком. А если таких датчиков нужно подключить несколько, причем количество соединительных проводников увеличить нельзя? Мы можем использовать сходный способ. Рассматриваться будет один из возможных вариантов, причем без какой-либо привязки к конкретной системе. Причем лишь физический уровень.
В статье рассматривается только один из возможных вариантов, причем только физический уровень. Подобные решения можно найти в различных промышленных устройствах, например, охранно-пожарных системах. Придумано это не мной, я просто рассказываю, как все устроено и работает. Для тех, кто с таким не сталкивался, но кому интересно.
Подключение множества датчиков и связанные с этим проблемы
Давайте рассмотрим подключение к центральному устройству множества внешних модулей/датчиков. Причем соединительная линия должна быть двухпроводной, но нужно передавать не только информацию в обе стороны, но и обеспечивать питание датчиков. Разумеется, решение не должно быть слишком сложным и дорогим. Количество датчиков не оговаривается, указывается лишь их максимальное число. Кроме того, должна быть возможность подключать и отключать датчики не отключая питание системы и не нарушая ее работоспособности. Скорость обмена невысокая. Инициатором обмена выступает центральное устройство.
Давайте выделим некоторые важные и проблемные моменты, которые будут учитываться при разработке решения.
Схема подключения датчиков
Двухпроводная линия связи определяет лишь один возможный вариант соединения датчиков - параллельный. Последовательный нам не подходит, так как при выходе даже одного датчика из строя линия связи оказывается разомкнутой, а система неработоспособной. А у нас по условиям задачи возможно отключение/подключение датчиков при работе системы
Это параллельное подключение "шиной". Ничего не изменится, если мы подключим датчики непосредственно к зажимам центрального устройства. Да, топология будет "звезда", но электрически все датчики будут соединены параллельно в обоих случаях. Для очень длинных линий связи и высоких скоростей обмена на концах линии связи устанавливают согласующие резисторы, но мы обойдемся без них, так как скорость обмена невысока.
На иллюстрации не показана полярность проводников линии связи. Да, мы можем выделить "плюс" и "минус", которые будут физически обозначены цветом изоляции проводников. Но, как мы скоро увидим, довольно легко обеспечить независимость датчиков от полярности линии связи. Поэтому полярность для нас не принципиальна.
Питание датчиков
Поскольку питание датчиков осуществляется от линии связи, а датчиков может быть много, встает вопрос ограничения потребляемого каждым датчиком тока. Датчики должны быть даже не маломощными, а желательно микромощными. Еще лучше, если датчик большую часть времени будет "спать".
Пока это условие не выглядит очевидным, но при рассмотрении схем приема/передачи/питания мы увидим, откуда появилось это условие. Кроме того, для больших токов потребления датчиков (а датчиков много, по условию) потребуется использовать проводники большего сечения, что удорожает линию связи. Но при большой длине линии все равно не получится избежать падения напряжения на проводниках. Другими словами, напряжении на линии вблизи центрального устройства будет выше, чем на большом удалении.
Это приводит к необходимости повышать напряжение питания, что не только позволит создать запас по напряжению на удаленном конце линии связи, но и снизит потребляемый датчиками ток, при той же потребляемой мощности.
Каждый датчик должен иметь адрес
Это очевидное требование, так как иначе мы не сможем обратиться к определенному датчику из множества подключенных к линии связи. Адрес может задан жестко, при изготовлении датчика, или задаваться/изменяться программно. Во втором случае потребуется выполнить конфигурирование датчика перед его подключением к системе. Каждый датчик должен иметь уникальный адрес, дублирование не допускается.
Реализация питания и передачи данных в датчик
Давайте вспомним, как мы подключали датчик в старой статье. Я скопирую иллюстрацию
Это для двухстороннего обмена, приемная часть центрального устройства нам пока не нужна. Транзистор VT2 подавал питание на датчик постоянно, но с помощью VT3 и VD1 можно было снизить напряжение на датчике. Это и позволяло модулировать питание передаваемой в датчик информацией. Эта часть старой схемы нас устраивает, но мы ее немного упростим.
А вот резистор R1, который выполнял роль датчика тока при передаче информации от датчика в центральное устройство, теперь представляет для нас большую проблему. Дело в том, что мы теперь не знаем количество подключенных датчиков, а значит не можем и выбрать величину сопротивления. Да и падение напряжения на этом резисторе может быть слишком большим, как и рассеиваемая им мощность. Так что резистор, именно при передаче информации и питания в датчики, будет лишним.
Кроме того, давайте упростим цепь передачи. Исключим пониженный уровень напряжения
Кажется, что изменение не велико, но оно позволяет немного упростить передатчик, если линия связи цифровая. Для аналогово-цифровой линии связи нам придется сохранить несколько уровней напряжения. Но об этом будет немного позже (и очень кратко).
Теперь вспомним, что нам нужно высокое напряжение в линии связи. Это напряжение будет намного превышать напряжение питания микроконтроллера. Поэтому мы получим примерно такую схему передатчика в центральном устройстве
Здесь нет ничего сложного. Транзисторы VT1 и VT2 образуют ключ, управляющий подачей напряжения Vline на линии связи. И датчики, которые подключены к линии. Поскольку Vline превышает допустимое для микроконтроллера напряжение питания Vcc, цепи питания разделены. Напряжение Vline обычно выбирается 12/24/36/48 В. Чем выше это напряжение, тем меньше будет ток в линии, при той же потребляемой мощности.
Поскольку напряжение Vline может превысить максимально допустимое Uзи для VT2, в цепи затвора предусмотрен делитель напряжения R1/R2. На этой иллюстрации не показана схема ограничения тока стока для VT2, что позволит защитить центральное устройство от короткого замыкания линии связи.
Давайте посмотрим на временные диаграммы напряжения в линии связи, они просты
В начальном состоянии в линию просто подается напряжение Vline. При этом датчики получают питание. Передача данных начинается со стартового бита - отключения питания линии на время большее времени передачи любого другого бита. Стартовый бит позволяет датчикам "проснуться" именно в начале передачи, но не отвлекаться на прием информации для них не предназначенной, если передаваемый по линии адрес не совпадает с адресом датчика. Это снижает потребляемую датчиками мощность.
В старом варианте мы могли использовать для передачи информации любой метод, даже NRZ (например, UART), так как единственный датчик все равно получал питание Umin. Но теперь мы не можем использовать NRZ, так как при этом отключение питания на линии может стать слишком длительным. Подходящими методами будут Manchester или подобие 1-wire (кодирование длительностью импульса). Для нас важно, что бы питание с линии не снималось надолго и стартовый бит самым длительным.
Теперь займемся датчиками. И начнем с цепей питания. Поскольку у нас напряжение в линии связи есть не всегда, потребуется дополнительный накопитель энергии, в качестве которого отлично подойдет конденсатор. Еще нам понадобится стабилизатор напряжения, который снизит напряжение Vline для необходимого для микроконтроллера уровня. Нам неважно, как именно реализован этот стабилизатор, но обычно используется микромощный линейный
Конденсатор C1e вместе с диодом VD1e обеспечивают на входе стабилизатора DA1e достаточный уровень напряжения даже во время стартового бита на линии связи. Разумеется, емкость конденсатора выбирается с учетом тока потребления микроконтроллера и собственного потребляемого тока стабилизатора. Но у нас эти токи малы, поэтому и емкость конденсатора будет не большой. Более того, она и не должна быть большой, так как иначе "пусковой ток" линии связи с датчиками (ток заряда всех конденсаторов датчиков), при включении питания центрального блока, будет слишком большой.
Последовательно с VD1e обычно включают резистор сопротивлением в несколько сотен Ом, который я не стал показывать на схеме. Этот резистор уменьшает "пусковой ток" датчика.
Но это означает, что на диаграмме напряжения в линии связи, которую мы видели чуть ранее, не показан небольшой, но важный, нюанс. Дело в том, что ограничение тока ключа VT2 в центральном блоке приведет к плавному нарастанию напряжения в линии при включении питания центрального блока. И это время "переходного процесса" мы должны учитывать - начало обмена по линии связи должно начинаться не сразу после включения питания, а с небольшой задержкой. Например, секунд 5. Подчеркиваю, что речь идет именно включении питания, что происходит довольно редко. За это время конденсаторы датчиков успеют зарядиться.
Но в нашем варианте схемы питания в датчике полярность линии связи важна. Как мы можем этого избежать? Достаточно просто установить диодный мост
Диод VD1e здесь может показаться лишним, но это совсем не так! И скоро мы это увидим. Давайте займемся цепями приема информации с линии связи. Это сделать достаточно легко
Обычный делитель приведет уровни напряжения на шине к логическим уровням микроконтроллера. И уже видно, что без VD1e прием информации был бы невозможен. Но такой вариант цепей приема информации не самый оптимальный. Дело в том, что если вход микроконтроллера настроить на формирование прерывания при изменении логического уровня, а прерывание и будет "будить" микроконтроллер, то пробуждение будет происходить при приеме каждого бита, а не только стартового.
Мы можем экономить питание пожертвовав еще одним входом и немного усложним схему
Мы добавили еще один делитель, конденсатор, и триггер Шмитта. Стартовый бит в линии связи не несет информационного содержания, это лишь сигнал "внимание". За время стартового бита конденсатор C2e успевает разрядиться через резистор R4e до напряжения логического "0". Этот "0" поступает на вход In2 микроконтроллера, который настроен на работу по прерываниям. Таким образом, при поступлении стартового бита микроконтроллер просыпается. За время передачи информационных бит конденсатор не успевает разрядиться, поэтому прерывание не возникает.
Проснувшись, микроконтроллер принимает адрес с линии связи. Если этот адрес совпадает с адресом датчика, то прием данных продолжается. Если адрес не совпадает, то микроконтроллер снова засыпает и не тратит энергию зря. Вход In1 это обычный логический вход, без формирования прерываний. Он используется для приема информационных бит.
Триггер Шмитта DD1e используется для преобразования медленно изменяющегося напряжения на C2e в импульс с логическими уровнями. Если микроконтроллер уже содержит триггер на входе In2, то использовать DD1e не требуется.
Реализация передачи данных от датчика
С питанием датчиков и передачей информации в датчики мы разобрались. Передача информации в обратном направлении даже более простая задача. Вспомним, как это было реализовано в старой статье. Там транзистор подключал параллельно цепи питания дополнительный резистор, что обеспечивало скачок тока потребления. Используем этот же метод и сейчас, только сопротивление дополнительного резистора выберем гораздо меньшим
Передача информации осуществляется VT1e, который фактически просто закорачивает линию связи, так как сопротивление R6e мало, порядка 10-20 Ом. Именно по этой причине датчик может начать передачу только по инициативе центрального устройства, которое при этом переключится на прием. Мы скоро увидим, как это выполняется. Если датчик начнет передачу "не вовремя", то линия связи, на которую почти без ограничения подается Vline будет закорочена, а VT1e, скорее всего, выйдет из строя, так как он маломощный.
Принцип передачи точно такой же, как и в направлении датчика. VT1e обеспечивает на линии напряжение близкое к 0, когда открыт. Когда он закрыт, на линии присутствует напряжение довольно близкое к Vline.
Кстати, обратите внимание, что на последней иллюстрации я показал и резистор, который ограничивает "стартовый ток" датчика. Это полная, но упрощенная, схема датчика (без части обеспечивающей сбор и обработку данных). Для полноты картины добавлен и этот резистор.
С датчиком мы закончили, полностью. Давайте закончим и с центральным устройством. Цепи приема просты, это просто делитель напряжения. Но нам нужно еще как то ограничивать ток в линии в состоянии приема. Для этого мы добавим еще один ключ, но уже с балластным резистором
К уже знакомой нам схеме добавились два транзистора, VT3 и VT4. В отличии от VT2, который обеспечивает передачу информации (модуляцию), VT3 лишь обеспечивает питание линии связи с ограничением тока с помощью резистора R7. VT3 открыт все время приема информации от датчика. Делитель R8/R9 обеспечивает преобразование уровней напряжения на линии связи к логическим уровням для микроконтроллера.
Уровень напряжения на линии связи в режиме приема немного ниже Vline, так как на R7 падение напряжения будет не нулевое, хоть и небольшое. Диаграмма напряжений на линии связи достаточно очевидна, но я все таки приведу ее
Заключение
Конечно, это чрезвычайно упрощенное описание. Далеко не полное. Кратко показан лишь принцип построения подобных линий связи, позволяющих центральному устройству обеспечивать двухсторонний обмен данными с множеством внешних устройств, не имеющих своего питания и питающихся от собственно лини связи. Такие линии связи часто называют сокращенно АЛС - адресные (или адресуемые) линии связи.
Внешние устройства не обязательно должны питаться от линии связи, у них могут быть и собственные полноценные блоки питания. Это никак не влияет на возможность подключения такого устройства и обмен информацией с ним. Просто из внешнего устройства будут исключены цепи питания от линии.
Можно еще больше расширить функционал и гибкость АЛС. Например, можно реализовать высокую скорость передачи данных, но потребуется специальный кабель и согласование волнового сопротивления. Можно вместо одного Vline использовать несколько разных, что позволит подключать к одной АЛС разные группы устройств или разделить команды управления и информационные. Можно реализовать режим экстренных оповещений от внешних устройств. Но это уже отдельные, причем большие, темы.
А еще, в статье я даже не коснулся вопроса защиты от ESD и помех. Реальные системы гораздо сложнее, чем рассмотрено в статье. Да и АЛС могут иметь длину в несколько сотен метров.
Есть много различных интерфейсов, для различный ситуаций и областей применения. Мы сегодня рассмотрели лишь один из вариантов. Причем реально применяющийся на практике. Точнее, краем глаза посмотрели "как это устроено".