Драйвер шины используется в одном из моих проектов, поэтому нумерация элементов начинается не с «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.
Список литературы:
Комментарии (37)
kiltum
27.02.2017 20:52Оно точно работает? Потому что мне кажется, что будут работать либо с паразитным, либо с полным питанием… но это мелочи. Почему не использовать стандартную схему из аппноута maxim про usart? Там надо только добавить защиту от статики и все
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.Vedga
28.02.2017 09:25Возможно я неправильно понял исходный комментарий ;). Конечно, при активном PULLUP обе шины использовать не получится. Но т.к. PULLUP требуется не для всех операций, то все-таки можно сказать, что «обе шины можно использовать (и) одновременно».
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», нет промежуточных значений.
leocat33
28.02.2017 08:26Ну и еще… ( не хочу быть «погромщиком» проекта, так, совет ) вместо диодной сборки, как защиту, может быть разумнее использовать что то вроде NUP2105L? Диодная сборка. Диоды неполярные. Как раз для защиты линий. Предназначена для CAN, но хорошо работает и на 485-м и на w1.
Vedga
28.02.2017 09:19Спасибо за наводку, учту. Просто я программист, а не не схемотехник ;'(. А совет дельный!
GarryC
28.02.2017 09:42Посмотрим на схему повнимательнее:
- Сдвиг уровня — без него (наверное) не обойтись — оставляем.
- Мощное питание — пусть будет, но убираем инвертор сигнала — включить "нулем" не такая уж сложная задача.
- Формирователь нуля сигнала — все известные мне МК поддерживают режим "открытый коллектор", так что необходимость внешней схемы под вопросом.
Итого из 4 транзисторов остаются 2.
Две схемы защиты — внутреннюю убираем — не спасет она, если не спасла внешняя, и во всех известных мне МК она есть на ножках.
При этом реализация внешней защиты на дискретах, причем общего назначения — мне представляется сомнительной, тут просится специализированный компонент, причем у него внутри и стабилитрон есть, про который Вы просто забыли.
Это придирки, вызванные привычкой делать минимально необходимые схемы, а так, конечно, все работать будет и в таком варианте, если стабилитрон поставить.
Vedga
28.02.2017 11:12Можно подробнее по поводу «включить нулем»? Исток Q5 на +5V, затвор на нуле — включим. А сможем ли мы его выключить? Затвор +3.3V (а если более низковольтный МК?), исток +5V.
Формирователь нуля можно выбросить, согласен. Насколько велика вероятность спалить выход МК, включив из-за программной ошибки одновременно ACTIVE PULLUP и лог. 0 на выход?
Внутренняя защита исключительно для подключения второй внешней 1wire шины с сигналом 3V. Если используется только 1wire с сигналом 5V конечно она не нужна.
В любом случае спасибо за замечания. Я же говорю, эта макетка для демонстрации алгоритма работы из основной статьи, а не законченное целевое устройство. Которое пока еще в процессе разработки:)GarryC
01.03.2017 10:42Конечно, можем выключить, если возьмем выходной транзистор с соответствующим (например 4В) пороговым напряжением, а лучше вообще биполяр, при условии, что потерять 0.2В от питания нам не страшно. Опять таки, управляющий выход должен быть 5в толерантным.
Если мы допускаем возможность таких ошибок, то тут все весьма непросто. Мой опыт говорит, что спалить ножку МК не так легко, она начинает задирать выходное напряжение и ток ограничивается, но это все сугубо индивидуально для разных МК и разных ножек, а вот внешний транзистор уходит в отбой практически гарантировано, поскольку он мощнее на порядок.
Ваш подход (с определенной избыточностью) вполне оправдан, когда речь идет о макетах и прототипе, поскольку будет работать всегда и везде и это несомненное достоинство. Так что, наверное, зря я на него потащил свои представления о серии, когда каждый лишний транзистор — это минус 20 рублей из моего кармана).
Alexeyslav
28.02.2017 11:25Из-за защитных диодов в МК для Q5 что 0в что 3.3В(темболее для контроллеров работающих от 1.8В) будут активным нулём и он будет постоянно открыт.
В МК истинный «открытый коллектор» бывает крайне редко, и обычно это либо специализированный контроллер или вывод сброса. В остальных случаях на выходах контроллера напряжение не может выходить за рамки его же питания, даже если они находятся в высокоимпедансном состоянии. Для этого и задействован Q4, на его стоке напряжение ничем не ограничено.GarryC
01.03.2017 10:32Если в дата написано "5в толерантно", то вполне себе может выходить за рамки питания МК.
kiltum
28.02.2017 11:12Всю ночь не мог понять, что не так. «Что? Мне вообще все не нравится!» (с) Капитан Смоллет
Слишком сложно. Почему бы не сделать так, особенно когда изоляции не надо?
R1,R2,Q1,Q2 реализуют классическую схему от Maxim для USART. А Q3, R3 — это кусок от классической схемы I2C шифтера (AN97055). Ну и D1,D2 обеспечивают защиту. Можно заменить на TVS или соответствующую сборку. Имхо проще и дает 5В для 1wire.Vedga
28.02.2017 11:18А это не то же самое, только без active pullup? Да еще и с лишней инверсией на TX? Тогда уж просто на одном MOSFET делаем level shifter, притягивание к 0 средствами выхода MK, а active pullup еще двумя MOSFET разной структуры.
Остается вопрос по поводу вероятности спалить выход МК, ошибочно включив active pullup и попробовав выставить «0» на шине 1wire.kiltum
28.02.2017 11:24На TX не инверсия, а реализация open-drain. Подробнее тут https://www.maximintegrated.com/en/app-notes/index.mvp/id/214
А с active pullup я если честно ни разу не сталкивался. Поэтому и не использую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. Какого номинала должен быть подтягивающий резистор для обеспечения такого тока? ;)
kiltum
28.02.2017 11:27А. Еще раз посмотрел схему. Нет, даже если включить active pullup, то ничего не будет. Шифтер же сработает
Vedga
28.02.2017 11:40Сработает. Ток из pullup потечет через выходную ногу МК. Я не про опасность напряжения, я про опасность по току.
Vedga
28.02.2017 11:48В смысле что bss84/2n7002 держат по току 150-200mA (т.е. мы можем без проблем сделать active pullup на 100mA). А вот как отнесется выход МК к подаче через него 100mA для меня вопрос открытый ;)…
kiltum
28.02.2017 12:11так может, будет проще сделать по другому?
Поставить перед микроконтроллером оптоизолятор типа ISO7221 и закрыть на этом тему? Через него точно ничего не пройдет при любых внятных входных данных. Заодно и защита будет от всякой гадости на длинных линиях.leocat33
28.02.2017 12:21Только не ОПТО! Я уже писал про ADUM. Опто для цифровых цепей это еще та кака…
kiltum
28.02.2017 12:23Ну, как специалист предложите решение, гарантированно развязывающее МК и его оператора с внешней средой, обеспечивающее защиту от 1,5КВ выбросов (а такие уже будут на расстояниях в 50-100м).
leocat33
28.02.2017 12:50Так уже писал… ADUM1250 + NUP2105L. У меня максимальное удаление DS18B20 было метров 120-150. Но… Не рекомендую вешать все датчики на один провод. И тем более делать мешанину из датчиков и таблеток типа i-Button. Счастье будет еще то… Лучше каждый датчик на отдельную ногу процессора, с отдельным проводом. До тех пор, пока я не столкнулся с промышленностью и КИПовцами так и думал, что там напрягаться, на один провод и все. Даже спорил, с человеком имеющим большой опыт работ в АСУТП. Но жизнь вносит свои коррективы в сознание и миропонимание…
kiltum
28.02.2017 12:53Ну как-то не согласуется
Только не ОПТО! Я уже писал про ADUM. Опто для цифровых цепей это еще та кака
и тут жеТак уже писал… ADUM1250 + NUP2105L
Вы уже определитесь, надо или не надо.leocat33
28.02.2017 13:14Надо или нет — решать не мне. Но ADUM это не опто. Там совершенно другой принцип работы. Да это изолятор, но с магнитной гальванической развязкой представляют собой безопасную, надежную и простую в применении альтернативу оптопарам, что подтверждается их практическим внедрением более чем в миллиарде каналов изоляции.
Из всех использованных мною и с моим участием взорвался только один. Но там и полетели практически все источники питания. Веселая авария… Причем свою функцию ADUM выполнил и в этом случае: внутренние цепи не пострадали.kiltum
28.02.2017 13:25А, понял. Не, «оптоизолятор» я использовал в общем смысле. Что ISO, что ADUM используют одну и ту же технологию. Главная суть комментария была в том, что бы развязать ножки контроллера от схемы, что бы ток куда не надо не тек
leocat33
28.02.2017 12:13А никак. В большинстве случаев (МК большинства производителей) сработает внутренний ограничитель на 20мА. В качестве эксперимента можете подключить светодиод просто к ноге МК. Ну будет очень ярко светить. Но… возможны проблемы с устойчивой работой ибо у разных МК разный предельный ток потребления… Не просто так выведено несколько ножек питания и несколько ножек земли…
kiltum
28.02.2017 12:25+1«внутренний ограничитель»? Это белый дым?
В любом даташите на любой МК прописан максимальный ток, который можно снять/подать с одной ножки и на процессор в целом.leocat33
28.02.2017 13:05Не, «волшебный дым». Микросхемы работают на волшебном дыму. Если дым из микросхемы выходит, то она работать перестает.
А если серьезно, то не знаю как в других МК но в STM32F100 — 48 ног, смотрю по даташитам: Максимально допустимый выходной ток одного вывода составляет 25 мА; если нагружены несколько выводов, то нужно учитывать ограничение по току линий питания микроконтроллера и линий земли величиной 150 мА. В то же время общее сопротивление выходных транзисторов составляет что-то около 120 ом при 3.3V. Т.е. как раз и есть эти самые 25мА.
В то же время: Разумеется, не следует допускать работу выводов при максимальном токе. Во-первых должен быть запас для более надёжной работы, во-вторых с увеличением тока, смещаются уровни сигналов на выходе из-за падения напряжения на внутреннем сопротивлении ключей.
В общем дым не выйдет, но такой режим не рекомендуем. Про AVR не скажу, ибо не знаю.kiltum
28.02.2017 13:30Ну изначально был вопрос про то, как почувствует себя контроллер, когда ему на ножку дадут 100мА из-за неправильного поведения софта. Был ответ про внутренние ограничители в 20мА. И возник резонный вопрос про что имеется ввиду.
Если вы надеетесь, что «выходные транзисторы с сопротивлением 120 ом» способны переварить такой ток, то у меня плохие новости.leocat33
28.02.2017 13:35Надолго — не знаю, не пробовал. Но минуты на 2-3 случайно «коротил» единицу на корпус. Ничего не сгорело и даже не нагрелось. А вот при попадании 24V на любую ногу дым выходит практически мгновенно:)
Alexeyslav
28.02.2017 19:33Конечно при 100мА через ножку она несомненно отгорит, но чтобы пошёл такой ток через вывод контроллера надо создать условия и как правило для этого необходимо повышенное напряжение.
Но тут дело в другом, при КЗ выходной транзистор войдёт в насыщение и станет стабилизатором тока, что при 3.3В питании не даст неограниченного роста тока, а только рост выделяемой мощности на ключе.
Если же туда попадёт сильные 5В то проблемы с портом отойдут на второй план, будет совершенно другая более масштабная проблема связанная с защитными диодами.leocat33
28.02.2017 20:00Про какой камень разговор? Про AVR?
На STM, если нога латентна к 5V, то ничего не произойдет, что-то читал в даташите на эту тему. Там какой то хитрый механизм компарации 5V с самой же ноги. Если не латентна, то может склеить ласты.Alexeyslav
28.02.2017 22:37Помоему там нет хитростей, просто вместо защитных диодов стоят низковольтные стабилитроны, которые позволяют подняться напряжению на пине выше напряжения питания. В случае с обычными диодами это доли вольта, стабилитрон позволяет поднять это напряжение.
Поведение выходного драйвера оно не зависит от типа контролера, там те же полевики применяют которые становятся источниками тока при увеличении нагрузки при постоянном напряжении на затворе. им страшен разве что тепловой пробой. Причем надо заметить, чем меньше напряжение питания тем меньше ограничение тока на выходе.
VDG
Без обид, но куда так спешить с выкладыванием статьи? Перенос куска схемы в отдельный проект (да хоть в копию из основного) и перенумерование элементов и входов заняло бы пять минут.
Vedga
Привычка программиста: копипаст в статью гарантирует отсутствие случайных ошибок. Но, конечно, обозначения элементов надо было сделать по-человечески.