Введение. Понятие ШИМ
Широко-импульсная модуляция (сокращенно ШИП) — это техника, используемая для преобразования аналогового сигнала в цифровой. Ведь компьютер не может выдавать аналоговый сигнал: выходы цифровой техники могут принимать только одно из двух значений – например, 0V или 5V. Поэтому используется счетчик высокой точности для кодирования аналогового сигнала в ШИМ-сигнал, которые – уже цифровой, поскольку в любой момент времени он принимает значение либо 5V (ВКЛ), либо 0V (ВЫКЛ). Напряжение подается на аналоговую нагрузку (например, светодиод, или сервопривод) в виде повторяющейся последовательности ВКЛ и ВЫКЛ. Получаемое выходное напряжение вычисляется по продолжительности сигналов ВКЛ и ВЫКЛ, по следующей формуле:
Выходное напряжение = (Время ВКЛ / время импульса) * максимальное напряжение.
Взгляните на рисунок ниже для лучшего понимания.

ШИМ имеет множество применений, например:
- регулирование яркость свечения ламп,
- скорости вращения мотора,
- генерация звука и т.д.
ШИМ имеет 3 параметра:
- Период
- Скважность
- Величина

У Ардуино 6 портов, поддерживающие ШИМ: это цифровые пины 3, 5, 6, 9, 10 и 11.
В предыдущем примере мы подключили LED к цифровому пину. Теперь мы будем менять его яркость с помощью ШИМ-сигнала.
Часть 1. Управление яркостью светодиода
Необходимые компоненты
- LED M5
- 220R
Схема
Соберем вот эту схему:

Обратите внимание, что мы подключаем LED к цифровому пину 11, которые поддерживает ШИМ. Если подключить к пину 12, то желаемого результата мы не получим.
Скетч
/******************************************************* * (C) jarduino.ru 2019 * Изучение ардуино через опыты. * * Опыт №3.1. Управление яркостью светодиода * * ****************************************************/ // Глобальные константы и переменные const int pinLed = 11; // порт для светодиода const int nDelay = 2; // задержка в мсек. между изменением яркости const int nLedMin = 0; // минимальная яркость // настройка платы void setup() { pinMode(pinLed, OUTPUT); } // основной цикл void loop() { static int i = nLedMin; // статическая переменная для хранения текущей яркости светодиода // постепенной увеличиваем яркость светодиода: while (i < 255) { analogWrite(pinLed, i); delay(nDelay); ++i; } // постепенно уменьшаем яркость светодиода: while (i > nLedMin) { analogWrite(pinLed, i); delay(nDelay); --i; } }
Результат

Часть 2. Управление яркостью с помощью потенциометра
Необходимые компоненты
- Дополнительно на понадобится потенциометр
Схема
Добавим на схему потенциометр:

Среднюю ногу потенциометра мы подключаем к аналоговому входу A0.
Скетч
/******************************************************* * (C) jarduino.ru 2019 * Изучение ардуино через опыты. * * Опыт №3.2 Управление яркостью светодиода с помощью потенциометра * * ****************************************************/ // Глобальные константы и переменные const int pinLed = 11; // порт для светодиода const int pinPot = A0; // порт для светодиода // настройка платы void setup() { Serial.begin(9600); // инициализировать последовательные порт pinMode(pinLed, OUTPUT); // установть пин светодиода в режим вывода // аналоговые пины по умолчанию уже стоят в режиме ввода. } // основной цикл void loop() { static int nValOld = 0; static int nVal; // статическая переменная для хранения текущей яркости светодиода nVal = analogRead(pinPot); // выведем значение nVal в окно отладки, а чтобы // не реагировать на помехи, будет выводить значение только если оно изменилось хотя бы на 3: if (abs(nValOld - nVal) > 3) { Serial.println(nVal); nValOld = nVal; } analogWrite(pinLed, nVal / 4); delay(10); // пауза в 0.01 сек. }
Результат
Когда вы вращаете ручку потенциометра, вы видите в мониторе последовательно порта как меняется напряжение и яркость светодиода в соответствии с ним.
Объяснение
В программе мы считываем аналоговое значение, задаваемое потенциометром, и применяем его к цифровому ШИМ порту, к которому подключен светодиод. В соответствии с изменением ШИМ-сигналом, меняется и яркость светодиода.
Обратите внимание, что максимальное значение для порта ШИМ – это 255, а аналогового порта – 1024. Поэтому считанное значение приходится делить на 4.
Заключение
В этом примере мы показали как использовать ШИМ, изменять напряжение на цифровом выходе, использовать потенциометр для управления нагрузкой.