ШИМ
Гениально определение ШИМ сформулировано в Википедии, поэтому я просто скопипащу его оттуда: "ШИМ - приближение желаемого сигнала (многоуровневого или непрерывного) к действительным бинарным сигналам (с двумя уровнями - вкл/выкл), так, что, в среднем, за некоторый отрезок времени, их значения равны. <...> ШИМ есть импульсный сигнал постоянной частоты и переменной скважности, то есть отношения периода следования импульса к его длительности. С помощью задания скважности (длительности импульсов) можно менять среднее напряжение на выходе ШИМ."
Теперь разберемся, что это значит. Пусть есть обычный такой прямоугольный сигнал:
Он имеет фиксированную частоту и скважность 50%. Это означает, что половину периода напряжение максимально, а другую половину оно равно нулю. Проинтегрировав этот сигнал за период, мы увидим, что его энергия равна половине максимальной. Это будет эквивалентно тому, как если бы мы все время подавали половину напряжения.
Если у нас максимальное напряжение равно 5 В, то напряжение, получаемое на выходе ШИМ равно скважность умножить на 5 В (и делить на 100% чтобы формал-nazi не привязывались):
Arduino позволяет записать на ШИМ-выход значение от 0 до 255, а это значит, что мы можем получить напряжение с дискретностью примерно 20 мВ.
Трехцветный светодиод
Вот он, четырехногий красавец:
Самая длинная нога - это общий анод, а все остальные - это катоды, каждый отвечает за свой цвет: (смотрим на рисунок) самая нижняя - красный, вторая сверху - зеленый, самая верхняя - синий.
Если подать на длинную ногу +5В, а на все остальные 0В, то получится белый свет (умоляю, предохраняйтесь - ставьте ограничивающие резисторы!). Насколько он белый, можно судить по следующему видео:
Но получать белый цвет на нем как раз-таки неинтересно. Посмотрим, как заставить его переливаться разными цветами.
ШИМ на Arduino
Частота ШИМ на Arduino - примерно 490 Гц. На плате Arduino UNO выводы, которые могут быть использованы для ШИМ - 3,5,6, 9, 10 и 11. На плате к этому есть подсказка - шелкографией перед номерами ШИМ-выводов есть тильда или диез.
Нет ничего проще, чем управлять ШИМ на Arduino! Для этого используется одна единственная функция analogWrite(pin, value), где pin - номер вывода, а value - значение от 0 до 255. При этом ничего не надо писать в void setup()!
Подробнее про это на английском языке можно почитать здесь и здесь.
Совсем немного работаем
Сделаем так, чтобы светодиод переливался разными цветами. Пусть один цвет плавно гаснет, в то время как другой разгорается. Поочередно будем менять пару цветов, и цвет будет переходить по кругу из красного в зеленый, из зеленого в синий, из синего в красный.
Соберем незамысловатую схему:
И напишем незамысловатый код:
//обзываем выводы соответственно цвету
int REDpin = 9;
int GREENpin = 10;
int BLUEpin = 11;
void setup(){}
void loop(){
for(int value = 0 ; value <= 255; value +=1) {
//яркость красного уменьшается
analogWrite(REDpin, value);
//яркость зеленого увеличивается
analogWrite(GREENpin, 255-value);
//синий не горит
analogWrite(BLUEpin, 255);
//пауза
delay(30);
}
for(int value = 0 ; value <= 255; value +=1) {
//красный не горит
analogWrite(REDpin, 255);
//яркость зеленого уменьшается
analogWrite(GREENpin, value);
//яркость синего увеличивается
analogWrite(BLUEpin, 255-value);
//пауза
delay(30);
}
for(int value = 0 ; value <= 255; value +=1) {
//яркость красного увеличивается
analogWrite(REDpin, 255-value);
//зеленый не горит
analogWrite(GREENpin, 255);
//яркость синего уменьшается
analogWrite(BLUEpin, value);
//пауза
delay(30);
}
}
Далее по теме Arduino и ШИМ
Arduino: управляем цветом RGB светодиода с помощью джойстика
Визуализация ШИМ на осциллографе
Наконец нашел какая частота ШИМ на ардуино. Спасибо. Как поднять кстати не знаете?
ОтветитьУдалитьНужно перенастроить таймер, отвечающий за ШИМ. Подскажу, что нужно менять значения в регистрах TCCR2A, TCCR2B, OCR2A, OCR2B = 50.
УдалитьПосмотрите здесь: http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM
Можно воспользоваться библиотекой TimerOne и поиметь на 9,10 ШИМ во первых с частотами вплоть до мегагерца, а во вторых со скважностью, задаваемой не 256 значениями, а 1024.
ОтветитьУдалитьскачать библиотеку можно тут http://code.google.com/p/arduino-timerone/downloads/list
Почему бы не поставить всего один резистор на землю, вместо трех на +??
ОтветитьУдалитьНа моей схеме к +5V все-таки подключен анод, а резисторы к "земле".
УдалитьПредставьте, что RGB-светодиод - это три светодиода, у которых просто соединены аноды (а это так и есть). Для каждого светодиода должен быть собственный токоограничивающий резистор, поэтому их три.