Vraag:
500 LED's aansturen met PWM
littlebirdceo
2009-12-21 13:17:25 UTC
view on stackexchange narkive permalink

Ik overweeg een project aan te gaan waarbij 500 LED's afzonderlijk moeten worden aangepakt, optimaal met PWM-ondersteuning voor elk.

Ik ben van plan een Arduino te gebruiken aangezien ik er al een heb, maar ik sta open voor suggesties als iemand denkt dat een ander platform een ​​betere match zou zijn.

Shift-registers zouden dat wel doen. moeten worden aangenomen. Wat is een goed ploegregister om in deze situatie te gebruiken? Als PWM dit project een stuk duurder maakt, kan ik het zonder. Ik wil proberen minder dan $ 100 uit te geven. Ik zou 500 LED's in bulk kopen op eBay.

Wat is uw mening over de beste manier om zo'n groot aantal LED's aan te sturen? En hoe zou ik de stroom moeten leveren? Ik zou elke hulp op prijs stellen. Ik ben redelijk ervaren met elektronica, ik heb gewoon nog nooit zoiets op zo'n grote schaal gedaan.

Vijftien antwoorden:
#1
+14
ElcoJacobs
2012-08-10 03:09:16 UTC
view on stackexchange narkive permalink

Ik ben de auteur van de ShiftPWM-bibliotheek en ik heb zojuist de documentatie bijgewerkt met schema's en veel meer algemene informatie voor normale LED's, LED-strips en krachtige LED's.

Je bent waarschijnlijk al begonnen met je project , maar aangezien deze pagina veel bezoekers trekt, wil ik toch graag een gedetailleerd antwoord geven.

Als u 500 LED's met ShiftPWM wilt bedienen, kunt u ongeveer 64 helderheidsniveaus per LED krijgen bij 60 Hz. U zou 64 schuifregisters gebruiken. Toegewijde hardware PWM-stuurprogramma's geven u meer helderheidsniveaus, maar zullen een beetje duurder zijn. Ik denk dat het belangrijkste voordeel van mijn bibliotheek het gebruiksgemak is, omdat het RGB- en HSV-functies en veel voorbeelden bevat.

Ik zou persoonlijk voor de TLC5916 van TLC5917 gaan in plaats van de normale schuifregisters, omdat ze hebben een ingebouwde constante stroom LED-driver. Dit scheelt je veel solderen, omdat je geen weerstanden nodig hebt.

