Что такое широтно-импульсная модуляция (ШИМ), и как она используется в Arduino?

Широтно-импульсная модуляция (ШИМ, англ. PWM — Pulse Width Modulation) — это один из базовых методов управления аналоговыми устройствами при помощи цифровых сигналов. Несмотря на то, что микроконтроллеры Arduino работают исключительно с цифровыми состояниями 0 В (LOW) и 5 В (HIGH), с помощью ШИМ можно эмулировать промежуточные значения напряжения, создавая эффект «псевдоаналогового» выхода. Этот механизм широко используется в управлении яркостью светодиодов, скоростью вращения двигателей постоянного тока, сервоприводами, аудиогенераторами и даже LCD-дисплеями.

Принцип работы ШИМ

Основная идея ШИМ проста: цифровой контакт переключается между состояниями «ВКЛ» и «ВЫКЛ» с очень высокой частотой. В течение каждого цикла часть времени сигнал находится в состоянии HIGH, а часть времени — в LOW. Соотношение этих времён и называется рабочим циклом (Duty Cycle).

Рабочий цикл (Duty Cycle)

Duty Cycle измеряется в процентах и показывает, какую часть периода сигнал находится в состоянии «ВКЛ». Например:

  • 0% — сигнал всегда выключен, среднее напряжение = 0 В;
  • 50% — половина времени HIGH, половина LOW, среднее напряжение ≈ 2,5 В;
  • 100% — сигнал постоянно HIGH, напряжение = 5 В.

Частота ШИМ

Второй важный параметр — частота. Это количество циклов в секунду, с которой происходит переключение HIGH/LOW. На плате Arduino Uno стандартные контакты ШИМ работают с частотой около 490 Гц, а пины 5 и 6 используют повышенную частоту 980 Гц. Чем выше частота, тем более «плавным» будет восприниматься управление устройством.

Какие пины Arduino поддерживают ШИМ?

На большинстве плат Arduino контакты с поддержкой ШИМ отмечены символом «тильда» (~). Например, на Arduino Uno это пины: 3, 5, 6, 9, 10, 11.

Для генерации сигнала используется встроенная функция analogWrite(pin, value), где:

  • pin — номер пина с поддержкой ШИМ,
  • value — значение от 0 до 255.

Значение 0 соответствует Duty Cycle = 0%, а 255 — 100%.

Примеры использования ШИМ в Arduino

1. Управление яркостью светодиода

Самый популярный пример: плавное изменение яркости светодиода. Код выглядит так:


int ledPin = 9;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  for (int value = 0; value <= 255; value++) {
    analogWrite(ledPin, value);  // Увеличение яркости
    delay(10);
  }
  for (int value = 255; value >= 0; value--) {
    analogWrite(ledPin, value);  // Уменьшение яркости
    delay(10);
  }
}
  

За счёт изменения Duty Cycle создаётся эффект плавного «дыхания» светодиода.

2. Управление скоростью двигателя постоянного тока

При подаче ШИМ-сигнала на драйвер двигателя регулируется среднее напряжение питания, что позволяет контролировать скорость вращения. Пример:


int motorPin = 6;

void setup() {
  pinMode(motorPin, OUTPUT);
}

void loop() {
  analogWrite(motorPin, 128); // Примерно 50% мощности
  delay(2000);
  analogWrite(motorPin, 255); // Полная мощность
  delay(2000);
}
  

3. Управление сервоприводами

Сервомоторы используют модифицированный ШИМ-сигнал, где ширина импульса определяет угол поворота. Для работы удобнее подключить библиотеку Servo.h:


#include <Servo.h>

Servo myServo;

void setup() {
  myServo.attach(9);
}

void loop() {
  myServo.write(0);   // Угол 0°
  delay(1000);
  myServo.write(90);  // Угол 90°
  delay(1000);
  myServo.write(180); // Угол 180°
  delay(1000);
}
  

4. Генерация звука

Arduino может использовать ШИМ для генерации звуковых сигналов. Для этого применяется функция tone(), но можно и вручную управлять ШИМ для создания простых мелодий.

5. Регулировка контрастности ЖК-дисплеев

Некоторые LCD-дисплеи позволяют изменять контраст с помощью ШИМ. Подключив выход ШИМ к управляющему входу дисплея, можно регулировать изображение без механического подстроечника.

Преимущества использования ШИМ

  • Энергоэффективность — меньшее выделение тепла по сравнению с аналоговым регулированием;
  • Простая реализация в Arduino при помощи analogWrite();
  • Высокая точность управления;
  • Возможность управления множеством типов устройств.

Недостатки и ограничения

  • Ограниченная частота ШИМ на стандартных платах Arduino;
  • Не все пины поддерживают ШИМ;
  • При слишком низкой частоте заметно мерцание светодиодов или шум двигателей;
  • Для мощных нагрузок необходимы драйверы и транзисторы.

Изменение частоты ШИМ

По умолчанию Arduino Uno работает на частотах 490 и 980 Гц. Однако при необходимости можно изменить частоту, работая напрямую с регистрами таймеров. Это используется, например, для управления звуком или более чувствительными устройствами. Для новичков чаще всего достаточно стандартных значений.

Заключение

Широтно-импульсная модуляция — это один из ключевых инструментов в арсенале разработчика Arduino. С её помощью можно управлять светодиодами, моторами, сервоприводами, дисплеями и даже создавать звук. Понимание принципов работы ШИМ открывает широкие возможности в электронике и позволяет создавать проекты, которые раньше казались сложными.

Если вы только начинаете работать с Arduino — начните с экспериментов с analogWrite() и светодиодом. Это даст наглядное понимание, как цифровые сигналы могут превращаться в «аналоговое» управление.

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Стойка нейлоновая М3 15мм + 6мм

Стойка нейлоновая М3 15мм + 6мм

Стойка для крепления различных електронных модулей к корпусу устройстваВысота стойки 15 ммДлина внеш..

3.60грн.

STM32F103CBT6 микроконтроллер QFP-48

STM32F103CBT6 микроконтроллер QFP-48

Микроконтроллер STM32F103CBT6 в корпусе QFP-48..

259.68грн.

ESP32 пианино из фруктов

ESP32 пианино из фруктов

Тема проекта: ESP32 пианино из фруктов. Друзья, рад вас всех сегодня видеть опять. Хочу проде..

Шаговый двигатель 28BYJ-48 с модулем драйвера

Шаговый двигатель 28BYJ-48 с модулем драйвера

Количество фаз 4Рабочее напряжение 5 ВКоэффициент изменения скорости 1/64Угол поворота минимальный&n..

114.93грн.

Создание простого таймера на ESP32: пример периодического вызова функции

Создание простого таймера на ESP32: пример периодического вызова функции

Создание простого таймера на ESP32: пример периодического вызова функции При разработке проектов ..