воскресенье, 12 января 2014 г.

Уроки: Arduino для начинающих. ШИМ (PWM) и нарастающая яркость светодиода #01


Вам в схемах наверняка захочется не просто включать или выключать элементы, но и регулировать их в процессе работы. Так вам не всегда нужно просто включить двигатель на полную мощность, скорее всего вам захочется управлять скоростью вращения.

Проблема в том, что микроконтроллер Ардуино выдает на выходе напряжение 5В или никакого, но есть одна хитрость. Ваш микроконтроллер может переключаться из одного состояние в другое более тысячи раз в секунду! Этим симулируется не полное напряжение, которое называется ШИМ (Широтно-Импульсная Модуляция, англ. Pulse Width Modulation или просто PWM)


Отношение времени включения к времени выключения называется скважность. Так если вам нужно напряжение 2.5В чтобы мотор или светодиод работали не в полную силу, то нужно установить скважность на 50%.


Посмотрите на рисунок, за определенный промежуток времени t ваш микроконтроллер находится то во включенном, то в выключенном состоянии, причем время во включенном состоянии равно времени в выключенном состоянии. Эти переключения происходят так быстро, что в случае со светодиодом он будет гореть в половину мощности.

Давайте посмотрим как это будет выглядеть на схеме.

Соединим светодиод с резистором (я использую сопротивление R=100кОм) и с 9 выводом на вашем Ардуино. Вы можете выбрать любой вывод, который отмечен знаком "~" - это означает, что данный вывод может работать в режиме ШИМ.

катод светодиода (короткую ножку) соединяем с "Землей". Выводы "Земля" обозначены на микроконтроллере аббревиатурой  "GND".

У меня это выглядит так:


Синие провода идут к 9 пину, а красные к земле.

Осталось написать код (скетч) для управления светодиодом:

// Задаем константу, после нее ; не ставится!
#define LED_PIN 9
// задаем переменну
int i=0;

void setup ()
{
  // ставим 9 вывод в режим выхода
 pinMode (LED_PIN, OUTPUT);
}
void loop ()
{
 // Запускаем цик в ходе которого яркость светодиода будет нарастать.
 // Обрати внимание, что значение i регулирует яркость от 0 до 255,
 // где 0=напряжению в 0В, а 255 составляет напряжение 5В
 // Т.е. для получения в 2,5 В значение i должно быть ~127
 for (i=0; i<=255; i=i+5){
  analogWrite (LED_PIN, i);
  delay (100);
 }
}

Обратите внимание. Т.к. значение LED_PIN остается неизменным, то  я записал его как константу. Для объявления константы нужно использовать директиву #define, затем через пробел название констаны и ее значение. ";" при объявлении переменной - не ставится.

Яркость светодиода регулируется переменной i с шагом в 5 единиц от 0 до 255.

Если все сделано верно, то яркость светодиода должна циклично нарастать до максимума, а затем сбрасываться.

Комментариев нет:

Отправить комментарий