Op mijn website ( http://www.elcojacobs.com/shiftpwm) heb ik meer informatie over het aansluiten van de LED's en hoe om te gaan met het op hoge snelheid aandrijven van de lange signaaldraden met de Arduino.

Als je nog vragen hebt, stel ze dan.

Heb je mijn antwoord hieronder bekeken? Hoewel de techniek die ik beschrijf extra hardware gebruikt, kan dezelfde aanpak waarschijnlijk worden gebruikt om de snelheid van uw bibliotheek enorm te verbeteren. Ik heb de Arduino niet geprogrammeerd, dus ik ben niet bekend met de instructietijden, maar in de eenvoudigste vorm zou je je CPU-belasting kunnen verminderen tot wat nodig zou zijn om simpelweg bits uit de SPI te blazen (als je momenteel 5 cycli hebt per bit en je SPI duurt 16 cycli per byte, dat zou een 2,5x versnelling zijn). Misschien kun je zelfs wat meer geavanceerde dingen doen terwijl je nog steeds met die snelheid loopt.
Stel dat u acht helderheidsniveaus wilt hebben die volledig aan, 1/2, 1/4, 1/8, 1/16, 1/32, 1/64 en 1/128 vertegenwoordigen. Als de Arduino een "EN" - of "OF" -bewerking kan uitvoeren op een waarde die is opgehaald van een aanwijzer en die aanwijzer in minder dan vier cycli kan verhogen, zou je waarschijnlijk drie bits per pixel kunnen gebruiken om je helderheidsinformatie op te slaan en toch een overdrachtssnelheid te bereiken van 16 cycli per 8 LED's.
Het berekenen van de PWM-waarden overlapt de SPI-uitvoer in mijn bibliotheek. Ik voer de SPI uit op 4MHz en de berekeningen duren net iets langer dan de SPI-uitvoer. Het duurt 43 klokcycli per byte, dus per 8 uitgangen. Dit is snel genoeg voor de meeste opstellingen. U kunt meer snelheid krijgen door bitcodemodulatie te gebruiken, waarbij u 8 update-perioden hebt, elke volgende periode de helft van de vorige. Ik heb een BCM-versie geschreven, maar deze is gevoeliger voor het moment waarop je de helderheidsinstelling bijwerkt. Het kan flikkering veroorzaken als het niet goed is uitgelijnd. Ik zal het waarschijnlijk wel in de matrixversie gebruiken.
BCM heeft het voordeel van jouw aanpak dat je gebruik kunt maken van de 1 / 2,1 / 4 ... timing, maar toch maar één pin per LED nodig hebt. Als je een computerwetenschappelijke achtergrond hebt, vind je het misschien interessant hoe de SPI-bytes worden berekend. Ik ontvang de duty-cycle uit het geheugen (2 klokken) en doe een vergelijking (1 klok). Het vergelijkingsresultaat wordt opgeslagen in de carry, dus ik kan het naar de byte verplaatsen met een rotate over carry (1 klok). Als je het 8 keer doet, worden alle vergelijkingsresultaten in één byte geplaatst die klaar is om naar de SPI te worden verzonden.
#2
+13
Axeman
2009-12-21 13:21:13 UTC
view on stackexchange narkive permalink

Kopieer gewoon :-)

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

Vandaag ' opnieuw een update uitbrengen voor ons open-source LED Pegboard-project "Peggy". Peggy versie 2 is vanaf de grond opnieuw ontworpen. En het ziet er ... bijna precies hetzelfde uit. De veranderingen onder de motorkap zijn echter aanzienlijk en we denken dat het in veel opzichten een grote verbetering is.

Eerst en vooral doet Peggy 2.0 nog steeds hetzelfde: het levert efficiënte stroom aan een 25 x 25 reeks LED-locaties. Peggy is ontworpen om een ​​deel van de angel, complexiteit en rommel uit het spelen met LED's te halen. Het is een veelzijdige en krachtige light-emitting pegboard waarmee u honderden LED's efficiënt kunt aansturen in elke gewenste configuratie, zonder ook maar een enkele belastingsweerstand te berekenen. Je kunt overal van 1 tot 625 LED's installeren, en Peggy zal ze voor je verlichten.


Peggy 2.0 is nu ook Arduino-compatibel: het ondersteunt programmeren via een USB-TTL-kabel, gebruikmakend van de populaire Arduino-softwareomgeving.

Geweldige link! Bladwijzer gemaakt. Ik was niet van plan om aan een project als dit te werken, maar ik moet het maken nu ik die kleine video zag :-)
@NicolaeSurdu Niet kapot. Ik heb het zojuist geopend.
Hoewel dit de vraag theoretisch kan beantwoorden, [zou het de voorkeur hebben] (http://meta.stackexchange.com/q/8259) om de essentiële delen van het antwoord hier op te nemen, en de link als referentie te geven.
#3
+6
davr
2009-12-21 15:09:54 UTC
view on stackexchange narkive permalink

In welke lay-out wil je de LED's hebben? U kunt veel werk besparen als u enkele LED-matrixen koopt, u ​​kunt enkelkleurige 8x8 LED-matrixen (64 LED's) voor een dollar of twee krijgen.

Je krijgt geen echte PWM met een AVR en schuifregisters op zoveel LED's, maar je kunt misschien wel 2-4 helderheidsniveaus uit elkaar halen. Je zou de cijfers moeten doorlopen en kijken wat er mogelijk is.

