ШИМ

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

graf1Важнейшим параметром сигнала ШИМ считают коэффициент заполнения, который можно вычислить по формуле:

graf2где T = Ton + Toff;

Ton — время высокого уровня; TOFF — время низкого уровня; T — период сигнала Время высокого уровня и низкого уровня сигнала показано на рисунке выше. U1- это состояния высокого уровня сигнала, то есть амплитуда.

В ардуино ШИМ можно реализовать на цифровых входах/выходах, обозначенных PWM или ~. На плате Arduino Uno это D03, D05, D06, D10, D11. И скважность импульса задается в пределах от 0 до 255.

analogWrite(0) — 0%

analogWrite(64) — 25%

analogWrite(127) — 50%

analogWrite(191) — 75%

analogWrite(255) — 100%

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int ledPin = 11;    // Присваиваем имя цифровому выводу 11  
 
void setup()  { 
 pinMode(ledPin, OUTPUT);       // Инициализируем цифровой pin 11 как выход
} 
 
void loop()  { 
 //--------------------------------------------------------------------------------------
 analogWrite(ledPin, 0); //Задаем значение ШИМ 0%.
delay(3000);   // Пауза 3 с для лучшей видимости эффекта.
 
  analogWrite(ledPin, 64); //Задаем значение ШИМ 25%.
delay(3000);   // Пауза 3 с для лучшей видимости эффекта.
 
analogWrite(ledPin, 127); //Задаем значение ШИМ 50%.
delay(3000);   // Пауза 3 с для лучшей видимости эффекта.
 
analogWrite(ledPin, 191); //Задаем значение ШИМ 75%.
delay(3000);   // Пауза 3 с для лучшей видимости эффекта.
 
analogWrite(ledPin, 255); //Задаем значение ШИМ 100%.
delay(3000);   // Пауза 3 с для лучшей видимости эффекта.
//---------------------------------------------------------------------------------------------
 
//плавное изменение яркости
 for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { // изменяем значение от 0 до 255 с шагом 5. Если поставить ++, то с шагом 1.
        analogWrite(ledPin, fadeValue);         
        delay(30);  // Пауза 30мс для лучшей видимости эффекта.                          
  } 
 
   for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { //изменяем значение от 255 до 0 с шагом 5. Если поставить --, то с шагом 1.
       analogWrite(ledPin, fadeValue);         
       delay(30);   // Пауза 30мс для лучшей видимости эффекта.                                
  } 
}

И еще один вариант кода с ШИМ с дополнительными переменными для удобства.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int ledPin = 11; // Присваиваем имя цифровому выводу 11
int brightness = 0; // переменная для задания яркости
int fadeValue = 3; // шаг изменения яркости
 
void setup() {
pinMode(ledPin, OUTPUT); // Инициализируем цифровой pin 11 как выход
}
 
void loop() {
analogWrite(ledPin, brightness); // устанавливаем на выводе ledPin значение яркости яркость brightness
 
brightness += fadeValue; // изменяем значение яркости
 
if (brightness == 0 || brightness == 255) {
fadeValue = -fadeValue; // при достижении границ диапазона 0 или 255, меняем на протвоположное
}
delay(30); // Пауза 30мс для лучшей видимости эффекта.
}