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

Почему analogRead показывает значения, когда к входу ничего не подключено?

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

Аналоговый вход Arduino — это вход мультиплексора АЦП с очень большим сопротивлением: по даташиту ATmega328P — 100 МОм. Если к нему ничего не подключено, напряжение на выводе ничем не задано. Arduino в справке по analogRead() предупреждает: такие показания «гуляют» и зависят от соседних входов и даже от того, насколько близко к плате рука.

Что на самом деле измеряет АЦП

По рис. 24-8 даташита при выборке вход через сопротивление 1–100 кОм заряжает конденсатор выборки ёмкостью 14 пФ. АЦП рассчитан на источники с выходным сопротивлением до 10 кОм. Без источника:

Что влияетПочемуЧто видно
Предыдущий каналконденсатор выборки один на все каналы, его некому перезарядитьчисло, близкое к соседнему входу
Наводки на вывод и проводвысокое сопротивление, ёмкость выводамедленные колебания, отклик на руку
Утечки выводаток утечки заряжает ёмкостьдрейф к одному краю

Первая строка — наш вывод из схемы входа; две другие даташит перечисляет как то, что действует на любой вход.

Как получить честный ноль

Резистор к земле нагружает и подключённый датчик. Наш расчёт: при резисторе 100 кОм и выходном сопротивлении датчика 100 Ом ошибка — 100 / 100 000 = 0,1 %, около одного отсчёта 10-битного АЦП. Поэтому:

  • Для пустого входа — резистор 10–100 кОм к земле, и показание будет 0.
  • Для датчика с большим сопротивлением — наш совет: конденсатор 10–100 нФ с входа на землю, который отдаёт заряд конденсатору выборки.
  • Неиспользуемые выводы даташит (разд. 14.2.6) советует не оставлять висящими, чтобы не рос ток потребления цифровых входов; для этого подходит и встроенная подтяжка — см. статью «Подтягивающий резистор». Но вход с включённой подтяжкой к питанию покажет в analogRead около 1023, а не 0 (наш вывод).

Какую реальную точность даёт АЦП Arduino — в ответе «С какой точностью Arduino измеряет напряжение», перевод кода в напряжение — в калькуляторе АЦП AVR.

Похожие вопросы

Почему пустой вход повторяет соседний канал?

У АЦП ATmega328P один конденсатор выборки на все каналы: по даташиту источник перезаряжает эти 14 пФ при каждом измерении. Если источника нет, перезаряжать нечем, и в конденсаторе остаётся напряжение предыдущего канала (наш вывод из схемы рис. 24-8). Поэтому неподключённый вход часто показывает примерно то же, что вход, прочитанный перед ним.

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

Наш совет — 10–100 кОм к земле. Даташит рассчитывает АЦП на источники до 10 кОм, а входное сопротивление самого входа — 100 МОм, поэтому резистор 100 кОм почти не нагружает подключаемый датчик, но не даёт входу висеть. Для источника с большим сопротивлением нужен конденсатор на входе: иначе недозаряженный конденсатор выборки тянет показание к значению предыдущего канала — вверх или вниз (наш вывод).

Можно ли так проверить, исправен ли вход?

Нет: плавающие числа на пустом входе — нормальное поведение. Проверяют подачей известного напряжения — например, соединив вход с 3,3 В или с землёй: исправный вход Arduino UNO с опорным 5 В покажет около 675 и 0 (наш расчёт: 3,3 / 5 · 1023).

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B, 2020) — разд. 24.6.1, рис. 24-8: источник заряжает конденсатор выборки CS/H = 14 пФ через последовательное сопротивление 1–100 кОм; АЦП рассчитан на источники с выходным сопротивлением около 10 кОм и меньше; на вход действуют ёмкость и ток утечки вывода; табл. характеристик АЦП: входное сопротивление RAIN 100 МОм; разд. 14.2.6: неиспользуемым выводам рекомендуется задавать определённый уровень, чтобы снизить ток потребления цифровых входов, например включив подтяжку
  2. Arduino. Language Reference: analogRead() (arduino/reference-en, commit b367b02) — Notes and Warnings: если аналоговый вход ни к чему не подключён, analogRead() возвращает значения, которые меняются в зависимости от многих факторов — значений на других аналоговых входах, близости руки к плате и т. п.

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