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

Просмотров: 2775


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

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

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

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

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

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

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

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

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

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

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

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


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

Значок

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

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

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

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

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

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

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

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



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


  • Дифференциальный терморегуляторДифференциальный терморегулятор
    Просмотров: 3726 Дифференциальный терморегулятор ch-3020 Назначение. Ch-c3020 представляет собой дифференциальный терморегулятор. Основное назначение солнечные системы горячего водоснабжения, а также вентиляционные системы управление притоком свежего воздуха. Контроллер позволяет работать пяти режимах. …
  • Стробоскоп для автомобиляСтробоскоп для автомобиля
    Просмотров: 1751 Одним из популярных решений светового тюнинга автомобиля, мотоцикла или скутера стал эффект –  “полицейский стробоскоп“. На база платы ch-c0050 реализовано несколько проектов. В этой статье приводятся две версии …
  • Гаджеты для домашней автоматики – Датчик приближенияГаджеты для домашней автоматики – Датчик приближения
    Просмотров: 1735 Управление светодиодным освещением – Датчик приближения. Данный гаджет предназначен для управления внутренним освещением мебели. Датчик позволяет определить закрытие или открытие дверцы или ящика и при этом включать или …
  • MPLAB® Code Configurator and EncoderMPLAB® Code Configurator and Encoder
    Просмотров: 1249 Еще раз про энкодер… Для некоторых приложений очень удобно и экономически выгодно, для настройки и управления использовать энкодер. Такие энкодеры имеют строенную тактовую кнопку которую можно применить для выбора …
  • WiFi ESP8266 – AT команды связанные с функцией Wi-FiWiFi ESP8266 – AT команды связанные с функцией Wi-Fi
    Просмотров: 4836 AT команды связанные с функцией Wi-Fi Функции Wi-Fi подключения, запускаться из командной строки Команда Описание  1 AT+CWMODE Проверка, настройка режима работы Wi-Fi (sta/AP/sta+AP), (не рекомендуется для новых проектов). 2 …
  • Проект с использованием MCC часть 16Проект с использованием MCC часть 16
    Просмотров: 896 Продолжим изучение EUSART. На этом этапе отработает передачи данных с ПК и получения эха. Для этого в основной цикл программы добавим код if(EUSART_DataReady) // проверим флаг готовности данных …
  • Модуль CAN в микроконтроллерах PIC18Модуль CAN в микроконтроллерах PIC18
    Просмотров: 5379 Введение   CAN последовательный интерфейс связи, который эффективно поддерживает распределенное управление в реальном масштабе времени с высокой помехозащищенностью. Протокол связи полностью определен Robert Bosch GmbH, в спецификации требований …
  • Сумеречное релеСумеречное реле
    Просмотров: 1275 Реле управления освещением, датчик день-ночь – одним словом фотореле для управления освещением или формирования сигнала для системы умный дом о понижении или повышении освещенности относительно заданного уровня. Реле выполнено по классической схеме, конденсаторный блок питания, от сети переменного тока …
  • Контроллер управления светодиодным освещением с дистанционным управлениемКонтроллер управления светодиодным освещением с дистанционным управлением
    Просмотров: 1836 Все активнее светодиоды входят в нашу жизнь. Всё эффективнее становится светодиодное освещение. Всё ниже опускаются цены. Всё больше появляется возможностей получения сочных цветов, простоты в управлении. Всё чаще …
  • Регулятор влажностиРегулятор влажности
    Просмотров: 1247 Регулятор ILLISSI-CH-1000 предназначен для контроля и регулировки относительной влажности в диапазоне от 0 до 100%. Регулятор позволяет работать как в режиме осушения, так и увлажнения. Для измерения возможно …



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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.