仅用几个引脚就能如何控制许多LED?


10

我正在使用具有6针I / O的Atmel ATtiny13。我想控制约15个LED,但不确定如何连接所有组件。如果没有任何形式的多路复用,似乎我一次只能控制6个LED。由于微控制器的尺寸,我是否仅限于6个LED?



3
不要忘记将您的选择与购买稍微细微的微控制器的成本进行比较。还应注意每个端口和总电流限制。
joeforker 2011年

不久前我开始使用micros时,我希望这个问题很容易找到,并提供清晰的答案。我设法学习了charlieplexing并成功实现了它,但是我想在这里以出色的SE社区答案重新创建问题。
JYelton 2011年

1
@joeforker是的,考虑到我的项目是一次性的,具有更多引脚的微型麦克风的成本非常低。我曾想过要使用一个带有20个IO引脚的微型芯片来完成这项工作,但是我的目标之一是缩小电路板的面积。此外,真棒形容词pinnier
JYelton 2011年

Answers:


18

有几种方法可用于通过几个IO引脚驱动大量LED。

最简单的是标准的行/列显示多路复用。使用这种技术,您可以通过n个 IO引脚驱动 LED 。从数学上讲,占空比为:(n/2)2n

1minimum(unique row patterns, unique column patterns)

这意味着,当所有LED都点亮(或所有行或所有列都相同)时,此技术的占空比为100%,占空比为1/n对角线需要点亮(或所有行均不同)。仅在点亮每个LED或一个LED(或零个LED,但这并不是很重要)时,才保证100%的占空比。

Charlieplexing稍微复杂一些。使用这种技术,您可以通过n个 IO引脚驱动 LED 。只有ñ - 1米的LED可以同时使用这种技术点亮。从数学上讲,占空比为:n2nnn1

1minimum simultaneous sets

1/n

我要提到的最后一种方法是使用移位寄存器或IO扩展器。通过两个引脚(原始数据/时钟接口,I2C或单向SPI),您可以控制任意数量的LED。任何图案的占空比均为100%,但更新速率与LED数量成反比。这是最昂贵的方法。对于15个LED,仅升级到具有这么多IO引脚的微型灯可能会更便宜。


+1用于说明占空比方面的内容。在关于Charlieplexing的第二句话中,您的意思是“ 用n个 IO引脚驱动n ^ 2-n LED吗?”
JYelton 2011年

如果仅从每一行中省略一个光,则Charlieplexing可以与复用非常相似地完成。实际上,有可能通过增加一个二极管来“恢复”光线,尽管除非列驱动器是恒定电流输出,否则使其与其他驱动器的亮度匹配可能很困难。
超级猫

11

n×(n1)ñ

范例:

3个引脚上的六个LED:

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个输出引脚的Charlieplexing原理图


感谢您提供输出引脚数据集以及有用的原理图。
JYelton 2011年

1
绘制原理图的另一种方法是使用NxN网格,但仅驱动列,并用行列短裤代替主对角线。
超级猫

意味着我不能一次打开所有这些?这是否意味着如果我想一次打开所有的灯,我必须做很多时间上的工作来愚弄眼睛?
MaNyYaCk

@MaNyYaCk是的。你是对的。
丹尼尔·格里洛

8

如果没有多路复用(直接驱动),则只能有6个LED。

通过charlieplexing,您可以从n个引脚驱动n *(n-1)个LED。

使用I / O扩展器或移位寄存器,您可以驱动几乎无限数量的LED。
示例:MCP23008 8位I2C I / O扩展器


您能否详细说明I / O扩展器是什么?
JYelton 2011年

3
I / O扩展器是包含I / O引脚和寄存器的外部芯片。您可以使用I2C或SPI等标准通信总线与它们进行通信。
mjh2007 2011年

+1您可以使用TI的TLC594(focus.ti.com/lit/ds/symlink/tlc5940.pdf)驱动很多LED ,但是对于许多工作而言,这可能会显得过高search.digikey.com/scripts/DkSearch/...
肯尼

谢谢-我应该设计一个使用I / O扩展器的项目,以迫使我了解它们的用法。
JYelton 2011年


2

这是我构建的charlieplexing的示例。

这是一个灯塔光束模拟器,使用一系列与12个LED灯串并与4个GPIO交错的灯来扫描光盘周围的光束。这里有一个录像带

该项目基于PIC,我使用的PIC12f683也是8pin uP,可以认为与8pin AVR相当。

LED的强度由中断驱动,该中断在60Hz左右提供32阶PWM。一次只能允许两个LED点亮,每个LED的占空比为50%,这是我所需要的。它还可以很好地权衡PWM刷新率与分辨率。

如果坚持“经典”方法,即在任何时间点仅以非常快的刷新率点亮单个LED,则使用charlieplexing的编码实际上非常简单。我先在纸上计算出所需的PORT和TRIS(图形专用寄存器),然后将结果存储在静态数组中。要点亮LED x,PIC只需在阵列的index [x]处查找值,然后将其直接写入PORT(稍加掩盖即可保留charliplex中未使用的其他引脚的状态)

我的项目只有12个LED而不是15个LED,或者5个GPIO允许的最大20个LED,因为我想保留一个GPIO备用用于将来的开发。

无论如何...我只是想拥有一个与您的要求相似的工作示例可能会有所帮助。

完整的源代码和原理图可在我的博客上找到。


0

另一种选择是使用Neopixel LED。它们具有内置的控制IC,您只需要一个引脚即可控制尽可能多的LED。当然,您将需要一个足够的独立LED电源。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.