|   Войти

Управление яркостью светодиода

Авторы: Ермолов К. А.,

Манойлов В. В.

Февраль 2019 года.

У контроллера Arduino есть 6 выводов цифрового порта (3-й, 5-й, 6-й, 9-й, 10-й и 11-й), которые поддерживают широтно-импульсную модуляцию (ШИМ). Эти выводы обозначены значком ~. Суть ШИМ заключается в следующем. Если, например, нужно, чтобы яркость светодиода (или скорость двигателя) уменьшилась, то на него нужно подавать высокий уровень не все время, а импульсно. Если, к примеру, высокий уровень подается в течение 1 миллисекунды, затем подается низкий уровень в течение 1 миллисекунды (мс), затем опять высокий, потом снова низкий и т.д., то светодиод будет гореть только в течение половины времени. Но поскольку включение и выключение происходит очень быстро (несколько сотен раз в секунду), мы не замечаем мигания, но мы видим, что яркость свечения светодиода уменьшилась в 2 раза. Если светодиод включен в течение 1 мс, затем выключен в течении 9 мс, затем опять включен 1 мс и т.д., то яркость составит только одну десятую от максимальной яркости. На рисунке представлены графики напряжений для различных вариантов ШИМ:

Чтобы управлять яркостью светодиода, его следует подключить к одному из выводов цифрового порта с ШИМ, например, к 3-му.

Команда analogWrite, задает яркость светодиода в диапазоне от 0 до 255, где 0 – светодиод выключен, а 255 – светодиод горит с максимальной яркостью. Например, команда analogWrite(3, 127), зажигает светодиод, подключенный к 3-му выводу цифрового порта, на половину его максимальной яркости.

Изменим программу из прошлого урока таким образом, чтобы светодиод мигал, но при этом не выключался полностью. Он будет гореть, чередуя 100-процентную яркость с 10-процентной (т.е. одна десятая от максимальной яркости):

byte LED=3; // создаем переменную LED. В ней мы будем хранить номер вывода, к которому подключен светодиод. В данном примере – 3-й вывод.

void setup() {  //функция setup выполняется один раз

  pinMode(LED, OUTPUT);  //3-й вывод цифрового порта делаем выходом (число 3 хранится в переменной LED)

} 

void loop() {  //функция loop выполняется бесконечное количество раз, пока работает контроллер

  analogWrite(LED, 255); // на 3-й вывод цифрового порта подаем максимальный уровень ШИМ. Светодиод загорится с максимальной яркостью.

  delay(250); //ждем 250 миллисекунд, т.е. одну четверть секунды. Светодиод продолжает гореть.

  analogWrite(LED, 25); //на 3-й вывод подаем 10-процентный уровень ШИМ. Светодиод будет горесть на одну десятую от максимальной яркости.

  delay(250); // ждем еще 250 миллисекунд. В течение этого времени светодиод горит на одну десятую максимальной яркости.

// после этого функция loop повторится

Скачать эту программу можно здесь.

Теперь изменим программу таким образом, чтобы светодиод плавно увеличивал свою яркость от 0 до максимальной. Для этого нам потребуется цикл с оператором for. Этот оператор позволяет повторять блок операторов определенное количество раз с изменением какого-то параметра. Оператор for используется следующим образом:

for(Инициализация; Условие; Приращение) {операторы}

Инициализация выполняется один раз в начале цикла. Далее на каждом шаге цикла проверяется условие. Если оно верно, выполняются операторы, заключенные в фигурные скобки и приращение (т.е. изменение какой-то переменной). После этого условие проверяется вновь. Когда значение условия становится ложным, цикл прекращается.

Вот пример программы:

byte LED=3; // создаем переменную LED. В ней мы будем хранить номер вывода, к которому подключен светодиод. В данном примере – 3-й вывод.

int i; // создаем переменную i. Тип int позволяет хранить числа от -32768 до 32767.

void setup() {

  pinMode(LED,OUTPUT); //3-й вывод цифрового порта делаем выходом (число 3 хранится в переменной LED)

}

 

void loop() {

  for(i=0; i<=255; i++){ //инициализация i=0 – присваиваем переменной i значение 0. Условие – i должно быть меньше либо равно 255. Приращение i++ увеличивает значение i на единицу. Как только i достигнет значения 256, цикл прервется.

    analogWrite(LED, i); // на 3-й вывод порта подаем ШИМ с уровнем i. В свою очередь i пробегает значения от 0 до 255.

    delay(100);// каждое значение ШИМ выводим в течение одной десятой секунды.

  } //конец цикла for

}//конец функции loop. Эта функция выполняется бесконечное количество раз, пока работает контроллер.

Результат работы программы следующий: сначала на 3-й вывод подается ШИМ с уровнем 0 (i=0). Этот уровень держится в течении 100 мс. Затем i увеличивается на единицу и становится равным 1. На 3-й вывод подается ШИМ с уровнем 1 и держится в течении 100 мс. Затем i снова увеличивается на единицу, становится равным 2. Теперь на 3-й вывод подается ШИМ с уровнем 2 в течении 100 мс. И так далее до 255. Как только i станет равным 256 цикл for прерывается.

Скачать программу.