Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Ночник на микроконтроллере

Недавно мне родители поставили задачу - сделать ночник (нечто между настольной лампой и фонариком, если вдруг кто - то не знает что это). В связи с временным переездом с деталями пока что напряженка, так что собирал буквально из того что смог найти. В итоге получилась такая схема (проект создан в программе Proteus 8.1):

Схема ночника на микроконтроллере 
Рис. 1

Как видите основа - микроконтроллер PIC12F629. Для управления светодиодами пришлось использовать транзисторные ключи, а для стабильности генератора - кварцевый резонатор на 12 МГц.

Устройство обладает следующими характеристиками:

  • Напряжение питания 5 В.
  • Ток потребления (не учитывая светодиоды ) < 10мА
  • Для управления светодиодами используется ШИМ
  • Время полного отключения - 30 минут

Управление устройством предельно простое: подал питание - светодиоды плавно включились. Причем светодиоды (а их, как вы заметили, 3) выключаются по очереди. Соответственно сначала плавно гаснет первый, потом 2-й и 3-й, с интервалом в 10 минут. Кнопка служит для программного перезапуска (я посчитал что использовать аппаратный «reset» будет не правильно, к тому же в будущем еще хочу добавить на эту кнопку функций).

Что касается печатной платы, то оказалось, что в данном случае будет достаточно и односторонней разводки. Вот что вышло:

Плата ночника
Рис. 2

Размеры платы 40х45 мм. Если использовать все компоненты в smd исполнении, то можно значительно сократить размеры платы.

И наконец «слово» о программе. Программа для микроконтроллера писалась в среде mikroPascal for PIC (версия 6.4).

Исходный код:

program NightLamp;

var count, systime, ctime: integer;
    tp1, tp2, tp3, e1, e2, e3, startup: byte;

label but1;

procedure Interrupt;
begin
     inc(systime);
//////////////////////////////////////////////////////////////////////////////// Эта часть программы отвечает за плавное зажигание светодиодов при старте.
     if startup = 1 then begin
        if systime >= 1171 then begin
           systime := 0;
           dec(tp1);
           dec(tp2);
           dec(tp3);
           if tp1 = 1 then startup := 0;
        end;
     end else begin
//////////////////////////////////////////////////////////////////////////////// Здесь происходит плавное гашение светодиодов
         if systime >= 11718 then begin
            systime := 0;
            inc(ctime);
            if e1 = 1 then begin
               inc(tp1);
               if tp1 = 99 then e1 := 0;
            end;
            if e2 = 1 then begin
               inc(tp2);
               if tp2 = 99 then e2 := 0;
            end;
            if e3 = 1 then begin
               inc(tp3);
               if tp3 = 99 then e3 := 0;
            end;
        end;
     end;
//////////////////////////////////////////////////////////////////////////////// Проверка на предмет совпадения прошедшего и установленноговремени, запуск цикла выключения светодиодов.
     if ctime = 500 then e1 := 1 else
     if ctime = 1100 then e2 := 1 else
     if ctime = 1500 then e3 := 1;
//////////////////////////////////////////////////////////////////////////////// Собственно сам программны ШИМ.
     if count <= 100 - tp1 then GP0_bit := 1 else GP0_bit := 0;
     if count <= 100 - tp2 then GP1_bit := 1 else GP1_bit := 0;
     if count <= 100 - tp3 then GP2_bit := 1 else GP2_bit := 0;
     if count >= 100 then count := 0;
     inc(count);
//////////////////////////////////////////////////////////////////////////////// Сбрасываем флаг прерывания Т0.
     INTCON.T0IF := 0;
end;

begin
CMCON := 0x7;                                                                   // Отключаем копаратор.
OPTION_REG := 0x8;                                                              // Конфигурация Т0.
INTCON := 0xA0;                                                                 // Конфигурация прерываний.
TRISIO := 0x8;                                                                  // Конфигурация порта.
GPIO := 0x0;                                                                    //

INTCON.T0IE := 1;
startup := 1;
tp1 := 99;
tp2 := 99;
tp3 := 99;
While TRUE do begin
      if Button(GPIO, 3, 10, 0) then begin                                      // Проверка, нажата ликнопка. Если нажата, то выполнение действий по отпусканию.
         but1:
         if Button(GPIO, 3, 10, 0) then goto but1 else begin
            tp1 := 99;
            tp2 := 99;
            tp3 := 99;
            ////////////////////////////////////////////////////////////////////
            count := 0;
            ctime := 0;
            systime := 0;
            ////////////////////////////////////////////////////////////////////
            startup := 1;
         end;
      end;
end;
end.

