Open drain output что это
Перейти к содержимому

Open drain output что это

  • автор:

Push-pull VS open-drain.

Push-pull VS open-drain.

На картинке видно, что open-drain может быть с внутренней подтяжкой и без неё.
Если использовать подтяжку становится вообще непонятно чем он отличается от push-pull.

А теперь давайте подумаем, что будет если мы соединим два PP выхода и установим на них разные логические уровни?

Push-pull VS open-drain.

Из-за конфликта уровней один из выходов просто выгорит, так как ток, возникший из-за разности потенциалов, ни чем не ограничен.
А теперь так же соединим два вывода OD.

Push-pull VS open-drain.

Видно, что потенциал линии притянется к земле и ничего не сгорит. Следовательно выводы OD можно соединять между собой не боясь чего-нибудь сжечь. Но если через один вывод можно пропустить 20 мА, то объединив 5 выводов, через них можно пропустить 100мА.

Push-pull VS open-drain.

Это и есть тот случай когда PP не может заменить OD.

А теперь представим другую ситуацию, есть шина данных, например, I2C у которой логическая единица не соответствует напряжению нашего МК и равна либо 1.8, либо 5 вольт. В обоих случаях, используя PP выход, подключить МК к такой шине не получится потому, что PP не может выдать ни 1.8, ни 5 вольт. Но это очень просто сделать, используя OD и внешний подтягивающий резистор.

STM32: Урок 4 — GPIO

GPIO (General Purpose Input-Output) — это выводы общего назначения, ноги микроконтроллера, доступные для прямого управления. Это обычно довольно дефицитный ресурс во многих популярных МК, но с STM32 эта проблема теряет актуальность: в самом мелком корпусе (LQFP48) доступно 37 GPIO, а в самом большом (LQFP176) — 140 GPIO. И всё это богатство ещё и настраивается вдоль и поперёк. Но, обо всём по порядку.

Для начала откроем руководство по STM32F100xx и взглянем на схему вывода порта:

Сами МК питаются 3.3 В, но до сих пор ещё активно используются 5-вольтовые микросхемы и логика, а их нужно как-то подключать. Поэтому в STM32 большинство выводов «толерантны» к 5 В — уж не знаю, как ещё перевести термин «5 V tolerant». То есть, они могут принимать на вход 5 В без какой-либо угрозы их здоровью.

Толерантный пин отличается от обычного только тем, что у него верхний защитный диод подключён к Vdd_ft вместо Vdd. Из этой схемы становится понятно, что хоть выводы и толерантны к 5 В на вход, но вот выдавать 5 В на выход не могут — тут уже нужен транзистор. Если нужно получить логическую единичку, то это не проблема — 3.3 В вполне распознаются 5-вольтовой логикой как 1, но если нужно именно 5 В, то есть решение — режим Open-drain у GPIO.

Всего у STM32F10x режимов GPIO имеется 8.

Выход общего назначения:

  • Push-pull, стандартный выход: выставляешь 0 в выходном регистре — получаешь низкий уровень на выходе, выставляешь 1 — получаешь высокий.
  • Open-drain (открытый сток, аналог открытого коллектора): вывод подключен к стоку N-MOS полевика в то время, как P-MOS полевик заперт, что позволяет управлять нагрузкой с большим напряжением, чем Vdd (3.3 В). Кому там нужно 5 В на выход? Ниже я расскажу, как их получить.

Выход с альтернативной функцией (для периферии типа SPI, UART):

  • Analog, аналоговый высокоимпендансный: подтягивающие резисторы и триггер Шмитта отключены. Используется при работе с АЦП.
  • Floating, обычный высокоимпендансный: подтягивающие резисторы отключены, триггер Шмитта включен.
  • Pull-up, вход с подтяжкой к питанию.
  • Pull-down, вход с прижатием у к «земле».

Как водится, линии GPIO объединены в порты, в STM32 — по 16 линий, поэтому нумеруются они с 0 по 15: PA0, PA1 .. PA15 — это линии порта A, например. Линии порта управляются программно с помощью нескольких регистров.

GPIOx_CRL и GPIOx_CRH — регистры конфигурации, содержат настройки режима (вход/выход) и частоты GPIO. Доступны на чтение и запись.

GPIOx_IDR и GPIOx_ODR — входной и выходной регистры: в первом хранится считанное со входов порта значение, во второй записывается новое состояние выводов. GPIOx_IDR доступен только на чтение, а GPIOx_ODR — на чтение и запись.

