analogWrite()
Формирует ШИМ-сигнал на цифровом выводе: value от 0 до 255 задаёт скважность, управляя яркостью светодиода, скоростью мотора или другой нагрузкой.
Полная статья
Описание
analogWrite() формирует на цифровом выводе сигнал широтно-импульсной модуляции (PWM) — периодический прямоугольный сигнал, у которого можно менять соотношение времени включения и выключения. Именно это соотношение и называется скважностью. Чем выше значение, тем дольше вывод остаётся в состоянии HIGH за каждый период — и тем, например, ярче светит подключённый светодиод или быстрее крутится мотор.
После вызова analogWrite() сигнал продолжает генерироваться аппаратно, без участия вашего кода, пока на том же выводе не будет вызван analogWrite(), digitalRead() или digitalWrite(). Это означает, что вам не нужно постоянно обновлять вывод в loop() — достаточно одного вызова.
Контакты с поддержкой PWM обычно помечены на плате знаком ~. Точный список выводов зависит от модели: сверьтесь с распиновкой вашей платы. Некоторые платы имеют дополнительные PWM-контакты, но их использование требует внимания к конфликтам с таймерами и другими функциями.
На ряде плат есть также настоящий аналоговый выход (ЦАП) — через analogWrite() на выводах, помеченных как DAC. Это отдельная возможность, не связанная с PWM: проверьте распиновку своей платы, чтобы понять, поддерживается ли DAC.
Важно: одновременно можно использовать PWM не более чем на 4 контактах. Если включить PWM на большем количестве выводов, скетч прервёт выполнение, и для возобновления работы потребуется перезагрузка платы.
Перед вызовом analogWrite() не нужно явно настраивать режим вывода через pinMode() — функция сама переводит вывод в нужный режим. Также analogWrite() никак не связана с аналоговыми входами и функцией analogRead().
Синтаксис
analogWrite(pin, value)
Параметры
pin— номер вывода Arduino, на котором нужно сформировать PWM-сигнал. Тип данных:int.value— скважность сигнала. Значение0означает, что вывод всегда выключен (постоянный LOW), значение255— что вывод всегда включён (постоянный HIGH). Промежуточные значения задают пропорциональную скважность. Тип данных:int.
Возвращает
Функция ничего не возвращает.
Пример кода
Скетч считывает положение потенциометра, подключённого к выводу A3, и пропорционально управляет яркостью светодиода через PWM.
int ledPin = 9; // светодиод подключён к цифровому выводу 9
int analogPin = A3; // потенциометр подключён к аналоговому выводу 3 (A3)
int val = 0; // переменная для хранения считанного значения
void setup() {
pinMode(ledPin, OUTPUT); // настраивает вывод как выход
}
void loop() {
val = analogRead(analogPin); // считать значение с входа
analogWrite(ledPin, val / 4); // analogRead возвращает значения от 0 до 1023, analogWrite принимает от 0 до 255
}
Где применяется
- Регулировка яркости светодиода — самый распространённый сценарий: значение
valueот 0 до 255 плавно меняет яркость. - Управление скоростью двигателя постоянного тока — через драйвер мотора, который принимает PWM-сигнал как сигнал управления.
- Формирование аналогового напряжения через RC-фильтр — ШИМ-сигнал после фильтрации низкими частотами превращается в приблизительное постоянное напряжение, пропорциональное
value.
Практические замечания
- Не нужен
pinMode()—analogWrite()самостоятельно настраивает вывод. Лишний вызовpinMode()не навредит, но и пользы не принесёт. - Частота PWM — обычно около 490 Гц на большинстве выводов, но на выводах 5 и 6 плат на базе ATmega328 она составляет около 980 Гц. Это важно, если подключённое устройство чувствительно к частоте.
- Выводы 5 и 6: осторожно с малыми значениями — из-за взаимодействия с
millis()иdelay(), которые используют тот же таймер, реальная скважность на этих выводах может оказаться чуть выше ожидаемой. Особенно это заметно приvalueв диапазоне 0–10: значение0может не полностью погасить вывод. Если нужно гарантированно выключить вывод, используйтеdigitalWrite(pin, LOW). - Максимум 4 PWM-вывода одновременно — превышение этого лимита приводит к зависанию скетча. Планируйте схему заранее.
- Связь с
analogRead()— функцииanalogWrite()иanalogRead()не связаны между собой: первая работает с цифровыми выводами и таймерами, вторая — с аналоговыми входами и АЦП.