Allegro maakt een aantal handige schuifregisters met constante stroomafvoer die speciaal zijn ontworpen voor het besturen van arrays van LED's, zodat je dat niet doet hebben de extra weerstanden nodig, dat maakt het ook eenvoudiger. Mogelijk kunt u de LED's niet rechtstreeks vanaf de AVR-uitgang aansturen als deze niet genoeg stroom kan leveren, dus u zult transistors moeten gebruiken. Je kunt ze in arrays in een enkele IC krijgen, wat ook wat werk scheelt.

allemaal heel goede punten!
#4
+5
Len Holgate
2009-12-21 17:49:47 UTC
view on stackexchange narkive permalink

Ik heb geen idee van het bereik van PWM dat je nodig hebt voor een LED, maar ik heb gewerkt aan een 64-kanaals PWM-controller voor een servobesturingstoepassing die me pulsen kan geven tussen 600us en 2,4ms. Dit maakt gebruik van CD74HCT238E's (demultiplexors met 3-8 lijnen) om 64 kanalen te genereren uit 8 I / O-pinnen op een ATMega168 en is bestuurbaar via eenvoudige seriële commando's. Ik denk dat je meerdere versies van een gewijzigde versie van deze controller aan elkaar kunt koppelen op een seriële lijn en alle 500 LED's kunt adresseren ... Je zou waarschijnlijk de ATTiny2313-versie van de controller kunnen gebruiken omdat je firmwarevereisten eenvoudiger zouden zijn.

Mijn blog bevat de assembly-bron en schema's en details van het ontwerpproces.

#5
+5
David Brenner
2009-12-21 21:57:17 UTC
view on stackexchange narkive permalink

Bekijk de "LED-driver" IC's op Mouser / Digikey. TI maakt bijvoorbeeld een heleboel stuurprogramma's met een verscheidenheid aan interfaces (I2C, SPI) die zeker aan uw behoeften zouden voldoen. De meeste van deze stuurprogramma's zijn ontworpen om doorgelust te worden, zodat de seriële uitgang van de ene wordt ingevoerd in de seriële ingang van de andere.

Zoiets als de TLC5940 biedt bijvoorbeeld 16-kanaals PWM-besturing. Dus eigenlijk is het een constant huidig ​​16-bits schuifregister met 12-bits grijsschaal PWM-besturing. Ik kan die specifieke IC aanbevelen, aangezien ik er een 80x16 scherm mee heb helpen ontwerpen.

#6
+4
Lepton
2010-07-29 11:09:17 UTC
view on stackexchange narkive permalink

Mondomatrix maakt een aantal seriële (rs-485) adresseerbare LED-driverboards en is gebaseerd op het Arduino-platform: http://www.displayduino.com/ Je zou in staat kunnen zijn om een systeem dat die hardware vrij gemakkelijk gebruikt

#7
+4
supercat
2011-03-16 22:38:26 UTC
view on stackexchange narkive permalink

Als je niet te veel bits PWM-besturing voor elke LED wilt, en je wilt voorkomen dat je een processor moet hebben met 500 LED's per PWM-cyclus, dan kun je 8 LED's met N-bits helderheid bedienen met N 74HC595 of gelijkwaardige chips. Verbind de uitgangen van alle N-chips met elkaar en sluit de inschakelingen aan op een schakeling die slechts één tegelijk met een geschikte timing mogelijk maakt. Regel zo dat de eerste chip de helft van de tijd wordt ingeschakeld, de tweede de helft van de rest, enz.

Elke herlaadbeurt van de schuifregisters moet worden gesynchroniseerd met de PWM-snelheid om aliasing te minimaliseren effecten (bijv. als een helderheidsniveau snel schakelde tussen 0111 en 1000, zou het punt in de PWM-cyclus waarop de schakelaar plaatsvond de schijnbare helderheid tijdelijk kunnen veranderen).

Terwijl je meerdere 74HC595-uitgangen voor elke LED moet gebruiken kan vervelend zijn, deze benadering is waarschijnlijk de eenvoudigste die verschillende helderheidsniveaus zou kunnen behouden zonder voortdurende tussenkomst van de CPU.

