Перейти к содержанию

Плавающий вход

Кнопка отпущена, а микроконтроллер видит нажатия; батарейное устройство в спящем режиме потребляет вдесятеро больше расчётного. Частая причина обоих случаев — вход, который ни к чему не подключён и поэтому «плавает» между логическими уровнями.

Обновлено Редакция GAW

Плавающий вход (floating input) — цифровой вход, к которому не подключено ничего, что задаёт уровень: ни источник сигнала, ни подтягивающий резистор. Входное сопротивление КМОП-входа огромно, поэтому напряжение на таком входе определяют утечки, наводки и заряд, оставшийся на ёмкости вывода. Логический уровень при этом случаен.

Чем опасен

  • Ложные срабатывания. Наводка от соседнего провода или прикосновение рукой переключает вход: кнопка без подтяжки «нажимается» сама, приёмник UART видит мусорные байты.
  • Лишний ток. Когда напряжение на входе около середины питания, входной буфер КМОП потребляет чрезмерный ток (DS40002061B, разд. 10.10.6). В спящем режиме это часто главный потребитель, сводящий на нет экономию режимов сна.
  • Дребезг на фронтах. Медленно меняющийся плавающий уровень многократно пересекает порог; триггер Шмитта на входе смягчает проблему, но не убирает причину.

Как задать уровень

СитуацияРешение
Неиспользуемый вывод AVRвнутренняя подтяжка; если важен ток при сбросе — внешняя подтяжка
Кнопка на землюподтяжка вверх, внутренняя или внешняя
Аналоговый вход AVRотключить цифровой буфер в DIDR0 или DIDR1
Неиспользуемый вывод STM32аналоговый режим или вход с подтяжкой
Вход, который бывает отключён от источникавнешний резистор к безопасному уровню

Подключать неиспользуемый вывод прямо к питанию или к земле Microchip не рекомендует: если программа по ошибке настроит его на выход, ток будет чрезмерным (DS40002061B, разд. 14.2.6).

STM32 после сброса

У STM32F1 во время сброса и сразу после него все выводы — плавающие входы (CNF = 01, MODE = 00), кроме выводов отладки с подтяжками (RM0008, разд. 9.1.1). Пока программа не настроила порт, внешняя схема видит высокий импеданс. Если к выводу подключён затвор MOSFET или вход драйвера, его уровень на это время задают внешним резистором. Режимы входа, подтяжки и регистры порта разобраны в статье о GPIO STM32, а пороги логических уровней и запретная зона между ними — в статье о логических уровнях.

Частые вопросы

Куда подключать неиспользуемые выводы микроконтроллера?

Microchip для ATmega328P советует включить внутреннюю подтяжку, а если важен ток во время сброса, когда она выключена, — поставить внешнюю подтяжку вверх или вниз. Подключать вывод прямо к VCC или GND не рекомендуется: если по ошибке настроить его на выход, через него пойдёт чрезмерный ток (DS40002061B, разд. 14.2.6). Вариант для STM32 — аналоговый режим: в нём входной триггер Шмитта отключён и не потребляет ток при любом напряжении (RM0008, разд. 9.1.10).

Почему плавающий вход увеличивает потребление?

Входной каскад КМОП потребляет ток в основном при переключении и когда напряжение на входе около середины питания: тогда оба транзистора приоткрыты. Плавающий вход ловит наводки, задерживается около VCC/2 и переключается от помех, и буфер потребляет чрезмерный ток (DS40002061B, разд. 10.10.6). Поэтому у аналоговых входов AVR цифровой буфер отключают регистрами DIDR0 и DIDR1.

Почему analogRead на пустом входе показывает случайные числа?

Потому что напряжение на пустом входе ничем не задано: его определяют наводки и утечки, и АЦП честно оцифровывает этот случайный уровень. Это не неисправность АЦП. Подробный разбор — в ответе о плавающем входе analogRead.

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B (2020) — разд. 14.2.6, «Unconnected Pins»: у неиспользуемых выводов должен быть определённый уровень, плавающих входов следует избегать ради снижения тока во всех режимах, где цифровые входы включены; проще всего включить внутреннюю подтяжку, но во время сброса она выключена — если важен ток при сбросе, ставят внешнюю подтяжку вверх или вниз; подключать неиспользуемые выводы прямо к VCC или GND не рекомендуется — при случайной настройке на выход будет чрезмерный ток; разд. 10.10.6: если входной буфер включён, а вход плавает или на нём уровень около VCC/2, буфер потребляет чрезмерный ток; у аналоговых входов цифровой буфер отключают регистрами DIDR0 и DIDR1
  2. STMicroelectronics. RM0008 Reference manual STM32F101/102/103/105/107, Rev 21 — разд. 9.1.1: во время и сразу после сброса выводы настроены как плавающие входы (CNFx = 01, MODEx = 00), выводы JTAG — с подтяжками; у каждого вывода есть слабые подтяжки вверх и вниз, включаемые в режиме входа; табл. 20: конфигурации входа — аналоговый, плавающий, с подтяжкой вверх или вниз; разд. 9.1.10: в аналоговом режиме входной триггер Шмитта отключён и не потребляет ток при любом напряжении на выводе, подтяжки выключены

Нашли ошибку?