Широтно-імпульсна модуляція (ШІМ — англ. 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) – середньоквадратична напруга на світлодіоді