#8
+3
Ricardo
2013-12-12 18:57:24 UTC
view on stackexchange narkive permalink

Dit geeft geen direct antwoord op de vraag, maar een ander aspect dat u mogelijk in overweging moet nemen, is de mogelijke helderheidsvariabiliteit tussen LED's in uw 500 batch. Dat is vooral belangrijk als deze leds naast elkaar gemonteerd worden, zoals in een matrix of in 7-segment displays. Zie dit antwoord voor meer informatie over hoe u dit probleem kunt oplossen, met name het gebruik van puntcorrectie om variaties in de helderheid van de led te compenseren.

Ik heb dit probleem ondervonden toen ik 200 rode LED's van 1 mm voor een set grote displays met 7 segmenten die ik aan het bouwen was. Mijn goedkope oplossing om het probleem op te lossen, omvatte het volgende:

  1. Ik bouwde een LED-tester in een breadboard om sets leds in verschillende helderheidscategorieën te classificeren
  2. Ik monteerde elk segment met Leds in dezelfde categorie (in mijn ontwerp bestond elk segment uit 5 in serie gemonteerde leds)
  3. Ik heb het verschil in helderheid van elk segment gecompenseerd met verschillende stroombegrenzende weerstanden. Voor een segment met helderdere LED's zou ik bijvoorbeeld een weerstand van 100 ohm gebruiken, terwijl ik voor een ander segment met dimmer-LED's 120 ohm weerstanden zou gebruiken.
Geldig punt, maar geeft geen antwoord op de vraag.
@MattYoung Akkoord. De vraag wordt grotendeels beantwoord door alle andere antwoorden. Ik wilde die antwoorden gewoon aanvullen en een bijzaak aanpakken die van invloed kan zijn op het ontwerp van het OP.
#9
+2
x4mer
2011-09-17 22:47:29 UTC
view on stackexchange narkive permalink

Ik raad aan de binaire hoekmodulatietechniek te gebruiken die in dit artikel wordt beschreven http://www.artisticlicence.com/WebSiteMaster/App%20Notes/appnote011.pdf

Of bekijk ShiftPWM bibliotheek http://www.elcojacobs.com/shiftpwm/

