通过PWM控制500个LED


26

我正在考虑一个项目,该项目涉及单独寻址500个LED,最好每个LED都支持PWM。

我已经计划使用Arduino,因为我已经有了它,但是如果有人认为使用其他平台更合适,我可以公开提出建议。

需要使用移位寄存器。在这种情况下可以使用什么好的移位寄存器?如果PWM使该项目变得昂贵得多,那么我可以不用它。我想尝试花费少于$ 100。我会在ebay上批量购买500个LED。

您对控制如此大量的LED的最佳方法有何看法?另外,我将如何提供电源?我将不胜感激。我对电子产品非常有经验,但是我从未做过如此大规模的事情。

Answers:


14

我是ShiftPWM库的作者,我刚刚更新了文档,其中包括原理图以及有关普通LED,LED灯条和大功率LED的更多常规信息。

您可能已经开始了您的项目,但是由于此页面吸引了很多访问者,因此我仍然想提供详细的答案。

如果要使用ShiftPWM控制500个LED,则每个LED在60 Hz时可以获得大约64个亮度级别。您将使用64个移位寄存器。专用的硬件PWM驱动器将为您提供更多的亮度,但价格会更高一些。我认为我的库的主要优点是易于使用,因为它包括RGB和HSV函数以及许多示例。

我个人会选择TLC5917的TLC5916而不是普通移位寄存器,因为它们具有内置的恒流LED驱动器。因为不需要电阻,所以可以节省大量的焊接工作。

在我的网站(http://www.elcojacobs.com/shiftpwm)上,我有更多关于如何连接LED以及如何处理Arduino高速驱动长信号线的更多信息。

如果您还有其他问题,请询问。


你看下面我的回答了吗?尽管我描述的技术使用了额外的硬件,但可能仍可以使用相同的方法极大地提高库的速度。我尚未对Arduino进行编程,所以我不熟悉它的指令时序,但是以最简单的形式,您可以将CPU负载减少到仅将SPI爆破比特所需的任何负载(如果您目前处于5个周期内)每位,而SPI每字节需要16个周期,因此可以提高2.5倍)。您甚至可以在仍然以这种速度运行的同时,做一些更复杂的事情。
2012年

例如,假设您要具有八个亮度级别,分别代表全开,1 / 2、1 / 4、1 / 8、1 / 16、1 / 32、1 / 64和1/128。如果Arduino可以对从指针获取的值执行“与”或“或”运算,并在不到四个周期的时间内递增该指针,则可能可以使用每个像素三位来存储亮度信息,但仍可以达到传输速度每8个LED 16个周期。
2012年

计算PWM值与我的库中的SPI输出重叠。我以4MHz运行SPI,计算时间仅比SPI输出长一点。每个字节需要43个时钟周期,因此每8个输出。对于大多数设置而言,这足够快。通过使用位码调制,您可以获得更快的速度,其中有8个更新周期,每个下一个周期是前一个周期的一半。我已经写了一个BCM版本,但是对您更新亮度设置的那一刻更加敏感。未对准时可能会引起闪烁。我可能会在矩阵版本中使用它。
ElcoJacobs 2012年

BCM的优势在于您可以利用1 / 2、1 / 4 ...时序,但每个LED仅占用一个引脚。如果您具有计算机科学背景,那么可能会发现有趣的是如何计算SPI字节。我从内存中接收到占空比(2个时钟),然后执行一个compare(1个时钟)。比较结果存储在进位中,因此我可以通过一次进位(1个时钟)将其移入字节。进行8次操作会将所有比较结果放在一个字节中,准备发送到SPI。
ElcoJacobs 2012年

13

只需复制:-)

http://www.evilmadscientist.com/article.php/peggy2

今天,我们发布了“ Peggy”开源LED Pegboard项目的更新。Peggy版本2已从头开始重新设计。而且看起来……几乎完全一样。不过,内幕上的变化是巨大的,并且我们认为从许多方面来看,这是一个很大的改进。

首先,Peggy 2.0仍然做同样的事情:它为25 x 25的LED位置阵列提供有效的电源。Peggy旨在消除LED的使用带来的刺痛,复杂性和混乱。它是一种多功能且功能强大的发光钉板,可让您以所需的任何配置有效地驱动数百个LED,而无需计算单个负载电阻。您可以在任何地方安装1到625个LED,Peggy会为您点亮它们。


Peggy 2.0现在还与Arduino兼容:它使用流行的Arduino软件环境通过USB-TTL电缆支持编程。


精彩的链接!已收藏。我本来不打算从事这样的项目,但现在我不得不
看那

@NicolaeSurdu不坏。我刚刚打开它。
阿克斯曼2012年

3
虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。

6

您想要LED处于哪种布局?您可以节省大量的工作,如果你买一些LED矩阵,可以得到单色LED的8x8矩阵(64个LED),用于降压2

