CUSTOMELECTRONICS.RU
Информационно-учебный блог о разработке электроники
Эл. почта: info@customelectronics.ru

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" так, как показано на рисунке:
ColorLed
Голубой светодиод подключен к 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);
}

Индивидуальные задания

  1. Измените третий пример так, чтобы после плавного увеличения яркости, светодиоды гасли плавно.
  2. Подберите соотношение яркости светодиодов так, чтобы добиться белого свечения светодиода.
  3. Сделайте из шилда лампу настроения. Цвета должны случайным образом переливаться. Организуйте основной цикл так, чтобы сначала случайным образом выбирался номер вывода, а потом он плавно зажигался и гас. Для этого можно использовать функцию random(min,max). Для работы с ней объявите переменную int pin=0; и в цикле void loop() вызовите эту функцию pin=random(9,12);. Она запишет в переменную pin значение от 9 до 11.

Остальные статьи цикла можно найти здесь.

Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

Метки: , , , , , , Просмотров: 15569