Каталог товаров
Клиенту
Тема сайта:
+38 (066) 305-77-25
Наш адрес
Харьков, времено - только доставка Новой Почтой, УкрПочтой, МистЕкспрес, ROZETKA Delivery
Телефоны:
Время работы
  • Пн-Пт: с 9 до 18
  • Сб.: с 10 до 17
  • Вс: с 11 до 16
E-mail
Мы в соцсетях
Перейти в контакты
0 0
Каталог
Главная
Закладки
0
Сравнить
0
Контакты

ШИМ (PWM): как управлять яркостью светодиодов и скоростью моторов

Чи була корисною ця стаття?
ШИМ (PWM): как управлять яркостью светодиодов и скоростью моторов

Широтно-импульсная модуляция: полный гайд для Arduino-мейкеров

От мигания светодиода до полета дрона — магия импульсов

PWM-сигнал на осциллографе

PWM-сигнал на осциллографе — сердце современной электроники

Введение: когда цифровой мир встречает аналоговый

Представьте себе ситуацию: вы держите в руках Arduino, подключаете светодиод и хотите сделать его яркость регулируемой — как в настольной лампе. Но есть проблема: микроконтроллер «разговаривает» только двумя состояниями — включено (5 вольт) или выключено (0 вольт). Никаких промежуточных значений. Как же тогда получить, скажем, 50% яркости?

Ответ кроется в гениальной технике под названием ШИМ (Широтно-Импульсная Модуляция) или на английском PWM (Pulse Width Modulation). Эта технология позволяет "обмануть" физику и получить аналоговые результаты из цифрового сигнала.

Интересный факт

Первый коммерческий PWM-усилитель звука создал британский изобретатель Клайв Синклер в 1964 году. Да, тот самый Синклер, который позже подарил миру легендарный компьютер ZX Spectrum! Его усилитель X-10 работал на принципах, которые до сих пор используются в современных Class-D аудиоусилителях.

Что такое ШИМ? Объяснение для людей

Аналогия с краником воды

Самая простая аналогия — это кран с водой, который вы быстро открываете и закрываете. Если держать кран открытым все время — поток максимальный. Если закрытым — воды нет. А теперь представьте, что вы быстро щелкаете краном: открыто-закрыто-открыто-закрыто... Если делать это достаточно быстро, вода будет течь равномерным потоком, но меньшим, чем максимальный!

Аналогия PWM с краном воды: быстрое переключение создает средний поток

Аналогия PWM с краном воды: быстрое переключение создает средний поток

Именно так работает ШИМ. Вместо того чтобы подавать постоянное напряжение 2.5 В (что микроконтроллер не умеет), мы подаем 5 В, но только половину времени. Результат? Среднее напряжение составляет 2.5 В!

Два ключевых параметра

1. Коэффициент заполнения (Duty Cycle)

Это процент времени, в течение которого сигнал находится в состоянии "включено" (HIGH). Измеряется в процентах от 0% до 100%:

  • 0% duty cycle — сигнал всегда выключен (0 В)
  • 50% duty cycle — половину времени включен, половину выключен (среднее напряжение 2.5 В)
  • 100% duty cycle — сигнал всегда включен (5 В)
Визуализация duty cycle: 25%, 50%, 75% — разная ширина импульсов при одинаковом периоде

Визуализация duty cycle: 25%, 50%, 75% — разная ширина импульсов при одинаковом периоде

2. Частота (Frequency)

Это скорость переключения между состояниями HIGH и LOW, измеряется в герцах (Hz). Частота определяет, сколько полных циклов "включено-выключено" происходит за секунду.

Формула среднего напряжения:
Vсредняя = Vпитания × (Duty Cycle / 100%)
Пример: 5В × 75% = 3.75В
Математика PWM

При питании 5 В и duty cycle 30% среднее напряжение составит 5 × 0.30 = 1.5 В. Именно это напряжение "почувствует" подключенное устройство, хотя фактически сигнал скачет между 0 и 5 вольтами сотни раз в секунду!

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