您不会通过AVR获得真正的PWM并在这么多LED上移位寄存器,但是您可能能够压缩2-4级亮度。您必须计算出数字,看看有什么可能。

Allegro制作了一些方便的恒定电流吸收器移位寄存器,专门用于控制LED阵列,因此您不需要额外的电阻器,这也将使事情变得更简单。如果AVR输出不能提供足够的功率,则可能无法直接从AVR输出驱动LED,因此您需要使用晶体管。您可以将它们以阵列的形式放在单个IC中,这也节省了一些工作。


一切都很好!
杰森S

5

我不知道LED所需的PWM范围,但我一直在为伺服控制应用开发64通道PWM控制器,该控制器可以给我600us到2.4ms的脉冲。它使用CD74HCT238E(3-8行多路解复用器)从ATMega168上的8个I / O引脚生成64个通道,并且可以通过简单的串行命令进行控制。我想您可以在串行线上将此控制器的多个版本的修改版本链接在一起,并寻址所有500个LED ...您可能会使用ATTiny2313版本的控制器,因为您的固件要求会更简单。

我的博客包含装配源,原理图以及设计过程的详细信息。


5

在mouser / digikey上签出“ LED驱动器” IC。例如,TI制造了许多具有各种接口(I2C,SPI)的驱动程序,这些接口肯定可以满足您的需求。这些驱动程序中的大多数被设计为菊花链连接,因此从一个驱动器输出的串行信号将被馈入另一个驱动器的串行输入信号。

例如,TL​​C5940之类的产品提供16通道PWM控制。因此,基本上,它是具有12位灰度PWM控制的恒流16位移位寄存器。我可以推荐该特定的IC,因为我帮助设计了一个80x16的显示器。


4

Mondomatrix制造了一些串行(rs-485)可寻址LED驱动器板,并且基于Arduino平台:http : //www.displayduino.com/您可能可以相当容易地使用该硬件组合系统


4

如果您不希望每个LED都有太多的PWM控制位,并且不想让每个PWM周期的处理器浪费500个LED,则可以使用N 74HC595或等效芯片来控制8个N位亮度的LED 。将所有N个芯片的输出连接在一起,然后将使能连接到某些电路,这些电路将在适当的时间一次只启用一个。安排好第一个芯片启用一半的时间,第二个芯片启用剩余一半的时间,依此类推。

移位寄存器的任何重载都应与PWM速率同步,以最小化混叠效应(例如,如果亮度水平在0111和1000之间快速切换,则发生切换的PWM周期中的点可能会瞬间改变视在亮度)。

尽管每个LED必须使用多个74HC595输出可能很烦人,但这种方法可能是最简单的方法,无需持续CPU干预即可保持不同的亮度水平。


3

这不能直接回答问题,但是您可能需要考虑的另一个方面是500批次LED之间的亮度变化。如果这些LED彼此靠近安装(例如矩阵或7段显示器),则这尤其重要。有关如何解决此问题的更多详细信息,请参见此答案,尤其是使用点校正来补偿LED亮度的变化。

当我为自己正在建造的一组大型7段显示器使用200个1mm红色LED时,我就遇到了这个问题。解决这个问题的廉价解决方案包括:

  1. 我在面包板上建立了一个LED测试仪,以对各种亮度类别的LED集进行分类
  2. 我使用相同类别的LED来安装每个分段(在我的设计中,每个分段由5个串联安装的LED组成)
  3. 我使用不同的限流电阻补偿了每个段的亮度差异。例如,对于具有较亮LED的段,我将使用100欧姆的电阻,而对于具有较暗LED的另一段,我将使用120欧姆的电阻。

1
有效点,但不回答问题。
马特·杨

1
@MattYoung同意。其他所有答案基本上都可以回答这个问题。我只是想补充这些答案,以解决可能影响OP设计的附带问题。
里卡多


1

XMOS将Macroblock MBI5026与其LED瓷砖套件一起使用。我认为它们已在大多数其他专业系统中使用。

里昂


1

具有串行接口的专用驱动器芯片可能确实是最好的选择。处理单个移位寄存器可能意味着电路非常复杂。至少Maxim和TI有所作为。我不记得有没有一个模型特别适合那个人。

仍然需要很多硬件。

至于电源,编程和总线,每个驱动器的数据表可能会包含您所需的大多数信息。


1

在软件领域,如果所需的不同亮度设置的数量不是太大,则以“位平面”格式存储数据(如我在其他基于硬件的答案中所述)可能会有所帮助。输出例程使用布尔运算符一次作用于8个像素。为了获得最大效率,这将需要具有多个单独的输出例程,用于PWM周期的不同部分。例如,如果一个人希望使用4位亮度值,则可以使用八种形式的例程:

  movf bit0Comp,w; 应为00或FF,具体取决于比较器的位0(如果清零,则为FF)
  iorwf POSTINCF,w; 数据的位0;始终使用IORWF
  和wf POSTINCF,w; 数据的第1位;如果比较器的第1位置1,则使用IORFF;ANDWF(如果清除)
  和wf POSTINCF,w; 数据的第2位;如果比较器的第1位被置位,则使用IORWF;否则,请使用IORWF。ANDWF(如果清除)
  和wf POSTINCF,w; 数据的第2位;如果比较器的第1位被置位,则使用IORWF;否则,请使用IORWF。ANDWF(如果清除)
  movwf SPIREG; 存储结果字节(如果> =比较数,则设置位)

