Управление яркостью светодиода. Функция analogWrite()
Пины Arduino могут выдавать напряжение ровно 5 вольт. Что делать, если нужно меньше? На выручку приходит широтно-импульсная модуляция (ШИМ), управление которой производится через функцию analogWrite().
Меньшее значение напряжения может пригодиться, чтобы подключенный к Arduino светодиод горел тусклее.
Посмотрим подробнее, что такое ШИМ и как это работает.
Фокус с лампочкой
Представим, что к Arduino подключена пьезопищалка, которая каждый раз во время исполнения программы издает прерывистый, щелкающий звук.
Мы отчетливо слышим, как она включается и выключается. Что с ней происходит?
В плату был загружен вот такой код:
void setup() {
pinMode(6, OUTPUT);
}
void loop() {
digitalWrite(6, HIGH);
delay(5);
digitalWrite(6, LOW);
delay(5);
}
Как видите, мы подаем напряжение, ждем 5 миллисекунд и на следующие 5 миллисекунд отключаем его.
Чередование промежутков, когда есть напряжение и нет, создает колебания пьезопластины. Это очень похоже на то, как если бы мы дергали струну и отпускали. В результате слышим издаваемый динамиком прерывистый звук.
Можно предположить, что если в данной схеме заменить пьезопищалку на светодиод, то мы увидим мигание. Но это не так. Давайте разбираться, почему.
Дело в том, что 5 мс — это очень маленькое время. Одна миллисекунда в тысячу раз быстрее секунды, и человеческий глаз просто не успевает заметить мигания. Наблюдателю кажется, что свет горит непрерывно.
Эксперименты со скважностью
Здесь стоит поговорить о такой характеристике переменного сигнала как скважность. Этим термином обозначается отношение длительности включения и отключения напряжения (T) к отрезку времени, когда напряжение подается (t1).
Другими словами, скважность показывает соотношение времени, когда напряжение подается и когда оно нулевое.
Перебирая различные комбинации задержек в нашей программе, можно заметить, что с сокращением времени подачи напряжения — яркость светодиода снижается.
Пример таких значений можно увидеть в приведенном ниже коде (лампочка здесь горит с меньшей яркостью, чем до этого):
void setup () {
pinMode(6, OUTPUT);
}
void loop () {
digitalWrite(6, HIGH);
delay(1); // Всего одна миллисекунда!
digitalWrite(6, LOW);
delay(19);
}
Верно и обратное. Если подавать напряжение дольше, а выключать пин на меньшее время, то светодиод станет ярче.
Если бы сигнал не прерывался, то все 100% времени подключенный к плате элемент получал бы максимальное напряжение.
Добавляя паузы, мы снижаем действие напряжения. В изначальном примере, где чередование было задано как 5 мс отключения после 5 мс работы, светодиоду передавалась только половина от максимального напряжения в 5 вольт — то есть 2,5 вольта.
Функции генерации переменного сигнала
Для получения различных уровней напряжения совсем не обязательно подбирать и прописывать паузы самостоятельно — можно воспользоваться специальными функциями.
Одна из них — tone(). С ее помощью получают звук заданной частоты.
Подробнее об этой функции можно почитать в посвященной ей статье. Сейчас нас интересует только то, что она генерирует сигнал с одинаковыми промежутками подачи и отключения напряжения (см. Рис. 2).
Для широтно-импульсной модуляции используется функция analogWrite(). Она позволяет подавать нужное напряжение на указанный пин.
В отличие от tone(), функция analogWrite() работает на постоянной частоте 490Hz.
Запись функции выглядит следующим образом:
analogWrite(X, Y);
В скобках указаны два параметра, которые принимает функция. Х означает номер пина, на который необходимо подавать напряжение, Y — уровень напряжения.
Функция будет генерировать равномерный сигнал с заданными параметрами рабочего цикла, пока не последует новый вызов analogWrite() на тот же пин, но с другим значением Y.
Уровень напряжения функция понимает в «зашифрованном» виде. Принимаются значения от 0 до 255.
0 вольт — это просто 0, а 5 вольт, то есть максимум, соответствует цифре 255.
Пример использования функции analogWrite():
void setup() {
pinMode(10, OUTPUT);
}
void loop() {
analogWrite(10, 255); // Подаем напряжение 5 В на 10-й пин
delay(500);
analogWrite(10, 0); // Подаем напряжение 0 В на 10-й пин
delay(500);
analogWrite(10, 128); // Подаем напряжение 2,5 В на 10-й пин
delay(1000);
analogWrite(10, 50); // Подаем напряжение 1 В на 10-й пин
delay(1500);
}
Эта команда очень похожа на digitalWrite() при установленном режиме OUTPUT для выбранного пина. Отличие в том, что вместо HIGH, что означало просто включение пина на 5 вольт, здесь указывается уровень напряжения.
Добавить комментарий