Почему глаз не видит мерцания?

Человеческий глаз имеет ограниченную способность воспринимать быстрые изменения света. Этот порог называется частотой слияния мерцания (Flicker Fusion Frequency) и составляет примерно 60-90 Гц для большинства людей. Если светодиод мигает быстрее — мы воспринимаем равномерный свет.

Восприятие мерцания глазом: низкая частота (заметное мигание) vs высокая частота (равномерный свет)

Восприятие мерцания глазом: низкая частота (заметное мигание) vs высокая частота (равномерный свет)

Но есть нюанс! Даже если мы не видим мерцания, наш мозг может его чувствовать. Исследования показывают, что низкочастотное PWM-мерцание может вызвать:

  • Усталость глаз и головную боль
  • Снижение концентрации при длительной работе
  • В редких случаях — приступы фотосенситивной эпилепсии (при частотах 3-70 Гц)

Стандарт IEEE 1789: безопасные частоты

В 2015 году Институт инженеров электротехники и электроники (IEEE) выпустил стандарт IEEE 1789-2015 с рекомендациями по безопасным частотам PWM для LED-освещения:

Частота Уровень риска Рекомендация
< 90 Гц ВЫСОКИЙ Избегать
90 – 1250 Гц СРЕДНИЙ Приемлемо
> 1250 Гц НИЗКИЙ Безопасно

Arduino Uno по умолчанию генерирует PWM с частотой около 490 Гц (пины 3, 9, 10, 11) или 980 Гц (пины 5, 6). Это находится в "желтой зоне" — приемлемо для большинства применений, но для профессионального освещения стоит поднимать частоту.

Проблема смартфонов

Многие OLED-экраны смартфонов используют PWM для регулировки яркости с частотой 200-500 Гц. При низкой яркости некоторые пользователи жалуются на усталость глаз. Производители премиум-смартфонов постепенно переходят на DC-димминг или высокочастотный PWM (более 1920 Гц).

Практика: плавное затухание LED на Arduino

Вот простой пример кода для создания эффекта "дыхания" светодиода:

Схема подключения LED к Arduino для PWM-диммирования (пин 9, резистор 220 Ом)

Схема подключения LED к Arduino для PWM-диммирования (пин 9, резистор 220 Ом)

led_breathing.ino
// LED "Дыхание" - плавное затухание
const int ledPin = 9; // PWM-пин
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
// Плавное увеличение яркости
for (int brightness = 0; brightness <= 255; brightness++) {
analogWrite(ledPin, brightness);
delay(10); // 10 мс задержка
}
// Плавное уменьшение яркости
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(ledPin, brightness);
delay(10);
}
}

Как это работает: Функция analogWrite() принимает значение от 0 до 255, где 0 — это 0% duty cycle, а 255 — это 100%. Arduino автоматически генерирует PWM-сигнал соответствующей ширины.

Нелинейность восприятия: гамма-коррекция

Человеческий глаз воспринимает яркость логарифмически, а не линейно. Это означает, что разница между 10% и 20% яркости кажется большей, чем между 80% и 90%. Для достижения визуально равномерного затухания нужна гамма-коррекция:

Сравнение: линейное затухание (воспринимается неравномерно) vs гамма-скорректированное (визуально плавное)

Сравнение: линейное затухание (воспринимается неравномерно) vs гамма-скорректированное (визуально плавное)

gamma_correction.ino
// Гамма-коррекция для плавного затухания
const float gamma_value = 2.2;
int gammaCorrect(int linear_value) {
float normalized = linear_value / 255.0;
float corrected = pow(normalized, gamma_value);
return (int)(corrected * 255);
}
void loop() {
for (int i = 0; i <= 255; i++) {
analogWrite(ledPin, gammaCorrect(i));
delay(10);
}
}

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

DC-моторы: инерция как природный фильтр

В отличие от светодиодов, DC-моторы обладают механической инерцией. Ротор не может мгновенно остановиться или разогнаться. Это свойство превращает прерывистый PWM-сигнал в плавное вращение — мотор просто "усредняет" импульсы!

При 50% duty cycle мотор получает половину максимальной мощности и вращается примерно с половинной скоростью. Но есть важный нюанс: частота PWM для моторов обычно ниже, чем для LED — от десятков герц до нескольких килогерц.

Почему моторы "поют"?

Если PWM-частота попадает в диапазон 20 Гц – 20 кГц, мотор может издавать слышимый писк или гул. Это вибрации обмоток на частоте PWM. Решение: либо снизить частоту ниже 20 Гц (что ухудшит плавность), либо поднять выше 20 кГц (что увеличит потери на переключение).

H-Bridge: управление направлением вращения

PWM контролирует только скорость мотора. Для изменения направления вращения необходимо изменить полярность питания. Здесь на помощь приходит схема под названием H-Bridge (Н-мост).

Принцип работы H-Bridge: различные комбинации переключателей меняют направление тока через мотор

Принцип работы H-Bridge: различные комбинации переключателей меняют направление тока через мотор

Н-мост состоит из четырех переключателей (транзисторов), расположенных в форме буквы "Н". Мотор находится посередине. Включая разные пары переключателей, мы направляем ток в разных направлениях через мотор.

Популярные H-Bridge драйверы:

  • L298N — классика для Arduino, два канала, до 2А на канал
  • TB6612FNG — более компактный, эффективный, до 1.2А
  • DRV8833 — популярный выбор для малых роботов

Практика: управление мотором с L298N

Схема подключения L298N к Arduino: ENA (PWM), IN1/IN2 (направление), мотор и питание

Схема подключения L298N к Arduino: ENA (PWM), IN1/IN2 (направление), мотор и питание

motor_control.ino
// Управление DC-мотором через L298N
const int ENA = 9; // PWM для скорости
const int IN1 = 7; // Направление 1
const int IN2 = 6; // Направление 2
void setup() {
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
}
// Вращение вперед с заданной скоростью (0-255)
void forward(int speed) {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, speed);
}
// Вращение назад
void backward(int speed) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, speed);
}
// Остановка
void stopMotor() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
analogWrite(ENA, 0);
}
void loop() {
forward(200); // 78% скорости вперед
delay(2000);
backward(150); // 59% скорости назад
delay(2000);
stopMotor();
delay(1000);
}

Dead-time: защита от короткого замыкания

При быстром переключении Н-моста существует опасность shoot-through — короткого замыкания, когда оба транзистора одного плеча случайно включаются одновременно. Это может сжечь схему за миллисекунды!

Внимание!

Dead-time (мертвое время) — короткая пауза между выключением одного транзистора и включением другого. Качественные драйверы моторов имеют встроенный dead-time, но при самостоятельном построении Н-моста это критически важно учесть.


Сервоприводы: точное позиционирование

Как работает сервомотор?

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

Внутреннее устройство сервопривода: мотор, редуктор, потенциометр обратной связи, управляющая плата

Внутреннее устройство сервопривода: мотор, редуктор, потенциометр обратной связи, управляющая плата

Ключевая особенность: в отличие от обычного PWM, где важен duty cycle, для сервоприводов критична именно длительность импульса, а не его процент от периода!

Стандартные параметры сигнала

Типичный хобби-сервопривод (SG90, MG996R и т. п.) ожидает сигнал со следующими параметрами:

  • Частота: 50 Гц (период 20 мс)
  • Импульс 1 мс — положение 0°
  • Импульс 1.5 мс — центральное положение 90°
  • Импульс 2 мс — положение 180°
Зависимость угла сервопривода от ширины импульса: 1 мс = 0°, 1.5 мс = 90°, 2 мс = 180°