GPIOx_BSRR и GPIOx_BRR — регистры атомарного изменения битов в GPIOx_ODR.
Обычно, если нужно установить бит в регистре периферии, то его сначала нужно прочитать, потом применить побитовое ‘ИЛИ’ к считанному значению и битовой маске, после чего записать новое значение назад в регистр. То же и со сбросом битов, только маску нужно инвертировать и применить побитовое ‘И’. А вот запись значений в GPIOx_BSRR и GPIOx_BRR изменяет только те биты выходного регистра, которые были установлены в единицу, притом происходит это за 1 такт, так что прерывание не сможет ворваться и всё испортить. Проиллюстрирую кодом:

const uint32_t mask = 1 

Оба регистра доступны только на запись.

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

В структуре GPIO_InitTypeDef из SPL, которую мы использовали в предыдущем уроке для инициализации GPIO, за режим отвечает поле GPIO_Mode, а константы для его заполнения имеют следующие имена:

  • GPIO_Mode_Out_PP - выход push-pull
  • GPIO_Mode_Out_OD - выход open-drain
  • GPIO_Mode_AF_PP - альтернативная функция, push-pull
  • GPIO_Mode_AF_OD - альтернативная функция, open-drain
  • GPIO_Mode_AIN - аналоговый высокоимпендансный вход
  • GPIO_Mode_IN_FLOATING - высокоимпендансный
  • GPIO_Mode_IPU - вход с подтяжкой к питанию
  • GPIO_Mode_IPD - вход с прижатием к земле

Подсмотреть это и многое другое можно в заголовочном файле stm32f10x_gpio.h, а в руководстве можно узреть ещё много интересного, включая детальные описания режимов и таблицу с описанием режимов GPIO для разной периферии - UART, SPI, I2C и др.

Пример инициализации GPIO для модуля USART1 и самого модуля на STM32VLDiscovery:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef gpio; GPIO_StructInit(&gpio); /* TX: выход push-pull */ gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Pin = GPIO_Pin_9; GPIO_Init(GPIOA, &gpio); /* RX: высокоимпендансный вход */ gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; gpio.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOA, &gpio); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); USART_InitTypeDef usart; /* Параметры по умолчанию: 9600 бод, 8 бит данных, 1 стоп-бит */ USART_StructInit(&usart); USART_Init(USART1, &usart); USART_Cmd(USART1, ENABLE);

Что касается режима Open-drain, тут всё не так прямолинейно, как с другими режимами. Так как устройство, которым предполагается управлять, подключено к открытому стоку, нужно чуть более сложное соединение, чем обычно, а управление будет инверсное: выставляешь выход в 1 - ток с верхнего резистора идёт на землю, устройство видит на линии 0; выставляешь 0 - полевик запирается, ток идёт на устройство, на линии уровень 1.

Разработчики STM32 также позаботились об энергопотреблении и о снижении уровня помех, предусмотрев настройку частоты: по сути, входной и в ыходной регистры GPIO тактируются от отдельного источника, что позволяет задать свою частоту каждой ножке МК. Для STM32F10x доступны 3 частоты, которые представлены константами:

  • GPIO_Speed_10MHz
  • GPIO_Speed_2MHz
  • GPIO_Speed_50MHz

Разумеется, частота GPIO не должна превышать частоту ядра (:

Ещё одна и интересная функция - переназначение выводов. Она позволяет переназначить выводы периферии с обычных на альтернативные, тоже фиксированные - впрочем, это не умаляет ценности данной функции: например, для USART1 можно переназначить TX с PA9 на PB6, а RX с PA10 на PB7. Если взглянуть на распиновку МК, можно увидеть, что обычные и альтернативные выводы находятся на разных сторонах кристалла, так что в разводке платы это в любом случае поможет:

А включается переназначение вот так:

/* Сначала нужно затактировать модуль AFIO, * управляющий альтернативными функциями. */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /* Переназначаем USART1: TX -> PB6, RX -> PB7 */ GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);

Если вы два часа разводили двустороннюю плату, а потом обнаружили, что не можете развести какую-то сторону без огромной тучи переходов и перемычек, возможно, что функция переназначения выводов спасёт вашу клавиатуру от нелепой смерти под кулаком.

Есть у GPIO и довольно диковинная функция - блокирование выводов. Я так и не понял, зачем она может понадобится, но суть такова: можно заблокировать изменение состояния любого GPIO до следующей перезагрузки МК. Активируется тоже несложно:

/* Фиксируем состояния выводов PA6 и PA13 */ GPIO_PinLockConfig(GPIOA, GPIO_Pin_6 | GPIO_Pin_13);

