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

Рано или поздно нам надоест, что светодиод всегда светит ярко или моторы крутятся с постоянной скоростью. Но на помощь приходят ШИМ-порты. Широтно-Импульсная модуляция, или ШИМ, это операция получения изменяющегося аналогового значения посредством цифровых устройств. Другими словами, устройства используются для получения прямоугольных импульсов — сигнала, который постоянно переключается между максимальным и минимальным значениями.   Данный сигнал моделирует напряжение между максимальным значением (5 В) и минимальным (0 В), изменяя при этом длительность времени включения 5 В относительно включения 0 В. Длительность включения максимального значения называется шириной импульса. Для получения различных аналоговых величин изменяется ширина импульса. При достаточно быстрой смене периодов включения-выключения можно подавать постоянный сигнал между 0 и 5 В на светодиод, тем самым управляя яркостью его свечения.

На графике зеленые линии отмечают постоянные временные периоды. Длительность периода обратно пропорциональна частоте ШИМ. Т.е. если частота ШИМ составляет 500 Гц, то зеленые линии будут отмечать интервалы длительностью в 2 миллисекунды каждый. Вызов функции analogWrite() с масштабом 0 – 255 означает, что значение analogWrite(255) будет соответствовать 100% рабочему циклу (постоянное включение 5 В), а значение analogWrite(127) – 50% рабочему циклу. Обратите внимание на то, что ШИМ имеют только пниы: 3, 5, 6, 9, 10, 11.

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

Приведу пример изменения яркости светодиода c помощью потенционометра. Подключим светодиод к 9 пину через резистор 220Ом и потенционометр к 0 аналоговому выходу.

схема новая

Теперь осталось только всё запрограммировать. Есть два варианта это сделать. Можно полученные значения с потенционометра разделить на 4 и отправить их на светодиод, или умножить полученные значения с потенционометра на 255, а потом разделить на 1023. Второй способ будет более точным. Вот сам программный код:

#define LedPin 9
#define PotPin 0

void setup() {
    pinMode (LedPin, OUTPUT);
} 

void loop() {
    int PotVal = analogRead(Pot_Pin);
    analogWrite(LedPin, (PotVal*255/1023));
    delay(20);
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *