Level converter arduino схема
У меня очень часто возникает задача преобразования уровня логических сигналов. К примеру, в недавнем проекте мне потребовалось как-то ввести в плату снаружи высоковольтный 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В.
Давайте также условимся различать «источник» сигнала — это тот элемент, который генерирует сигнал, и «приёмник», который принимает этот сигнал.
2 Пример подключения преобразователя логического уровня
Давайте посмотрим на практическом примере, как работает преобразователь уровня.
Для этого подключимся к какому-нибудь 3-вольтовому датчику, например, датчику температуры и влажности HTU21D. Этот датчик управляется по интерфейсу I2C, и ему необходим 3-вольтовый сигнал управления. В то же время Arduino генерирует 5-вольтовый сигнал. Тут нам и придёт на помощь преобразователь логического уровня. Соединим устройства по такой схеме:
Схема подключения датчика HTU21D к Arduino через преобразователь логического уровня
Для того чтобы использовать датчик, скачаем библиотеку HTU21D (она также приложена внизу статьи). Установим библиотеку как обычно. Загрузим пример SparkFun_HTU21D_Demo (File Examples SparkFun HTU21D humidity and temperature sensor breakout). В мониторе порта побегут измеренные значения температуры и влажности. Вживую это выглядит так:
Работа с датчиком HTU21D посредством Arduino и преобразователя
Сгорит ли датчик HTU21D, если его подключить напрямую к Arduino без преобразователя уровня? Вряд ли. Но он будет работать на повышенном напряжении, что сократит срок его службы на неопределённое время. Кроме того, датчик может греться, а значит, будет искажать показания и температуры, и влажности. Также возможны «глюки» в управлении. Поэтому лучше всё же подключать датчик HTU21D к Arduino через конвертер уровня. На крайний случай, если его нет, можно подключить линии SDA и SCL датчика через ограничительные резисторы сопротивлением ~330 Ом.
Более подробно о работе с сенсором HTU21D рассказывается в следующей статье.
Открытый коллектор
Самый лучший и удобный вариант, который только можно представить. Если источник сигнала выполнен по схеме с открытым коллектором — вам вообще не нужно делать согласование уровней.
В предыдущих вариантах мы говорили только о пуш-пулл выходах, т.е. таких выходах где и 0 и 1 генерируются «честно», отдельными транзисторами.
А вот открытый коллектор это такой каскад, который коммутирует только 0. Переключение к 1 он не делает, он лишь отключает 0. То есть, такому выходу обязательно нужен внешний резистор, который подтянет выход к 1 — а конкретное значение напряжения неважно.
Таким образом, для передачи из большего к меньшему с условием выхода «открытый коллектор» нужен лишь резистор, подтягивающий линию к меньшему напряжению.
Однако, передача из меньшего к большему тоже возможна. Если мы опять подключим резистор к меньшему напряжению, на низковольтную часть не попадёт высокое напряжение, а высоковольтная логика (как в прошлом пункте) всё равно будет способна различать логические уровни, потому что порог переключения обычно довольно мал.
Таким образом, если источник сигнала имеет выход типа «открытый коллектор» — неважно, передаёте из L в H или наоборот, вам достаточно просто притянуть линию 10кОм-резистором к меньшему из двух напряжений. Проконтролируйте разве что параметр «Minimum high-level input voltage» у приёмника — он должен быть выше, чем напряжение питания низковольтной стороны, Vcc_L.
Все эти схемы очень просты, но годятся только для сопряжения одной-двух цепей, дальше уже начинается слишком много «рассыпухи». Если вам нужно преобразовать сразу целую шину из десятка сигналов — лучше использовать специализированные микросхемы, о которых я расскажу в третьей части.
Стабилитрон
Ещё одна простая схема, в которой напряжение ограничивает стабилитрон. Возьмите стабилитрон на 3.3 вольта, например BZX84C3V3. Точность подбора ограничивающего напряжения опять же неважна, можете взять стабилитрон на 3 вольта, если они окажутся доступнее. Токоограничивающий резистор — любой, номиналом от 1 до 10 кОм.
Оптрон
В дополнение к преобразованию уровня ещё и развязывает земли. Может проводить сигналы между двумя цепями, находящимися при потенциале до 1 киловольта друг относительно друга.
Расчёт номиналов резисторов прост, резистор в цепи светодиода рассчитывается как обычно: на светодиоде падает 1.7В, схема питается от 3.3В, значит на резисторе должно падать 1.6В при токе 5мА (стандартный ток для ИК-светодиода оптрона), это даёт 320 Ом, ближайшее значение 330 Ом. Такой же расчёт и для других напряжений.
1 Назначение и описание преобразователя уровня сигнала
Для коммуникации с цифровыми устройствами (датчиками, контроллерами и т.д.) и управления ими используется цифровой сигнал. Цифровой сигнал – это такой сигнал, в котором вся необходимая информация кодируется двумя уровнями напряжения, т.н. логическим нулём и логической единицей. За логический "0" обычно (но не обязательно) принимают напряжение 0 В, за логическую "1" – высокий уровень напряжения. Высокий он называется только относительно логического нуля. По факту это обычно довольно слабые напряжения. Самые распространённые на сегодня напряжения для передачи цифрового сигнала это 5 В и 3.3 В. Техника развивается, технологии изготовления цифровых устройств не стоят на месте. Поэтому в последнее время также встречаются более низкие напряжения 2.4 и 1.2 В. Подробнее о напряжениях, применяемых в цифровой технике, можно почитать здесь.
Если ваш микроконтроллер использует 5-вольтовую логику (как, например, Arduino), то нельзя просто взять и подключить к нему напрямую устройство, в котором применяется другой логический уровень. Для согласования уровней применяются специальные преобразователи напряжения.
В англоязычной литературе их могут называть по-разному: logic shifter, level shifter, level converter.
Кроме того, бывают преобразователи однонаправленные и двунаправленные. Однонаправленные преобразователи уровня могут преобразовывать сигналы, идущие только в одну сторону, как правило, от контроллера к управляемому устройству. Двунаправленные преобразователи, соответственно, преобразуют сигнал и от контроллера к устройству, и в обратную сторону.
Пример 4-канального двунаправленного преобразователя уровня показан на фотографии. Его основной элемент – четыре транзистора BSS138, которые обеспечивают быструю коммутацию сигналов.
4-канальный преобразователь логического уровня на транзисторах BSS138
Иногда каналы обозначаются не HV и LV, а по-другому. Например, A и B.
Как не сложно догадаться, сигналы необходимо подключать к соответствующим выводам. Например, если вы подключаете линию тактовой частоты контроллера к высоковольтному каналу HV3, то с другой стороны она будет выходить из канала LV3.
Ещё один пример преобразователя напряжения уровня – модуль HW-221 на основе микросхемы TXS0108E.
Здесь уже имеются 8 вводов-выводов. Причём к выводам со стороны порта A (A1…A8) должна подключаться низковольтовая логика, а к выводам B1…B8 – высоковольтная. Соответственно, питание VCCA должно быть от 1.4 до 3.6 В, а питание VCCB – от 1.65 до 5.5 В. Напряжение VCCA должно быть не больше, чем VCCB. Также на данном модуле присутствует вход разрешения работы OE. Работа разрешена при подключении его к питанию VCCA. При подключении OE к земле, все вводы-выводы переходят в третье состояние.
Передача большее → меньшее
Диод, замыкающий сигнал на линию питания
Простейший вариант, при котором вся схема сопряжения сводится до одного резистора.
Например, мы используем микросхему которая питается от 3.3В, а снаружи приходит 5 вольт. В одном из моих недавних проектов я использовал микросхему приёмника интерфейса RS-423, у которой на выходе было напряжение 5 вольт, и мне нужно было подключить её к МК STM32, который питается от 3.3В. Минимальное напряжение питания приёмника составляло 4.5 вольта, так что я не мог запитать её от тех же 3.3В.
Внутри STM32 около каждого вывода стоят защитные «диодные вилки» — последовательно включенные диоды (часто это диоды Шоттки), которые предохраняют пин от напряжений выше Vcc и ниже GND.
При попадании 5В на такой 3.3В вход, верхний диод открывается, пропуская ток с пина на Vcc, при этом на диоде падает напряжение порядка 0.3В.
Этот диод довольно слаб, в даташите даже не приводятся его параметры. Если вы попытаетесь подавать на вход больше 3.6В в течение даже небольшого времени — диод сгорит, ваши 5 вольт попадут дальше в схему и в итоге сгорит всё.
Однако можно обеспечить этому диоду гораздо более мягкие условия, и таким образом использовать его как элемент нашей схемы конвертера уровня. Для этого достаточно просто поставить резистор последовательно с входной цепью. Номинал не очень важен, но можно начать с 4.7кОм.
Теперь в первый момент времени на вход попадают 5 вольт, спустя несколько десятков микросекунд диод открывается и даёт этому высокому напряжению стечь в цепь Vcc. Ток мог бы очень сильно вырасти, но ему мешает резистор, который ограничивает ток всего до каких-то полутора миллиампер. Конечно, в таком режиме диод может работать неограниченно долго.
Таким образом, для ввода большего напряжения в цепь меньшего — убедитесь что в приёмнике стоят защитные диоды, и просто поставьте последовательно резистор в 1кОм.
Если же этих диодов нет — поставьте снаружи свой.
Расчёт сопротивления резистора можно провести, если знать предельный ток защитных диодов. Они представляют собой обычные интегральные диоды, значит что ток через них вряд ли может превышать 1мА. В даташитах очень редко приводят этот параметр, но можно найти значения порядка 0.5-1мА.
Также нам нужно вычислить напряжение, которое должно падать на резисторе: приходит 5 вольт, должно остаться 3.3В, минус падение напряжения на диоде 0.3В, итого 1.4В. Исходя из этого, номинал токоограничивающего резистора составит 1.4В / 0.5мА = 2.8кОм. Чтобы гарантированно остаться в щадящем режиме, возьмём резистор побольше: например 3.3кОм или 4.7кОм.
2 Пример подключения преобразователя логического уровня
Давайте посмотрим на практическом примере, как работает преобразователь уровня.
Для этого подключимся к какому-нибудь 3-вольтовому датчику, например, датчику температуры и влажности HTU21D. Этот датчик управляется по интерфейсу I2C, и ему необходим 3-вольтовый сигнал управления. В то же время Arduino генерирует 5-вольтовый сигнал. Тут нам и придёт на помощь преобразователь логического уровня. Соединим устройства по такой схеме:
Схема подключения датчика HTU21D к Arduino через преобразователь логического уровня
Для того чтобы использовать датчик, скачаем библиотеку HTU21D (она также приложена внизу статьи). Установим библиотеку как обычно. Загрузим пример SparkFun_HTU21D_Demo (File Examples SparkFun HTU21D humidity and temperature sensor breakout). В мониторе порта побегут измеренные значения температуры и влажности. Вживую это выглядит так:
Работа с датчиком HTU21D посредством Arduino и преобразователя
Сгорит ли датчик HTU21D, если его подключить напрямую к Arduino без преобразователя уровня? Вряд ли. Но он будет работать на повышенном напряжении, что сократит срок его службы на неопределённое время. Кроме того, датчик может греться, а значит, будет искажать показания и температуры, и влажности. Также возможны «глюки» в управлении. Поэтому лучше всё же подключать датчик HTU21D к Arduino через конвертер уровня. На крайний случай, если его нет, можно подключить линии SDA и SCL датчика через ограничительные резисторы сопротивлением ~330 Ом.
Более подробно о работе с сенсором HTU21D рассказывается в следующей статье.
Конвертер логических уровне представляет собой небольшое устройство, которое понижает сигнал с 5 В до 3.3 В, либо повышает его от 3.3 В до 5 В. Данный модуль понадобиться при подключении Arduino UNO (с напряжением логики 5 В) с модулем Bluetooth HC-05 (с напряжением логики 3.3 В). В этой статье расскажу об трех конвертеров логических уровней.
Конвертер логических уровней 5В в 3.3В / 3.3В в 5В, 2/4-канала
Общие сведения
Расскажу только о двух канальном конвертеры, так как он очень похож на четырех канальный. Для работы модуля необходимо два напряжения, высокое 5 В (HV) и низкое 3.3 В (LV). Если посмотреть на схему то можно увидеть, что модуль разделен на блоки. Первый часть схемы состоит из одного N-канального MOSFET транзистора марки BSS138 и пару резисторов, которые подтягивают линии TX_LV (LV1) к 3.3 В и TX_HV (HV1) к 5 В. То-есть линии TX_LV (LV1) и TX_HV (HV1) всегда в логической единице (3.3 В или 5 В) и транзистор закрыт, но если линию TX_LV (LV1) или TX_HV (HV1) подтянуть к земле, транзистор откроется там самым закоротит всю линию TX (LV) к логическому нулю. Вторая часть схемы собрана на двух резисторов образуя делитель напряжения.
У четырех канального конвертера нету схемы с делителем напряжения, а есть четыре блока с MOSFET транзисторами
Схема конвертера логических уровней 5В в 3.3В / 3.3В в 5В, 2 — канала
Схема конвертера логических уровней 5В в 3.3В / 3.3В в 5В, 4 — канала
Назначение выводов
Модуль содержит 12 контактов, шесть по каждую сторону. На одной стороне расположены контакты с высоким напряжением 5 В, а с другой с низким напряжением 3.3 В.
► HV и GND — Высокое напряжение (5 В)
► LV и GND — Низкое напряжение (3.3 В)
► TX0 (LV1), RX0 (LV2), TX1 (LV3), RX1 (LV4) — Логические вывода с низким напряжением (3.3 В).
► TX0 (HV1), RX0 (HV2), TX1 (HV3), RX1 (HV4) — Логические вывода с высоким напряжением (5 В).
Купить на Aliexpress
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Конвертер логических уровней 4 — канала
Купить в Самаре и области
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Конвертер логических уровней 4 — канала
1 Назначение и описание преобразователя уровня сигнала
Для коммуникации с цифровыми устройствами (датчиками, контроллерами и т.д.) и управления ими используется цифровой сигнал. Цифровой сигнал – это такой сигнал, в котором вся необходимая информация кодируется двумя уровнями напряжения, т.н. логическим нулём и логической единицей. За логический "0" обычно (но не обязательно) принимают напряжение 0 В, за логическую "1" – высокий уровень напряжения. Высокий он называется только относительно логического нуля. По факту это обычно довольно слабые напряжения. Самые распространённые на сегодня напряжения для передачи цифрового сигнала это 5 В и 3.3 В. Техника развивается, технологии изготовления цифровых устройств не стоят на месте. Поэтому в последнее время также встречаются более низкие напряжения 2.4 и 1.2 В. Подробнее о напряжениях, применяемых в цифровой технике, можно почитать здесь.
Если ваш микроконтроллер использует 5-вольтовую логику (как, например, Arduino), то нельзя просто взять и подключить к нему напрямую устройство, в котором применяется другой логический уровень. Для согласования уровней применяются специальные преобразователи напряжения.
В англоязычной литературе их могут называть по-разному: logic shifter, level shifter, level converter.
Кроме того, бывают преобразователи однонаправленные и двунаправленные. Однонаправленные преобразователи уровня могут преобразовывать сигналы, идущие только в одну сторону, как правило, от контроллера к управляемому устройству. Двунаправленные преобразователи, соответственно, преобразуют сигнал и от контроллера к устройству, и в обратную сторону.
Пример 4-канального двунаправленного преобразователя уровня показан на фотографии. Его основной элемент – четыре транзистора BSS138, которые обеспечивают быструю коммутацию сигналов.
4-канальный преобразователь логического уровня на транзисторах BSS138
Иногда каналы обозначаются не HV и LV, а по-другому. Например, A и B.
Как не сложно догадаться, сигналы необходимо подключать к соответствующим выводам. Например, если вы подключаете линию тактовой частоты контроллера к высоковольтному каналу HV3, то с другой стороны она будет выходить из канала LV3.
Ещё один пример преобразователя напряжения уровня – модуль HW-221 на основе микросхемы TXS0108E.
Здесь уже имеются 8 вводов-выводов. Причём к выводам со стороны порта A (A1…A8) должна подключаться низковольтовая логика, а к выводам B1…B8 – высоковольтная. Соответственно, питание VCCA должно быть от 1.4 до 3.6 В, а питание VCCB – от 1.65 до 5.5 В. Напряжение VCCA должно быть не больше, чем VCCB. Также на данном модуле присутствует вход разрешения работы OE. Работа разрешена при подключении его к питанию VCCA. При подключении OE к земле, все вводы-выводы переходят в третье состояние.
Резисторный делитель
Тоже часто используемый вариант, в котором высокое напряжение делится на делителе, рассчитанном так чтобы получить напряжение низковольтной части. Большая точность подбора номиналов не нужна: более высокое напряжение уйдёт в защитный диод (но номиналы резисторов не дадут ему пробиться), а более низкое по-прежнему будет детектироваться входной цепью.
Передача меньшее → большее
Более сложные схемы, которые применяются для повышения уровня логического сигнала, но могут использоваться и для понижения.
Три диода последовательно
Три стандартных кремниевых диода последовательно дадут падение напряжения 0.6 В * 3 = 1.8 В. Таким образом, с 5 вольт напряжение упадёт до 3.2.
Экзотический вариант, в промышленной электронике я такого не видел.
Транзистор
Простой вариант, который к тому же работает сам по себе, без использования внутренних цепей микросхем.
Поставьте инвертор на NPN-транзисторе, если инверсия сигнала нестрашна (например её можно сменить в МК)
Или два инвертора последовательно, если сигнал нужно сохранить в той же полярности.
Конечно, в этих двух схемах можно использовать любой логический N-канальный полевой транзистор, например IRLM2502:
Эти схемы применимы и для передачи из большего напряжения в меньшее.
С другой стороны, очень часто бывает так, что на приёмнике диапазоны логических «0» и «1» пересекаются с соответствующими диапазонами источника. Например, типичный 3.3 источник генерирует логическую «1» напряжением 3.3 вольта, а типичная 5-вольтовая микросхема чувствует логическую «1» начиная уже с 2 вольт. Получается, что приёмник отлично видит перепады напряжения от источника, и никакие дополнительные меры вообще не нужны.
1 Назначение и описание преобразователя уровня сигнала
Для коммуникации с цифровыми устройствами (датчиками, контроллерами и т.д.) и управления ими используется цифровой сигнал. Цифровой сигнал – это такой сигнал, в котором вся необходимая информация кодируется двумя уровнями напряжения, т.н. логическим нулём и логической единицей. За логический "0" обычно (но не обязательно) принимают напряжение 0 В, за логическую "1" – высокий уровень напряжения. Высокий он называется только относительно логического нуля. По факту это обычно довольно слабые напряжения. Самые распространённые на сегодня напряжения для передачи цифрового сигнала это 5 В и 3.3 В. Техника развивается, технологии изготовления цифровых устройств не стоят на месте. Поэтому в последнее время также встречаются более низкие напряжения 2.4 и 1.2 В. Подробнее о напряжениях, применяемых в цифровой технике, можно почитать здесь.
Если ваш микроконтроллер использует 5-вольтовую логику (как, например, Arduino), то нельзя просто взять и подключить к нему напрямую устройство, в котором применяется другой логический уровень. Для согласования уровней применяются специальные преобразователи напряжения.
В англоязычной литературе их могут называть по-разному: logic shifter, level shifter, level converter.
Кроме того, бывают преобразователи однонаправленные и двунаправленные. Однонаправленные преобразователи уровня могут преобразовывать сигналы, идущие только в одну сторону, как правило, от контроллера к управляемому устройству. Двунаправленные преобразователи, соответственно, преобразуют сигнал и от контроллера к устройству, и в обратную сторону.
Пример 4-канального двунаправленного преобразователя уровня показан на фотографии. Его основной элемент – четыре транзистора BSS138, которые обеспечивают быструю коммутацию сигналов.
4-канальный преобразователь логического уровня на транзисторах BSS138
Иногда каналы обозначаются не HV и LV, а по-другому. Например, A и B.
Как не сложно догадаться, сигналы необходимо подключать к соответствующим выводам. Например, если вы подключаете линию тактовой частоты контроллера к высоковольтному каналу HV3, то с другой стороны она будет выходить из канала LV3.
Ещё один пример преобразователя напряжения уровня – модуль HW-221 на основе микросхемы TXS0108E.
Здесь уже имеются 8 вводов-выводов. Причём к выводам со стороны порта A (A1…A8) должна подключаться низковольтовая логика, а к выводам B1…B8 – высоковольтная. Соответственно, питание VCCA должно быть от 1.4 до 3.6 В, а питание VCCB – от 1.65 до 5.5 В. Напряжение VCCA должно быть не больше, чем VCCB. Также на данном модуле присутствует вход разрешения работы OE. Работа разрешена при подключении его к питанию VCCA. При подключении OE к земле, все вводы-выводы переходят в третье состояние.
2 Пример подключения преобразователя логического уровня
Давайте посмотрим на практическом примере, как работает преобразователь уровня.
Для этого подключимся к какому-нибудь 3-вольтовому датчику, например, датчику температуры и влажности HTU21D. Этот датчик управляется по интерфейсу I2C, и ему необходим 3-вольтовый сигнал управления. В то же время Arduino генерирует 5-вольтовый сигнал. Тут нам и придёт на помощь преобразователь логического уровня. Соединим устройства по такой схеме:
Схема подключения датчика HTU21D к Arduino через преобразователь логического уровня
Для того чтобы использовать датчик, скачаем библиотеку HTU21D (она также приложена внизу статьи). Установим библиотеку как обычно. Загрузим пример SparkFun_HTU21D_Demo (File Examples SparkFun HTU21D humidity and temperature sensor breakout). В мониторе порта побегут измеренные значения температуры и влажности. Вживую это выглядит так:
Работа с датчиком HTU21D посредством Arduino и преобразователя
Сгорит ли датчик HTU21D, если его подключить напрямую к Arduino без преобразователя уровня? Вряд ли. Но он будет работать на повышенном напряжении, что сократит срок его службы на неопределённое время. Кроме того, датчик может греться, а значит, будет искажать показания и температуры, и влажности. Также возможны «глюки» в управлении. Поэтому лучше всё же подключать датчик HTU21D к Arduino через конвертер уровня. На крайний случай, если его нет, можно подключить линии SDA и SCL датчика через ограничительные резисторы сопротивлением ~330 Ом.
Более подробно о работе с сенсором HTU21D рассказывается в следующей статье.
Читайте также: