Широтно-імпульсна модуляція (ШІМ — англ. pulse-width modulation, PWM), або модуляція за тривалістю імпульсів (англ. pulse-duration modulation, PDM) — процес керування шириною (тривалістю) високочастотних імпульсів за законом, який задає низькочастотний сигнал.
Перемикання відбувається з великою швидкістю, відповідно до типу навантаження, з таким розрахунком, щоб період модульованого сигналу був істотно меншим, ніж інерційність системи, до якої подається сигнал. Частота перемикання може становити декілька разів на хвилину для повільних процесів (наприклад електропечі); 100 Гц для електролампи розжарювання; від декількох до десятків кГц для електродвигуна або від десятків до сотень кГц для аудіопідсилювача і комп’ютерного блоку живлення.
Code example / Приклад коду
#include
#define ledPin D1 // цифровий вихід яким керуємо [0-1023]
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
Serial.println("Off");
digitalWrite(ledPin, LOW );
delay(2000);
Serial.println("10% Duty Cycle");
analogWrite(ledPin,102);
delay(2000);
Serial.println("20% Duty Cycle");
analogWrite(ledPin,205);
delay(2000);
Serial.println("50% Duty Cycle");
analogWrite(ledPin,511);
delay(2000);
Serial.println("70% Duty Cycle");
analogWrite(ledPin,714);
delay(2000);
Serial.println("100% Duty Cycle");
analogWrite(ledPin,1023);
delay(2000);
Serial.println("0->100% Duty Cycle");
for (int i=0; i< 1024; i++) { analogWrite(ledPin, i); delay(10); }
Serial.println("100->0% Duty Cycle");
for (int i=1023; i>-1 ; i--) {analogWrite(ledPin, i); delay(10); }
}
void loop() {
Serial.println("Breathing LED");
for (int i=200; i< 1000; i++) { analogWrite(ledPin, i); delay(1); }
for (int i=1000; i>200 ; i--) { analogWrite(ledPin, i); delay(4); }
}
Як це виглядає на екрані осцилографа:
Freq – частота , майже 1kHz
Dut (параметр коефіцієнту заповнення (англ. duty cycle), під яким розуміється відношення тривалості ввімкненого стану (англ. ‘on’ time) до прийнятого періоду імпульсів.
RMS (root mean square) – середньоквадратична напруга на світлодіоді