Внешний и внутренний pullup

Есть два способа вытягивания контактов в Arduino — с помощью внутреннего и внешнего резистора. Интересно, когда мне следует использовать внешний резистор вместо INPUT_PULLUP.

, 👍1

Обсуждение

По моему опыту, единственное отличие состоит в том, что «внешнее подтягивание/подтягивание легче заменить» и, возможно, также «просто взглянув на схему, вы можете увидеть внешний резистор, поэтому через несколько месяцев легче понять конструкцию»., @Filip Franik


3 ответа


Лучший ответ:

3

В обычном приложении можно использовать как внутренний, так и внешний резистор.

Каждый метод имеет свои преимущества:

Внутренний резистор

  • Плюсы: гибкость в изменении кода.
  • Плюсы: уменьшение размера печатной платы
  • Плюсы: снижение затрат (очень мало).
  • Минус: это может нагреть MCU.

Внешний резистор

  • Плюсы: меньше нагрева для MCU.
  • Минусы: сложно заменить, если это встроенная печатная плата.
  • Минусы: увеличение размера печатной платы

Кроме того, подтягивающие и подтягивающие резисторы используются не только для порта ВХОД, но и для порта ВЫХОД. В случае порта OUTPUT. У внешнего резистора есть еще одно преимущество: гибкость в подключении устройств с различными входными/выходными напряжениями. Например, в аппаратном обеспечении I2C см. I2C на аппаратном уровне.

ПРИМЕЧАНИЕ. Насколько мне известно, на момент написания статьи библиотека Arduino НЕ поддерживала INPUT_PULLDOWN

,

1. Тепло, выделяемое внутренним подтягиванием, незначительно. 2. Некоторые платы (не на основе AVR) имеют INPUT_PULLDOWN., @Edgar Bonet


1

"Язык Arduino" (то есть функция pinMode()) знает только INPUT_PULLUP.

Поэтому вам нужны внешние резисторы для резисторов PULLDOWN.

ВЫХОДНЫЕ сигналы не являются плавающими, поэтому термин PULLUP/PULLDOWN-резистор здесь не применяется.

Кроме того, значение внутреннего подтягивающего резистора не регулируется. Если это значение (20 .. 50 кОм) не подходит (для I²C требуется что-то меньше 10 кОм), требуется внешний резистор.

,

Как я писал в комментарии к предыдущему ответу, [некоторые ядра Arduino поддерживают INPUT_PULLDOWN](https://github.com/arduino/ArduinoCore-samd/blob/1.8.4/cores/arduino/wiring_constants.h# Л32)., @Edgar Bonet


2

"Минусы: это может нагреть MCU"
Он не будет. P=V^2/R, поэтому 5*5/20 000 = 1,25 мВт, процессор не нагревается. Даже при включении всех 80 транзисторов в Mega2560 и снижении их уровня рассеивание составит всего 0,1 Вт.

"ПРИМЕЧАНИЕ. Насколько мне известно, на момент написания статьи библиотека Arduino НЕ поддерживала INPUT_PULLDOWN" Это связано с тем, что устройства семейства Atmega328P, '1284, '2560 и т. д. не имеют внутренних подтягивающих резисторов. Только подтягивания. См. Раздел 14 их спецификаций, «Порты ввода-вывода».

Этого подтягивания обычно недостаточно для подтягивания I2C, нарастающий фронт, создаваемый внутренним подтягиванием от 20 000 до 50 Кбит, очень медленный. Требуется внешний 4,7K до примерно 2,2K (зависит от того, сколько устройств I2C подключено). И спецификация шины I2C говорит, что они должны быть в конце шины, а не в начале шины (обычно это процессор).

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

,