Зависимость угла сервопривода от ширины импульса: 1 мс = 0°, 1.5 мс = 90°, 2 мс = 180°

Историческая справка

Частота 50 Гц (период 20 мс) для сервоприводов происходит со времен радиоуправляемых моделей 1960-х годов. Тогда сигнал передавался через PPM (Pulse Position Modulation), и период ~22.5 мс позволял управлять несколькими сервоприводами по одному радиоканалу. Стандарт сохранился, хотя технологии давно изменились!

Практика: управление сервоприводом

Arduino имеет встроенную библиотеку Servo, которая упрощает работу:

Схема подключения сервопривода: сигнал (оранжевый), питание (красный), земля (коричневый)

Схема подключения сервопривода: сигнал (оранжевый), питание (красный), земля (коричневый)

servo_control.ino
#include <Servo.h>
Servo myServo;
const int servoPin = 9;
void setup() {
myServo.attach(servoPin);
}
void loop() {
// Поворачиваем на 0°
myServo.write(0);
delay(1000);
// Центральное положение
myServo.write(90);
delay(1000);
// Максимальный угол
myServo.write(180);
delay(1000);
}
// Альтернатива: точное управление через микросекунды
// myServo.writeMicroseconds(1500); // Центр

Совет: Дешевые сервоприводы часто имеют неточные границы движения. Вместо стандартных 1000-2000 мкс они могут работать в диапазоне 500-2400 мкс. Экспериментируйте с writeMicroseconds() для точной калибровки.


PWM на Arduino: углубление в детали

Какие пины поддерживают PWM?

Не все пины Arduino одинаковы! PWM доступен только на пинах, обозначенных символом "~" на плате. Для Arduino Uno это пины 3, 5, 6, 9, 10, 11.

Расположение PWM-пинов на Arduino Uno — обозначены символом '~'

Расположение PWM-пинов на Arduino Uno — обозначены символом "~"

Пины Таймер Частота по умолчанию
5, 6 Timer0 ~980 Гц
9, 10 Timer1 ~490 Гц
3, 11 Timer2 ~490 Гц

Как изменить частоту PWM?

По умолчанию Arduino использует частоты около 500 Гц. Но для некоторых применений (SMPS, бесшумное управление моторами) требуются более высокие частоты. Это можно настроить через регистры таймеров:

change_pwm_frequency.ino
// Изменение частоты PWM на пинах 9 и 10 (Timer1)
// ВНИМАНИЕ: это влияет на функцию delay() и millis()!
void setup() {
// Устанавливаем делитель = 1 для частоты ~31 кГц
TCCR1B = TCCR1B & B11111000 | B00000001;
// Делитель = 8 для частоты ~3.9 кГц
// TCCR1B = TCCR1B & B11111000 | B00000010;
// Делитель = 64 для частоты ~490 Гц (по умолчанию)
// TCCR1B = TCCR1B & B11111000 | B00000011;
pinMode(9, OUTPUT);
}
void loop() {
analogWrite(9, 128); // 50% duty cycle
}
Внимание!

Изменение настроек Timer0 (пины 5, 6) нарушит работу функций delay(), millis() и micros(). Избегайте модификации Timer0, если это возможно.

ESP32: больше возможностей

ESP32 имеет значительно более гибкую систему PWM. Вместо фиксированных таймеров, здесь есть 16 независимых PWM-каналов с программируемой частотой от 1 Гц до 40 МГц и разрешением до 16 бит!

ESP32 DevKit — все GPIO-пины поддерживают PWM с гибкой настройкой частоты

ESP32 DevKit — все GPIO-пины поддерживают PWM с гибкой настройкой частоты

esp32_pwm.ino
// PWM на ESP32
const int ledPin = 2;
const int pwmChannel = 0;
const int frequency = 5000; // 5 кГц
const int resolution = 8; // 8 бит (0-255)
void setup() {
ledcSetup(pwmChannel, frequency, resolution);
ledcAttachPin(ledPin, pwmChannel);
}
void loop() {
// Плавное затухание
for (int duty = 0; duty <= 255; duty++) {
ledcWrite(pwmChannel, duty);
delay(10);
}
}

