Преобразователи уровня логических сигналов, часть 1. Однонаправленная передача

У меня очень часто возникает задача преобразования уровня логических сигналов. К примеру, в недавнем проекте мне потребовалось как-то ввести в плату снаружи высоковольтный UART. Это был не обычный RS-232 с инвертированием и уровнями +12 (лог. 0) .. -12В (лог. 1), а именно что UART с уровнями 0 (лог. 0) .. 12В (лог. 1). Такой нестандартный протокол, кстати, раньше иногда встречался в ноутбуках.

Другой, даже более частый случай — согласование 3.3-вольтовых и 5-вольтовых микросхем. К примеру, такая необходимость практически всегда возникает при стыковке современных микроконтроллеров и каких-нибудь древних микросхем интерфейсов или силовых мостов. Ещё один пример это использование цветных ЖК-дисплеев (они часто требуют 1.8В) и соединение с ПЛИС, напряжение на выходе которых может доходить до 1.0-1.2В.

Ну и наконец, третий случай — использование низковольтных низкопотребляющих микросхем. Один из ярких примеров это магнитометр в составе датчика LSM303DLHC, который требует питания 1.8В. У него вроде как есть отдельный вход для питания ног I2C-интерфейса, но напряжение там не может превышать напряжения питания, и возникает задача стыковки 1.8 и 3.3В.

Назовём уровень напряжения низковольтной части Vcc_L, а высоковольтной — Vcc_H.

Чаще всего модули с разным уровнем напряжения питания всё-таки имеют общую землю, и я буду это неявно подозревать во всех следующих схемах. Таким образом, уровень лог. 0 нас не интересует потому что он передаётся и так хорошо. Все проблемы возникают при передаче логической 1, когда к примеру на вход микросхемы, рассчитанной на 3.3В попадает 5 вольт. В этом примере Vcc_L = 3.3В, Vcc_H = 5В.

Давайте также условимся различать «источник» сигнала — это тот элемент, который генерирует сигнал, и «приёмник», который принимает этот сигнал.

Передача большее → меньшее

Диод, замыкающий сигнал на линию питания

Простейший вариант, при котором вся схема сопряжения сводится до одного резистора.

Например, мы используем микросхему которая питается от 3.3В, а снаружи приходит 5 вольт. В одном из моих недавних проектов я использовал микросхему приёмника интерфейса RS-423, у которой на выходе было напряжение 5 вольт, и мне нужно было подключить её к МК STM32, который питается от 3.3В. Минимальное напряжение питания приёмника составляло 4.5 вольта, так что я не мог запитать её от тех же 3.3В.

Внутри STM32 около каждого вывода стоят защитные «диодные вилки» — последовательно включенные диоды (часто это диоды Шоттки), которые предохраняют пин от напряжений выше Vcc и ниже GND.

protection_diodes

При попадании 5В на такой 3.3В вход, верхний диод открывается, пропуская ток с пина на Vcc, при этом на диоде падает напряжение порядка 0.3В.

Этот диод довольно слаб, в даташите даже не приводятся его параметры. Если вы попытаетесь подавать на вход больше 3.6В в течение даже небольшого времени — диод сгорит, ваши 5 вольт попадут дальше в схему и в итоге сгорит всё.

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

conv_res-diodes

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

Таким образом, для ввода большего напряжения в цепь меньшего — убедитесь что в приёмнике стоят защитные диоды, и просто поставьте последовательно резистор в 1кОм.

conv_limiting-res

Если же этих диодов нет — поставьте снаружи свой.

conv_external-diodes

Расчёт сопротивления резистора можно провести, если знать предельный ток защитных диодов. Они представляют собой обычные интегральные диоды, значит что ток через них вряд ли может превышать 1мА. В даташитах очень редко приводят этот параметр, но можно найти значения порядка 0.5-1мА.

