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

Views: 2986


Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы приведем несколько решений на 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 555 downloads

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

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

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

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

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

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

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

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

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

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

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


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

Значок

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

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

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

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

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

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

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

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



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


  • Проект с использованием MCC часть 02Проект с использованием MCC часть 02
    Views: 2261 Когда мы запустили конфигуратор, самое главное понять, что с этим делать и как проверить, то что мы делаем работает или нет. Для начала настроим регистры конфигурации микроконтроллера и настроем …
  • DS18B20 – удаленный контроль температурыDS18B20 – удаленный контроль температуры
    Views: 3027 Контроль температуры с использованием датчиков температуры DS18B20 и платы ILLISSI-4B-09-primum Проект позволяет подключать к плате ILLISSI-4B-09-primum до 16 датчиков температуры DS18B20, удаленных более 300 метров,  и выводить информацию …
  • MCC PIC24 – модуль OUTPUT COMPARE – в режиме генератора звуковых сигналовMCC PIC24 – модуль OUTPUT COMPARE – в режиме генератора звуковых сигналов
    Views: 602 При проектировании простых устройств автоматики, часто необходимо иметь механизм звукового оповещения. Самый верхний уровень, это формирование голосовых сообщений, но об этом, как то по позже… В самом примитивном …
  • Униполярный шаговый двигатель – часть 2Униполярный шаговый двигатель – часть 2
    Views: 799 В этой части только итог и версия 2.0 универсальной, которая позволяет управлять шаговым двигателем во всех трех режимах и 3.0 специальной библиотеки только для одного полушагового режима. В …
  • Униполярный шаговый двигательУниполярный шаговый двигатель
    Views: 2153     В приводах различных устройств часто применяются шаговые двигатели, Шаговый двигатели различают двух типов униполярные – когда обмотки коммутируются током текущим только в одну сторону, например при …
  • Development Boards PIC18F47Q84Development Boards PIC18F47Q84
    Views: 1272 Microchip тішить новими мікроконтролерами. Особливістю цього MCU – це багата інтелектуальна периферія, що дозволяє вирішувати такі завдання на 8 бітних MCU, які неможливо реалізувати на деяких навіть 32 …
  • TDA7294 part 1TDA7294 part 1
    Views: 222 TDA7294 має унікальні дані для створення підсилювачів звукової частоти HI-FI класу. Варіант застосування є конфігурація BRIDGE (мостова схема включення), де використовуються два TDA7294, як показано на схематичній діаграмі …
  • Простой цифровой регулятор мощностиПростой цифровой регулятор мощности
    Views: 6431 Простой регулятор мощности с цифровой индикацией. Этот проект создан как обучающий, для ознакомления с основами построения сетевых регуляторов мощности. Устройства подобного типа можно использовать для управления освещением, скоростью …
  • Индикатор кода – RC-5 Protocol PhilipsИндикатор кода – RC-5 Protocol Philips
    Views: 979 Индикатор кода – RC-5 Protocol Philips При конструировании дистанционного управления на инфракрасных лучах для контроля удобно иметь индикатор кодов передаваемых пультом. Плата ch-c3000 позволяет изготавливать устройства с возможностью …
  • Проект с использованием MCC часть 03Проект с использованием MCC часть 03
    Views: 1559 Первым делом перенастроим регистры конфигурации, следующим образом: Отключим выход генератора (CLKOUT function is disabled. I/O function on the CLKOUT pin) Включим сторожевой таймер (WDT enabled) После этой настройки …



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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

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

НазадДалее