根据比较值的不同,可以使用IORWF和ANDWF的不同组合。请注意,使用所示的这种方法,只要将所有四个位都写入到显示移位例程的调用之间,或者通过使像素更新例程确定是否将像素的像素值更新为像素,就可以在PWM周期的任何点更新像素亮度值而不会闪烁。下一个移位将为像素输出“ 1”或“ 0”,然后设置或清除像素的所有位(无论哪种操作,它都会做其将要执行的任何操作),然后写入其值应为对。还要注意的是,通过改变显示更新的时间,或者在一个PWM周期内多次使用一些比较值,可以达到任意的非线性亮度等级。


1

FPGA或CPLD提供许多I / O引脚,因此可以很好地完成这些任务。选择最简单,最便宜的。如果一个还不够,请使用一对。


您能为我们提供更多有关为什么这是一个好选择的详细信息吗,现在我知道了,但是我知道有哪些选择以及您列出的建议技术,Origial Poster(OP)可能没有这样的选择背景。
Kortuk 2012年

我不确定这是最好的选择,但希望它被提及以保持完整性。如果以一种或另一种方式用PWM控制500个LED,最后需要500条可单独控制的导线。很难找到具有这么多输出引脚的微控制器。解决这一问题的方法有很多,但仍然可以使用微控制器,但是一个或几个便宜的CPLD / FPGA可以很容易地为这些输出引脚供电。
卡尔

1

几乎可以肯定,您可以使用PSoC3PSoC5轻松地做到这一点。

PSoC芯片是包含可重新配置数字硬件的微控制器,有点像FPGA或CPLD。这意味着您可以制作复杂的电路来完成不寻常的事情,例如使用PWM驱动500个LED。而且,您可能可以使用可重新配置的数字模块来实现整个功能,这意味着芯片的CPU部分仅需要将所需的LED亮度写入阵列中。

504个LED装在一个21 x 24的矩形中。如果您有24个PWM通道和21个GPIO,则可以正常工作。你猜怎么了?PSoC的功能还不止这些。

您可以在PSoC上轻松设置24个PWM通道,并将其他21个引脚配置为移位寄存器的一部分。接下来,配置一些DMA通道以将字节从内存中泵入PWM输出,这很可笑。现在,CPU需要做的就是生成图形。PSoC3具有8位8051内核,而PSoC5具有32位ARM。随便你吧。您唯一需要的外部IC是一些ULN2803,以为行提供高驱动电流。PWM输出应具有足够的电流驱动单个LED。


这是驱动LED的全部杀伤力。有专门的,廉价的,预先设计的LED驱动器,用于像这样的大量链接,这些驱动器一直用于巨大的显示器。无需重新发明所有这些,并且花费更多。
nemik

@nemik-实际上,芯片的总成本(来自昂贵的Farnell)仅为6.80英镑。
Rocketmagnet 2012年

0

利用规模经济。像Aliexpress这样的中国网站出售基于WS2811的LED线束,每50个LED约15美元。它们分别可寻址,明亮,通常防水,并具有PWM亮度。无需焊接或移位寄存器即可使两者混淆。我敢打赌,自己做所有这一切,将使您花费更多,花费更多时间并且非常沮丧。另外,您在奥兹(Oz),因此从中国寄出的运费不会太贵。

这些是为制造巨型LED显示器而制作的,因此它们往往很便宜。只需确保大约每50个LED重新注入电源即可获得最佳性能。

也有Arduino库使它们易于使用。


1
每50个LED 15美元?因此,对于500个LED,这要花费150美元?您有神经告诉我我的解决方案很昂贵吗?-1
Rocketmagnet 2012年

另外,请提供一个链接。WS801并不是Google的理想之选,它也不会出现在Aliexpress
Rocketmagnet

对不起,我的意思是WS2811,像这些aliexpress.com/store/product/...或没有PWM调光,这些aliexpress.com/store/product/...
nemik

一个串行信号通过PWM调光驱动50个LED。谢谢,这正是我所追求的。但是,标准的移位寄存器提供了一个“锁存”引脚,用于在发送完整帧后将缓冲的数据复制到输出。这里没有锁存器,因此我希望在高刷新率时会出现明显的噪声。芯片支持每像素15位的400 Kbps数据,因此在帧更新时屏幕将显示1.9毫秒的废话。
nialsh 2014年
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.