ATmega32的Vs=5 V,每个引脚可以提供和吸收 +/-20 mA 的电流,电压损失约为 0.7 V .. 0.8 V
它可以拉出和灌入4·(20 mA)= 80 mA(每个封装),甚至每个端口,没有问题。
假设您不想超过每个 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。