Hoewel dit de vraag theoretisch kan beantwoorden, [zou het de voorkeur hebben] (http://meta.stackexchange.com/q/8259) om de essentiële delen van het antwoord hier op te nemen, en de link als referentie te geven.
#10
+1
Leon Heller
2009-12-21 22:36:52 UTC
view on stackexchange narkive permalink

XMOS gebruikt Macroblock MBI5026 met hun LED-tegelkits. Ik denk dat ze in de meeste andere professionele systemen worden gebruikt.

Leon

#11
+1
XTL
2010-07-28 18:52:59 UTC
view on stackexchange narkive permalink

Toegewijde driverchips met seriële interfaces zullen inderdaad waarschijnlijk de beste route zijn. Omgaan met individuele schuifregisters zal waarschijnlijk een zeer complex circuit betekenen. Maxim en TI maken tenminste wat. Ik kan me niet herinneren of een van beide een model heeft dat bijzonder geschikt is voor zoveel.

Het zal nog steeds veel hardware vergen.

Wat betreft voeding, programmering en bussen, de datasheet voor elke bestuurder zal waarschijnlijk de meeste informatie hebben die u nodig heeft.

#12
+1
supercat
2012-08-13 21:19:11 UTC
view on stackexchange narkive permalink

Als het aantal verschillende helderheidsinstellingen dat men nodig heeft, binnen het softwaregebied niet te groot is, kan het handig zijn om de gegevens op te slaan in een "bitplanair" formaat (zoals beschreven in mijn andere hardwarematige antwoord) en laat de uitvoerroutines vervolgens Booleaanse operatoren gebruiken om op 8 pixels tegelijk te reageren. Voor maximale efficiëntie zijn hiervoor meerdere afzonderlijke uitvoerroutines nodig, die worden gebruikt voor verschillende delen van de PWM-cyclus; als men bijvoorbeeld 4-bits helderheidswaarden wil gebruiken, zou men acht routines van de volgende vorm gebruiken:

 movf bit0Comp, w; Moet 00 of FF zijn, afhankelijk van bit 0 van comparand (FF indien vrij) iorwf POSTINCF, w; Bit 0 van gegevens; gebruik altijd IORWF andwf POSTINCF, w; Bit 1 van gegevens; gebruik IORWF als bit 1 van comparand is ingesteld; ANDWF indien duidelijk andwf POSTINCF, w; Bit 2 van gegevens; Gebruik IORWF als bit 1 van comparand is ingesteld; ANDWF indien duidelijk andwf POSTINCF, w; Bit 2 van gegevens; Gebruik IORWF als bit 1 van comparand is ingesteld; ANDWF indien duidelijk movwf SPIREG; Sla de resulterende byte op (bits set if> = comparand) 

Men zou verschillende combinaties van IORWF en ANDWF gebruiken, afhankelijk van de waarde van de comparand. Merk op dat met behulp van deze benadering, zoals geïllustreerd, men de pixelhelderheidswaarden op elk punt in de PWM-cyclus kan bijwerken zonder flikkering, op voorwaarde dat alle vier de bits worden geschreven tussen aanroepen van de display-shift-routine, of door de pixel-update-routine te laten bepalen of de de volgende verschuiving zal een "1" of een "0" voor de pixel weergeven en alle bits van de pixel instellen of wissen (welke bewerking hem ook zou laten doen wat hij sowieso zou gaan doen) en vervolgens alle bits schrijven waarvan de waarde zou moeten tegenovergesteld zijn. Merk ook op dat men willekeurige niet-lineaire helderheidsschalen kan bereiken door de timing van de schermupdates te variëren, of door sommige vergelijkingswaarden meer dan eens in een PWM-cyclus te gebruiken. Niet-lineaire helderheidsschalen zijn vaak handig bij leds, aangezien het verschil in helderheid tussen 1/128 duty en 2/128 duty over het algemeen veel beter zichtbaar is dan het verschil tussen 127/128 en 128/128 (of zelfs tussen 7/8 en 8/8).

#13
+1
Carl
2012-08-15 02:25:06 UTC
view on stackexchange narkive permalink

FPGA's of CPLD's kunnen goed zijn voor dergelijke taken omdat ze veel I / O-pinnen bieden. Ga voor de eenvoudigste en goedkoopste. Als één niet genoeg is, gebruik er dan een paar.

Kun je ons wat meer details geven over waarom dit een goede optie is, op dit moment weet ik ervan, maar ik weet wat de opties zijn en wat de voorgestelde technologieën zijn die je noemt, de Origial Poster (OP) heeft deze waarschijnlijk niet een achtergrond.
Ik weet niet zeker of dit de beste optie is, maar ik wilde het ter volledigheid vermelden. Als er op de een of andere manier 500 LED's met PWM's worden aangestuurd, zijn uiteindelijk 500 individueel regelbare draden nodig. Het is moeilijk om een ​​microcontroller te vinden met zoveel outputpinnen. Er zijn veel manieren om dit te omzeilen, nog steeds met behulp van microcontrollers, maar een of een paar goedkope CPLD's / FPGA's kunnen gemakkelijk die outputpinnen geven.
#14
+1
Rocketmagnet
2012-08-15 05:35:08 UTC
view on stackexchange narkive permalink

Je kunt dit vrijwel zeker gemakkelijk doen met een PSoC3 of PSoC5.

De PSoC-chips zijn microcontrollers die herconfigureerbare digitale hardware bevatten, een beetje zoals een FPGA of CPLD. Dit betekent dat je complexe schakelingen kunt maken om ongebruikelijke dingen te doen, zoals het aansturen van 500 LED's met PWM. Bovendien kun je het hele ding waarschijnlijk implementeren met behulp van de herconfigureerbare digitale blokken, wat betekent dat het CPU-gedeelte van de chip alleen de gewenste LED-helderheid in een array hoeft te schrijven.

504 LED's passen in een rechthoek 21 x 24. Als je 24 PWM-kanalen had en 21 GPIO, dan zou je dit werkend kunnen krijgen. Raad eens? De PSoC heeft meer dan dat.

U kunt eenvoudig 24 PWM-kanalen instellen op een PSoC en 21 andere pinnen configureren om deel uit te maken van een schuifregister. Configureer vervolgens enkele DMA-kanalen om bytes uit het geheugen naar de PWM-uitgangen te pompen, en je lacht. Het enige dat de CPU hoeft te doen, is de grafische weergave genereren. De PSoC3 heeft een 8-bit 8051-kern, terwijl de PSoC5 een 32-bit ARM heeft. Kies maar. De enige externe IC's die u nodig heeft, zijn enkele ULN2803's om de hoge aandrijfstroom voor de rijen te leveren. De PWM-uitgangen moeten voldoende stroomaandrijving hebben voor enkele LED's.

Dit is een totale overkill voor het aansturen van LED's. Er zijn speciale, goedkope, vooraf ontworpen LED-stuurprogramma's die zijn gemaakt om grote hoeveelheden op deze manier aan elkaar te koppelen en die altijd worden gebruikt voor gigantische displays. Het is niet nodig om dat allemaal opnieuw uit te vinden en voor hogere kosten.
@nemik - Eigenlijk zijn de totale kosten van de chips (van dure Farnell) slechts £ 6,80.
#15
  0
nemik
2012-08-14 09:54:08 UTC
view on stackexchange narkive permalink

Maak gebruik van schaalvoordelen. Chinese sites zoals Aliexpress verkopen op WS2811 gebaseerde LED-strengen voor ~ $ 15 per 50 LED's. Ze zijn individueel adresseerbaar, helder, meestal waterdicht en hebben PWM voor helderheid. Geen soldeer- of schuifregisters om mee te rotzooien. Dit alles zelf doen, ik wed dat het je meer zal kosten, veel meer tijd in beslag zal nemen en erg frustrerend zal zijn. Bovendien ben je in Oz, dus verzending vanuit China is niet al te duur.

Deze zijn gemaakt voor het maken van gigantische LED-displays, dus ze zijn meestal vrij goedkoop. Zorg ervoor dat u ongeveer om de 50 LED's of zo opnieuw stroom injecteert voor de beste prestaties.

Er zijn ook Arduino-bibliotheken om ze gebruiksvriendelijk te maken.

$ 15 per 50 leds? Dus voor 500 LED's komt dit neer op $ 150? En je durft me te vertellen dat mijn oplossing duur is? -1
Kunt u hier ook een link naar geven? WS801 doet Google niet goed, en het komt ook niet voor bij een zoekopdracht naar [Aliexpress] (http://www.aliexpress.com/wholesale?SearchText=WS801&catId=0&manual=y)
Sorry, ik bedoelde WS2811, zoals deze http://www.aliexpress.com/store/product/WS2811-LED-pixel-node-DC5V-input-full-color-RGB-string-50pcs-a-string-IP68- Rated / 701799_581805567.htmlor, zonder PWM-dimmen, deze http://www.aliexpress.com/store/product/DC5V-input-Square-type12mm-led-string-light-RGB-color-50pcs-a-string/701799_605976057 .html
Een serieel signaal om 50 leds aan te sturen met PWM-dimmen.Bedankt, dit is precies wat ik zoek.Maar een standaard schuifregister biedt een "latch" -pin om gebufferde gegevens naar de uitgangen te kopiëren nadat het volledige frame is verzonden.Er zit hier geen vergrendeling, dus ik verwacht merkbare ruis bij hoge vernieuwingsfrequenties.De chips ondersteunen 400 Kbps-gegevens met 15 bits per pixel, dus het scherm zal 1,9 milliseconden onzin weergeven terwijl het frame wordt bijgewerkt.


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 2.0-licentie waaronder het wordt gedistribueerd.
Loading...