1-Wire slave на МК. Часть 1: Железо


    Для одного из проектов по автоматизации потребовалось сделать устройство, которое является подчинённым 1-Wire устройством, принимает команды от мастера и выставляет на своих выходах значение аналогового сигнала в диапазоне от 0 до 10В.
    Проанализировав линейку стандартных микросхем 1-Wire от Maxim, стало ясно, что нет микросхемы, которая позволит реализовать подобный функционал.
    Потому было принято решение реализовывать 1-Wire slave на микроконтроллере. Надеюсь, данный материал будет интересен и полезен людям, которые делают «умный дом» своими руками, т.к. 1-Wire достаточно популярная шина в подобных проектах. В качестве камня был выбран МК Cortex M0+ ATSAMD20G16 от Atmel, но о реализации в коде расскажем во второй части. Забегая немного вперед, скажу что в третьей части цикла пойдет речь о реализации собственного семейства устройств для линуксовой библиотеки OWFS (One Wire File System). А сегодня расскажем о некоторых аппаратных решениях, к которым мы пришли в процессе разработки.

    Речь в основном пойдет о том как подключить ногу микроконтроллера к 1-Wire шине с минимальным вредом для здоровья. Будем двигаться от простого к сложному.

    Ничего не делать


    Первая проблема, с которой сталкиваешься при попытке собрать 1-Wire устройство на микроконтроллере с ядром Cortex – это уровень питания микроконтроллера 3.3В, в то время как на шине 1-Wire имеем 5В. Можно использовать толерантность ног микроконтроллера к 5В и подключать как есть, прямо к шине. К сожалению, ноги SAM D20 не толерантны к 5-ти вольтам, потому нам этот вариант не подошел, но отметить его, справедливости ради, стоит. Хотя, сажать внешнюю шину напрямую на ногу 3.3В камня идея не самая удачная. Во-первых, есть вероятность нестабильной работы других устройств на шине с паразитным питанием, во-вторых на длинном проводе можно «словить» наводку.

    Преобразование уровней



    Самый простой вариант — двунаправленный преобразователь уровня на транзисторе. Для него потребуется где-то брать 5В со стороны шины 1-Wire.
    Первый вариант — делать 5В на своем устройстве (помимо 3.3В) для «запитки» шины. Как следствие, усложнение схемотехники.
    Второй вариант — прокладывать шину 1-Wire в три провода. Третьим проводом идёт линия питания +5В. Из проблем — лишний провод, просадка напряжения на длинном проводе.

    Согласование уровней


    Если очень не хочется использовать +5В можно разделить сигнальную линию на 2 составляющих (вход и выход)

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

    Повышаем устойчивость


    Для того что бы сделать прием данных по 1-Wire более уверенным необходимо сделать крутые фронты импульсов со стороны микроконтроллера. Для этого воспользуемся компаратором от TI LMV331, который обеспечит более точный и резкий переход между логическими «0» и «1», а так же гистерезис 160mV. Еще заменим выходной би-полярный транзистор BC547 на полевой IRLML6346 и поставим защитный TVS диод ESD5Z6 на 6В.

    Для данной схемы компаратор потребуется запитать от 5В. Где их можно взять было сказано выше.

    Развязанный 1-Wire


    Для обеспечения электрической развязки шины 1-Wire и внутренней электроники устройства воспользуемся изолированным транслятором уровней ADuM1201, и изолированным DC/DC конвертор TES 1-1211. Как и в предыдущем случае, линию данных 1-Wire делим на 2 линии: 1W_Rx и 1W_Tx.

    DC/DC конвертор с 12 на 5 вольт взят для примера, можно использовать аналогичный 3.3/5.

    Остальная схемотехника


    Для полноты картины покажем схемотехнику подключения микроконтроллера, а так же выходных аналоговых каналов 0-10В.


    Т.к. протокол 1-Wire требует наличие уникального адреса для каждого устройства на шине, на плату ставим 1-Wire UID от Maxim DS2411. Будучи для неё мастером шины будем считывать её UID и использовать его в качестве собственного адреса. У DS2411 код семейства 0x01 (family code — старший байт UID’а). Мы же на сайте OWFS выберем незанятый код семейства для нашего нового устройства и будем подменять первый байт.

    Как уже было сказано, во второй части приступим к программной реализации протокола 1-Wire Slave.
    Rainbow
    Поставки электронных компонентов, инжиниринг
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 8

      0
      Вроде внимательно прочитал, но так и не понял этот момент:
      Самый простой вариант — двунаправленный преобразователь уровня на транзисторе. Для него потребуется где-то брать 5В со стороны шины 1-Wire.
      Первый вариант — делать 5В на своем устройстве (помимо 3.3В) для «запитки» шины. Как следствие, усложнение схемотехники.

      а дальше вы ставите LMV331, который запитываете от 5 Вольт.
        0
        да, тут от 5 вольт не уйти. под схемой об этом сказано. т.е. не для всех из перечисленных вариантов стоит цель не избавиться от 5В.
        0
        Опто-развязанный 1-Wire — Месье знает толк в извращениях.
          +1
          Мало того что опто-развязанный, еще и с внешним входным компаратором. Вообще статья из серии: как всунуть Cortex туда, где легко справится Tiny.
            0
            Как всунуть Cortex-A…
            0
            Да, вероятно задача специфичная. Но если питание МК не отвязано от питания 220В (например, сделано на конденсаторном делителе), то отвязывать придется интерфейс.
            Или вот апнота от Maxim, в которой показано как развязывать мастер. В аннотации там указано, что развязка обязательна для медицинских приборов.
            0
            А почему бы вместо компаратора не использовать триггер Шмитта? 74lvc1g17 прекрасно принимает на вход 5 В при питании от 3.3 В.
              0
              ну да, красивый вариант, похоже

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое