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 и проверьте, что пороги в коде соответствуют выбранному диапазону.