我正在使用具有 6 针 I/O 的 Atmel ATtiny13。我想控制大约 15 个 LED,但不确定如何连接所有东西。如果没有任何形式的多路复用,我似乎一次只能控制 6 个 LED。由于微控制器的尺寸,我是否仅限于 6 个 LED?
如何用我的微控制器上的几个引脚控制多个 LED?
有几种方法可用于从几个 IO 引脚驱动大量 LED。
最简单的是标准行/列显示复用。使用这种技术,您可以使用 \$n\$ IO 引脚驱动 \$( n / 2 )^2\$ LED。在数学上,占空比为:
$$\frac{1}{minimum(\text{唯一行模式,唯一列模式})}$$
这意味着当所有 LED 都点亮(或所有行或所有列都相同)时,该技术的占空比为 100%,当需要点亮对角线时(或所有行不同)。当点亮每个 LED 或一个 LED(或零个 LED,但这并不重要)时,您只能保证 100% 的占空比。
稍微复杂的是Charlieplexing。使用这种技术,您可以使用 \$n\$ IO 引脚驱动 \$n^2 - n\$ LED。这种技术只能同时点亮 \$n - 1\$ 个 LED。在数学上,占空比为:
$$\frac{1}{\text{最小同时集}}$$
其中同时设置是一组独特的 LED,它们具有共阳极或共阴极。(这还没有被证明,这只是我在思考了一分钟后得出的结论。如果占空比对您很重要,您将需要进一步研究。)这是一个更复杂的计算,无论是在智力上并且在计算上比标准多路复用的等效计算。实际上,当所有 LED 都点亮时,您会获得 \$1 / n\$ 的占空比,但 n-1 或更少 LED 的某些(仅部分)模式可以具有 100% 的占空比。点亮 1 个 LED 时,您只能保证 100% 的占空比。
我要提到的最后一种方法是使用移位寄存器或 IO 扩展器。通过两个引脚(原始数据/时钟接口、I2C 或单向 SPI),您可以控制任意数量的 LED。任何模式的占空比都是 100%,但更新率与 LED 的数量成反比。这是最昂贵的方法。对于 15 个 LED,升级到具有这么多 IO 引脚的 micro 可能会更便宜。
使用Charlieplexing,您可以直接从 \$n\$ 引脚驱动 \$n \times (n-1)\$ LED。
示例:
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
如果没有多路复用(直接驱动),则仅限于 6 个 LED。
使用 charlieplexing,您可以从 n 个引脚驱动 n*(n-1) 个 LED。
使用 I/O 扩展器或移位寄存器,您可以驱动几乎无限数量的 LED。
示例:MCP23008 8 位 I2C I/O 扩展器
正如@mjh2007 建议的那样,使用 I2C 扩展器。但也有 专门用于驱动 LED的产品,无需外部限流电阻。