Espruino:Примеры/Что такое ШИМ и как её использовать

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Что такое ШИМ и как её использовать [1]

ШИМ или широтно-импульсная модуляция – это важный концепт в области электроники. С её помощью вы можете имитировать низкое напряжение, быстро включая и выключая питание на контакте. В этом руководстве мы расскажем, как она работает и как её можно применить на практике. В результате вам станет понятно, как работает функция analogWrite() на контактах, поддерживающих ШИМ.

Подсоединение

Мы будем использовать светодиоды платы, так что ничего подключать не надо.

Код

Чтобы понять, что такое ШИМ, давайте разберём пару примеров включения питания на контакте. Давайте начнём с включения питания на протяжении 5 секунд:

Вы можете попробовать сделать это сами на Espruino при помощи следующего кода:

LED1.set();
setTimeout( function() { LED1.reset(); }, 5000);

Не особо зрелищно, да? В течение этих 5 секунд светодиод будет просто включен. Теперь давайте включим питание на этом контакте лишь в течение 1 секунды из этих 5 секунд. То есть в результате светодиод, подключенный к этому контакту, будет гореть в течение 1 секунды из этого 5-секундного интервала, то есть в течение 20% от этого периода.

Мы можем сделать это, отправив на Espruino следующую команду:

LED1.set();
setTimeout( function() { LED1.reset(); }, 1000);

Опять же, интересного мало. Теперь давайте попробуем включать светодиод на 1/5 секунды каждую секунду и повторять это в течение 5 секунд:

Обратите внимание, что мы по-прежнему включаем светодиод на 1 секунду из 5-секундного интервала, т.е. на 20% от общей протяжённости периода. Разница в том, что теперь мы переключаем контакт между положениями «вкл» и «выкл» каждую секунду. Кроме того, мы можем сделать это переключение ещё более быстрым и заставить мозг поверить, что светодиод не включается и выключается, а горит постоянно. Время, в течение которого контакт будет один раз включен и один раз выключен, называется периодом. Количество периодов в каждой секунде измеряется в герцах (Гц). Например:

Как видите, в течение каждого периода мы держим светодиод включённым в течение 20% времени, и выключенным в течение 80% времени. В целом у нас получилось 25 периодов. Все эти 25 периодов происходят в течение одной секунды, а это значит, что частота включения и выключения светодиода составляет 25 Гц.

Чтобы заставить мозг поверить, что светодиод горит постоянно, нам нужно увеличить эту частоту ещё больше. К примеру, человеческий глаз не замечает мерцания, если частота мерцания составляет 50 Гц. В этом случае будет казаться, что светодиод горит на 20% от своей мощности. Это как раз то, что нам нужно. В результате, быстро включая и выключая светодиод, мы можем заставить наш мозг думать, что светодиод горит постоянно, но тусклее обычного.

А теперь давайте попробуем всё это на Espruino:

var interval;
function pwm(brightness, Hz) {
  if ((typeof interval) !== "undefined") {
    clearInterval(interval);
    LED1.reset();
  }
  interval = setInterval(function() {
    digitalPulse(LED1, 1, brightness * (1000/Hz));
  }, 1000/Hz);
}

В этой функции есть аргумент brightness, с помощью которого мы задаём яркость красного светодиода, а также Hz, в котором мы задаём частоту переключения светодиода. Оператор if проверяет, задан ли уже интервал. Если да, мы останавливаем этот интервал и снова выключаем светодиод. После этого функция продолжает выполнять оставшийся код.

Если мы хотим включить светодиод на полную яркость и на 100 Гц, то нам нужно держать его включённым (при помощи функции digitalPulse) в течение 10 мс и повторять это каждые 10 мс. Если нам нужно только 20% от яркости, то нам надо держать его включённым в течение 2 мс и повторять это каждые 10 мс. Теперь попробуйте код ниже – он включит светодиод только с 10% яркостью:

pwm(0.1, 50);

Также можете попробовать поэкспериментировать с аргументами. Вы увидите, что изменение аргумента Hz мало чего изменит, но если уменьшить его, например, до 15, это создаст раздражающее мерцание. Кроме того, вы всегда можете остановить мигание светодиода, просто напечатав:

clearInterval(interval); LED1.reset();

Теперь вы должны примерно понимать, как работает ШИМ, и можете применить её сами при помощи функции analogWrite(), а если точнее – в свойстве freq аргумента options.

См.также

Внешние ссылки