Эта статья посвящена функции analogWrite() в Arduino IDE и широтно импульсной модуляции.
Напряжение в в платах Arduino.
В платах Arduino (обычно UNO и NANO) есть контакты 5V, 3.3V, на которых соответственно напряжение равно 5 и 3.3 Вольта. Ещё есть контакт GND – то есть земля, "-" или ноль. Стоит учитывать, что при выключенном состоянии любого из контактов с 2 по 13 на них именно нулевой заряд. Подробнее я расскажу об этом в статье о RGB-светодиодах.
Не забудьте о резисторе!
Кто читал мои прежние статьи (смотрите в подборке "Arduino & C++"), знают, что большинство используемых на практике светодиодов рассчитаны на 2 Вольта. Соответственно, их нельзя так просто воткнуть катодом к GND и анодом к 5V. Для этого в цепь нужно добавить сопротивление ≈1KΩ.
digitalWrite()
Если сделать всё, как я описывал в предыдущей статье на эту тему, светодиод будет гореть во всю мощь, т. к. при вызове digitalWrite() существуют только два состояния конкретного контакта: HIGH (полностью включено, 5 вольт) и LOW (полностью выключено, 0 вольт). Как же тогда сделать, чтобы зажечь светодиод не на всю, а, например, наполовину мощности? Можно, конечно поставить резистор с большим сопротивлением. Но это можно сделать без изменений в цепи. Схема:
ШИМ
Тут приходит на помощь широтно-импульсная модуляция (ШИМ, англ. – PWM). Её работа довольно проста: просто включать и выключать с определённой частотой 5V. Кратковременные импульсы не будут портить светодиод (более того: он будет даже долговечнее!). В таком режиме контакт Arduino работает следующим образом:
Включить 5V;
Подождать X времени;
Выключить 5V;
Подождать X времени.
Казалось бы, светодиод будет мигать. Но применяемые на практике частоты выше тех, которые способен различать наш глаз.
В Arduino UNO такой режим поддерживают не все контакты с 2 по 13, а только 3, 5, 6, 9, 10 и 11. Отличить их можно по символу "~" перед номером контакта.
analogWrite()
Данный режим работы контактов Arduino позволяет реализовать простая, довольно важная и удобная в использовании функция – analogWrite(). Нужно написать её внутри (между фигурными скобками void loop(){ и }) void loop(). Внутри скобок analogWrite() нужно написать через запятую два числа: номер контакта и значение частоты от 0 до 255. В нашем случае номер контакта – 5. Чтобы светодиод горел в половину яркости, 255 ÷ 2 ≈ 127,5. Число с плавающей точкой (десятичную дробь) мы не сможем записать, поэтому округляем до целых: 127,5 ≈ 128. Пишем:
analogWrite(5, 128);
После скобок ставим " ; ".
Готовая программа с использованием функции:
Более показательной является программа с X вместо значения.
Довольно важная информация:
//всё на строке после двух слэшей
//не компилируется.
Это очень удобно использовать для замечаний в тексте программы и лучшего ориентирования в ней.
С помощью этой программы мы увидели, как светодиод зажжётся один раз и далее будет гореть в неполную яркость.
Рассчёты равного напряжения
Если нам нужно подключить светодиод без резистора, можно сделать простой рассчёт, из которого мы увидим, какое значение от 0 до 255 будет соответствовать 2 вольтам (допустимое напряжение светодиода). 255 – это "на всю", т.е. 5 вольт, а 0 – это соответственно 0 вольт. Воспользуемся пропорцией:
255 ÷ x = 5 ÷ 2. Произведение средних членов пропорции тождественно равно произведению крайних членов:
x × 5 = 255 × 2
5x = 510 – уровнение стандартного вида.
x = 510 ÷ 5
x = 102.
Значит, для подключения светодиода без резистора допустимые значения ≤ (меньше или равно) 102.
Всё просто!
Спасибо, что дочитали : )
*Прочитать мои статьи "что такое Arduino", "мигалка от Ардуиныча" и "Подключение светодиода" вы можете прочитать в подборке "Arduino & C++".
*Всё программы я пишу в среде Arduino IDE.
*Для подключения китайских аналогов Arduino используйте драйвер CH-340.
Arduino IDE и драйвер советую скачивать с сайта Амперка.