Hi, da bei mir immer mal wieder Beleuchtungsprojekte anstehen würde ich gerne wissen auf welche weise ich eine große Anzahl an 8-Bit (besser sogar noch 10...12 Bit, zum Ausgleich der logarithmischen Kennlinie des Auges) PWM-Kanälen herbekommen könnte, die mit ca. 100 hz arbeiten, damit sie nicht flimmern und eine schnelle Anbindung haben, damit man sie entsprechend schnell per SPI oder so ansteuern kann. Bei manchen Projekten fallen mal 20..30.. sicher auch mal 100..200 und mehr PWM-Kanäle an, die ich benötige. Beispielsweise für RGB-LED Arrays oder RGB-Leuchtstreifen bei denen jede LED in ihrer Farbe einzeln steuerbar sein soll. Meine Soft-PWM haut auf einem AVR höchsten 20 Kanäle (aufm Mega16 vieleicht auch 30) raus und funktioniert noch nicht so zufriedenstellend wie ich mir das wünschen würde. Ich suche da nach einer noch besseren Lösung, die sollte natürlich auch nicht zu teuer sein. Ein 5€ PWM-chip der mir 30 PWMs zu verfügung stellt würde mich bei 300 Knälen dann 50€ kosten, das soll auch nicht sein. Wäre mit dem AVR xmega was anzufangen oder sind CPLDs für sowas geeignet? lg PoWl
bei großen sachen nimmt man externe "pwm chips", die tlc59xx von ti zB oder von philips etc. und mal im ernst 50euro sind alles andere als teuer...
Das müsste auch mit einem billigen Mega oder Tiny noch machbar sein. Schau mal hier nach: http://www.mikrocontroller.net/articles/%22Additive%22_PWM
Schau Dir mal ein FPGA wie den XC3S50A(N) an. Kostet unter 10 Euro und hat einiges an Rechenpower. 100 Hz bei 12 Bit sind erst 401 kHz, dass ist Pipifax fuer den Baustein. Dazu kommt noch absolut deterministische Verhalten, kein Interrupt verhunzt Dir das Timing.
Mit Schieberegistern und AVR geht einiges. Bei einem aktuellen Projekt habe ich 6 Schieberegister kaskadiert und lasse darüber eine 7 Bit PWM laufen bei etwa 100 Hz. Somit hat man bereits 48fach PWM. Wenn man jetzt an jeden Pin eines Ports eine solche Schieberegister-Kaskade anhängt, so hat man bereits 384fach PWM. 7 Bit sind natürlich etwas mager. Der begrenzende Faktor liegt da beim AVR, wobei man ihn bei 20 MHz vermutlich auch mit 8 Bit laufen lassen könnte. Man kriegt aber locker mehr hin, wenn man die Kaskaden verkürzt, bei einer 2er Kaskade sollten 10 Bit drinliegen. Pro AVR-Port schafft man so also 128fach PWM. Als Schieberegister ist der 74HC595 optimal.
Nachtrag: Die Lösung ist IMHO einem FPGA deutlich überlegen, da man mit günstigen Standardbauteilen und Hausmitteln beliebig viele Kanäle generieren kann. Ein FPGA ist von der Entwicklung und von den Finanzen her schon ein anderes Kaliber...
@Paul Hamacher (powl) >gerne wissen auf welche weise ich eine große Anzahl an 8-Bit Geht mit Soft-PWM. > (besser >sogar noch 10...12 Bit, zum Ausgleich der logarithmischen Kennlinie des >Auges) PWM-Kanälen herbekommen könnte, die mit ca. 100 hz arbeiten, Das braucht ICs ala TLC5921. >Lösung, die sollte natürlich auch nicht zu teuer sein. Ein 5€ PWM-chip >der mir 30 PWMs zu verfügung stellt würde mich bei 300 Knälen dann 50€ >kosten, das soll auch nicht sein. Umsonst ist der Tod. >Wäre mit dem AVR xmega was anzufangen oder sind CPLDs für sowas >geeignet? CPLDs sind zu klein. Es muss ein FPGA her. Z.B. so. Beitrag "LED-Matrix, 9x9 RGB, Voll dimmbar" @ mr.chip (Gast) >an jeden Pin eines Ports eine solche Schieberegister-Kaskade anhängt, so >hat man bereits 384fach PWM. Na dann mach das mal. Ich bin mal gespannt wie das laufen soll. >7 Bit sind natürlich etwas mager. Der begrenzende Faktor liegt da beim >AVR, wobei man ihn bei 20 MHz vermutlich auch mit 8 Bit laufen lassen >könnte. Man kriegt aber locker mehr hin, wenn man die Kaskaden verkürzt, >bei einer 2er Kaskade sollten 10 Bit drinliegen. Pro AVR-Port schafft >man so also 128fach PWM. Käse. >Nachtrag: Die Lösung ist IMHO einem FPGA deutlich überlegen, da man mit >günstigen Standardbauteilen und Hausmitteln beliebig viele Kanäle >generieren kann. "Beliebig viele" kann keine Technologie der Welt, schon gar keine TTL ICs. Du bist ein Träumer und Theoretiker. MFG Falk
kann mir mal jemand erklären wo der vorteil von "schieberigester + avr" gegenüber "avr mit vielen haxeln" oder "ein paar avrs mit vielen haxerln" liegt?
@ zwieblum (Gast) >kann mir mal jemand erklären wo der vorteil von "schieberigester + avr" >gegenüber "avr mit vielen haxeln" oder "ein paar avrs mit vielen >haxerln" liegt? Da will jemand krampfhaft Pins sparen, vergisst aber dabei, dass das serielle Rausklimpern der Bits selbst mit Hardware-SPI einiges an Zeit kostet. Zeit, die man bei wirklich vielen Kanälen und Soft-PWM nicht hat. MfG Falk
> kann mir mal jemand erklären wo der vorteil von "schieberigester + avr" > gegenüber "avr mit vielen haxeln" oder "ein paar avrs mit vielen > haxerln" liegt? ja - man darf länger mit eagle & co spielen - die schaltung/platine sieht interessanter und umfangreicher aus
> Da will jemand krampfhaft ...
unser paul ist eben ein extremist ääähhh perfektionist, was man ja
bereits am zersaegten dragon sehen konnte.
>> an jeden Pin eines Ports eine solche Schieberegister-Kaskade anhängt, so >> hat man bereits 384fach PWM. > Na dann mach das mal. Ich bin mal gespannt wie das laufen soll. Ich habe hier 224 x 7 Bit PWM an einem AVR. Anstatt 8 Ketten, die ja auf einen Port passen würden, habe ich nur 5 Ketten, um das Kabel schmaler zu halten. Zwei Ketten sind zudem etwas kürzer, da es so ausreicht. Wenn man dias Konzept voll ausbaut, also 8 (Anzahl Portpins) x 6 (längste Kette) x 8 (Anzahl LEDs pro Port) kommt man auf 384. > Du bist ein Träumer und Theoretiker. ...der aber, was die PWM angeht, seine Träume sehr gut verwirklichen und Theorie gut in die Praxis umsetzen kann, nicht? ;-)
zwieblum schrieb: > kann mir mal jemand erklären wo der vorteil von "schieberigester + avr" > gegenüber "avr mit vielen haxeln" oder "ein paar avrs mit vielen > haxerln" liegt? Viele Haxen an einem AVR bedeutet viele Kabel. Wenn sich das über etliche Quadratmeter streut, dann kann eine Lösung über dezentrale Shifter eine Menge Verdrahtung einsparen.
>Umsonst ist der Tod.
Aber nicht hier in der BananenRepublikDeutschland
Man kann gerade den Software PWM sehr effizient in ASM lösen. Ein Software PWM hat hier auch vorteile gegenüber Hardware PWM Chips, denn so kann man PWM gut mit der Umschaltung einer LED Matrix syncronisieren. Man bekommt dann je LED nur jeweils eine Puls. Die Zeit für das Rausschieben der Daten ist nicht so schlimm. Das geht mit hardware SPI immer noch etwas schneller als das berechnen neuer Werte.
@ mr.chip (Gast) >man dias Konzept voll ausbaut, also 8 (Anzahl Portpins) x 6 (längste >Kette) x 8 (Anzahl LEDs pro Port) kommt man auf 384. Dann hast du 384 AUSGÄNGE! Dort noch auf JEDEN eine PWM draufzupacken drüfte den AVR "etwas" überfordern. Ich lasse mich aber gern vom Gegenteil überzeugen. >...der aber, was die PWM angeht, seine Träume sehr gut verwirklichen und >Theorie gut in die Praxis umsetzen kann, nicht? ;-) Beweis? MfG Falk
> Dann hast du 384 AUSGÄNGE! > Dort noch auf JEDEN eine PWM draufzupacken drüfte den AVR "etwas" > überfordern. Wie gesagt, mit 224 Kanälen auf 7 Bit habe ich es hier am laufen. (Siehe obigen Beitrag) > Ich lasse mich aber gern vom Gegenteil überzeugen. Schön. Aber warum müssen vorher stets noch Beleidigungen wie "Käse" oder "Du bist ein Träumer und Theoretiker" sein? Das Klima im Forum ist ja dank der zahllosen Trolle sowieso schon unterirdisch - dass die "normalen" User aber nicht mal anständig diskutieren können, ist schon bedenklich.
Ja, bitte Pix/Video und C-Dateien ;-) Ich habe auch schon an eine Porterweiterung mit Schieberegistern gedacht aber selbst mit SPI braucht das rausshiften von 50 PWM-Kanälen schon lange. Mal ganz abgesehen von Wartezeiten, Zeiten die man zum Neubeladen braucht usw.. RAM, um die PWM-Daten zu speichern.. usw.. kann ich mir auch schlecht vorstellen. 8 Bit sollten es aber schon sein. Die PWM muss garnicht mal so intelligent und leistungssparend sein. Der AVR hat dann alle resourcen frei, nur für die soft-PWM. Wobei eine herkömmliche PWM, bei der dann in jedem Durchlauf bei jedem Kanal geprüft wird ob er jetzt abgeschaltet werden soll auch ein mordsmäßiger Rechenaufwand entsteht. Angenommen 50 Kanäle, jeder hat einen pwm-Wert im Ram. Dann muss bei jedem Timer-Overflow eine Schleife laufen, die jeden pwm-Wert aus dem Ram holt, dann prüft, ob eine 1 oder eine 0 rausgeshiftet wird... jeweils 8 Schleifendurchläufe werden benötigt um das 8 Bit lange Register zum rausshiften zu befüllen, und dann weiter.. bis alle 50 Kanäle abgearbeitet sind.. Das dauert doch ewig, oder geht das irgnedwie einfacher? Die Frequenz darf natürlich auch 90 oder 120Hz betragen, hauptsache flimmerfrei solls sein.
@ mr.chip (Gast) >Wie gesagt, mit 224 Kanälen auf 7 Bit habe ich es hier am laufen. (Siehe >obigen Beitrag) Und ich bin der Kaiser von China. Behaupten kann man viel, beweisen muss man es. Poste deinen Quelltext. >Schön. Aber warum müssen vorher stets noch Beleidigungen wie "Käse" oder >"Du bist ein Träumer und Theoretiker" sein? Das sind Aussagen, die nun mal meine Meinung darstellen. MFG Falk
> Und ich bin der Kaiser von China. Behaupten kann man viel, beweisen muss > man es. Poste deinen Quelltext. Denkst du, ich würde herkommen, um Leute zu verarschen? (BTW komm ich auch nicht her, um herumzuzicken.) Und eigentlich kümmert es mich ja nicht, ob der Falk Brunner mir glaubt oder nicht, geschweige denn bin ich ihm Beweise schuldig. Aber bitteschön, Quelltext siehe Anhang. (Ja, undokumentiert, vielleicht unsauber programmiert, ..., aber er läuft.) >>Schön. Aber warum müssen vorher stets noch Beleidigungen wie "Käse" oder >>"Du bist ein Träumer und Theoretiker" sein? >Das sind Aussagen, die nun mal meine Meinung darstellen. Du verreisst die Aussagen anderer Leute ohne irgendwelche Begründung, dafür aber umso beleidigender - und du liegst sogar noch falsch.
@ mr.chip (Gast) >Dateianhang: bobppdisp_pwmctrl.asm (3,4 KB, 5 Downloads) | formatierter >Aber bitteschön, Quelltext siehe Anhang. (Ja, undokumentiert, vielleicht >unsauber programmiert, ..., aber er läuft.) Hmm, wen ich das richtig sehe schiebst du 5 Bit parallel raus, und das 48 mal. Also 240 PWM Kanäle. Deine Schleife braucht ca. 30 Takte, macht bei 16 MHz ~2us. Das Ganze muss 48 mal durchlaufen werden, macht ~50us = 20kHz. Dann wird der pwmcnt erhöht. Bei 7 Bit Auflösung macht das dann noch 150 Hz PWM-Frequenz. OK, da ist noch Luft. Überzeugt. MfG Falk P S Aber man muss nebenbei auch noch Daten in den AVR kriegen. Und wenns geht sauber synchronisiert.
@Falk Er hat noch mehr Luft, er Übertaktet mit Baudratenquarz: > .equ F_CPU = 22118400 ; Systemtakt in Hz Da er weder EEProm noch AD verwendet kann es laufen. AVR
Es geht auch noch etwas schneller: man kann die Ergebisse des Vergleichs direkt aus dem Carry-flag in einem Register sammeln. Die Ausgabe kann dann zusammen erfolgen. Die Ausgabe über hardware SPI sollte auch nicht länger daueren als mehrere Bits prallel. Man kann auch noch etwas triksen, indem man den ersten PWM Schritt nur halb so lange macht (mit Schieberegistern geht das über den Enable Pin) Damit gewinnt man auf die schnelle 1 Bit an Auflösung. Die Datenübertragung zum AVR ist sicher ein Problem, aber nicht unlösbar. Aber oft wird ja das selbe "Bild" doch etwas länger dargestellt. Wegen der doch schon relativ langen Zeit pro PWM Schritt (ca. 20...50 µs), ist der Overhead und Fehler auch nicht so groß, wenn man die PWM routine in eine ISR schreibt. Die Datenübertragung kann dann im Hauptprogramm stattfinden. Mit einem Doppelten Puffer sollte das schon einigermaßen schnell gehen. Es reicht ja schon ein Byte etwa alle 50 µs um ziehmlich die ganzen PWM Daten zu übertragen. Damit sollte dann ein neues "Bild" alle etwa 20-30 ms möglich sein. Schneller macht ohne hin kaum Sinn.
> Die Datenübertragung zum AVR ist sicher ein Problem, aber nicht > unlösbar. Per UART geht es ganz gut: Bei jedem Schritt wird kurz geprüft, ob ein neues Byte hereingekommen ist. Wenn ja, schreibt man es in den Grafikbuffer. Das kostet pro Durchlauf kaum 5 Taktschritte. Die Synchronisierung ist in der Tat nicht ganz einfach. Zurzeit habe ich noch keine, vermutlich werde ich es dann aber so machen, dass der AVR nach jedem gesendeten Byte die aktuelle Schreiposition im Grafikbuffer übers UART zurücksendet - so kann der Sender herausfinden, was er als nächstes Übermitteln muss und zwar auch dann, wenn mal etwas verloren gehen sollte. Bei einem Full Duplex UART spielt diese Datenratenverschwendung ja keine Rolle. > Man kann auch noch etwas triksen, indem man den ersten PWM Schritt nur > halb so lange macht (mit Schieberegistern geht das über den Enable Pin) > Damit gewinnt man auf die schnelle 1 Bit an Auflösung. Wie meinst du das genau? Verstehe ich jetzt nicht :-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.