Урок №04. Работа с ШИМ-портами. Циклы.

## Теоретическая справка о ШИМ (широтно-импульная модуляция)

**ШИМ (широтно-импульсная модуляция)** - процесс управления мощностью, подводимой к нагрузке, путём изменения скважности импульсов, при постоянной частоте. Простыми словами - это способ задавать произвольное напряжение на выходе, переключаясь между LOW и HIGH сигналами тысячи раз в секунду.

Под скважностью понимается временной промежуток между LOW и HIGH сигналами.

Для более ясного понимания ШИМ приведем пример. Предположим, что у нас есть светодиод, который соединен с кнопкой таким образом, что когда ее зажимают, светодиод излучает свет, а когда кнопка отпущена, то он гаснет. И так, если мы зажмем кнопку и практически сразу его отпустим, то светодиод погаснет, не успев загореться на полную мощность. Теперь попробуем провести этот опыт несколько раз подряд. Мы увидим, что светодиод как будто бы не успевает получить полное напряжение и работает лишь на 50 %. По такому принципу работает ШИМ. Она подает максимальное напряжение, но благодаря тому как долго держит "нажатой" кнопку, "отпускает", ждет и потом снова "нажимает" кнопку, рождается вот такой сигнал с уменьшенным значением напряжения. Ниже приведено несколько графиков с примерами:

    На платах Arduino UNO специальные ШИМ-порты обозначают волнистой чертой "~".

На большинстве плат Arduino Uno, Nano, Micro режим работы с ШИМ поддерживают порты **3**, **5**, **6**, **9**, **10** и **11.** На плате Arduino Mega порты с **2** по **13.**

## Теоретическая справка о цикле FOR

Опишем работу цикла FOR:

Оператор for требует на вход 3 параметра for (выражение 1; выражение 2; выражение 3), которые определяют количество раз, которое будет выполнен цикл.

* Сначала определяется переменная счетчик (выражение 1).
* Проверяется условие выполнение цикла (выражение 2)
* Если условие ложно, то программа выходит из цикл for и продолжает свое выполнение. Т.е. если в самом начале условие будет ложно, то тело цикла не выполнится ни одного раза.
* Если условие истинно, то начинает выполняться тело цикла.
* После того как тело цикла выполнится, программа возвращается к заголовку и выполняет изменение значение переменной-счетчика (выражение 3).
* После этого возвращаемся к пункту два, и все действия повторяются до тех пор, пока условие не станет ложным.

Пример формата цикла FOR:

```
for (int i=0; i<10; i++){ // определяем счетчик i. Пока i<10 выполняем набор команд и
                          //увеличиваем i на единицу.

//операторы будут здесь

}

```

## Написание программного кода

Для того чтобы послать ШИМ-сигнал с цифрового пина нам нужна функция analogWrite(). Эта функция посылает значения от 0 до 255 на заданный ШИМ-пин, где 0 соответствует 0V, а 255 - 5V. Таким образом, организуя цикл, который будет отправлять ШИМ-сигнал, увеличивая его значение на единицу каждые 10 миллисекунд, мы получим плавно загорающийся светодиод.

```
int PWMpin=10; //объявляем переменную пина

void setup() {

pinMode(PWMpin, OUTPUT); //выставляем режим работы 10-ого пина как выход.

}

void loop() {

for (int i=0; i<=255; i++) { //организуем цикл от 0 до 255

  analogWrite(PWMpin, i);    //в команду записываем значение счетчика

  delay(10);                 //ставим небольшую задержку

  }

}

```