Плавающий вход
Кнопка отпущена, а микроконтроллер видит нажатия; батарейное устройство в спящем режиме потребляет вдесятеро больше расчётного. Частая причина обоих случаев — вход, который ни к чему не подключён и поэтому «плавает» между логическими уровнями.
Обновлено Редакция 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.
Источники
- 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
- STMicroelectronics. RM0008 Reference manual STM32F101/102/103/105/107, Rev 21 — разд. 9.1.1: во время и сразу после сброса выводы настроены как плавающие входы (CNFx = 01, MODEx = 00), выводы JTAG — с подтяжками; у каждого вывода есть слабые подтяжки вверх и вниз, включаемые в режиме входа; табл. 20: конфигурации входа — аналоговый, плавающий, с подтяжкой вверх или вниз; разд. 9.1.10: в аналоговом режиме входной триггер Шмитта отключён и не потребляет ток при любом напряжении на выводе, подтяжки выключены
Нашли ошибку?
Смотрите также
- Подтягивающий резисторPull-up и pull-down: определённый уровень на свободной линии
- Триггер ШмиттаДва порога с гистерезисом: медленные фронты, шум, дребезг
- GPIOВывод общего назначения: вход и выход, подтяжки, сила выхода, функции
- GPIO STM32Режимы выводов, регистры F1 и F4, BSRR, AF, скорость, токи, 5 В, код
- Логические уровниVOH, VOL, VIH, VIL, запас помехоустойчивости, ТТЛ и КМОП, уровни МК и интерфейсов
- Почему analogRead показывает значения, когда к входу ничего не подключено?Висящий вход: заряд конденсатора выборки и наводки — нужен резистор к земле
- Удержание шины (bus hold)Встроенная слабая защёлка, удерживающая последний уровень на висящей линии
- КМОП-логикаЛогика на комплементарных парах МОП-транзисторов: малое потребление, пороги от питания