Введение в светодиоды
Светодиод очень чуствителен к протекающему через него току. Так, если лампочку можно просто повесить на клемы батарейки, то светодиод от такого к себе отношения сначала помигает, а потом сдохнет, источая дикую вонь. Поэтому, у каждого светодиода, помимо падения напряжения, указывается его максимально-допустимый рабочий и пиковый токи. Так, для мелких светодиодов, токи как правило равны 10 - 20 миллиампер, а падения напряжений для красных равно 2.5 вольта, а для синих, зелёных и желтых около 4х вольт.
Для подключения одиночного светодиода к батарейке или иному источнику тока, используют гасящие резисторы или драйверы светодиодов. Драйвер светодиодов заслуживает отдельного обсуждения, а гасящий резистор опишу прямо здесь - в схеме далее будет таких аж 3 штуки)
Итак, для подключения светодиода с падением напряжения 3 вольта и током 20 миллиампер к источнику питания, скажем 5 вольт, последовательно в цепь необходимо воткнуть резистор. Расчет резистора в этом случае следующий:
R = (Uпит - Uпад) / Iдиода, что для нашего светодиода составит
R = (5 - 3)/0.020 = 100Ом.
При этом необходимо учитывать, что лишние 2 вольта осядут на резисторе в виде тепла. Для мелких светодиодов это может быть не принципиально, но для светодиодов с потреблением порядка 100 - 700мА это уже серьёзно. Для расчета выделяемой резистором в воздух мощности(в виде тепла) существует формула:
P = I*U
т.е. мощность равна силе тока в цепи * напряжение падения, что в нашем случае составит 0.02 * 2 = 0.04 ватта. Ну тут любая SMD-шка справится)
Вторая формула мощности, которую можно вывести через закон Ома -
U = I*R -> P = I*(I*R)
P = I*I*R
Мощность равна сила тока в квадрате, умноженная на сопротивление. Т.е. для нашего случая 0.02А*0.02А*100Ом = 0.04 ватта.
В случае, когда нам необходимо последовательно запитать несколько светодиодов в цепи - например, 2 светодиода с падением 2.4 вольта от 5 вольт, диоды подключают последовательно, а гасящий резистор в этом случае должен погасить только (5В-2*2.4В) = 0.2 вольта, соответственно он будет равен 0.2/0.020 = 10Ом. Мощность его при этом составит 10*0.02*0.02 = 0.004 ватта.
Другое дело, когда в бой идут светодиоды повышеной яркости, с большим потребляемым током - например, рассматриваемый далее RGB светодиод позволяет мучать себя током в 350мА, т.е. 0.35А. Для его красной составляющей с падением напряжения 2.6 вольта резистор будет уже солидным - (5 - 2.6)/0.35 = 6.85Ом. Но омы тут не главное - мощность, рассеиваемая данным резистором P = 0.35*0.35*6.85 = 0.839, что почти ватт. Резистор при этом будет греться как утюг (у меня термопара показывала 79 - 80 градусов), поэтому в моей схеме ниже я применяю двухватные резисторы. И всё бы ничего, но расстояние между выводами такого резистора почти 20 миллиметров, и сам он размером в две микросхемы ATTiny13 в дипе)))
Ниже показан резистор на радиаторе и матовый стакан для зубных щеток, который будет использоваться в качестве плафона)
Введение в ШИМ
Шим - широтно-импульсная модуляция. Описание ШИМа даже википедия рекомендует почитать у DI HALTa, на easyelectronics.ru, поэтому много распинаться по теории не буду, а на практике покажу, как это сделано у меня на ассемблере.
Суть шима - подавать на управляемое устройство не сплошной сигнал, а кучу прерывистых. При этом устройство, питаемое от ШИМанутых импульсов, будет получать не полное питание, а лишь его часть(в случае, если в ШИМ есть скважины, т.е. отсутствие сигнала).
Для светодиода ШИМ является очень удобным способом управления его яркостью. Так, если для управления яркостью лампочки можно увеличивать или уменьшать напряжение в достаточно большом диапазоне, то для светодиода яркость регулируется его постоянным включением/выключением. Например, при включении/выключении светодиода много раз в секунду, он будет гореть в половину своей яркости. Следует также учесть, что длительность сигнала/длительность отсутствия сигнала, не являются постоянными величинами - например мы можем 2мс держать светодиод включенным, 1 мс - выключенным. В таком случае яркость его составит 2 / (2 + 1) от максимальной.
В идеале в ШИМ - схему необходимо встроить интегрирующую цепочку, чтобы скважины и импульсы приобрели вид кривой, а не пиков и провалов; но для данной схемы это не обязательно)
ATtiny13
Фактически, у данного микроконтроллера есть две ноги, которые умеют генерировать аппаратный ШИМ, используя встроенные средства(таймеры). Но для RGB светодиода требуются три ноги, поэтому генератор я решил собрать самостоятельно.
Три ноги микросхемы объявлены как выходы; на них будет генерироваться сигнал.
Три переменных - brightR, brightG, brightB отвечают за яркость своего канала, R G и B соответственно. Их значение определяет, сколько тиков счетчика светодиод будет включен, а сколько - выключен.
/***********************************************************/
/* Таймер. По таймеру лишь формируется ШИМ сигнал для RGB канала */
/***********************************************************/
event_timer:
/*ШИМ для каждого канала в соответсвии с регистрами яркости*/
push tmp1
in tmp1, SREG
push tmp1
push tmp2
in tmp1, PORTB
ori tmp1, 0b00011100 ;Выставляем биты вывода
/*Проверяем, попадает-ли текущее значение счетчика в интервал 0..Яркость канала
Если нет - выключаем порт*/
mov tmp2, current_pwm_value
cp brightR, tmp2
brpl ev_t_skip_red
andi tmp1, 0b11111011
ev_t_skip_red:
cp brightG, tmp2
brpl ev_t_skip_green
andi tmp1, 0b11110111
ev_t_skip_green:
cp brightB, tmp2
brpl ev_t_skip_blue
andi tmp1, 0b11101111
ev_t_skip_blue:
/*Генерируем сигнал*/
out PORTB, tmp1
/*Увеличиваем счетчик pwm*/
inc tmp2
cpi tmp2, c_max_gradations + 1
brne ev_t_exit
clr tmp2
ev_t_exit:
mov current_pwm_value, tmp2
pop tmp2
pop tmp1
out SREG, tmp1
pop tmp1
reti
Поясню ещё раз некоторые моменты алгоритма:
По переполнению таймера на единичку увеличивается счетчик current_pwm_value
- Сравниваем яркость красного канала brightR с текущим значением счетчика current_pwm_value
- Если счетчик больше яркости красного - гасим красный диод
- Если счетчик меньше либо равен яркости красного - включаем красный диод
Для зеленого и синего канала повторяем соответствующую процедуру.
Счетчик current_pwm_value принимает значения от 0 до c_max_gradations; У меня в проекте c_max_gradations = 128, чего вполне достаточно для плавного изменения цветов. Максимальное значение данной константы - 254. Соответственно, яркости каналов также должны лежать в пределах от 0 до c_max_gradations.
Модуль индикации и управления
Модуль индикации и управления - собственно светодиод с обвесом в виде транзисторов и резисторов, а модуль управления - кнопка и резистор для переключения программы))
Резисторы светодиода взяты на 2 Вт, чтоб грелись поменьше. Как вариант - можно набрать параллельно или последовательно, но и двухватники стоят вполне вменяемо - особенно, на фоне RGB диода с радиатором)
При сборке главное не перепутать резистор красного светодиода с резисторами остальных, иначе ток через красный светодиод сильно превысит норму и диодик сдохнет)
Транзисторы bc817-40 и резисторы R1 - R3(3кОм) взяты в корпусах для поверхностного монтажа, чтобы не занимали лишнего места. Большие резисторы и микросхема в дип-корпусе распологаются на стороне компонентов.
Потребление схемы достаточно большое, поэтому блок питания тоже нужно брать соответствующий - на пару ампер.
Ниже показана готовая плата устройства, с запаянными деталями.
Размер платы выбран таким, чтобы полностью прятаться под радиатором светодиода.
Лампа стоит на столе и светится в ожидании корпуса:)
Внутри крепление выглядит следующим образом: