Я использую Atmel ATtiny13 с 6-контактным вводом-выводом. Я хотел бы контролировать около 15 светодиодов, но не знаю, как все подключить. Кажется, что без какого-либо мультиплексирования я смогу управлять только 6 светодиодами одновременно. Я ограничен только 6 светодиодами из-за размера микроконтроллера?
Существует несколько методов, которые можно использовать для управления большим количеством светодиодов с нескольких контактов ввода-вывода.
Самым простым является стандартное мультиплексирование отображения строк/столбцов. С помощью этой техники вы можете управлять светодиоды с контакты ввода-вывода. Математически рабочий цикл равен:
Это означает, что этот метод имеет рабочий цикл 100 %, когда горят все светодиоды (или все строки или все столбцы идентичны) и рабочий цикл когда нужно осветить диагональную линию (или все ряды разные). Вам гарантируется 100% рабочий цикл только при включении каждого светодиода или одного светодиода (или ни одного светодиода, но на самом деле это не имеет большого значения).
Чуть более сложным является Чарлиплексинг . С помощью этой техники вы можете управлять светодиоды с контакты ввода-вывода. Только С помощью этой техники одновременно можно зажигать светодиоды. Математически рабочий цикл равен:
где одновременный набор представляет собой уникальную группу светодиодов, имеющую общий анод или общий катод. (Это не было доказано, это просто то, к чему я пришел после того, как обдумал проблему в течение минуты. Если рабочий цикл важен для вас, вы захотите изучить это подробнее.) Это гораздо более сложный расчет как интеллектуально и в вычислительном отношении, чем эквивалентный расчет для стандартного мультиплексирования. По сути, вы получаете рабочий цикл когда горят все светодиоды, но некоторые (только некоторые) шаблоны из n-1 или меньшего числа светодиодов могут иметь рабочий цикл 100%. Вам гарантирован 100% рабочий цикл только при включении 1 светодиода.
Последний метод, который я упомяну, — это использование регистра сдвига или расширителя ввода-вывода. С помощью двух контактов (либо интерфейс необработанных данных/тактовых импульсов, либо I2C, либо однонаправленный SPI) вы можете управлять произвольно большим количеством светодиодов. Рабочий цикл для любого шаблона составляет 100%, но скорость обновления обратно пропорциональна количеству светодиодов. Это самый затратный метод. Для 15 светодиодов, вероятно, будет дешевле просто перейти на микро с таким количеством контактов ввода-вывода.
Используя Charlieplexing , вы можете напрямую управлять светодиоды от булавки.
Пример:
Шесть светодиодов на 3 контакта:
PINS LEDS
0 1 2 1 2 3 4 5 6
0 0 0 0 0 0 0 0 0
0 1 Z 1 0 0 0 0 0
1 0 Z 0 1 0 0 0 0
Z 0 1 0 0 1 0 0 0
Z 1 0 0 0 0 1 0 0
0 Z 1 0 0 0 0 1 0
1 Z 0 0 0 0 0 0 1
0 0 1 0 0 1 0 1 0
0 1 0 1 0 0 1 0 0
0 1 1 1 0 0 0 1 0
1 0 0 0 1 0 0 0 1
1 0 1 0 1 1 0 0 0
1 1 0 0 0 0 1 0 1
1 1 1 0 0 0 0 0 0
Без мультиплексирования (прямой привод) вы ограничены 6 светодиодами.
С помощью charlieplexing вы можете управлять n * (n-1) светодиодами с n контактов.
С расширителями ввода-вывода или сдвиговыми регистрами вы можете управлять практически неограниченным количеством светодиодов.
Пример: MCP23008 8-битный модуль расширения ввода/вывода I2C
Как предложил @mjh2007 с расширителем I2C. Но есть те, которые специально предназначены для управления светодиодами , что позволяет избежать необходимости во внешних токоограничивающих резисторах.
Вот пример charlieplexing, который я построил.
Это симулятор луча маяка, в котором используется серия из 12 светодиодов, объединенных в 4 GPIO, для перемещения луча света вокруг диска. Здесь есть видео об этом .
Проект основан на PIC, я использую PIC12f683, который также является 8-контактным UP и может считаться сравнимым с 8-контактными AVR.
Интенсивность светодиода определяется прерыванием, которое обеспечивает 32-шаговую ШИМ с частотой около 60 Гц. Только два светодиода могут гореть одновременно, что дает 50%-ную нагрузку для каждого светодиода, поскольку это было все, что мне было нужно. Это также дает хороший компромисс между частотой обновления ШИМ и разрешением.
Кодирование для использования charlieplexing на самом деле довольно простое, если вы придерживаетесь «классического» метода освещения только одного светодиода в любой момент времени с очень высокой частотой обновления. Сначала я вычисляю необходимые PORT и TRIS (регистры, специфичные для pic) на бумаге, а затем сохраняю результаты в статическом массиве. Чтобы зажечь светодиод x, PIC просто должен найти значение в индексе массива [x] и записать их непосредственно в ПОРТ (с небольшой маскировкой, чтобы сохранить состояние других контактов, не используемых в charliplex)
В моем проекте всего 12 светодиодов, а не 15 или максимум 20, которые позволяют 5 GPIO, поскольку я хотел сохранить один запасной GPIO для будущих разработок.
В любом случае... Я просто подумал, что было бы полезно иметь рабочий пример, похожий на ваш запрос.
Полный исходный код и схемы доступны в моем блоге.
Другим вариантом было бы использование светодиодов Neopixel. Они имеют встроенную микросхему управления, и вам нужен только один контакт для управления любым количеством светодиодов. Конечно, тогда вам понадобится соответствующий отдельный источник питания для светодиодов.
Даниэль Грилло
Джофоркер
Джей Йелтон
Джей Йелтон
mjh2007
Джей Йелтон