如何用我的微控制器上的几个引脚控制多个 LED?

电器工程 微控制器 引领 复用器
2022-01-05 13:32:36

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

4个回答

有几种方法可用于从几个 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

具有 3 个输出引脚的 Charlieplexing 示意图

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

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

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

正如@mjh2007 建议的那样,使用 I2C 扩展器。但也有 专门用于驱动 LED的产品,无需外部限流电阻。