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

analogWriteResolution()

Задаёт разрядность (в битах) для последующих вызовов analogWrite(), позволяя задействовать полный аппаратный диапазон PWM или DAC на платах, поддерживающих более 8 бит.

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

Описание

analogWriteResolution() позволяет задать, сколько бит будет использоваться при последующих вызовах analogWrite(). По умолчанию разрядность равна 8 битам — значения от 0 до 255 — чтобы код оставался совместимым с классическими платами Arduino на базе AVR.

Если плата поддерживает более точный PWM или имеет выход DAC, эта функция позволяет задействовать больший аппаратный диапазон и получить более плавное управление сигналом.

Синтаксис

Чтобы использовать нужный диапазон значений для DAC или PWM, вызовите:

analogWriteResolution(bits)

Параметры

bits — разрядность в битах, которую будет ожидать analogWrite(). Допустимые значения: от 1 до 32.

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

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

Возвращает

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

Пример кода

void setup() {
  // открыть последовательное соединение
  Serial.begin(9600);
  // настроить цифровой пин как выход
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  // считать значение с A0 и преобразовать его для PWM пина
  // с подключённым светодиодом
  int sensorVal = analogRead(A0);
  Serial.print("Analog Read : ");
  Serial.print(sensorVal);

  // стандартное разрешение PWM
  analogWriteResolution(8);
  analogWrite(11, map(sensorVal, 0, 1023, 0, 255));
  Serial.print(" , 8-bit PWM value : ");
  Serial.print(map(sensorVal, 0, 1023, 0, 255));

  // изменить разрешение PWM до 12 бит
  analogWriteResolution(12);
  analogWrite(12, map(sensorVal, 0, 1023, 0, 4095));
  Serial.print(" , 12-bit PWM value : ");
  Serial.print(map(sensorVal, 0, 1023, 0, 4095));

  // изменить разрешение PWM до 4 бит
  analogWriteResolution(4);
  analogWrite(13, map(sensorVal, 0, 1023, 0, 15));
  Serial.print(", 4-bit PWM value : ");
  Serial.println(map(sensorVal, 0, 1023, 0, 15));

  delay(5);
}

Возможности плат

Разные платы Arduino поддерживают разную аппаратную разрядность PWM или DAC:

  • Платы с 8-битным разрешением PWM делят рабочий цикл PWM на 255 шагов.
  • Платы с 10-битным разрешением PWM делят рабочий цикл PWM на 1024 шага.
  • Платы с 12-битным разрешением PWM делят рабочий цикл PWM на 4095 шагов.
  • Платы с 16-битным разрешением PWM делят рабочий цикл PWM на 65536 шагов.

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

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

  • Вызывайте analogWriteResolution() один раз в setup(), до первого обращения к analogWrite(). Изменение разрядности в середине работы скетча может привести к неожиданным скачкам сигнала.
  • Если вы установили разрядность выше аппаратной, Arduino отбросит лишние старшие биты. Например, при 12-битной настройке на 8-битном выводе значение 4095 превратится в 255.
  • Если вы установили разрядность ниже аппаратной, недостающие биты будут заполнены нулями. Значение 15 при 4-битной настройке на 8-битном выводе превратится в 240 (то есть 0b11110000).
  • Разрядность, заданная analogWriteResolution(), действует глобально для всех последующих вызовов analogWrite() в скетче.
  • При отладке удобно выводить передаваемые значения через Serial Monitor и сравнивать с реальным поведением устройства — это помогает быстро обнаружить несоответствие между заданным и аппаратным разрешением.

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

  • Плавное управление яркостью светодиода или RGB-ленты — 8-битного разрешения иногда недостаточно для мягких переходов; 12 или 16 бит дают более тонкую шкалу значений.
  • Управление мотором через драйвер — более высокая разрядность помогает точнее задавать мощность, если драйвер и плата поддерживают такой режим PWM.
  • Генерация аналогового сигнала через PWM — платы со встроенным цифро-аналоговым преобразователем могут выдавать сигнал с разрядностью 10–12 бит, и analogWriteResolution() позволяет передавать значения в полном диапазоне.
  • Прототипирование аудио или сенсорных систем — когда важна точность выходного напряжения, а не просто включено/выключено.

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