Почему 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).
Источники
- 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: неиспользуемым выводам рекомендуется задавать определённый уровень, чтобы снизить ток потребления цифровых входов, например включив подтяжку
- Arduino. Language Reference: analogRead() (arduino/reference-en, commit b367b02) — Notes and Warnings: если аналоговый вход ни к чему не подключён, analogRead() возвращает значения, которые меняются в зависимости от многих факторов — значений на других аналоговых входах, близости руки к плате и т. п.
Нашли ошибку?
Смотрите также
- С какой точностью Arduino измеряет напряжение?АЦП — около 0,2 %, опорное — до 7–9 % без калибровки
- Устройство выборки и храненияКлюч и конденсатор на входе АЦП: выборка, хранение, требования к источнику
- Подтягивающий резисторPull-up и pull-down: определённый уровень на свободной линии
- АЦП AVR: ADPS и кодЧастота АЦП, время преобразования, код по напряжению, ADMUX и ADCSRA