Предлагаемый Вашему вниманию драйвер шины 1-Wire не является чем-то революционным, все использованные схемотехнические решения давно известны. Причиной публикации стало желание не загромождать статью о программной реализации примитивов 1-Wire-master на основе PWM и ICP.

Принципиальная схема
Драйвер шины 1-Wire

Драйвер шины используется в одном из моих проектов, поэтому нумерация элементов начинается не с «1».

Назначение сигналов:

ICP — входной сигнал для микроконтроллера, предназначенный для приема данных с шины 1-Wire;
OCRA — выходной сигнал для микроконтроллера, предназначенный для модуляции передаваемых на шину 1-Wire данных;
PULLUP — выходной сигнал для микроконтроллера, предназначенный для реализации на шине 1-Wire режима «ACTIVE PULLUP»;
3V3 — напряжение питания, к которому толерантны пины микроконтроллера ICP, OCRA и PULLUP. Это напряжение не обязательно должно быть именно 3.3V, оно может быть больше или меньше.

Двумя обязательными критериями являются:

— напряжение 3V3 должно быть строго меньше напряжения 5V0 (как минимум на величину падения напряжения на паразитном диоде MOSFET Q3 в случае его прямого включения);
— напряжение 3V3 должно быть больше напряжения между затвором и истоком используемых MOSFET, гарантирующих их стабильное открытие.

ONEWIRE — сигнал шины 1-Wire;
5V0 — питание для шины 1-Wire.

Компоненты Q2 и R19 обеспечивают модуляцию сигнала на шине 1-Wire со стороны низковольтной части драйвера. R18 предназначен для гарантированного закрытия Q2 при отсутствии модулирующего сигнала и, в некоторой степени, для защиты от ESD (electrostatic discharge) в случае исполнения драйвера в виде отдельного модуля.

Диодная сборка D8 предназначена исключительно для защиты от ESD в том невероятном случае, если кому-то захочется подключить 1-Wire устройства с низковольтным питанием. Например DS18B20 допускает диапазон питающих напряжений от 3.0V до 5.5V. Однако следует заметить, что режим «ACTIVE PULLUP» возможен только со стороны шины 1-Wire с питанием +5V (т.е. низковольтные 1-Wire устройства не стоит использовать в режиме parasite power). Кроме того, для улучшения параметров помехоустойчивости низковольтной шины 1-Wire возможно понадобится уменьшить номинал R19 до значения 1K включительно. «Вишенка на торте» — оба варианта шины 1-Wire могут использоваться одновременно.

На компонентах R19, Q3 и R20 собран тривиальный двунаправленный преобразователь уровней (разъяснение принципов его работы см. в списке литературы).

На компонентах R21, Q4, R22 собран однонаправленный инвертирующий преобразователь уровней для управления Q5, реализующим режим «ACTIVE PULLUP».

Резисторы R23 и R24 предназначены для ограничения протекающего тока (например, в случае подключения нового устройства на шину 1-Wire в тот момент, когда она находится в режиме «ACTIVE PULLUP»).

Диодная сборка D9 обеспечивает защиту от ESD со стороны шины 1-Wire.

Внешний вид устройства (на макетной плате)
Драйвер шины 1-Wire на макетной плате

Список литературы:

  1. Guidelines for Reliable Long Line 1-Wire Networks
  2. APPLICATION NOTE 4255
  3. DS18B20 datasheet
  4. Согласование логических уровней 5В и 3.3В устройств
Поделиться с друзьями
-->

