Широтно-импульсная модуляция (ШИМ, англ. pulse-width modulation (PWM)) — процесс управления мощностью, подводимой к нагрузке, путём изменения скважности импульсов, при постоянной частоте. Т.е. изменяется только ширина импульса постоянной амплитуды при постоянной частоте.
Важнейшим параметром сигнала ШИМ считают коэффициент заполнения, который можно вычислить по формуле:
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мс для лучшей видимости эффекта. } |