如何通过多路复用有效地驱动多个 LED?

电器工程 引领 司机
2022-01-14 00:34:26

我正在将我的微控制器 (AVRmega32U4) 连接到 4x4 LED 阵列。有 2 条控制线来操作列(传递到 2 到 4 解复用器)和 4 条控制线来操作行。我将一列高,一行低以照亮特定的 LED。我将列拉低或将行拉高以关闭 LED。

这种设计同时适用于最多 4 个 LED。然而,当我尝试使用这种策略同时点亮所有 16 个 LED 时,LED 的亮度明显降低(毕竟它们的占空比为 1/16!)。

有哪些方法可以更有效地点亮该阵列中的大量 LED?说,10+?

我正在考虑编写大量代码来处理不同的情况,但这会在我的微控制器上消耗更多的空间,而不是我能接受的。我正在考虑添加另一个带有 16 条控制线的微控制器来管理这些 LED,一次一个,但这似乎需要引入很多开销。

在此处输入图像描述

4个回答

我使用Telaclavo 回答中的宝贵信息来调整我的。如果你喜欢他,别忘了给他点赞。

如果您的占空比为 1/16,那么您必须为每个 LED 提供 16 倍其标称电流才能获得相同的平均亮度。这会降低 LED 的寿命。高亮度 LED 可以在 1/16 占空比的标称电流下进行 PWM 控制,并且仍然与普通指示灯 LED 一样亮。
最简单的解决方案是保持占空比固定,这样您也可以固定电流。每个列驱动器必须同时驱动 4 个 LED,因此是标称电流的 4 倍。

原理图中的 7404 不适合这个。第一个 TTL 可以提供非常小的电流:0.4mA。但即使下沉也不行,那也只有 16mA,大多数 LED 和高亮度都规定为 20mA。您需要一个可以获取该驱动程序的驱动程序。在您的 4 列 x 4 行中,4 列中的每一列都必须提供 4 个 LED,每个 LED 的电流为 20mA,即 80mA。存在高端驱动器,但您可能必须使用分立元件(BJT 或 MOSFET)。电流不会导致高耗散,因为每个高端晶体管的平均电流仅为其 1/4:20mA,如果所有 LED 都打开,这是最坏的情况。

编辑
BC807是一个不错的选择,的 \$H_{FE}\$ 最小值为 100,因此几毫安的基极电流会驱动它处于饱和状态。您不再需要 7404 来反转 74S139 的低电平有效输出,因为 BC807 由低电压驱动。74S139(为什么不 LS?)可以吸收所需的电流,74HC139 也可以。虽然大多数微控制器能够吸收 20mA 电流,但ATMega32U4
似乎并非如此数据表没有给出最大电流作为参数(空白),但最小和最大输出电压指定为 10mA。因此,对于低端,您将获得额外的驱动程序。74LVC07A额定灌电流为 32mA。

在 Digikey 批量购买 74HC139 + 74LVC07A + 4 \$\times\$ BC807 + 8 个电阻器的成本不到 35 美分。

如果希望所有 LED 看起来同时点亮,那么一维驱动器(通常称为“行”,与 LED 的物理排列无关)应构造成当一个行驱动器通电时,能够同时点亮所有列;在另一个方向上,列通常设计为一次通电一行。在大多数情况下,这意味着行驱动器必须比列驱动器“更强大”。

虽然有时设计带有只能同时驱动一半列驱动器的行驱动器的显示器可能会有优势(例如,因为希望能够在显示器的一部分中闪烁明亮的消息),但在大多数情况下可以达到特定的水平具有特定行数的表观亮度将需要一定水平的行电流。如果一次只能驱动一半的列,则以给定的亮度点亮所有列将需要以两倍的电流驱动它们以进行补偿。

顺便说一句,还没有提到一点:如果要在使用多路 LED 时尝试接近最大亮度的任何东西,则应该设计一种电路,以防止一排通电时间过长。至少,应该设计一些东西,以便如果 CPU 停止,显示器将自动关闭或循环浏览行,并且在不使显示器空白的情况下,显示器扫描不能过于频繁地重新启动(通过让计数器告诉 CPU当它回绕时,而不是让 CPU 重置计数器,或者让“计数器重置”信号禁用行驱动程序一段最短时间)。否则 CPU 故障可能会损坏 LED 面板。

