Answers:
我是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高速驱动长信号线的更多信息。
如果您还有其他问题,请询问。
只需复制:-)
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电缆支持编程。
您想要LED处于哪种布局?您可以节省大量的工作,如果你买一些LED矩阵,可以得到单色LED的8x8矩阵(64个LED),用于降压或2。
您不会通过AVR获得真正的PWM并在这么多LED上移位寄存器,但是您可能能够压缩2-4级亮度。您必须计算出数字,看看有什么可能。
Allegro制作了一些方便的恒定电流吸收器移位寄存器,专门用于控制LED阵列,因此您不需要额外的电阻器,这也将使事情变得更简单。如果AVR输出不能提供足够的功率,则可能无法直接从AVR输出驱动LED,因此您需要使用晶体管。您可以将它们以阵列的形式放在单个IC中,这也节省了一些工作。
Mondomatrix制造了一些串行(rs-485)可寻址LED驱动器板,并且基于Arduino平台:http : //www.displayduino.com/您可能可以相当容易地使用该硬件组合系统
如果您不希望每个LED都有太多的PWM控制位,并且不想让每个PWM周期的处理器浪费500个LED,则可以使用N 74HC595或等效芯片来控制8个N位亮度的LED 。将所有N个芯片的输出连接在一起,然后将使能连接到某些电路,这些电路将在适当的时间一次只启用一个。安排好第一个芯片启用一半的时间,第二个芯片启用剩余一半的时间,依此类推。
移位寄存器的任何重载都应与PWM速率同步,以最小化混叠效应(例如,如果亮度水平在0111和1000之间快速切换,则发生切换的PWM周期中的点可能会瞬间改变视在亮度)。
尽管每个LED必须使用多个74HC595输出可能很烦人,但这种方法可能是最简单的方法,无需持续CPU干预即可保持不同的亮度水平。
这不能直接回答问题,但是您可能需要考虑的另一个方面是500批次LED之间的亮度变化。如果这些LED彼此靠近安装(例如矩阵或7段显示器),则这尤其重要。有关如何解决此问题的更多详细信息,请参见此答案,尤其是使用点校正来补偿LED亮度的变化。
当我为自己正在建造的一组大型7段显示器使用200个1mm红色LED时,我就遇到了这个问题。解决这个问题的廉价解决方案包括:
我建议使用本文所述的二进制角度调制技术http://www.artisticlicence.com/WebSiteMaster/App%20Notes/appnote011.pdf
或查看ShiftPWM库http://www.elcojacobs.com/shiftpwm/
在软件领域,如果所需的不同亮度设置的数量不是太大,则以“位平面”格式存储数据(如我在其他基于硬件的答案中所述)可能会有所帮助。输出例程使用布尔运算符一次作用于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周期内多次使用一些比较值,可以达到任意的非线性亮度等级。
FPGA或CPLD提供许多I / O引脚,因此可以很好地完成这些任务。选择最简单,最便宜的。如果一个还不够,请使用一对。
几乎可以肯定,您可以使用PSoC3或PSoC5轻松地做到这一点。
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。
利用规模经济。像Aliexpress这样的中国网站出售基于WS2811的LED线束,每50个LED约15美元。它们分别可寻址,明亮,通常防水,并具有PWM亮度。无需焊接或移位寄存器即可使两者混淆。我敢打赌,自己做所有这一切,将使您花费更多,花费更多时间并且非常沮丧。另外,您在奥兹(Oz),因此从中国寄出的运费不会太贵。
这些是为制造巨型LED显示器而制作的,因此它们往往很便宜。只需确保大约每50个LED重新注入电源即可获得最佳性能。
也有Arduino库使它们易于使用。