mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ganz ganz viele 8-Bit PWMs mit >=100hz, wie?


Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Richard U. (ronw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Uwe Bonnes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: Diensthabender Troll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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

Autor: Diensthabender Troll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Da will jemand krampfhaft ...

unser paul ist eben ein extremist ääähhh perfektionist, was man ja 
bereits am zersaegten dragon sehen konnte.

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> 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? ;-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Umsonst ist der Tod.

Aber nicht hier in der BananenRepublikDeutschland

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: mr.chip (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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.

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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 :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.