Комментарии (37)


  1. VDG
    27.02.2017 19:15
    +3

    Драйвер шины используется в одном из моих проектов, поэтому нумерация элементов начинается не с «1».

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


    1. Vedga
      27.02.2017 20:58
      +1

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


  1. kiltum
    27.02.2017 20:52

    Оно точно работает? Потому что мне кажется, что будут работать либо с паразитным, либо с полным питанием… но это мелочи. Почему не использовать стандартную схему из аппноута maxim про usart? Там надо только добавить защиту от статики и все


    1. Vedga
      27.02.2017 21:09

      Точно работает (осциллограммы см. на связанной статье про софт на хабре). Причем одновременно для 1-wire шины с 3V сигналом и для шины с 5V сигналом. Для первого случая питание slaves должно быть отдельным, для второго может быть как отдельным, так и паразитным (управляется на уровне софта).
      Из аппнота Using a UART to Implement a 1-Wire Bus Master реализация не устроила потому, что на внешней шине 1wire хотелось иметь сигнал 5V, а входы микроконтроллера (RxD, в частности) к нему не толерантны. Все-таки на длинных линиях те же DS18B20 с паразитным питанием себя чуствуют намного увереннее на 5 вольтах, чем на 3.3.


      1. Vedga
        28.02.2017 09:25

        Возможно я неправильно понял исходный комментарий ;). Конечно, при активном PULLUP обе шины использовать не получится. Но т.к. PULLUP требуется не для всех операций, то все-таки можно сказать, что «обе шины можно использовать (и) одновременно».


  1. leocat33
    27.02.2017 23:18

    Для работы с 1-Wire 3.3V со стороны контроллера и 5V со стороны датчиков я использую ADUM1250.
    С одной стороны питание и сигнал 3.3V, с другой 5V.
    Недостатки: возможно высокая цена (но это кому как), если нужен только 1 канал, то второй не задействован, нужны PullUp резисторы (я ставлю 4.7к)
    Плюсы: Полная гальваническая развязка до 560 V, 2500 V rms for 1 minute per UL 1577, фильтрация шума в обе стороны — своего рода «фича» данного чипа. Если чип с маркировкой A, то предельная частота 1 мГц, все что выше — фильтруется. Четкое разделение «0» и «1», нет промежуточных значений.


  1. leocat33
    28.02.2017 08:26

    Ну и еще… ( не хочу быть «погромщиком» проекта, так, совет ) вместо диодной сборки, как защиту, может быть разумнее использовать что то вроде NUP2105L? Диодная сборка. Диоды неполярные. Как раз для защиты линий. Предназначена для CAN, но хорошо работает и на 485-м и на w1.


    1. Vedga
      28.02.2017 09:19

      Спасибо за наводку, учту. Просто я программист, а не не схемотехник ;'(. А совет дельный!


  1. GarryC
    28.02.2017 09:42

    Посмотрим на схему повнимательнее:


    1. Сдвиг уровня — без него (наверное) не обойтись — оставляем.
    2. Мощное питание — пусть будет, но убираем инвертор сигнала — включить "нулем" не такая уж сложная задача.
    3. Формирователь нуля сигнала — все известные мне МК поддерживают режим "открытый коллектор", так что необходимость внешней схемы под вопросом.
      Итого из 4 транзисторов остаются 2.
      Две схемы защиты — внутреннюю убираем — не спасет она, если не спасла внешняя, и во всех известных мне МК она есть на ножках.
      При этом реализация внешней защиты на дискретах, причем общего назначения — мне представляется сомнительной, тут просится специализированный компонент, причем у него внутри и стабилитрон есть, про который Вы просто забыли.
      Это придирки, вызванные привычкой делать минимально необходимые схемы, а так, конечно, все работать будет и в таком варианте, если стабилитрон поставить.


    1. Vedga
      28.02.2017 11:12

      Можно подробнее по поводу «включить нулем»? Исток Q5 на +5V, затвор на нуле — включим. А сможем ли мы его выключить? Затвор +3.3V (а если более низковольтный МК?), исток +5V.
      Формирователь нуля можно выбросить, согласен. Насколько велика вероятность спалить выход МК, включив из-за программной ошибки одновременно ACTIVE PULLUP и лог. 0 на выход?
      Внутренняя защита исключительно для подключения второй внешней 1wire шины с сигналом 3V. Если используется только 1wire с сигналом 5V конечно она не нужна.
      В любом случае спасибо за замечания. Я же говорю, эта макетка для демонстрации алгоритма работы из основной статьи, а не законченное целевое устройство. Которое пока еще в процессе разработки:)


      1. GarryC
        01.03.2017 10:42

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


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


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


    1. Alexeyslav
      28.02.2017 11:25

      Из-за защитных диодов в МК для Q5 что 0в что 3.3В(темболее для контроллеров работающих от 1.8В) будут активным нулём и он будет постоянно открыт.
      В МК истинный «открытый коллектор» бывает крайне редко, и обычно это либо специализированный контроллер или вывод сброса. В остальных случаях на выходах контроллера напряжение не может выходить за рамки его же питания, даже если они находятся в высокоимпедансном состоянии. Для этого и задействован Q4, на его стоке напряжение ничем не ограничено.


      1. GarryC
        01.03.2017 10:32

        Если в дата написано "5в толерантно", то вполне себе может выходить за рамки питания МК.


  1. kiltum
    28.02.2017 11:12

    Всю ночь не мог понять, что не так. «Что? Мне вообще все не нравится!» (с) Капитан Смоллет

    Слишком сложно. Почему бы не сделать так, особенно когда изоляции не надо?

    image

    R1,R2,Q1,Q2 реализуют классическую схему от Maxim для USART. А Q3, R3 — это кусок от классической схемы I2C шифтера (AN97055). Ну и D1,D2 обеспечивают защиту. Можно заменить на TVS или соответствующую сборку. Имхо проще и дает 5В для 1wire.


    1. Vedga
      28.02.2017 11:18

      А это не то же самое, только без active pullup? Да еще и с лишней инверсией на TX? Тогда уж просто на одном MOSFET делаем level shifter, притягивание к 0 средствами выхода MK, а active pullup еще двумя MOSFET разной структуры.
      Остается вопрос по поводу вероятности спалить выход МК, ошибочно включив active pullup и попробовав выставить «0» на шине 1wire.


      1. kiltum
        28.02.2017 11:24

        На TX не инверсия, а реализация open-drain. Подробнее тут https://www.maximintegrated.com/en/app-notes/index.mvp/id/214

        А с active pullup я если честно ни разу не сталкивался. Поэтому и не использую


        1. Vedga
          28.02.2017 11:38

          По схеме из комментария Q1 — чистейшей воды инверсия, чтобы open drain на Q3 работал без инверсии входного Tx. Но у меня нет свободного UART, поэтому реализация выхода средствами PWM. А здесь я полярность могу поставить любую.
          Без active pullup очень плохо работает команда convert при использовании parasite power. Можно уменьшить номинал резистора, подтягивающего выход к +5V, но до определенного уровня. Например, по datasheet на DS18B20 потребление в режиме convert 1.5mA/устройство. Если у нас на шине 20 датчиков и мы даем безадресный convert, то ожидаемое потребление 30mA. Какого номинала должен быть подтягивающий резистор для обеспечения такого тока? ;)


      1. kiltum
        28.02.2017 11:27

        А. Еще раз посмотрел схему. Нет, даже если включить active pullup, то ничего не будет. Шифтер же сработает


        1. Vedga
          28.02.2017 11:40

          Сработает. Ток из pullup потечет через выходную ногу МК. Я не про опасность напряжения, я про опасность по току.


          1. Vedga
            28.02.2017 11:48

            В смысле что bss84/2n7002 держат по току 150-200mA (т.е. мы можем без проблем сделать active pullup на 100mA). А вот как отнесется выход МК к подаче через него 100mA для меня вопрос открытый ;)…


            1. kiltum
              28.02.2017 12:11

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


              1. leocat33
                28.02.2017 12:21

                Только не ОПТО! Я уже писал про ADUM. Опто для цифровых цепей это еще та кака…


                1. kiltum
                  28.02.2017 12:23

                  Ну, как специалист предложите решение, гарантированно развязывающее МК и его оператора с внешней средой, обеспечивающее защиту от 1,5КВ выбросов (а такие уже будут на расстояниях в 50-100м).


                  1. leocat33
                    28.02.2017 12:50

                    Так уже писал… ADUM1250 + NUP2105L. У меня максимальное удаление DS18B20 было метров 120-150. Но… Не рекомендую вешать все датчики на один провод. И тем более делать мешанину из датчиков и таблеток типа i-Button. Счастье будет еще то… Лучше каждый датчик на отдельную ногу процессора, с отдельным проводом. До тех пор, пока я не столкнулся с промышленностью и КИПовцами так и думал, что там напрягаться, на один провод и все. Даже спорил, с человеком имеющим большой опыт работ в АСУТП. Но жизнь вносит свои коррективы в сознание и миропонимание…


                    1. kiltum
                      28.02.2017 12:53

                      Ну как-то не согласуется

                      Только не ОПТО! Я уже писал про ADUM. Опто для цифровых цепей это еще та кака
                      и тут же
                      Так уже писал… ADUM1250 + NUP2105L


                      Вы уже определитесь, надо или не надо.


                      1. leocat33
                        28.02.2017 13:14

                        Надо или нет — решать не мне. Но ADUM это не опто. Там совершенно другой принцип работы. Да это изолятор, но с магнитной гальванической развязкой представляют собой безопасную, надежную и простую в применении альтернативу оптопарам, что подтверждается их практическим внедрением более чем в миллиарде каналов изоляции.
                        Из всех использованных мною и с моим участием взорвался только один. Но там и полетели практически все источники питания. Веселая авария… Причем свою функцию ADUM выполнил и в этом случае: внутренние цепи не пострадали.


                        1. kiltum
                          28.02.2017 13:25

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


            1. leocat33
              28.02.2017 12:13

              А никак. В большинстве случаев (МК большинства производителей) сработает внутренний ограничитель на 20мА. В качестве эксперимента можете подключить светодиод просто к ноге МК. Ну будет очень ярко светить. Но… возможны проблемы с устойчивой работой ибо у разных МК разный предельный ток потребления… Не просто так выведено несколько ножек питания и несколько ножек земли…


              1. kiltum
                28.02.2017 12:25
                +1

                «внутренний ограничитель»? Это белый дым?

                В любом даташите на любой МК прописан максимальный ток, который можно снять/подать с одной ножки и на процессор в целом.


                1. leocat33
                  28.02.2017 13:05

                  Не, «волшебный дым». Микросхемы работают на волшебном дыму. Если дым из микросхемы выходит, то она работать перестает.
                  А если серьезно, то не знаю как в других МК но в STM32F100 — 48 ног, смотрю по даташитам: Максимально допустимый выходной ток одного вывода составляет 25 мА; если нагружены несколько выводов, то нужно учитывать ограничение по току линий питания микроконтроллера и линий земли величиной 150 мА. В то же время общее сопротивление выходных транзисторов составляет что-то около 120 ом при 3.3V. Т.е. как раз и есть эти самые 25мА.
                  В то же время: Разумеется, не следует допускать работу выводов при максимальном токе. Во-первых должен быть запас для более надёжной работы, во-вторых с увеличением тока, смещаются уровни сигналов на выходе из-за падения напряжения на внутреннем сопротивлении ключей.
                  В общем дым не выйдет, но такой режим не рекомендуем. Про AVR не скажу, ибо не знаю.


                  1. kiltum
                    28.02.2017 13:30

                    Ну изначально был вопрос про то, как почувствует себя контроллер, когда ему на ножку дадут 100мА из-за неправильного поведения софта. Был ответ про внутренние ограничители в 20мА. И возник резонный вопрос про что имеется ввиду.

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


                    1. leocat33
                      28.02.2017 13:35

                      Надолго — не знаю, не пробовал. Но минуты на 2-3 случайно «коротил» единицу на корпус. Ничего не сгорело и даже не нагрелось. А вот при попадании 24V на любую ногу дым выходит практически мгновенно:)


                    1. Alexeyslav
                      28.02.2017 19:33

                      Конечно при 100мА через ножку она несомненно отгорит, но чтобы пошёл такой ток через вывод контроллера надо создать условия и как правило для этого необходимо повышенное напряжение.
                      Но тут дело в другом, при КЗ выходной транзистор войдёт в насыщение и станет стабилизатором тока, что при 3.3В питании не даст неограниченного роста тока, а только рост выделяемой мощности на ключе.
                      Если же туда попадёт сильные 5В то проблемы с портом отойдут на второй план, будет совершенно другая более масштабная проблема связанная с защитными диодами.


                      1. leocat33
                        28.02.2017 20:00

                        Про какой камень разговор? Про AVR?
                        На STM, если нога латентна к 5V, то ничего не произойдет, что-то читал в даташите на эту тему. Там какой то хитрый механизм компарации 5V с самой же ноги. Если не латентна, то может склеить ласты.


                        1. Alexeyslav
                          28.02.2017 22:37

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


  1. D_EL
    28.02.2017 15:24

    Почему бы не взять половинку с этой схемы?
    image


    1. Vedga
      28.02.2017 15:25

      А разве сделано так и не сделано? ;)