Главная chevron_right Функции chevron_right Аналоговый ввод/вывод chevron_right analogReadResolution()

analogReadResolution()

analogReadResolution() задаёт разрядность АЦП от 1 до 32 бит, определяя диапазон значений, которые вернёт analogRead() — по умолчанию 10 бит (0–1023).

Полная статья

Описание

analogReadResolution() управляет разрядностью, с которой функция analogRead() возвращает результат аналогового измерения. По умолчанию установлено 10 бит — это даёт диапазон от 0 до 1023 и обеспечивает совместимость со старыми платами на базе AVR.

На платах, которые поддерживают более высокую разрядность АЦП, можно получить более широкий диапазон значений:

  • 10 бит: значения от 0 до 1023
  • 12 бит: значения от 0 до 4095
  • 14 бит: значения от 0 до 16383
  • 16 бит: значения от 0 до 65535

Чем выше разрядность, тем тоньше различия между соседними значениями — это полезно, когда нужно точнее измерять медленно меняющиеся сигналы: температуру, освещённость, положение потенциометра или напряжение с аналогового датчика.

Синтаксис

analogReadResolution(bits)

Параметры

bits — целое число от 1 до 32, задающее разрядность результата, который вернёт analogRead().

Допустимы значения от 1 до 32. Можно указать разрядность выше той, что поддерживается аппаратно, но в этом случае часть битов не будет содержать новой информации. Подробности — в разделе «Примечания» ниже.

Возвращает

Функция ничего не возвращает.

Пример кода

Пример демонстрирует использование АЦП с разными значениями разрядности.

void setup() {
  // открыть последовательное соединение
  Serial.begin(9600);
}

void loop() {
  // считать значение с A3 при разрешении по умолчанию (10 бит)
  // и отправить его через последовательное соединение
  analogReadResolution(10);
  Serial.print("ADC 10-bit (default) : ");
  Serial.print(analogRead(A3));

  // изменить разрешение на 12 бит и считать A3
  analogReadResolution(12);
  Serial.print(", 12-bit : ");
  Serial.print(analogRead(A3));

  // изменить разрешение на 16 бит и считать A3
  analogReadResolution(16);
  Serial.print(", 16-bit : ");
  Serial.print(analogRead(A3));

  // изменить разрешение на 8 бит и считать A3
  analogReadResolution(8);
  Serial.print(", 8-bit : ");
  Serial.println(analogRead(A3));

  // небольшая задержка, чтобы не перегружать Serial Monitor
  delay(100);
}

Примечания и предупреждения

Важно понимать, что происходит, когда запрошенная разрядность не совпадает с реальными возможностями железа.

Разрядность выше аппаратной. Если задать analogReadResolution() значение больше, чем поддерживает плата, Arduino считает данные с максимально доступной точностью, а недостающие старшие биты заполнит нулями. Например, при использовании UNO R4 с параметром analogReadResolution(16) вы получите 16-битное число, в котором первые 14 бит содержат реальное показание АЦП, а два последних бита равны нулю. Само по себе это не ошибка — такой подход позволяет писать скетчи, которые автоматически воспользуются преимуществами более точных АЦП на будущих платах без каких-либо изменений в коде.

Разрядность ниже аппаратной. Если задать analogReadResolution() значение меньше реальных возможностей платы, лишние младшие биты просто не попадают в результат. Это удобно, когда вам нужен грубый диапазон или вы хотите сократить объём данных.

Где применяется

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

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

  • Вызывайте analogReadResolution() в setup() один раз, до первого вызова analogRead() — это гарантирует корректный диапазон с самого начала.
  • Функция доступна не на всех платах: на классических Arduino на базе AVR (Uno, Nano, Mega) она не поддерживается. Проверьте документацию своей платы перед использованием.
  • После изменения разрядности обновите все пороговые значения и формулы пересчёта в коде — они напрямую зависят от диапазона возвращаемых значений.
  • Нулевые младшие биты при разрядности выше аппаратной не несут реальной информации о сигнале: не пытайтесь интерпретировать их как дополнительную точность.
  • Если результаты analogRead() выглядят неожиданно, выводите сами считанные значения через Serial Monitor и проверьте, что пороги в коде соответствуют выбранному диапазону.

Полезные материалы