Приветствую всех. При разработке данного устройства не стояло целей создать что-то конкретное, просто идея и просто ее реализация. Спектр применения ограничивает лишь фантазия. Итак, единственной задачей было создание управления тремя каналами ШИМ и их различными комбинациями при помощи одной переменной. За переменную был взят АЦП (значение аналого цифрового преобразователя). 10 битный АЦП микроконтроллеров AVR способен дать 1024 значения (2 в 10 степени). Достаточно для количества градаций цветовой палитры, чтобы плавно изменять оттенки. Основа конструкции микроконтроллер AVR attiny13. Он имеет всего 2 канала аппаратного ШИМа, поэтому реализовался программный ШИМ.
От идеи к реализации:
Для программной реализации необходимо задействовать два прерывания — для реализации программной ШИМ прерывания по таймеру (таймер 0) и прерывания по завершению преобразования АЦП (ADC_vect). Это первая часть. Вторая — инициализация порта, таймера и АЦП и алгоритм смены цветов. Для этого не мало важно знать правило, по которому происходит смена оттенков цветов. Будем использовать порядок как в радуге. Между прочим, чтобы посмотреть как смешиваются цвета, далеко лезть не нужно, в том же пэйнте или другом редакторе, содержащем инструменты с палитрой цветовой гаммы можно посмотреть это. Источником опорного напряжения для АЦП выбираем напряжение питания (5 вольт). При старте в программе заложено что-то типа инициализации — на полсекунды загорается каждый цвет RGB светодиода, чтобы было видно, что все исправно технически, а также все три цвета вместе — если белый цвет, то с балансом белого все в порядке. Мало ли. Теперь это же в программном коде.
#define LED1 PB0 #define LED2 PB1 #define LED3 PB2 #define LED_PORT PORTB #define LED_DDR DDRB #define BUTTON1 PB3 #define B_PORT PORTB #define B_DDR DDRB // прерывание по переполнению таймера 0 ISR (TIM0_OVF_vect) { if (count++ > pwm) { count=0; red_b = red; //сохранием значения в буфер green_b = green; blue_b = blue; LED_PORT |=(1<0) {B=1;} if (ADC>2) {B=2;} if (ADC>254) {B=3;} if (ADC>508) {B=4;} if (ADC>762) {B=5;} if (ADC>1016) {B=6;} if (B==1) {green=pwm;blue=0;red=0;} if (B==2) {blue=A; green=pwm; red=0;} if (B==3) {green=(pwm-(A-254)); blue=pwm; red=0;} if (B==4) {red=(A-508); blue=pwm; green=0;} if (B==5) {blue=(pwm-(A-762)); red=pwm; green=0;} if (B==6) {red=pwm;blue=0;green=0;} } // конец while(1) } // конец main
Работа ШИМ человеческим глазом не заметна, то есть мерцаний нет. Если глаз вооружить камерой, то немного заметно, ну оно и понятно, камера по своим параметрам может много чего незаметного глазу человека усмотреть.
В итоге вышло такое устройство:
В качестве RGB светодиода использовался кусочек светодиодной ленты на RGB светодиодах (1 юнит, это 3 светодиода). Лента требует питания 12 вольт, поэтому был собран DC-DC повышающий преобразователь 5 вольт — 12 вольт на микросхеме MC34063 для питания либо от USB порта, либо от нескольких батареек 1,5 вольта для возможности использовать портативно устройство. Если планируется использовать это, например от бортовой сети автомобиля 12 вольт, то MC34063 нужно заменить на понижающий стабилизатор (либо схемно с MC34063, либо заменить на LM7805 и соответственно расключить источники +12 и +5 вольт). Также стоит отметить, что светодиодная лента у себя на борту уже содержит токоограничительные резисторы, подобранные в соответствии с балансом белого цвета.
В качестве ключевых элементов используется микросхема ULN2003. Фактически это несколько транзисторов в корпусе микросхемы. Каждый канал способен выдержать 0,5 ампера, а в сумме по каналам 2,5 ампера, это стоит учитывать для возможной нагрузки. Также микросхему можно заменить на биполярный транзисторы или полевые для мощной нагрузки, но для полевых рекомендуется, в таком случае, использовать драйверы, можно самые простые.
Стабилитрон VD1 используется для защиты порта микроконтроллера от высокого напряжения (естественно, это относительное сравнение, так как для микроконтроллера 12 вольт уже высокое напряжение) и его номинал составляет 5,1 вольта. Можно применить 5,6 или в крайнем случае другой номинал близкий к значению в 5 вольт. Стабилитрон обязательно стоит применять только в случае, если напряжение, подаваемое на АЦП будет превышать 5 вольт. Конденсатор C6 можно не применять, поставил его просто для надежности. Дроссель в обвязке MC34063 можно использовать другого номинала в разумных пределах. R1, при подключении к источнику напряжения является делителем напряжения, им можно как настраивать цвет по умолчанию от зеленого до красного, так и подстраивать диапазоны напряжения при измерении.
Функционал не большой, но можно найти широкий диапазон применения от декоративного до информативного или просто побаловаться с RGB светодиодами. В зависимости от настроения всегда можно покрутить ручку потенциометра и сменить подсветку по вкусу или приделать к схеме делитель напряжения (или без него) и получится этакий вольтметр, имеющий вместо цифровых показаний цвет, соответствующий определенному напряжению. Ясное дело, такой вольтметр не сгодится для точных измерений, а вот как индикатор нескольких уровней напряжения с плавным изменением цвета между ними вполне не плохо. В конце концов, подавая выпрямленный усиленный звуковой сигнал с микрофона или аудиосистемы, можно получить одноканальную простейшую цветомузыку или индикатор громкости, соответствующей определенному цвету, в конце концов ночник. Схема не имеет сложностей и проста в повторении, отлично подойдет для обучающих целей начинающих радиолюбителей, позволяет проявить фантазию при изготовлении.
Стоит отметить, что в палитре цветов нет желтого и оранжевого. Так сделано, потому, что задумкой было сделать зеленый низкий уровень напряжения на АЦП, а красный — высокий, желтый и оранжевый — это смешение зеленого и красного (это единственная комбинация, не задействованная в устройстве).
Устройство собиралось на макетной плате. Потенциометр соединен с напряжением питания 5 вольт.
К статье прилагается проект протеус (для симуляции может потребоваться мощный ресурс компьютера, иначе будет притормаживать), прошивка для микроконтроллера, макетная печатная плата для attiny13 (15 и так далее с аналогичной распиновкой), на которой собиралось устройство, исходный код (AS4), а также небольшое видео (к сожалению, не удалось передать в нем всю цветовую палитру изменения цвет из-за ограниченности возможностей матрицы камеры, в реальности выглядит более эффектно).
Конфигурация фьюз битов для микроконтроллера attiny13:
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
IC1 | МК AVR 8-бит | ATtiny13A | 1 | |||
IC2 | Составной транзистор | ULN2003 | 1 | |||
IC3 | DC/DC импульсный конвертер | MC34063A | 1 | |||
VD1 | Стабилитрон | BZX55C5V1 | 1 | |||
VD2 | Диод Шоттки | 1N5819 | 1 | |||
R1 | Потенциометр | 10 кОм | 1 | Переменный или подстроечный резистор | ||
R2, R9 | Резистор | 1.5 кОм | 2 | |||
R3 | Резистор | 10 кОм | 1 | |||
R4-R6 | Резистор | 240 Ом | 3 | |||
R7 | Резистор | 12 кОм | 1 | |||
R8 | Резистор | 1 кОм | 1 | |||
R10 | Резистор | 180 Ом | 1 | |||
R11 | Резистор | 0.25 Ом | 1 | 0.2 — 0.3 Ом, можно подбором нескольких в параллель | ||
C1, C3, C8 | Конденсатор | 100 нФ | 3 | |||
С2 | Конденсатор | 10 мкФ | 1 | |||
С4 | Конденсатор | 590 пФ | 1 | |||
C5, C6 | Электролитический конденсатор | 1000 мкФ | 2 | 1 можно не использовать | ||
С8 | Конденсатор | 100 мкФ | 1 | |||
L1 | Дроссель | 100 мкГн | 1 | |||
S1 | Тактовая кнопка | TC-A109 | 1 | |||