Практически все действия в программе «завязаны» на таймере T0. Это связано не столько с «экономией» энергии, сколько с тем, что мне было лень возиться с таймером T1.

Так как микроконтроллер работает на частоте 12МГц, то при выключенном предделителе Т0 (просто переключаем его от Т0 к WDT) и условии что таймер 8-ми битный последний будет переполняться 12000000/(4*256) = 11718 раз в секунду. По этому для отсчета времени было использовано 2 переменные типа «integer». В первую записывается количество переполнений Т0,а во вторую - непосредственно прошедшее время, в секундах.

Дальше все просто - считаем нужное количество секунд и включаем / выключаем светодиод.

Что касается ШИМа - то он программный. Частота импульсов ~117 Гц (шаг 0 - 100). Вообще - то прямоугольные импульсы, генерируемые микроконтроллером, следуют с частотой 11 кГц, но с учетом необходимости регулирования длительности импульса и паузы, получаем всего 117 Гц. Но, на практике и такой частоты достаточно. Мерцания светодиодов не видно.

Так для микроконтроллеров PIC конфигурация (выбор генератора, WDT и т.п.) находится в .hex файле, то скриншот с выставлением фузов приводить не буду. К слову, для прошивки микроконтроллера использовал программу WinPic800 и программатор JDM.

Теперь коротко о возможной замене деталей:
Транзисторы можно использовать любые маломощные структуры NPN. У меня кроме КТ315 под рукой ничего не было, по-этому «в бой пошли одни старики». Микроконтроллер заменить на более «старший» 12F675 или 12F683 нельзя. Светодиоды можно использовать любые (только не забывайте про ток).

Ну и напоследок сравнение ожидаемого и действительного.

Модель
Рис. 4

Реальность
Рис. 5

Еще фото
Рис. 6


Рис. 7


Рис. 8

А вот фотография устройства после замены светодиодов на белые.


Рис. 9

И небольшое видео, демонстрирующее работу девайса.

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
U1 МК PIC 8-бит
PIC12F629
1 DIP8Поиск в магазине ОтронВ блокнот
Q1-Q3 Биполярный транзистор
КТ315А
3 Любой маломощныйПоиск в магазине ОтронВ блокнот
D1-D3 СветодиодLED3 Любой, подходящий по яркости и токуПоиск в магазине ОтронВ блокнот
C1, C2 Конденсатор33 пФ2 0805Поиск в магазине ОтронВ блокнот
R1-R3 Резистор
220 Ом
3 Мощность зависит от светодиодовПоиск в магазине ОтронВ блокнот
R4 Резистор
2.2 кОм
1 +/- 20%Поиск в магазине ОтронВ блокнот
PB1 КнопкаPB11 Лобая, подходящая по габаритамПоиск в магазине ОтронВ блокнот
X1 Кварцевый резонатор12 МГц1 Желательно низкопрофильныйПоиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: Изменена: 22.08.2014 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (6) | Я собрал (0) | Подписаться

-1
Сергей #
Непонятно, зачем использовать кварц, для таких целей хватило бы и внутреннего RC генератора. Идея использовать несколько светодиодов, зажигая их последовательно для регулировки яркости тоже сомнительна, за плафоном не будет видно горит один светодиод или два впол накала. С практической точки зрения лучше использовать один яркий светодиод или несколько обычных, соединенных последовательно и запитанных от импульсного стабилизатора тока. Если особо постараться его можно прямо на микроконтроллере и сделать, задействовав компаратор, таймер и внешний транзистор с индуктивностью и конденсатором.
Ответить
-1

[Автор]
zeconir #
Кварц для ШИМа, если сможете "поднять" внутренний генератор МК до > 12 МГц, можно отключить. С остальным вполне согласен. На мой взгляд удобнее моя констркция. Если у вас другая точка зрения, осветите ее в своей статье.
Ответить
0
Айнур #
Собрал схему в proteus в точности как у вас, но диоды мигают только. Подскажите в чем проблема?
Ответить
0

[Автор]
zeconir #
Протеус, в силу того что он ПРОГРАММНЫЙ симулятор, не может отрисовывать и обрабатывать данные в реальном времени. Да, скорость симуляции приближена к 1/1, но не всегда. Да и выше частоты обновления монитора ( < 65Гц ) не выйдет.
Отредактирован 01.01.2015 21:42
Ответить
-2
_CHERNIY_x_PLASTELIN_ #
Пришлите схему в proteus
Ответить
0

[Автор]
zeconir #
В архиве есть и исходники прошивки, и проект протеуса.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
МиниПК MK809V - 4 ядра, Android 4.4.2 Паяльник с регулировкой температуры
вверх