Гирлянда на ATtiny13a с программным ШИМ

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

Всё началось с выбора светодиодов. Решил выбрать 3мм светодиоды жёлтого свечения. Для управления ими использовал микроконтроллер ATtiny13a, так как его ножек хватает для задачи, а для питания схемы использовал 12 вольт.

Задача контроллера обслуживать 4 канала гирлянды и одну кнопку. На каждый канал, установил транзистор для управления нагрузкой. Питание микроконтроллера осуществляется линейным понижающим стабилизатором на 5 вольт, а 12 вольт идут через транзисторы на гирлянду.

Вероятно возник вопрос: «Почему 4 канала»? Отвечу, что это было сделано для создания эффектов, то есть для комбинирования линий гирлянды. Количество линий определило наличие свободных ножек у микроконтроллера. Оставшийся пин использовал под кнопку для переключения эффектов свечения гирлянды.

Изготовление гирлянды.

Начну с того, как рассчитать количество светодиодов на канал:

  1. Необходимо узнать падение напряжения. У меня получилось 1.8В на жёлтых светодиодах.

  2. Делим напряжение питания (12В) на напряжение падения (1.8В), получаем чуть больше 6. Следовательно на каждый канал будет установлено 6 последовательно включённых светодиода.

Остаётся только спаять гирлянду. Для этого потребовалось 24 светодиода(6 на каждую часть гирлянды), провода и термоусадка.

Печатная плата

Плату я проектировал с учётом изготовления по технологии ЛУТ (вся разводка произведена на нижнем слое). Перемычки обозначены на верхнем слое. Сопротивление резисторов, которые относятся к анодам светодиодов(R7 — R10), надо рассчитывать в зависимости от использования определённых светодиодов. Резисторы и конденсаторы использованы в smd исполнении(для посадочных мест 0805, так же можно использовать компоненты 0603).

Программа.

Это самое интересное, что реализовано в проекте. У меня была идея добавить режимы с ШИМ, но у контроллера нет достаточного количества ножек аппаратных поддерживающих ШИМ, и поэтому решил реализовать его программно-аппаратным путём(аппаратным, так как всё равно используется таймер-счётчик).

Для увеличения скорости переполнения счётного регистра таймер-счётчика установил максимальную частоту контроллера. Получается, что при чистоте 9.6МГц (E: FF, H: FF, L: 7A), прерывание по переполнению счётного регистра срабатывает каждые 0.027 мс. Следовательно получается реализовать программный ШИМ и оставить время для работы основной программы(так как вне прерывания остаётся около 300 тактов для выполнения программы).

В самом прерывании, переменная считает до максимального значения разрешения ШИМ (который можно изменить) и обнуляется по достижению. В то время как в основной программе сравнивается значение с этой переменной и выставляется нужный сигнал (высокий или низкий определённой длительности) на выбранный канал.

В программе пять режимов:

  1. Включенная гирлянда

  2. Поочерёдное мигание каждым из каналов гирлянды

  3. Плавное увеличение и уменьшение яркости (при помощи ШИМ),

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

  5. Выключенная гирлянда(удобно, для того чтобы не отключать от сети)

Рассмотрим осциллограмму каждого из режимов. В первом и последнем режиме нет ничего интересно. А вот три последующих рассмотрим:
1. Циклическое переключение каналов:

Примечание: смена фронтов на Channel 3, это нажатие кнопки. А после её отжатия начинает работать выбранный режим.

2. Плавное возрастание и уменьшение значений ШИМ:

3. Циклическое переключение каналов с ШИМ каждого из них:

Ближе:

Кнопка для переключения режимов отрабатывает по отжатию и циклически считает номер для установки определённого режима. Так же количество режимов можно изменить.

В памяти микроконтроллера остаётся ещё около 300 байт для написания программы, так что можно ещё добавить эффекты для гирлянды.

Код я оформил, так чтобы легко можно было бы изменить скорость каждого из режимов и разрешение ШИМ (я выбрал шести битный, так как это оптимально по плавности и скорости).

 // ===== USER SETTINGS ===== #define NUMBER_MODES			5		//Count of modes/effects // ------------------------------------ #define PWM_RESOLUTION			64		//Bit PWM (64 - 6-bit)  - 500Hz  										///////// (127 - 7-bit) - 300Hz 										///////// (255 - 8-bit) - 130Hz // ------------------------------------	 #define DELAY_BOUNCE_BUTTON		1480	//Button chatter elimination (~40ms) //(x - count) * 0.027ms #define DELAY_SWITCH_BLINK		15000	//Garland Channel Switching	 (405ms) //--------------------- // ------------------------------------ #define DELAY_DIMMING_MODE_1	1000	//PWM values increase time, for the effect this value is half	  (1000ms) //(x - count) * 1ms  #define DELAY_DIMMING_MODE_2	110		//PWM values increase time, for the effect this value is complete (110ms)  //----------------- 

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

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
DD1 МК AVR 8-бит ATtiny13A 1 В DIP исполнении
 
DA1 Линейный регулятор LM7805 1
 
VT1-VT4 Биполярный транзистор 2N5551 4
 
SB1 Кнопка 3×6 мм 1
 
HL5 Светодиод 3мм 1 для индикации питания
 
R1-R6 Резистор 10 кОм 6 SMD 0603
R7-R10 Резистор 30 Ом 4 SMD 1206
R11 Резистор 470 Ом 1 SMD 0603
 
C1 Конденсатор 0.1 мкФ 1 SMD 0603
C2 Конденсатор 220 мкФ 1 8X11.5MM
C3 Конденсатор 2.2 мкФ 1 SMD 0603
 
XS1-XS4 Разъём PLS-2 4 Для подключения гирлянд
XS5 Разъём 2×5 мм 1 Клеммник
XP1 Разъём PLD-6 1 Для ISP программатора