Вы здесь

Широтно-импульсная модуляция (ШИМ или PWM) в Arduino

Широтно-импульсная модуляция (ШИМ) в Arduino

При выводе данных из микроконтроллера мы очень часто используем нули и единицы. С этим справляется обычное управление портами вывода Ардуино и других микроконтроллеров.

Однако иногда нам требуется промежуточное значение. Для этого в микроконтроллерах используется система ШИМ или PWM (eng.), которая в зависимости от программы генерирует сигналы определенной длительности и напряжения. От промежуточного времени между импульсами зависит конечное на выходе.

График широтно-импульсной модуляции

За счет высокой частоты различные приборы и человек не замечают разницы между импульсным и стабилизированным напряжением.
В Arduino Uno есть несколько портов, поддерживающие ШИМ. Это выходы: 3,5,6,9,10,11. В Arduino используется 8 битный ШИМ, то есть мы можем выбрать одно из 256 значений переменной.
Для примера мы подсоединим светодиод на 3 пин Arduino и будем плавно гасить и зажигать его, тем самым подавая от 0 до 5В.

ШИМ со светодиодом и ардуино

const int LedPin = 3; // назовем 3 пин для удобства

void setup() {
  pinMode(LedPin, OUTPUT); // инициализируем наш порт на выход
}

void loop()
{

  for (int brightness = 0; brightness < 255; brightness++) { // создаем цикл, где яркость(brightness) = 0, и с каждым шагом увеличивается на 1 еденицу
    analogWrite(LedPin, brightness); // записываем это значение в порт
    delay(2); // задержка для правильной работы
  }

  for (int brightness = 255; brightness >= 0; brightness--) { // все тоже самое, только теперь уменьшаем яркость
    analogWrite(LedPin, brightness);
    delay(2);
  }

}

 

Шим конечно не полноценный ЦАП, который есть в Arduino Due, но на нём можно воспроизводить звуки через пьезоизлучатель с обычным Ардуино, на приемлемом уровне