Как я могу управлять многими светодиодами с помощью всего нескольких контактов на моем микроконтроллере?

Я использую Atmel ATtiny13 с 6-контактным вводом-выводом. Я хотел бы контролировать около 15 светодиодов, но не знаю, как все подключить. Кажется, что без какого-либо мультиплексирования я смогу управлять только 6 светодиодами одновременно. Я ограничен только 6 светодиодами из-за размера микроконтроллера?

Я не видел. Возможно продублировано: electronics.stackexchange.com/questions/9860/…
Не забудьте сравнить ваши варианты со стоимостью покупки микроконтроллера чуть меньшего размера. Также обратите внимание на ограничения по портам и суммарному току.
Когда я некоторое время назад начал работать с микропроцессорами, мне хотелось, чтобы на этот вопрос было легко найти четкие ответы. Мне удалось узнать о charlieplexing и успешно реализовать его, но я хотел воссоздать здесь вопрос с отличным качеством ответов SE-сообщества.
@joeforker Вы правы, стоимость микро с большим количеством контактов была довольно минимальной, учитывая, что мой проект был разовым. В какой-то момент я подумал об использовании микросхемы с примерно 20 выводами ввода-вывода для выполнения этой работы, но одной из моих целей была очень маленькая печатная плата. Кроме того, потрясающее прилагательное pinnier !
@mjh: я хотел опубликовать вопрос, сформулированный таким образом, потому что когда-то я нашел бы его чрезвычайно полезным. Вопрос, на который вы ссылаетесь, относится к Arduino, хотя, безусловно, принцип идентичен.

Ответы (6)

Существует несколько методов, которые можно использовать для управления большим количеством светодиодов с нескольких контактов ввода-вывода.

Самым простым является стандартное мультиплексирование отображения строк/столбцов. С помощью этой техники вы можете управлять ( н / 2 ) 2 светодиоды с н контакты ввода-вывода. Математически рабочий цикл равен:

1 м я н я м ты м ( уникальные шаблоны строк, уникальные шаблоны столбцов )

Это означает, что этот метод имеет рабочий цикл 100 %, когда горят все светодиоды (или все строки или все столбцы идентичны) и рабочий цикл 1 / н когда нужно осветить диагональную линию (или все ряды разные). Вам гарантируется 100% рабочий цикл только при включении каждого светодиода или одного светодиода (или ни одного светодиода, но на самом деле это не имеет большого значения).

Чуть более сложным является Чарлиплексинг . С помощью этой техники вы можете управлять н 2 н светодиоды с н контакты ввода-вывода. Только н 1 С помощью этой техники одновременно можно зажигать светодиоды. Математически рабочий цикл равен:

1 минимальные одновременные сеты

где одновременный набор представляет собой уникальную группу светодиодов, имеющую общий анод или общий катод. (Это не было доказано, это просто то, к чему я пришел после того, как обдумал проблему в течение минуты. Если рабочий цикл важен для вас, вы захотите изучить это подробнее.) Это гораздо более сложный расчет как интеллектуально и в вычислительном отношении, чем эквивалентный расчет для стандартного мультиплексирования. По сути, вы получаете рабочий цикл 1 / н когда горят все светодиоды, но некоторые (только некоторые) шаблоны из n-1 или меньшего числа светодиодов могут иметь рабочий цикл 100%. Вам гарантирован 100% рабочий цикл только при включении 1 светодиода.

Последний метод, который я упомяну, — это использование регистра сдвига или расширителя ввода-вывода. С помощью двух контактов (либо интерфейс необработанных данных/тактовых импульсов, либо I2C, либо однонаправленный SPI) вы можете управлять произвольно большим количеством светодиодов. Рабочий цикл для любого шаблона составляет 100%, но скорость обновления обратно пропорциональна количеству светодиодов. Это самый затратный метод. Для 15 светодиодов, вероятно, будет дешевле просто перейти на микро с таким количеством контактов ввода-вывода.

+1 за небольшое объяснение аспекта рабочего цикла. Во втором предложении о плексировании Чарли вы имели в виду «управлять n ^ 2-n светодиодами с n контактами ввода-вывода?
Чарлиплексирование можно сделать очень похоже на мультиплексирование, если просто исключить один свет из каждой строки. На самом деле, может быть возможно «восстановить» этот свет, добавив диод, хотя, если драйверы столбцов не являются выходами постоянного тока, согласование яркости с другими может быть затруднено.

Используя Charlieplexing , вы можете напрямую управлять н × ( н 1 ) светодиоды от н булавки.

Пример:

Шесть светодиодов на 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

Схема Чарлиплексирования с 3 выходными контактами

Спасибо за набор данных выходных контактов, а также за полезную схему.
Другой способ рисования схемы - это сетка NxN, но только с ведущими столбцами и заменой основной диагонали на короткие строки-столбцы.
значит я не могу включить их все сразу? Означает ли это, что если я хочу включить их все сразу, мне придется достаточно усложнить время, чтобы обмануть глаза?
@MaNyYaCk Да. Ты прав.

Без мультиплексирования (прямой привод) вы ограничены 6 светодиодами.

С помощью charlieplexing вы можете управлять n * (n-1) светодиодами с n контактов.

С расширителями ввода-вывода или сдвиговыми регистрами вы можете управлять практически неограниченным количеством светодиодов.
Пример: MCP23008 8-битный модуль расширения ввода/вывода I2C

Не могли бы вы уточнить, какими будут расширители ввода-вывода?
Расширитель ввода-вывода — это внешняя микросхема, содержащая контакты ввода-вывода и регистры. Вы можете использовать стандартную коммуникационную шину, такую ​​как I2C или SPI, для связи с ними.
+1 Вы можете управлять множеством светодиодов с TLC594 от TI ( focus.ti.com/lit/ds/symlink/tlc5940.pdf ), но для многих задач это может быть излишним. search.digikey.com/scripts/DkSearch/…
Спасибо - я должен разработать проект, в котором используются расширители ввода-вывода, чтобы заставить меня изучить их использование.

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