Применение PWM в реальном мире

PWM окружает нас повсюду, даже если мы этого не замечаем:

Инфографика: применение PWM в повседневной жизни

PWM в повседневной жизни: освещение, транспорт, аудио, бытовая техника

  1. LED-освещение — от настольных ламп до автомобильных фар
  2. Экраны смартфонов и мониторов — регулировка яркости подсветки
  3. Электротранспорт — контроллеры моторов в Tesla, электросамокатах, дронах
  4. Class-D аудиоусилители — компактные и эффективные (до 95% КПД!)
  5. Импульсные блоки питания — в каждом компьютере и зарядном устройстве
  6. Солнечные инверторы — преобразование DC в AC для сети
  7. Терморегуляторы — управление элементами Пельтье
  8. Вентиляторы ПК — 4-pin PWM для бесшумного охлаждения
PWM в космосе

Марсоход Perseverance использует PWM-контроллеры для управления своими моторами и сервоприводами. В разреженной атмосфере Марса эффективное управление мощностью критически важно — каждый ватт на счету!


Идеи для проектов

Вот несколько идей для практики работы с PWM:

🟢 Начальный уровень

RGB LED контроллер

Смешивание цветов через три PWM-канала. Создайте радугу или цветомузыку!

Музыкальная лампа

Яркость LED реагирует на звук через микрофон — простой аудиовизуализатор.

Диммер с потенциометром

Классический регулятор яркости — первый шаг к пониманию PWM.

🟡 Средний уровень

Робот-машинка

Два DC-мотора через H-Bridge, управление со смартфона по Bluetooth.

Пан-тилт камера

Два сервопривода для поворота камеры по горизонтали и вертикали.

Вентилятор с автоматикой

Скорость зависит от температуры — умное охлаждение.

🔴 Продвинутый уровень

Квадрокоптер

Синхронное PWM-управление четырьмя бесколлекторными моторами через ESC.

MPPT контроллер солнечной панели

Оптимизация заряда аккумулятора через отслеживание точки максимальной мощности.

Class-D усилитель

Собственный аудиоусилитель с ШИМ — вершина мастерства!


Выводы

PWM — это тот редкий случай, когда простая идея имеет огромное влияние. Быстрое переключение между двумя состояниями позволяет цифровым устройствам управлять аналоговым миром: от яркости одного светодиода до движения электромобиля.

Ключевые моменты, которые стоит запомнить:

  • Duty cycle определяет среднюю мощность (0-100%)
  • Частота должна быть достаточно высокой (>1 кГц для LED, >20 кГц для бесшумных моторов)
  • Сервоприводы работают на 50 Гц и зависят от ширины импульса (1-2 мс)
  • analogWrite() на Arduino — самый простой способ начать
Концептуальная иллюстрация PWM: от LED до дрона

От простого к сложному: PWM — фундамент современной электроники

Теперь, когда вы понимаете принципы PWM, весь мир микроконтроллеров открывается перед вами. От простого мигания LED до создания собственного дрона — все это построено на тех же фундаментальных принципах, которые вы только что изучили.

Успехов в ваших проектах! 🚀


Полезные ссылки

Рекомендуемые товары
Похожие статьи
Что такое напряжение?
Что такое напряжение?
Блог, Электроника для начинающих
17 февраля
Електричний струм для початківців: дружній гайд
Електричний струм для початківців: дружній гайд
Блог, Электроника для начинающих
19 февраля
Электромагнетизм: Невидимая Сила
Электромагнетизм: Невидимая Сила
Блог, Электроника для начинающих
14 апреля
Таємниці логічних рівнів
Таємниці логічних рівнів
Блог, Электроника для начинающих
25 мая

Продовжимо солов'їною?

Оберіть мову