Также нам нужно вычислить напряжение, которое должно падать на резисторе: приходит 5 вольт, должно остаться 3.3В, минус падение напряжения на диоде 0.3В, итого 1.4В. Исходя из этого, номинал токоограничивающего резистора составит 1.4В / 0.5мА = 2.8кОм. Чтобы гарантированно остаться в щадящем режиме, возьмём резистор побольше: например 3.3кОм или 4.7кОм.

Резисторный делитель

Тоже часто используемый вариант, в котором высокое напряжение делится на делителе, рассчитанном так чтобы получить напряжение низковольтной части. Большая точность подбора номиналов не нужна: более высокое напряжение уйдёт в защитный диод (но номиналы резисторов не дадут ему пробиться), а более низкое по-прежнему будет детектироваться входной цепью.

conv_divider

Стабилитрон

Ещё одна простая схема, в которой напряжение ограничивает стабилитрон. Возьмите стабилитрон на 3.3 вольта, например BZX84C3V3. Точность подбора ограничивающего напряжения опять же неважна, можете взять стабилитрон на 3 вольта, если они окажутся доступнее. Токоограничивающий резистор — любой, номиналом от 1 до 10 кОм.

conv_zener

Три диода последовательно

Три стандартных кремниевых диода последовательно дадут падение напряжения 0.6 В * 3 = 1.8 В. Таким образом, с 5 вольт напряжение упадёт до 3.2.

conv_3-diodes

Экзотический вариант, в промышленной электронике я такого не видел.

Передача меньшее → большее

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

Транзистор

Простой вариант, который к тому же работает сам по себе, без использования внутренних цепей микросхем.

Поставьте инвертор на NPN-транзисторе, если инверсия сигнала нестрашна (например её можно сменить в МК)

conv_inverter

Или два инвертора последовательно, если сигнал нужно сохранить в той же полярности.

conv_dual-invertor

Конечно, в этих двух схемах можно использовать любой логический N-канальный полевой транзистор, например IRLM2502:

conv_fet-inverter

Эти схемы применимы и для передачи из большего напряжения в меньшее.

С другой стороны, очень часто бывает так, что на приёмнике диапазоны логических «0» и «1» пересекаются с соответствующими диапазонами источника. Например, типичный 3.3 источник генерирует логическую «1» напряжением 3.3 вольта, а типичная 5-вольтовая микросхема чувствует логическую «1» начиная уже с 2 вольт. Получается, что приёмник отлично видит перепады напряжения от источника, и никакие дополнительные меры вообще не нужны.

Оптрон

В дополнение к преобразованию уровня ещё и развязывает земли. Может проводить сигналы между двумя цепями, находящимися при потенциале до 1 киловольта друг относительно друга.

conv_opto

Расчёт номиналов резисторов прост, резистор в цепи светодиода рассчитывается как обычно: на светодиоде падает 1.7В, схема питается от 3.3В, значит на резисторе должно падать 1.6В при токе 5мА (стандартный ток для ИК-светодиода оптрона), это даёт 320 Ом, ближайшее значение 330 Ом. Такой же расчёт и для других напряжений.

Открытый коллектор

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

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

conv_different-outs

А вот открытый коллектор это такой каскад, который коммутирует только 0. Переключение к 1 он не делает, он лишь отключает 0. То есть, такому выходу обязательно нужен внешний резистор, который подтянет выход к 1 — а конкретное значение напряжения неважно.

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

conv_OD-pull-up

Однако, передача из меньшего к большему тоже возможна. Если мы опять подключим резистор к меньшему напряжению, на низковольтную часть не попадёт высокое напряжение, а высоковольтная логика (как в прошлом пункте) всё равно будет способна различать логические уровни, потому что порог переключения обычно довольно мал.

Таким образом, если источник сигнала имеет выход типа «открытый коллектор» — неважно, передаёте из L в H или наоборот, вам достаточно просто притянуть линию 10кОм-резистором к меньшему из двух напряжений. Проконтролируйте разве что параметр «Minimum high-level input voltage» у приёмника — он должен быть выше, чем напряжение питания низковольтной стороны, Vcc_L.

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

Схемы для двунаправленной передачи данных — во второй части статьи.

Ссылка на основную публикацию