Несколько слов об электрических характеристиках
В даташите по STM32F100xx встречаются рекомендации подключать не более 20 выводов с отдачей 8 мА через каждый или не более 8 выводов с 20 мА, но практически нереально найти информацию по максимальному току на вывод. Но есть таблица, где приведена максимальная рассеиваемая мощность для МК целиком, причём для разных корпусов эта мощность разная. Например, для LQFP64, в котором идёт STM32F100RBT6B на STM32VLDiscovery, эта мощность равна 444 мВт, что при напряжении питания 3.3 В даёт силу тока ~134 мА. В другой таблице указано, что максимальный ток, потребляемый МК в режиме выполнения кода со всей включенной периферией при 100℃, составляет 15.7 мА. Итого имеем 134 - 15.7 = 118.3 мА на все выходы. Это максимальный ток, который может пропустить через себя МК, что немного расходится с рекомендациями. Впрочем, питать что-либо кроме светодиодов от MК в любом случае - плохая идея, а 118.3 мА хватит на пару-тройку десятков обычных светодиодов, которые при номинальном токе в 20 мА выжигают глаза, а при 1 мА вполне годятся в индикаторы.

Основы на пальцах. Часть 4

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

Миром правит цифра!

Краеугольным камнем цифровой схемотехники служит понятие нуля и единицы, понятие это совершенно условное, т.к. фактически нет никакого нуля и нет никакой единицы, есть лишь уровни напряжения – высокий и низкий, а также некий порог после которого данный уровень напряжения принято считать высоким или низким. Скажем все, что ниже 0.7 вольт считаем за низкий уровень, т.е. 0, все что выше 2.4 вольт высоким, т.е. единица. Между 0.7 и 2.4 вольта, когда не ясно какой уровень, это состояние совершенно неопределенное его нельзя оценивать как входную величину, иначе на выходе системы в таком случае будет непредсказуемый результат.
Сопротивление входов очень высокое, практически можно считать его бесконечным.

Во избежания путаницы смыслов, в терминологии ключей и транзисторов принято следующее соглашение. Ключ считается открытым или закрытым для протекания тока, как кран на трубе. С точки зрения же механического исполнения он может быть замкнут или разомкнут. Так что открыт = замкнут, закрыт = разомкнут. И не следует путать с англоязычной нотацией, где Open = открыт если речь идет о транзисторе или электронном ключе и Open = разомкнут если речь идет о механическом рубильнике. Там Open-Close следует рассматривать в общем контексте текущего случая. Велик и могуч русский язык! =)

Выход в микросхеме бывает разных типов. Различают push-pull и open drain (в нашей литературе его называют Открытым Коллектором или ОК). Отличие заключается в способе выдачи сигнала на выход. В Push-Pull выходе когда нужен низкий уровень, то выход тупо и беспрекословно замыкается на землю, имеющую нулевой потенциал, а когда высокий, то на напряжение питания.
В открытом коллекторе все несколько иначе. Когда нам надо получить низкий уровень, то мы сажаем ногу на землю, а вот высокий уровень получается подтягивающим резистором (pullup), который, в отсутствии посадки на землю и большого сопротивления висящей на выходе нагрузке, заводит на ногу высокий потенциал. Тут можешь вспомнить закон Ома и посчитать какое будет напряжение выхода на открытом коллекторе если подтягивающий резистор обычно порядка 1КилоОм, а сопротивление входа больше 1МегаОм. Тип выхода определяется из документации на микросхему, некоторые микрухи имеют программируемый выход, например, все контроллеры AVR. Исходя из этого становится понятен смысл регистров Port и DDR в контроллере AVR – они определяют тип выхода Open Drain+PullUp, Push-Pull или просто Open Drain.

Рубрики

  • ARM. Учебный курс
  • AVR. Учебный курс
  • MegaHard Lab
  • MSP430. Учебный курс
  • Автоэлектроника
  • Готовые устройства
  • Диагностика и ремонт
  • Инструмент
  • Книги
  • Начинающим
  • Новости
  • Радиолюбительские Технологии
  • Робототехника
  • Софт

Перевод "open drain output" на русский

The alternative to a push-pull output is a single switch that connects the load either to ground (called an open collector or open drain output) or to the power supply (called an open-emitter or open-source output).

Альтернативой двухтактному выходу является одиночный электронный ключ, который присоединяет нагрузку или к земле (так называемый «выход с открытым коллектором (стоком)») или к источнику питания (так называемый «выход с открытым эмиттером (истоком)»).

Предложить пример

Другие результаты

The open-drain output driver is by no means the standard configuration among digital ICs, and with good reason: it comes with some significant disadvantages.

Выходной каскад с открытым стоком ни в коем случае не является стандартной схемой среди цифровых микросхем, и для этого есть причина: он обладает некоторыми существенными недостатками.

Whenever one of the six monitored voltages falls below its threshold, the open-drain reset output asserts and remains asserted for at least 140 ms after all six voltages exceed their respective thresholds.

Как только одно из шести отслеживаемых напряжений падает ниже порогового уровня, выход RESET\ с открытым истоком устанавливается на низком уровне и остается установленным как минимум 140 мс после того, как все 6 напряжений превысят свои пороговые уровни.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *