Приветствую!
В продолжение темы про миниатюрный драйвер для светодиодов на микросхеме CL6807, решил рассказать, как регулировать яркость светодиодов с данным драйвером.
В даташите на драйвер написано, что для управления яркость предназначен отдельный вывод ADJ.
Приобрел я светодиодные бра, которые питаются от 220 В и просто включаются и выключаются. Захотелось сделать управление яркостью для них. В каждом бра установлены 2 светодиода мощностью 1 Вт. Драйвер светодиодов сделан на МС BP3122 китайской фирмы Bright Power Semiconductor Co.
Немного о драйвере BP3122. Интересная вещь! На сайте данной компании я не нашел в продукции такой драйвер. Есть много похожих, которые включаются по аналогичной схеме. Но на просторах интернета я нашел даташит на данный драйвер. Как ни странно, адрес ведет на сайт изготовителя. Типовая схема включения, взятая из данного документа:
Микросхема применяется в качестве драйвера в светодиодных лампах (например, с цоколем Е27). Имеет встроенный полевой транзистор, напряжение сток-исток которого до 650 В. Выходная мощность не более 5 Вт, рабочая частота 65-70 кГц. Работать драйвер начинает с порогового напряжения 13.8 В (на входе VCC). При снижении напряжения ниже 9 В драйвер выключается. Внутри микросхемы установлен стабилитрон на 15 В. Производитель рекомендует применять данный драйвер в схемах с питанием от 85 до 265 В (хотя можно запитать и от 13.8 В) Выходной ток для светодиода можно посчитать по формуле:
где Np – количество витков первичной обмотки трансформатора,
Ns – количество витков вторичной обмотки трансформатора,
Ip_pk – амплитуда тока в полевом транзисторе, или ток в первичной обмотке трансформатора, который задается резистором Rs и высчитывается по формуле:
Драйвер BP3122 имеет несколько защит: от короткого замыкания на выходе, от перегрева (150 градусов Цельсия), от перенапряжения. Если к выходу не подключен светодиод (обрыв), сработает защита от перенапряжения. Если на выходе короткое замыкание, драйвер снижает рабочую частоту до 5 кГц, уменьшая этим потребление. Также есть защита, если задающий ток резистор замкнут или произошло насыщение сердечника трансформатора.
Вернемся к нашим … микросхемам. Драйвер BP3122 хорош тем, что требует минимум внешних компонентов для работы. Но у него нет управления яркостью. Было решено запитать светильники от 12 В и применить драйвер CL6807.
В даташите на CL6807 сказано, что регулировать яркость можно двумя способами:
- Изменением напряжения на выводе ADJ от 0.5 В до 2.5 В. При этом выходной ток регулируется от 0% до 100% от номинального. При напряжении на этом выводе 0.4 В и ниже драйвер выключается.
- Подавая сигнал ШИМ на вывод ADJ через транзистор с открытым коллектором (или открытым стоком). При этом, если частота ШИМ-сигнала больше 10 кГц, то выходной ток будет регулироваться в диапазоне от 25% до 100%, а при частоте ШИМ-сигнала меньше 500 Гц диапазон расширяется от 1% до 100% от номинального выходного тока. Максимальная частота для ШИМ-сигнала 20 кГц.
Сначала я сделал такую схему:
12 вольтами питается драйвер. Нагрузкой являются два 1-ваттных светодиода. Резистор, задающий ток, составлен из трех, т.к., во-первых, резисторов номиналом меньше 1 Ом не было в наличии, во-вторых, удобнее менять выходной ток, убрав или добавив резистор на плате. Плату я сразу делал с управлением от микроконтроллера, поэтому остался понижающий стабилизатор 5 В. От него и взял напряжение, идущее на вывод ADJ. Конечно можно убрать стабилизатор и взять напряжение 12 В, нужно только увеличить номинал R1. Все остальные внешние компоненты для микросхем D1 и D2 взяты из типовых схем включения. Яркость меняется резистором R2.
Подаем питание на схему. Напряжение питания 12.9 В. При таком управлении напряжение на выводе ADJ меняется в диапазоне от 0.5 до 2.6 В. Измерим выходной ток. Включим амперметр в разрыв одного из проводов, идущих на светодиоды. При вращении ручки резистора R2 выходной ток меняется от 133 мА до 401 мА. Минимальное значение выходного тока немаленькое. Визуально минимальная яркость светодиодов не такая уж и минимальная!
Ладно. Отложим эту схему. Попробуем управлять яркостью с помощью ШИМ-сигнала. Добавим немного элементов в схему:
Создавать ШИМ будем с помощью микроконтроллера ATtiny13 фирмы Atmel. Он был у меня в наличии, к тому же это маленький (если корпус SO-8), дешевый контроллер.
Вся схема питается напряжением 12 В. Микроконтроллер D2 запитан от стабилизатора D1. ШИМ-сигнал берется с выхода OC0A (бит 0 порта В) – вывод 5 и через транзистор VT1 с открытым коллектором подается на вывод ADJ драйвера D3 CL6807. Диод VD1 нужен для перестраховки от неправильной подачи полярности напряжения питания (но он необязателен). Цепь R1, C4 уменьшает вероятность случайного сброса при кратковременных просадках питания микроконтроллера, а также при воздействии внешних помех по питанию. Сопротивление R1 может быть в пределах от 4.7 кОм до 10 кОм. Разъемы Х2, Х3 используются для внутрисхемного программирования контроллера. Для управления ШИМ-сигналом применен энкодер, который подключается к разъему Х4 и выводам 2 (PB3), 3 (PB4) микроконтроллера. R5 – это перемычка на случай, если вдруг нужно будет отключить сигнал ШИМ от драйвера. Конденсатор С3 на плате нужно расположить как можно ближе к выводам питания микроконтроллера. Диоды Шоттки VD1, VD2 любые на напряжение не ниже 20 В и ток не ниже 1 А. Это могут быть SS12, SS13, SS14, SS24 и аналогичные.
Теперь о программе для микроконтроллера. Программа написана в CodeVisionAVR.
Подключаем библиотеки, объявляем нужные переменные:
#include <tiny13a.h>
#include <delay.h>
unsigned int EncData=0; //Переменная для энкодера.
——— Инициализация энкодера ——————-
void InitEncoder (void)
{
DDRB.3 = 0; // выводы МК, к которым подключен энкодер (PB3, PB4).
DDRB.4 = 0; // настраиваем на вход.
PORTB.3 = 1; // вкл.
PORTB.4 = 1; // подтягивающий.
}
——— опрос и обработка энкодера ———————-
void Encquest (void)
{
Определяем направление вращения и сравниваем с заданным значением (минимальное или максимальное).
if ((PINB.3==0)&(PINB.4==1)&(EncData<MAX_VALUE))
{
delay_ms(50); // задержка для защиты от дребезга контактов.
EncData += 17; // увеличиваем переменную энкодера.
}
if ((PINB.3==1)&(PINB.4==0)&(EncData>MIN_VALUE))
{
delay_ms(50);
EncData -= 17; // уменьшаем переменную энкодера.
}
}
Отдельными подпрограммами сделал запуск и остановку таймера.
void Timer_start_64()
{ //Запуск с предделителем на 64.
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
}
//—— Остановка таймера ———————————
void Timer_stop()
{
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
}
Почему значение, на которое увеличивается или уменьшается переменная энкодера, равно именно 17? В данной схеме применен микроконтроллер, на борту которого есть только 8-и битный таймер Т0. Максимальное значение, до которого он может считать, равно 255. Если взять шаг изменения переменной энкодера 1, то для того, чтобы убавить или прибавить яркость придется очень долго крутить ручку энкодера (хотя в этом случае яркость меняется плавнее). А максимальное значение яркости (точнее, минимальное, т.к. транзистор инвертирует сигнал) будет при значении 255. Поэтому для оптимального изменения яркости от минимума до максимума нужно найти число, на которое 255 делится без остатка. Это 17. Получилось 15 шагов изменения яркости. Для лучшего понимания предлагаю решить задачку: в этой схеме можно применить микроконтроллер, имеющий 16-и битный таймер (например, ATmega8). Найдите значение, на которое нужно изменять переменную энкодера, для оптимального изменения яркости, скажем, для такого же количества шагов, как в данной схеме.
Далее идет основная программа:
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
Инициализация порта В. Настраиваем бит 0 порта на выход (выходной ШИМ-сигнал), остальные биты можно оставить по умолчанию, т.к. настройка входов для энкодера происходить в отдельной подпрограмме InitEncoder. Все неиспользуемые входы-выходы порта нужно настроить на вход и установить внутреннюю подтяжку. Это делается для уменьшения потребления МК.
DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0);
PORTB=(1<<PORTB5) | (1<<PORTB4) | (1<<PORTB3) | (1<<PORTB2) | (1<<PORTB1) | (0<<PORTB0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Fast PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Настройка прерываний от таймера Т0.
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);
// Настройка аналогового компаратора
// Analog Comparator: Off
// The Analog Comparator’s positive input is
// connected to the AIN0 pin
// The Analog Comparator’s negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
ADCSRB=(0<<ACME);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR0=(0<<AIN0D) | (0<<AIN1D);
// Настройка АЦП.
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
Инициализация энкодера.
InitEncoder();
Основной цикл программы.
while (1)
{
Timer_start_64();
OCR0A=EncData; //заносим значения из переменной энкодера в регистр OCR0A
Encquest(); //опрос энкодера
}
}
Прошивку для МК можно скачать тут
10_PWM_LED_CL6807_tiny13.hex (1,0 КиБ, 1 640 hits)
Fuse-биты контроллера:
Зашиваем программу в контроллер. Проверяем, что все работает. Посмотрим, что потребляют светодиоды. Напомню, что при изменении яркости с помощью резистора ток светодиодов менялся от 133 мА до 401 мА. Подключаем амперметр как и в прошлый раз и видим, что при максимальной яркости светодиодов ток остался примерно тем же (400 мА). А вот минимальное значение выходного тока равно 26 мА! При чем светодиоды при этом токе гаснут. В итоге – технический нокаут переменного резистора:)
Весь проект задумывался на SMD-компонентах. Микроконтроллер ATtiny13 в корпусе SO-8, стабилизатор MC78M05 – DPAK, Транзистор VT1 – SOT23-3. Печатную плату я делал на одностороннем стеклотекстолите, но нарисована она для двустороннего. На плате специально сделаны переходные отверстия для соединения с помощью проводников (я использую обрезки выводов компонентов (резисторы, конденсаторы)).
Файлы печатной платы в формате pdf (масштаб 1:1, отзеркаленные, готовые для ЛУТ):
Верхний слой (4,6 КиБ, 1 630 hits)
Нижний слой (6,1 КиБ, 1 716 hits)
Нижний слой с компонентами (31,8 КиБ, 1 620 hits)
И для удобства увеличенное изображение платы с компонентами:
Нижний слой с компонентами_увелич. (39,8 КиБ, 1 631 hits)
Все компоненты для устройства доступны в Китае по минимальной цене:
Микроконтроллер ATtiny13 (корпус SO-8).
Стабилизатор 5В MC78M05 (корпус DPAK).
Транзистор BC847 (корпус SOT23).
Дроссель 10х10х4 мм 10 номиналов по 5 шт.
Диоды в корпусе SMA 7 номиналов по 10 шт.
SMD-Конденсатор 10мкх16В.
SMD-конденсатор 22мкх16В.
SMD-резисторы 80 номиналов по 50 шт. (размер 0603).
Оставить сообщение:
[contact-form-7 id=”3550″ title=”Контактная форма 1″]
См. также:
- Миниатюрный драйвер светодиодов на микросхеме CL6807.
- Что означает SPST, SPDT?
- Ремонт выпрямительного (диодного) моста генератора.
- Проверка регулятора напряжения генератора.
- Как самостоятельно изготовить регулятор напряжения генератора.
- Автозапуск своими руками.
Если Вы нашли что-то полезное, поделитесь с друзьями:
[SvenSoftSocialShareButtons]