Найти тему
𝔸𝕣𝕕𝕦𝕚𝕟𝕪𝕔𝕙

ШИМ и analogWrite() в среде Arduino IDE

Эта статья посвящена функции 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);

После скобок ставим " ; ".

Готовая программа с использованием функции:

Значение – 200
Значение – 200

Более показательной является программа с X вместо значения.

Значение – x
Значение – x

Довольно важная информация:

//всё на строке после двух слэшей

//не компилируется.

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

С помощью этой программы мы увидели, как светодиод зажжётся один раз и далее будет гореть в неполную яркость.

Рассчёты равного напряжения

Если нам нужно подключить светодиод без резистора, можно сделать простой рассчёт, из которого мы увидим, какое значение от 0 до 255 будет соответствовать 2 вольтам (допустимое напряжение светодиода). 255 – это "на всю", т.е. 5 вольт, а 0 – это соответственно 0 вольт. Воспользуемся пропорцией:

255 ÷ x = 5 ÷ 2. Произведение средних членов пропорции тождественно равно произведению крайних членов:

x × 5 = 255 × 2

5x = 510 – уровнение стандартного вида.

x = 510 ÷ 5

x = 102.

Значит, для подключения светодиода без резистора допустимые значения ≤ (меньше или равно) 102.

Всё просто!

-4

Спасибо, что дочитали : )

*Прочитать мои статьи "что такое Arduino", "мигалка от Ардуиныча" и "Подключение светодиода" вы можете прочитать в подборке "Arduino & C++".

*Всё программы я пишу в среде Arduino IDE.

*Для подключения китайских аналогов Arduino используйте драйвер CH-340.

Arduino IDE и драйвер советую скачивать с сайта Амперка.