Самый простой диммер для светодиодного освещения

Visits: 2953


Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы приведем несколько решений на PIC-микроконтроллеров. PIC10F320/322 это идеальное решения для создания всевозможных регуляторов освещения. При этом мы получаем довольно функционально навороченное устройство с минимальной стоимостью и минимальными затратами времени на изготовление. Этот проект направлен для начинающих, для которых необходима информация как с нуля начать программировать и получить базовые знания по микроконтроллеру и по языку программирования Си.


Пример первый, самый простой регулятор с управлением яркостью от потенциометра, яркость задается вращением потенциометра от 0 до 100% (256 уровней яркости).

ch_dimm_bs

Схема регулятора.

ch_dimm_v1.0

Яркость задается напряжением сниманием с потенциометра R1. Это управляемое напряжение подается на вход RA0, настроенным как аналоговый вход и подключенным ко входу AN2 АЦП микроконтроллера. Процедура АЦП помещена в основный цикл работы программы, полученное значение напрямую грузиться в регистр ШИМ микроконтроллера. Выход ШИМ RA1 управляет силовым ключом на транзисторе V1. Как видно со схемы все элементарно просто. Стабилизатор предназначен для получения стабилизированного питания для микроконтроллера и само сбой разумеется можно такую схему использовать в цепях стандартного напряжения 12-24 вольта постоянного напряжения. Силовой транзистор можно брать любой с логическим уровнем управления, т.е. это те транзисторы, которые при подаче 1-2 вольта на затвор полностью открывают свой канал. Например на транзисторе IRF7805 можно коммутировать ток до 13 Ампер (естественно при определенных условиях), а для любых условий до 5 ампер легко. Соединитель CON1 предназначен, только для внутрисхемного программирования контроллера, для этой цели предназначены и резисторы R2 и R5, т.е. если микроконтроллер запрограммирован, то эти элементы можно не ставить, ну и R4 и BAV70 предназначены для защиты от перенапряжения и неправильного включения напряжения питания. Конденсаторы C1 и C2 керамические и предназначены для подавления импульсных помех, а также для надежности работы аналогового стабилизатора LM75L05.


Построения программы.

Построение начинается у указанием компилятору с чем он работает, а также конфигурирования микроконтроллера:

#include <xc.h>				// для настройки под выбранный контроллер
//------------------------------------------------------------------------------
// конфигурирование контроллера PIC10F320
//------------------------------------------------------------------------------
// конфигурирование контроллера

#pragma config FOSC = INTOSC            // INTOSC oscillator: CLKIN function disabled
//#pragma config FOSC_EC                // EC: CLKIN function enabled
#pragma config BOREN = ON		// Brown-out Reset enabled/сброс по понижению питания включен
#pragma config WDTE = ON		// WDT enabled
#pragma config PWRTE = ON		// Таймер задержки включения питания/Power-up Timer Enable
#pragma config MCLRE = ON		// MCLR/VPP pin function is digital input
#pragma config CP = ON			// Program memory code protection is enabled
#pragma config LVP = OFF		// High-voltage on MCLR/VPP must be used for programming
#pragma config LPBOR = ON		// Brown-out Reset enabled/сброс по понижению питания включен
#pragma config BORV = HI 		// Brown-out Reset Voltage (VBOR) set to 2.7V
#pragma config WRT = ALL 		// 000h to 0FFh write protected, no addresses may be modified by EECON control

//------------------------------------------------------------------------------

#define _XTAL_FREQ 16000000 // тактовая частота

После того как контроллер сконфигурирован необходимо настроить порты ввода вывода, настроить ШИМ, настроит работу АЦП. Это все уже выполняется в программе:

