Главная chevron_right Уроки chevron_right Микроконтроллеры chevron_right Аналоговые входы Arduino (Analog Input Pins)

Аналоговые входы Arduino (Analog Input Pins)

Подробно о том, как работают аналоговые входы на платах Arduino с микроконтроллерами ATmega: АЦП, маппинг пинов, подтягивающие резисторы и подводные камни.

Эта статья описывает аналоговые входные пины на чипах Arduino (ATmega8, ATmega168, ATmega328P, ATmega1280) — как они устроены, как их правильно использовать и каких ошибок стоит избегать.

АЦП — аналого-цифровой преобразователь

Микроконтроллеры ATmega, которые стоят в основе большинства плат Arduino, содержат встроенный аналого-цифровой преобразователь (АЦП). В зависимости от модели количество каналов различается: 6 каналов на стандартных платах, 8 — на Mini и Nano, и целых 16 — на Mega.

Разрядность АЦП составляет 10 бит. Это значит, что результат измерения — целое число от 0 до 1023, где 0 соответствует 0 В, а 1023 — опорному напряжению (обычно 5 В или 3,3 В в зависимости от платы).

Главное назначение аналоговых пинов — читать показания аналоговых датчиков: потенциометров, термисторов, фоторезисторов и т.д. Но важно понимать: аналоговые пины — это полноценные пины GPIO, точно такие же, как цифровые пины 0–13. Если в вашем проекте аналоговые входы не заняты, их можно свободно использовать как обычные цифровые входы или выходы.

Маппинг пинов (Pin Mapping)

Аналоговые пины можно использовать так же, как цифровые — через псевдонимы A0 (аналоговый вход 0), A1 и т.д. Это работает во всех функциях, принимающих номер пина.

Например, чтобы настроить аналоговый пин 0 как выход и установить на нём уровень HIGH, код будет выглядеть так:

pinMode(A0, OUTPUT);
digitalWrite(A0, HIGH);

Это особенно удобно, когда в проекте не хватает цифровых пинов: просто берёте свободный аналоговый и работаете с ним как с цифровым.

Подтягивающие резисторы (Pull-up Resistors)

Аналоговые пины, как и цифровые, поддерживают встроенные подтягивающие резисторы (pull-up). Включить подтяжку можно командой:

pinMode(A0, INPUT_PULLUP);  // Включить подтягивающий резистор на аналоговом пине 0

Однако будьте осторожны: включённый pull-up влияет на показания analogRead(). Если вы одновременно читаете аналоговое значение и включили подтяжку, результаты будут искажены — резистор «тянет» напряжение к питанию, и реальный сигнал датчика перестаёт корректно отображаться.

Важные нюансы и типичные ошибки

Пин был выходом — переключите обратно

Функция analogRead() не будет работать корректно, если пин ранее был настроен как выход. Прежде чем читать аналоговый сигнал, обязательно переведите пин в режим входа. Иначе показания будут некорректными или вовсе непредсказуемыми.

INPUT vs INPUT_PULLUP

Вызов pinMode(pin, INPUT) отключает внутренний pull-up резистор, независимо от того, был ли он включён раньше. Если вам нужно читать аналоговые значения с включённой подтяжкой (например, для кнопки без внешнего резистора), используйте вместо этого pinMode(pin, INPUT_PULLUP).

Электрические помехи при переключении пинов

Документация на ATmega предупреждает: не стоит переключать аналоговые пины в цифровой режим непосредственно перед тем, как делать измерения analogRead() на других аналоговых пинах. Такие переключения вносят электрический шум в аналоговую часть схемы и приводят к «джиттеру» — случайным колебаниям показаний.

Практический совет: если вы управляли аналоговым пином как цифровым, добавьте небольшую задержку (delay() на несколько миллисекунд) перед тем, как вызывать analogRead() для чтения других аналоговых пинов. Это даёт аналоговой части время стабилизироваться.

Практические замечания

  • Если вы используете аналоговый пин как цифровой выход, а потом хотите снова читать с него аналоговый сигнал — не забудьте явно вызвать pinMode(A0, INPUT) перед analogRead().
  • На платах с напряжением питания 3,3 В максимальное входное напряжение для аналогового пина тоже 3,3 В. Подача 5 В на такой пин может повредить микроконтроллер.
  • АЦП делит диапазон от 0 до опорного напряжения на 1024 шага. При питании 5 В один шаг ≈ 4,9 мВ, при 3,3 В — около 3,2 мВ.
  • Аналоговые пины A4 и A5 на большинстве плат Arduino Uno также используются для шины I²C. Если в проекте есть I²C-устройства, эти пины заняты.