ATmega32Vs=5 V,每个引脚可以提供和吸收 +/-20 mA 的电流,电压损失约为 0.7 V .. 0.8 V

ATmega32_1

它可以拉出和灌入4·(20 mA)= 80 mA(每个封装),甚至每个端口,没有问题。

ATmega32_2

假设您不想超过每个 LED 的 20 mA 额定值,这将是一种不同的方法:

示意图

U1 = ADG1636它有两个 SPDT 开关。每个开关连接可在 25 ºC 下在任何方向承载 238 mA(最大值)。这远高于 4·(20 mA)=80 mA。因此,U1 充当大电流缓冲器。1 kpcs 的 IC 成本为 1.83 美元。

Rs = (5-2-0.7 V)/(20 mA)=115 \$\Omega\$, 1/4 W。您只需要其中四个。

为了安全地反并联成对的LED,如图所示,它必须是\$V_{F}<|V_{Rmax}|\$,并且通常满足该条件。

脚步:

1)设置B=0(如图)。这将使您可以访问二极管 D9 至 D16。二极管 D1 到 D8 将全部关闭。
2)设置A=0(如图)。这将使您可以访问二极管 D10、D12、D14 和 D16。
3) 如果要关闭 D10,请设置 C=A。如果您希望 D10 打开,请设置 C=!A(!表示否定)。
4) 与 3) 同时,对 {D,D12}, {E,D14}, {F,D16} 做同样的事情。
5) 设置 A=1。这将使您可以访问二极管 D9、D11、D13 和 D15。
6) 重复 3) 和 4),但对于 {C,D9}、{D,D11}、{E,D13}、{F,D15}。
7) 设置 B=1。这将使您可以访问二极管 D1 至 D8。
8) 重复 2) 至 6),但针对二极管 D1 至 D8。
9) 对每个新的完整循环重复 1) 到 8)。

这样,每个二极管将以 1/4 的占空比开启(这很好,考虑到您有 16 个二极管)。是的,如果你想逐渐控制亮度,你可以将 PWM 与这个想法混合使用。

正如我所说,该解决方案不超过每个 LED 的 20 mA 额定电流,因此您将看到的最大亮度将是每个 LED 可以产生的最大亮度的 1/4。如果您想要更高的亮度,请使用产生更多 mcd/mA 的 LED。这将保持完好无损他们的长寿。

由于 U1 的高电流能力,每个 LED 将产生的光量将不取决于点亮的 LED 总数。

而且,您的 MCU 仍然只需要 6 条 GPIO 线。只需一个外部 IC,而不是解码器 + 缓冲器或晶体管。这更昂贵,但更紧凑(如果这是关键的话),并且布线稍微容易一些(六线,而不是八线,连接到 LED 矩阵)。在我看来,这更像是一个好奇和学术的答案。

为 Federico Russo添加:你所说的已经在我的段落“正如我所说的,这个解决方案 [...]”中得到解决。强制 80 mA 通过 20 mA LED,即使是 1/4 的时间,也不是一个好主意。它的寿命会缩短。不是由于过度耗散(这是相同的),而是由于电迁移(与电流成正比)。请参阅Cree 的此参考资料摘抄:

重复脉冲

第二种类型的过电流条件,即大电流重复脉冲,可能会或可能不会导致 LED 的早期灾难性故障。与通常的预期寿命相比,重复的大电流脉冲可能导致 LED 的预期寿命缩短,约为数万或数十万小时。以高于数据表限制某个百分比但低于单脉冲故障所需阈值的幅度经受反复瞬变的特定设备最终仍将失效。失效机制很可能是由于电迁移,因为足够多的金属离子最终会从其原始晶格位置移开。

如果您想以更少的电流获得相同的寿命和相同的光,请使用在 20 mA 时产生更多 mcd 的 LED。

对于点亮大量 LED,TLC 5940 等驱动器 IC 是一个不错的选择。

对于 16 个 LED,它只需要来自 MCU 的 7 个引脚,并且驱动器可以串联连接多达 100 个 LED。

http://www.ti.com/product/tlc5940

https://sites.google.com/site/artcfox/demystifying-the-tlc5940