Views: 3182
Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы приведем несколько решений на PIC-микроконтроллеров. PIC10F320/322 это идеальное решения для создания всевозможных регуляторов освещения. При этом мы получаем довольно функционально навороченное устройство с минимальной стоимостью и минимальными затратами времени на изготовление. Этот проект направлен для начинающих, для которых необходима информация как с нуля начать программировать и получить базовые знания по микроконтроллеру и по языку программирования Си.
Пример первый, самый простой регулятор с управлением яркостью от потенциометра, яркость задается вращением потенциометра от 0 до 100% (256 уровней яркости).
Схема регулятора.
Яркость задается напряжением сниманием с потенциометра 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 строк, из которых только три имеют место к самой работе регулятора света.
- Запустить АЦП на измерение.
- Дождаться окончания измерения.
- Загрузить полученное значение в ШИМ.
// главный цикл программы
while(1)
{
CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++-
GO_nDONE=1; // запуск измерения уровня сигнала от АЦП
while(GO_nDONE); // ожидаем окончания
PWM2DCH=ADRES; // управление яркостью
}
Всё! Как вы убедились – микроконтроллеры это просто!!!
Фото проекта:
Видео работы диммера:
Пример второй. Так как мы работаем с микроконтроллером, добавим две кнопки, то выполним вариант задание яркости потенциометром, а управлением кнопками функции включено / выключено.
Схема для примера.
К свободным входам 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; // выключить освещение
}
}
В этом примере потенциометром задается яркость, а кнопками реализована функциями ВКЛ/ВЫКЛ.
Схема для варианта управления кнопками.
Вариант программы позволяющей регулировать яркость двумя кнопками:
// главный цикл программы
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 одновременно
Пример четвертый. Добавим третью кнопку с функцией ВКЛ/ВЫКЛ.
Схема.
Настройка портов микроконтроллера для работы с 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 573 downloads
Самый простой диммер для светодиодного освещения...Самый простой диммер для светодиодного освещения прошивка v1.0 0.26 KB 454 downloads
Самый простой диммер для светодиодного освещения...Самый простой диммер для светодиодного освещения прошивка v3.0 0.30 KB 441 downloads
Самый простой диммер для светодиодного освещения...Самый простой диммер для светодиодного освещения прошивка v4.0 0.43 KB 410 downloads
Самый простой диммер для светодиодного освещения...Самый простой диммер для светодиодного освещения прошивка v5.0 0.53 KB 429 downloads
Самый простой диммер для светодиодного освещения...Самый простой диммер для светодиодного освещения прошивка v6.0 0.58 KB 487 downloads
Самый простой диммер для светодиодного освещения...Проект с примерами Microchip MPLAB XC8 C Compiler V1.30, MPLAB X IDE v2.00
Самый простой диммер для светодиодного освещения проект 58.14 KB 137 downloads
Самый простой диммер для светодиодного освещения...Самый простой диммер для светодиодного освещения схема в PDF v3.00 11.70 KB 451 downloads
Самый простой диммер для светодиодного освещения...Самый простой диммер для светодиодного освещения схема в PDF v4.00 11.43 KB 422 downloads
Самый простой диммер для светодиодного освещения...Самый простой диммер для светодиодного освещения схема в PDF v5.00 11.52 KB 672 downloads
Самый простой диммер для светодиодного освещения...Это может быть интересно
Стробоскоп для автомобиляViews: 2216 Одним из популярных решений светового тюнинга автомобиля, мотоцикла или скутера стал эффект – “полицейский стробоскоп“. На база платы ch-c0050 реализовано несколько проектов. В этой статье приводятся две версии …
Проект с использованием MCC часть 15Views: 1716 EUSART – Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. … читать на вики. Внесем изменения в нашу схему, …
Счетчики посетителейViews: 1294 Вас сосчитали!? или счетчики посетителей. Для чего нужны счетчики посетителей? Какие они бывают? ТОРГОВЛЯ. Подсчитайте, сколько ваш магазин посещает человек за день. Кок много человек приходит утром, какое …
Сенсорный выключатель светаViews: 15246 Хотя в настоящий момент актуальны системы управления освещением с передачей данных по электросети, но я думаю, что проекты такого рода тоже имеют право на жизнь. Анонс Три вида …
HVLD модуль на примере PIC24FJ128GA204Views: 805 HVLD модуль представляет собой простое устройство, для контроля напряжения питания микроконтроллера или внешнего напряжения (через делитель). Его задача при “выходе” напряжения за заданные пределы сформировать сообщение микроконтроллеру, что …
The art of DJViews: 233 The art of DJ. The art of DJ has gained wide popularity. Today, a DJ is not just someone whose task is to mix tracks; a DJ is …
Цифровой тахометр для автомобиля CH-С3300Views: 2010 Тахометр Ch-С3300 предназначен для индикации и контроля оборотов, времени работы и максимальных оборотов развиваемых двигателем во время поездки. Датчиком может использоваться как обычный контактный прерыватель или выход датчика …
Гаджеты для домашней автоматики – Емкостной сенсорViews: 1804 Управление светодиодным освещением – Сенсор емкостной. Данный гаджет предназначен для управления освещением где необходимо включением освещение сенсорным прикосновением. Датчик позволяет управлять светодиодной нагрузкой в виде модулей или светодиодных лент …
NeoPixel LED и PIC18Views: 1882 Еще раз об управлении светодиодами на драйвере WS2812 и ему подобных. Как известно эти светики управляются по однопроводной шине. Основная особенность, что программно можно описать передачу данных, …
Мониторинг температурыViews: 1470 Настоящий проект создан как обучающий с применением библиотек ds18b20 и LCDHD44780 и компилятора Microchip MPLAB XC8 C Compiler V1.12. Если необходимо иметь информацию по состоянию температуры в помещении или в здании, с количеством до 6 точек (16), то …