//------------------------------------------------------------------------------
void main(void)
{
     CLRWDT(); 	// сброс сторожевого таймера +++++++++++++++++++++-
     // настройка внутренего генератора
     OSCCON = 0b01110000;   //OSCILLATOR CONTROL REGISTER
/*               +++------- 111 = 16 MHz
 */
     // настройка сторожевого таймера
    WDTCON = 0b00100101;
    // настройка портов, функций аналоговых входов
    PORTA  = 0b00000000;
    TRISA  = 0b00000100;
    LATA   = 0b00000000;
    ANSELA = 0b00000100;// аналоговый вход для нашего потенциометра
    WPUA   = 0b00000000;
//    OPTION_REG = 0b00000000;

    // настройка ШИМ
    T2CON = 0b00000100;
    PR2=255;
    PWM2CON = 0b11100000;
    PWM2DCH = 0;
    PWM2DCL = 0;
    // настройка АЦП
    ADCON = 0b10001001;//

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

  1. Запустить АЦП на измерение.
  2. Дождаться окончания измерения.
  3. Загрузить полученное значение в ШИМ.
    // главный цикл программы
while(1)
    {
        CLRWDT();           // сброс сторожевого таймера +++++++++++++++++++++-
        GO_nDONE=1;         // запуск измерения уровня сигнала от АЦП
        while(GO_nDONE);    // ожидаем окончания
        PWM2DCH=ADRES;      // управление яркостью
    }

Всё! Как вы убедились – микроконтроллеры это просто!!!


Фото проекта:

ch_dimm_v1.0_01

 


Видео работы диммера:

 


Пример второй. Так как мы работаем с микроконтроллером, добавим две кнопки, то выполним вариант задание яркости потенциометром, а управлением кнопками функции включено / выключено.

Схема для примера.

ch_dimm_v3.0

К свободным входам RA0 и RA3 добавим тактовые кнопки подключенные к земле.

Изменение программы для возможности добавления двух кнопок для получения функций управления:

Получение доступа к порту RA3:

#pragma config MCLRE = OFF		// MCLR/VPP на функцию цифрового входа, для кнопки функция

Описание, для удобства названия кнопок и к какому порту они подключены:

// подключение кнопок
#define KN01 PORTAbits.RA0  // 
#define KN02 PORTAbits.RA3  //

Изменение настроек портов и включение подтягивающих резисторов (это для создание потенциала каким можно будет управлять кнопками):

//    PORTA  = 0b00000000;
    TRISA  = 0b00001101;        // 0 и 3 на вход цифровой
    LATA   = 0b00000000;
    ANSELA = 0b00000100;        // аналоговый вход для нашего потенциометра
    // включить подтягивающие резисторы
    WPUA   = 0b00001001;        //
    OPTION_REG = 0b00000111;    //

И для тестового варианта, самая простая программа которая будут просто включать выключать освещения. Необходимо учитывать, что переделывается программа с примера 1 в котором яркость управляется при помощи ШИП, для включения необходимо в ШИМ записать значение 255, для отключения значение 0.

    // главный цикл программы
while(1)
    {
        CLRWDT();           // сброс сторожевого таймера +++++++++++++++++++++-
//        GO_nDONE=1;         // запуск измерения уровня сигнала от АЦП
//        while(GO_nDONE);    // ожидаем окончания
//        PWM2DCH=ADRES;      // управление яркостью
        if(!KN01)PWM2DCH=0;
        if(!KN02)PWM2DCH=255;

    }

В этом фрагменте программы достигнут эффект управления кнопками простого включения/выключения освещения на 100%.

В следующем примере совместим функции регулировки яркости и функции включения выключения освещения кнопками.

    // главный цикл программы
while(1)
    {
        CLRWDT();           // сброс сторожевого таймера +++++++++++++++++++++-
        GO_nDONE=1;         // запуск измерения уровня сигнала от АЦП
        while(GO_nDONE);    // ожидаем окончания

        // контроль состояния кнопок и переключения режима включено/выключено
        if(!KN01)ON_OFF=0;
        else if(!KN02)ON_OFF=1;
        // управление яркость
        if(ON_OFF)
        {
            PWM2DCH=ADRES;      // управление яркостью освещения
        }
        else
        {
            PWM2DCH=0;          // выключить освещение
        }
    }

В этом примере потенциометром задается яркость, а кнопками реализована функциями ВКЛ/ВЫКЛ.

Схема для варианта управления кнопками.

ch_dimm_v4.0

Вариант программы позволяющей регулировать яркость двумя кнопками:

    // главный цикл программы
while(1)
    {
        CLRWDT();           // сброс сторожевого таймера +++++++++++++++++++++-
        // контроль состояния кнопок и переключения режима включено/выключено
        if(!KN01)
        {
            if(!NAZ)
            {
                NAZ=1;          // кнопка нажата
                __delay_ms(10); // зашита дребезга 
                if(!KN01)
                {
                    if(PWM2DCH<255)PWM2DCH=PWM2DCH+5;
                }
            }
        }
        else if(!KN02)
        {
            if(!NAZ)
            {
                NAZ=1;          // кнопка нажата
                __delay_ms(10); // зашита дребезга 
                if(!KN02)
                {
                    if(PWM2DCH>0)PWM2DCH=PWM2DCH-5;
                }
            }
        }
        else
        {
            NAZ=0;   // кнопка не нажата
        }
    }

 В этом примере можно найти один из решений проблемы блокировки дребезг от механики кнопок и функции контроля одиночного нажатия кнопки. Каждое нажатие выполняет изменение яркости на SHAG если SHAG=5 единиц, в этом варианте мы будем иметь 51 ступень яркости. Для изменения ШАГА яркости (уменьшения ступеней яркости) необходимо константу SHAG. Увеличение значения уменьшает количество ступеней яркости. В текущем примере шаг это константа 5. Ниже приведем вариант когда шаг яркости может быть в довольна широких значениях, что даст возможность приспособить для любых проектов.

Для управления добавим пару параметров:

bit NAZ;            // флаг кнопка нажата
#define SHAG 10     // шаг изменения яркости
int yarkost=0;        // яркость

Сам главный цикл:

    // главный цикл программы
while(1)
    {
        CLRWDT();           // сброс сторожевого таймера +++++++++++++++++++++-
        // контроль состояния кнопок и переключения режима включено/выключено
        if(!KN01)
        {
            if(!NAZ)
            {
                NAZ=1;          // кнопка нажата
                __delay_ms(10); // зашита дребезга
                if(!KN01)
                {
                    if(yarkost<255)
                    {
                        yarkost+=SHAG;
                        if(yarkost>255)yarkost=255;
                    }

                }
            }
        }
        else if(!KN02)
        {
            if(!NAZ)
            {
                NAZ=1;          // кнопка нажата
                __delay_ms(10); // зашита дребезга
                if(!KN02)
                {
                    if(yarkost>0)
                    {
                        yarkost-=SHAG;
                        if(yarkost<0)yarkost=0;
                    }
                }
            }
        }
        else
        {
            NAZ=0;   // кнопка не нажата
        }
        PWM2DCH=yarkost; // загрузка яркости
    }

В этом примере константу можно менять от 1 до ~100 т.е. получить даже 2 ступени яркости.

Видео демонстрации работы примера 2

  


Пример третий. Выполним вариант задание яркости с применением двух кнопок (режим автоповтора). В этом примере при нажатии на кнопку яркость изменяется на 10 единиц, при удержании кнопки реализовано плавное изменение яркости с шагом равной 1.

Добавим несколько переменных:

bit NAZ;            // флаг кнопка нажата
#define SHAG 1      // шаг изменения яркости для автоматического
#define SHAGr 10    // шаг изменения яркости для ручного режима
#define SPEEDY 2000 // константа скорости изменения яркости
int yarkost=0;      // яркость
int timerauto;      // таймер автоповтора

Главный цикл:

  // главный цикл программы
while(1)
    {
        CLRWDT();           // сброс сторожевого таймера +++++++++++++++++++++-
        // контроль состояния кнопок и переключения режима включено/выключено
        if(!KN01)
        {
            if(!NAZ)
            {
                NAZ=1;          // кнопка нажата
                __delay_ms(10); // зашита дребезга
                if(!KN01)
                {
                    if(yarkost<255)
                    {
                        yarkost+=SHAGr;
                        if(yarkost>255)yarkost=255;
                    }

                }
            }
            else
            {
                if(--timerauto==0)
                {
                    timerauto=SPEEDY;
                    if(yarkost<255)
                    {
                        yarkost+=SHAG;
                        if(yarkost>255)yarkost=255;
                    }
                }
            }
        }
        else if(!KN02)
        {
            if(!NAZ)
            {
                NAZ=1;          // кнопка нажата
                __delay_ms(10); // зашита дребезга
                if(!KN02)
                {
                    if(yarkost>0)
                    {
                        yarkost-=SHAGr;
                        if(yarkost<0)yarkost=0;
                    }
                }
            }
            else
            {
                if(--timerauto==0)
                {
                    timerauto=SPEEDY;
                    if(yarkost>0)
                    {
                        yarkost-=SHAG;
                        if(yarkost<0)yarkost=0;
                    }
                }
            }
        }
        else
        {
            NAZ=0;   // кнопка не нажата
        }
        PWM2DCH=yarkost; // загрузка яркости
    }

Видео проекта для примера 3 и 4 одновременно


Пример четвертый. Добавим третью кнопку с функцией ВКЛ/ВЫКЛ.

Схема.

ch_dimm_v5.0

 

Настройка портов микроконтроллера для работы с 3 кнопками.

    // настройка портов, функций аналоговых входов
//    PORTA  = 0b00000000;
    TRISA  = 0b00001101;        // 0 и 3 на вход цифровой
    LATA   = 0b00000000;
    ANSELA = 0b00000000;        // аналоговый вход для нашего потенциометра
    // включить подтягивающие резисторы
    WPUA   = 0b00001101;        //
    OPTION_REG = 0b00000111;    //

Главный цикл программы.

// главный цикл программы
while(1)
    {
        CLRWDT();           // сброс сторожевого таймера +++++++++++++++++++++-
        // контроль состояния кнопок и переключения режима включено/выключено
        if(!KN01)
        {
            if(!NAZ)
            {
                NAZ=1;          // кнопка нажата
                __delay_ms(10); // зашита дребезга
                if(!KN01)
                {
                    if(yarkost<255)
                    {
                        yarkost+=SHAGr;
                        if(yarkost>255)yarkost=255;
                    }

                }
            }
            else
            {
                if(--timerauto==0)
                {
                    timerauto=SPEEDY;
                    if(yarkost<255)
                    {
                        yarkost+=SHAG;
                        if(yarkost>255)yarkost=255;
                    }
                }
            }
        }
        else if(!KN02)
        {
            if(!NAZ)
            {
                NAZ=1;          // кнопка нажата
                __delay_ms(10); // зашита дребезга
                if(!KN02)
                {
                    if(yarkost>0)
                    {
                        yarkost-=SHAGr;
                        if(yarkost<0)yarkost=0;
                    }
                }
            }
            else
            {
                if(--timerauto==0)
                {
                    timerauto=SPEEDY;
                    if(yarkost>0)
                    {
                        yarkost-=SHAG;
                        if(yarkost<0)yarkost=0;
                    }
                }
            }
        }
        else if(!KN03)
        {
            if(!NAZ)
            {
                NAZ=1;          // кнопка нажата
                __delay_ms(10); // зашита дребезга
                if(!KN03)
                {
                    ON_OFF=!ON_OFF; // включить-выключить
                }
            }
        }
        else
        {
            NAZ=0;   // кнопка не нажата
        }

        if(ON_OFF)PWM2DCH=yarkost; // загрузка яркости
        else PWM2DCH=0;// выключить освещение
    }

Функции кнопок KN01 – увеличение яркости, KN02 – уменьшение яркости, KN03 – включено – выключено.


P/S. 

PIC10F3xx – самый удобный контроллер для начала изучения программирования и освоения для начинающих.


Пример 1:
Схема в формате PDF для примера 1

Значок

Самый простой диммер для светодиодного освещения схема в PDF v1.00 11.54 KB 546 downloads

Самый простой диммер для светодиодного освещения...
Прошивка для примера 1 v1.0
Значок

Самый простой диммер для светодиодного освещения прошивка v1.0 0.26 KB 436 downloads

Самый простой диммер для светодиодного освещения...
Прошивка для примера 2 v3.0
Значок

Самый простой диммер для светодиодного освещения прошивка v3.0 0.30 KB 425 downloads

Самый простой диммер для светодиодного освещения...
Прошивка для примера 2 v4.0
Значок

Самый простой диммер для светодиодного освещения прошивка v4.0 0.43 KB 394 downloads

Самый простой диммер для светодиодного освещения...
Прошивка для примера 3 v5.0
Значок

Самый простой диммер для светодиодного освещения прошивка v5.0 0.53 KB 410 downloads

Самый простой диммер для светодиодного освещения...
Прошивка для примера 4 v6.0
Значок

Самый простой диммер для светодиодного освещения прошивка v6.0 0.58 KB 467 downloads

Самый простой диммер для светодиодного освещения...


Проект с примерами Microchip MPLAB XC8 C Compiler V1.30, MPLAB X IDE v2.00

Значок

Самый простой диммер для светодиодного освещения проект 58.14 KB 117 downloads

Самый простой диммер для светодиодного освещения...
Схема в формате PDF для примера 2
Значок

Самый простой диммер для светодиодного освещения схема в PDF v3.00 11.70 KB 430 downloads

Самый простой диммер для светодиодного освещения...
Схема в формате PDF для примера 3
Значок

Самый простой диммер для светодиодного освещения схема в PDF v4.00 11.43 KB 399 downloads

Самый простой диммер для светодиодного освещения...
Схема в формате PDF для примера 4
Значок

Самый простой диммер для светодиодного освещения схема в PDF v5.00 11.52 KB 649 downloads

Самый простой диммер для светодиодного освещения...



Это может быть интересно


  • Цифровой спидометр для автомобиляЦифровой спидометр для автомобиля
    Visits: 10129  Универсальность печатной платы ch-c0030pcb позволяет создавать на её основе разнообразные устройства. Одним из таких устройств является электронный спидометр для автомобиля, в котором можно задать два компаратора скорости, например,  для …
  • ch-светомузыка и AK4113ch-светомузыка и AK4113
    Visits: 1250 Пришло время вернуться к светомузыке. На сегодня использование аналогового входа стало непрактичным, на сегодня необходимо использовать S/PDIF и Toslink. С этим надо было как то разобрать, что это …
  • Униполярный шаговый двигательУниполярный шаговый двигатель
    Visits: 2125     В приводах различных устройств часто применяются шаговые двигатели, Шаговый двигатели различают двух типов униполярные – когда обмотки коммутируются током текущим только в одну сторону, например при …
  • MCC PIC24 – модуль REAL-TIME CLOCK AND CALENDAR (RTCC)MCC PIC24 – модуль REAL-TIME CLOCK AND CALENDAR (RTCC)
    Visits: 435 RTCC предоставляет пользователю часы реального времени и функция календаря (RTCC), точность “хода” может быть откалибрована. Основные особенности модуля RTCC: • Работает в режиме глубокого сна. • Возможность выбора источника …
  • LED драйвер TM1639LED драйвер TM1639
    Visits: 2140 TМ1639 позволяет работать на матрицу 8*8 или 8 семисегметных индикаторов. Может работать как на индикаторы с общим катодом, но и есть возможность подключать общим анодом. Для управления драйвером …
  • Стабилизатор тока для светодиодов SN3350Стабилизатор тока для светодиодов SN3350
    Visits: 2572 SN3350 ближайший аналог ZXLD1350 Как собрать готовый вариант, читайте во второй части – http://catcatcat.d-lan.dp.ua/stabilizator-toka-na-sn3350-chast-2/ 40V  драйвер светодиодов с внутренним ключом  SN3350 – импульсный понижающий преобразователь, разработанный для того, чтобы эффективно управлять одним или …
  • CCP модуль для декодирования ИК-кодов пультов ДУCCP модуль для декодирования ИК-кодов пультов ДУ
    Visits: 1021 Множество изготовителей для своих пультов дистанционного управления на ИК лучах используют принцип широтно-импульсной модуляции. В таких кодах бит единицы представляется импульсом большой длительности, а ноль импульсом короткой длительности. …
  • Audio-bluetooth modules BK8000L (noname)Audio-bluetooth modules BK8000L (noname)
    Visits: 629 Еще один вариант, так сказать недоразумения Audio-bluetooth modules BK8000L (noname). Его отличительной маркировкой служат два отверстия в плате и надпись R2. Отличают его от модулей на чипе BK8000L, …
  • Мультизоновый индикатор-терморегулятор ch-c3010Мультизоновый индикатор-терморегулятор ch-c3010
    Visits: 1139 Часто возникает необходимость получить информацию по температуре с множества точек контроля. Вам необходимо знать температуру в комнате, в коридоре,  температуру на улице, а в погребе (или на балконе) …
  • MPLAB® Harmony – или как это просто! Часть 2.MPLAB® Harmony – или как это просто! Часть 2.
    Visits: 2642 Часть вторая – Первая программа на PIC32. Музыкальная тема к статье, слушаем: Для начала изучения PIC32 надо иметь или демоплату или самому её изготовить имея микроконтроллер. Начнем из …



Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

Продолжайте читать

НазадДалее