Arduino. Использование ШИМ-модуляции
Широтно-импульсная модуляция (pulse width modulation, PWM) часто используется в цифровой технике. В Arduino есть специальная функция для формирования этого сигнала.
Временная диаграмма ШИМ-сигнала:
analogWrite
Скважность это отношение периода следования импульсов к их длительности. На рисунке – чем больше мгновенное значение управляющего сигнала, тем меньше скважность импульсов ШИМ-сигнала. Этот способ модуляции широко применяется в технике ввиду того, что позволяет произвольное среднедействующее значение средствами цифровых устройств. Этот способ применим в тех случаях, когда необходимо, например, плавно регулировать яркость свечения лампы, температуры нагревателя, скорость вращения мотора постоянного тока и так далее.
Arduino имеет встроенную функцию для формирования ШИМ-сигнала – analogWrite(pin,value). У этой функции два параметра: pin – номер вывода, на котором формируется сигнал; value – относительное значение скважности импульсов.
Value может принимать значения от 0 до 255. Причем максимальная скважность получается при 0 (а среднедействующее значение минимально), а минимальная при 255 (среднедействующее максимально). Функция analogWrite может работать только с выводами 9, 10 и 11 (на нашей плате EduBoard с микроконтроллером Atmega8). Соответственно, только такие значения может принимать переменная pin.
Если использовать эту функцию для управления другим выводом (0-8, 12, 13), то при значения скважности от 0 до 127 на выводе будет низкий уровень напряжения, а при 128-255 – высокий.
Подготовка к работе
На нашей плате TutorShield есть трехцветный светодиод. Отдельные цвета подключены к выводам 9, 10, 11 на которые можно вывести ШИМ-сигнал. Для возможности управления им установите перемычку "color" так, как показано на рисунке:
Голубой светодиод подключен к 9му выводу, оранжевый к 10му, зеленый к 11му.
Первый пример
Для начала, чтобы понять суть работы с ШИМ-сигналом попробуем запустить программу которая будет не просто включать/выключать светодиод, а менять его яркость между двумя значениями:
#define BLUE 9 #define ORANGE 10 #define GREEN 11 void setup() { pinMode(BLUE, OUTPUT); } void loop() { analogWrite(BLUE, 250); delay(500); analogWrite(BLUE,50); delay(500); }
Второй пример
Теперь напишем программу, плавно меняющую яркость свечения на этом светодиоде в цикле:
#define BLUE 9 #define ORANGE 10 #define GREEN 11 void setup() { pinMode(BLUE, OUTPUT); } void loop() { for (int i=0; i<256; i++) { analogWrite(BLUE,i); delay(10); } }
Третий пример
И, конечно, попробуем управлять поочередно всеми светодиодами:
#define BLUE 9 #define ORANGE 10 #define GREEN 11 void setup() { pinMode(BLUE, OUTPUT); pinMode(ORANGE, OUTPUT); pinMode(GREEN, OUTPUT); } void loop() { for (int i=0; i<256; i++) { analogWrite(BLUE,i); delay(10); } analogWrite(BLUE,0); for (int i=0; i<256; i++) { analogWrite(ORANGE,i); delay(10); } analogWrite(ORANGE,0); for (int i=0; i<256; i++) { analogWrite(GREEN,i); delay(10); } analogWrite(GREEN,0); }
Индивидуальные задания
- Измените третий пример так, чтобы после плавного увеличения яркости, светодиоды гасли плавно.
- Подберите соотношение яркости светодиодов так, чтобы добиться белого свечения светодиода.
- Сделайте из шилда лампу настроения. Цвета должны случайным образом переливаться. Организуйте основной цикл так, чтобы сначала случайным образом выбирался номер вывода, а потом он плавно зажигался и гас. Для этого можно использовать функцию random(min,max). Для работы с ней объявите переменную int pin=0; и в цикле void loop() вызовите эту функцию pin=random(9,12);. Она запишет в переменную pin значение от 9 до 11.
Остальные статьи цикла можно найти здесь.
Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.
Метки: analogWrite, Arduino, PWM, обучение, программирование, учебный курс, ШИМ Просмотров: 17451