ШИМ (PWM) В Arduino

Генерация ШИМ

Широтно-импульсная модуляция (PWM или ШИМ) — с помощью этого метода можно изменять ширину импульса при сохранении постоянной частоты волны. При данном методе используется цифрой источник сигнала, из которого получают аналоговый сигнал.

Сигнал ШИМ состоит из двух основных составляющих, которые влияют на его работу. Одним из них является коэффициент заполнения (рабочий цикл), вторым — частота сигнала.

Коэффициент заполнения сигнала

Период импульса состоит из цикла включения +5В и цикла выключения . Величина, в течение которого сигнал находится в высоком уровне (включен) во время одного периода, известна как коэффициент заполнения (выраженная в процентах).

\[ DutyCircle=\frac{T_{on}}{T_{on}+T_{off}}\times100 \]

Например. Импульс с периодом 20 мс будет оставаться включенным (высоким) в течение 4 мс. Следовательно, рабочий цикл будет:

D = 4ms / 20ms × 100 = 20%

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

Ниже показаны примеры сигналов с применением метода широтно-импульсной модуляции с разным коэффициентом заполнения (рабочим циклом).

Примеры сигналов ШИМ с разным коэффициентом заполнения
Рисунок 1. Примеры сигналов с разным коэффициентом заполнения

Частота сигнала

Частота сигнала определяет, как быстро ШИМ завершает цикл. То есть 2000 Герц будет 2000 циклов за одну секунду). Это означает, как быстро сигнал переходит из высокого уровня в низкий. Повторяя эту последовательность высокого и низкого уровня сигнала  с высокой скоростью (частотой) и с определенным рабочим циклом(коэффициентом заполнения), выход ШИМ будет представлять из себя обычный аналоговый сигнал с  постоянным  напряжением.

Пример


Если мы хотим создать аналоговый сигнал +2В для данного цифрового источника, который может быть либо высоким (включен) при +5В, либо низким (выключен) при , мы можем использовать ШИМ с рабочим циклом 40%. Он будет обеспечивать выход +5В в течение 40% времени.

Если цифровой сигнал циклически повторяется достаточно быстро, то напряжение на выходе оказывается средним напряжением. Если цифровое нижнее значение равно 0 В (что обычно и бывает), то среднее напряжение можно рассчитать, взяв цифровое высокое напряжение, умноженное на рабочий цикл:

5 В × 0,4 = 2 В

Теперь давайте посмотрим на ШИМ в Arduino на примере Arduino Uno.

Контакты PWM (ШИМ) в Arduino

Arduino Uno имеет 6 8-битных каналов ШИМ. Эти контакты на плате обозначены символом «~». Эти выводы показаны на изображении ниже.

Контакты, которые поддерживают ШИМ, на плате ардуино уно
Рисунок 2. Контакты, которые поддерживают ШИМ, на плате ардуино уно

Функции Arduino для работы с ШИМ

AnalogWrite (Pin, Duty)

Эта функция применяется для генерации ШИМ или вывода аналогового значения на указанный канал. Подробнее о функции analogWrite.

Параметры

  • Pin — вывод, на котором мы хотим генерировать ШИМ или аналоговый сигнал.
  • Duty — рабочий цикл, лежит в пределах от 0 (0%, всегда выключен) – 255 (100%, всегда включен).

Пример

AnalogWrite (3, 127) // генерирует ШИМ с рабочим циклом 50%

Затухание светодиода с помощью Arduino PWM

Давайте создадим небольшое приложение, в котором светодиод будет постоянно гаснуть. Это приложение по управлению яркостью светодиода можно использовать, например, для украшения светодиодами дома или фестивалей.

Схема подключения светодиода к ардуино уно
Рисунок 3. Схема подключения светодиода к ардуино уно

Скетч для затухания светодиода с помощью Arduino PWM

int led = 6;           // контакт ШИМ, к которому подключен светодиод
int brightness = 0;    // яркость светодиода
int fadeAmount = 5;    шаг изменения яркости светодиоду

void setup() {
  pinMode(led, OUTPUT); // объявляем  вывод ШИМ как выход:

}
void loop() {
  analogWrite(led, brightness); // устанавливаем яркость светодиода
  // изменить яркость в следующий раз через цикл:
  brightness = brightness + fadeAmount;
 // изменить направление затухания на концах затухания:
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }  
  delay(30);  // ждем 30 миллисекунд, чтобы увидеть эффект затемнения
}

Управление яркостью светодиода с помощью потенциометра

Давайте создадим приложение, в котором мы будем управлять яркостью светодиода с помощью Arduino, изменяя ручку потенциометра. И так, когда мы вращаем ручку потенциометра, АЦП Arduino будет считывать этот аналоговый сигнал. Затем мы будем генерировать ШИМ-сигнал, пропорциональный аналоговому сигналу.

Схема подключения потенциометра  и светодиода
Рисунок 4. Схема подключения потенциометра  и светодиода

Скетч для управления яркостью светодиодов

int ledPin = 6;      // светодиод подключен к цифровому контакту 9
int analogPin = A0;  // потенциометр подключен к аналоговому контакту 3
int val = 0;         // переменная для хранения прочитанного значения
void setup()
{
  pinMode(ledPin, OUTPUT);   // объявляем  вывод ШИМ как выход:
}
void loop()
{
  val = analogRead(analogPin); // чтения значения от потенциометра
  analogWrite(ledPin, val / 4);// Значения AnalogRead варьируются от 0 до 1023, значения AnalogWrite от 0 до 255.
}
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии