Ich mache mir grade Gedanken über PWM, das ich in Softweare implementieren muss, da ich LED Displays per Bus ansteuere. Schaut man sich Binary Code Multiplication an (zb hier http://www.batsocks.co.uk/readme/art_bcm_3.htm) scheint es da noch potential für eine Optimierung zu geben. Wenn ich 50% duty cycle fahren will, würde das in BCM ja abgebildet auf 11110000 Obwohl man es ja auch auf 01010101 abbilden könnte, also möglicherweise weniger Flackern auf dem Display, da man die Frequenz maximiert hat. Natürlich gibt es dabei immernoch Werte die man nicht auf eine höhere Frequenz abbilden kann, weil man einfach ein Verhältnis wie 00000001 einhalten muss. Man könnte nun also die minimale anzahl Bits ausrechnen die jeder duty cycle benötigt, und daraus ein sich wiederholendes Pattern erstellen. also für 25% zum Beispiel braucht man 4 Bits: 0001 -> 00010001 statt 00000011 Frage ist nun, lohnt sich der Aufwand überhaupt? Gibt es dazu existierende Verfahren? Ich würde da eine LUT machen mit einem optimierten Pattern für jeden duty cycle, was aber bei mehr PWM-Tiefe viel Platz beansprucht. DLP Projektoren benutzen wohl noch einen ähnlichen Trick um die Frequenz zu maximieren: http://cnx.org/content/m16126/latest/
Für LEDs muss man keine so hohe PWM Frequenz haben - rund 100 Hz sollten reichen. Wegen der Funkstörungen sollte man da eher viele Flanken vermeiden. Also eher das Gegenteil machen - die PWM Signale so weit wie Möglich zusammenfassen. Ein Möglicher Trick aus dem Link ist es mit einem halblangen Timeslot am Anfang zu Arbeiten - so gibt es ein 1 Bit extra Auflösung mit wenig Aufwand. Wenn es dann mit der Auflösung bei 100 Hz Frequenz noch nicht reicht, könnte man ggf. noch da Modulieren, also ggf. die eine Hälfte um 1 Schritt höher. Wegen der geringen Amplitude sollten auch die dann enthaltenen 50 Hz noch nicht so stören.
Florian H. schrieb: > Ich mache mir grade Gedanken über PWM, das ich in Softweare > implementieren muss, da ich LED Displays per Bus ansteuere. Ich verstehe zwar nicht, was das eine mit dem anderen zu tun haben sollte, aber egal. > Wenn ich 50% duty cycle fahren will, würde das in BCM ja abgebildet auf > > 11110000 Du hast BCM definitiv nicht verstanden. Würde es wirklich so funktionieren, wie du glaubst, gäbe es nur neun mögliche Helligkeitsstufen. So ist es aber eben nicht. Tatsächlich liefert 00000001 ein völlig anderes Einschaltmuster als z.B. 00001000, obwohl in beiden Fällen jeweils nur ein Bit gesetzt ist. Genau das ist doch der Trick bei BCM, weswegen es 256 verschiedene Einschaltdauern liefern kann. Die einzelnen Bits werden nach ihrer binären Wertigkeit beurteilt und tragen deshalb völlig unterschiedlich zur Einschaltdauer bei.
c-hater schrieb: > Genau das ist doch der Trick bei BCM, weswegen es 256 verschiedene > Einschaltdauern liefern kann. Ähem, wieviele Stufen geliefert werden können, hängt natürlich von der Zahl der zur Codierung verwendeten Bits ab, 2^Bitzahl. Bei 8 Bits also 256, bei 9 512 usw.
@ c-hater (Gast) >Ich verstehe zwar nicht, was das eine mit dem anderen zu tun haben >sollte, aber egal. Das überrascht uns nicht. >> Wenn ich 50% duty cycle fahren will, würde das in BCM ja abgebildet auf >> >> 11110000 >Du hast BCM definitiv nicht verstanden. Das sagt mal wieder der Richtige. DU bist der, welcher auf dem Schlauch steht. > Würde es wirklich so >funktionieren, wie du glaubst, gäbe es nur neun mögliche >Helligkeitsstufen. Nö, es ist eine vereinfachte Dartstellung, welche zeigen soll, dass bei 50% PWM eben ein großer Puls mit 50% Pulbreite entsteht. >So ist es aber eben nicht. Tatsächlich liefert 00000001 ein völlig >anderes Einschaltmuster als z.B. 00001000, obwohl in beiden Fällen >jeweils nur ein Bit gesetzt ist. Das war gart nicht das Thema. Setzen sechs!
@Florian H. (heeen) >11110000 >Obwohl man es ja auch auf >01010101 >abbilden könnte, also möglicherweise weniger Flackern auf dem Display, >da man die Frequenz maximiert hat. Nennt sich PulsDICHTEmodulation, die bekanntesten Umsetzungen sind ein binary rtae multiplier, gibt es als TTL-IC (74irgendas) bzw. eine Sigma-Delta Modulator. >Frage ist nun, lohnt sich der Aufwand überhaupt? Tja, nicht, wenn man einfach die LEDs mit 100-200 Hz mit normaler PWM betreiben kann. >existierende Verfahren? Ich würde da eine LUT machen mit einem >optimierten Pattern für jeden duty cycle, was aber bei mehr PWM-Tiefe >viel Platz beansprucht. Braucht man nicht, das kann man einfacher berechnen.
^ Danke :)
> Ich verstehe zwar nicht, was das eine mit dem anderen zu tun haben sollte, aber
egal.
Ich wollte einfach ausdrücken dass ich kein hardware PWM nutzen kann.
Ausserdem Betreibe ich das ganze mit der schnellsten Clock Frequenz die
das Ganze hergibt, und jetzt möchte ich noch möglichst flackerfrei
Farbabstufungen haben.
Sagt der eine Esel zum anderen Esel: Du Esel!
Vielleicht noch etwas Hintergrund: es handelt sich um 10 mal 16x16 Rot+Grün Module mit eingebautem Latch, also Modul auswählen, 16x Rot, Grün und Takt rausschreiben, nächste Zeile. Daher bin ich an Softwarelösungen interessiert. Bonus Bild: http://heeen.de/proj/led-matrix-lampe/DSC_4888.jpg Bonus Video: http://heeen.de/proj/led-matrix-lampe/flame.mp4
:
Bearbeitet durch User
@ Florian H. (heeen) >Daher bin ich an Softwarelösungen interessiert. Na dann wird das aber nix mit Sigma-Delta & Co, denn das würde die Prozessorlast ziemlich erhöhen. Mach 10 Bit PWM, sei es klassisch als Soft-PWM oder BAM. Das reicht. https://www.youtube.com/channel/UCKuR1kvLvBd-UrsjRqATMog Diese LED-Leisten laufen mit Soft-PWM 10Bit@100Hz. Beitrag "Re: DMX Steuerung 24 Kanal"
Ich habe noch ordentlich Luft im Controller, getaktet mit 200Mhz und ich habe teilweise 2000 nops fürs timing, das muss ich aber noch etwas ausfeilen. Controller ist ein BeagleBone (ARM 720Mhz), der Treiber läuft auf einer der realtime units (200mhz).
:
Bearbeitet durch User
@ Florian H. (heeen) >Controller ist ein BeagleBone (ARM 720Mhz), der Treiber läuft auf einer >der realtime units (200mhz). Nobel geht die Welt zu grunde. ;-) Na dann mal los!
Ulrich schrieb: > Für LEDs muss man keine so hohe PWM Frequenz haben - rund 100 Hz sollten > reichen. Sieht man an jedem Bremslicht das vor einem fährt und jeder zittrigen LED Anzeige, daß dieses wohl Unsinn ist. > Gibt es dazu existierende Verfahren? Bresenham. Siehe http://de.wikipedia.org/wiki/Bresenham-Algorithmus Verlauf der Fehlervariablen. Die liefert über 0 genau deine Pulse.
Ulrich schrieb: > Wegen der Funkstörungen sollte man da eher viele Flanken > vermeiden. Die Funkstörungen, genauer gesagt das Spektrum der Funkstörungen, hängen nicht von der Anzahl der Flanken sondern von der Steilheit ab. Man sollte also die Flankensteilheit verringern. Ob das Störspektrum mit 100 oder 200 Hz Wiederholrate ausgesendet wird, spielt eine untergeordnete Rolle.
Florian H. schrieb: > Schaut man sich Binary Code Multiplication an (zb hier > http://www.batsocks.co.uk/readme/art_bcm_3.htm) > scheint es da noch potential für eine Optimierung zu geben. > > Wenn ich 50% duty cycle fahren will, würde das in BCM ja abgebildet auf > > 11110000 Nein. Wie andere schon richtig gesagt haben, hast du BCM nicht verstanden. Ein Duty cycle von 50% wird in (8-Bit-) BCM auf 1000000 abgebildet. Und wenn man mit dem Oszilloskop auf die LED schaut und auf den zweiten Kanal den BCM-Takt legt, dann sieht man dieses Signal:
1 | 1111...11110000...0000 |
2 | \_ 128x1 _/\_ 128x0 _/ |
Und zwar deswegen, weil bei BCM die Länge der einzelnen Bits nicht konstant ist, im Gegensatz zu linearer PWM. ... > Obwohl man es ja auch auf > > 01010101 > > abbilden könnte Bei einer linearen 3-Bit PWM wäre es so wie du schreibst. Dann besteht jeder PWM-Zyklus aus 8 Zellen und man könnte 50% wahlweise als 11110000 oder 11001100 oder 10101010 (oder weitere 32 Bitmuster, insgesamt gibt es 8!/(4!*4!) = 35 verschiedene Bitmuster mit 4 von 8 gesetzten Bits) darstellen. Ob man das will oder nicht, steht wieder auf einem anderen Blatt. Öfter Umschalten flimmert zwar weniger, aber jeder Umschalt- vorgang erzeugt auch extra Verluste. Andererseits geht flimmerfreier als flimmerfrei nicht. XL
Ich habe (zur Vereinfachung) 4x1 und 4x0 geschrieben und Du 128x1 und 128x0. Was genau soll ich nicht verstanden haben? Auf 10000000 wird nicht abgebildet - das ist der Duty cycle von 50% in 8 bit geschrieben also 128/255.
Florian H. schrieb: > Ich habe (zur Vereinfachung) 4x1 und 4x0 geschrieben Das hättest du mal dazusagen sollen. > und Du 128x1 und > 128x0. Was genau soll ich nicht verstanden haben? Daß BCM niemals ein Bitmuster 10101010 erzeugen kann. Bzw. daß der BCM-Code 10101010 einen Wert von (128+32+8+2)/256 bzw. (1+4+16+64)/256 repräsentiert. Je nachdem ob mit dem MSB oder dem LSB angefangen wird. > Auf 10000000 wird nicht abgebildet Doch, natürlich. Auch BCM bildet Codes auf Impulsfolgen ab. Netterweise ist die Abbildung 1:1. > das ist der Duty cycle von 50% in 8 bit geschrieben also 128/255. <Oberlehrer> es sind 128/256 </Oberlehrer> XL
:
Bearbeitet durch User
Axel Schwenke schrieb: > Daß BCM niemals ein Bitmuster 10101010 erzeugen kann. Das ist doch genau der Grund für diesen Post - daß es möglicherweise sinnvoll ist das haben zu wollen - und deshalb BCM oder klassische PWM da nicht genügt.
Florian H. schrieb: > Axel Schwenke schrieb: >> Daß BCM niemals ein Bitmuster 10101010 erzeugen kann. > > Das ist doch genau der Grund für diesen Post - daß es möglicherweise > sinnvoll ist das haben zu wollen - und deshalb BCM oder klassische PWM > da nicht genügt. Und warum schreibst du dann überhaupt erst was von BCM, wenn du ein Signal erzeugen willst, das BCM garantiert nicht erzeugen wird? <kopfschüttelnd>
Florian H. schrieb: > Frage ist nun, lohnt sich der Aufwand überhaupt? Gibt es dazu > existierende Verfahren? http://www.mino-elektronik.de/AVR_PWM_64/AVR_PWM_64.htm
@ Axel Schwenke (a-za-z0-9) >Und warum schreibst du dann überhaupt erst was von BCM, wenn du ein >Signal erzeugen willst, das BCM garantiert nicht erzeugen wird? > <kopfschüttelnd> Mal immer langsam mit den jungen Pferden. Lies DU mal in Ruhe den Eröffnungsbeitrag und du wirst feststellen, dass der VOLLKOMMEN OK und klar ist. Du hast dich genauso wie unser allseits bekannter c-hater verwirren lassen, warum auch immer. Und auch DU kannst noch was lernen, z.B. klare Fomulierungen. "Und zwar deswegen, weil bei BCM die Länge der einzelnen Bits nicht konstant ist, im Gegensatz zu linearer PWM." Das ist schlicht FALSCH! Die LÄNGE der einzelenen Bit ist sehr wohl konstant, nur die zeitliche ANORDNUNG ist nicht zusammenhängend. Beispiel. 4 Bit PWM mit Wert 0b1010 = 10 PWM **********______ BCM ********____**__ Wie das Bitmuster bei einem binary rate multiplier (74xx97) oder Sigma Delta Modulator aussieht, darf jemand anders rausfinden. Man sollte ab und an mal versuchen, seinen vorschnellen Beißreflex zu hinterfragen und zu reduzieren, sonst endet man mal wie MaWin.
Florian H. schrieb: > http://www.batsocks.co.uk/readme/art_bcm_3.htm) Der Artikel ist doch eindeutig: "the weight of each bit doubles in value" Also: 50%: 10000000 25%: 01000000 75%: 11000000 usw.
Falk Brunner schrieb: > Man sollte ab und an mal versuchen, seinen vorschnellen Beißreflex zu > hinterfragen und zu reduzieren, sonst endet man mal wie MaWin. Der Falk, ja der wurde bei dem Unsinn den er so schreibt schon oft gebissen. In diesem Thread aber nur der Ulrich. Der Florian möchte ja gar kein BCM, das war ja für ihn nur ein schlechtes Beispiel, sondern etwas höherauflösendes. Das Verfahren hatte ich genannt, vermutlich arbeitet BRM genau so, das habe ich aber nicht untersucht.
Die BCM hat den Vorteil, daß sie viel weniger CPU-Zeit verbraucht, als die klassiche PWM. Man kann daher mit der Frequenz deutlich höher gehen. Man könnte sogar die ersten 2..4 Bits im Interrupt abwarten. Um ein Flackern bei Änderungen zu vermeiden, macht man das Update der Ausgabetabelle wärend der längsten letzten Bitzeit.
Falk Brunner schrieb: > @ Axel Schwenke (a-za-z0-9) > >>Und warum schreibst du dann überhaupt erst was von BCM, wenn du ein >>Signal erzeugen willst, das BCM garantiert nicht erzeugen wird? > >> <kopfschüttelnd> > > Mal immer langsam mit den jungen Pferden. Lies DU mal in Ruhe den > Eröffnungsbeitrag und du wirst feststellen, dass der VOLLKOMMEN OK und > klar ist. Du hast dich genauso wie unser allseits bekannter c-hater > verwirren lassen, warum auch immer. Der Post wäre klar gewesen, wenn Florian den Exkurs zu BCM weggelassen hätte. Aber wenn er sich dann sogar explizit auf das von BCM gelieferte Einschaltmuster für 50% bezieht, was kann man denn dann anderes annehmen, als daß er mit dem Rest seiner Ausführungen auch bei BCM bleiben will? > Und auch DU kannst noch was lernen, z.B. klare Fomulierungen. > > "Und zwar deswegen, weil bei BCM die Länge der einzelnen Bits nicht > konstant ist, im Gegensatz zu linearer PWM." > > Das ist schlicht FALSCH! Die LÄNGE der einzelenen Bit ist sehr wohl > konstant, nur die zeitliche ANORDNUNG ist nicht zusammenhängend. Ich vermute mal, die Verwirrung rührt daher, daß du mit "Bits" etwas ganz anderes meinst als ich. > Beispiel. > > 4 Bit PWM mit Wert 0b1010 = 10 > > PWM **********______ > > BCM ********____**__ Vorschlag einer anderen Nomenklatur: ein PWM (BCM) Zyklus besteht aus 2^n gleichlangen "Zellen", wobei die Länge einer Zelle durch den Mastertakt vorgegeben ist. Das Ausgabemuster, bestehend aus aktiven und inaktiven Zellen, liefert den gewünschten Mittelwert. Trivia: entscheidend für den Mittelwert ist dabei nur die Anzahl aktiver Zellen, nicht deren Anordnung. Dann hat eine n-Bit PWM die folgenden Eigenschaften: - es gibt in einem Zyklus nur entweder 0 oder genau zwei Wechsel zwischen aktiven und inaktiven Zellen (0 Wechsel entsprechen den PWM-Werten 0 und 2^n, also alle Zellen aus bzw. an) - sonst liegt der erste Wechsel am Anfang des Zyklus, der andere kann zwischen zwei beliebigen Zellen liegen BCM hat die folgenden Eigenschaften: - es gibt in einem Zyklus zwischen 0 und höchstens n Zustandswechsel - die Zeitpunkte, an denen Zustandswechsel passieren können, sind innerhalb des Zyklus fixiert: der erste liegt am Anfang des Zyklus, der zweite bei 1/2, der dritte bei 3/4, ... der n-te bei (2^n-1)/2^n der Zykluslänge Ich bevorzuge es, bei BCM nicht 2^n einzelne, gleich lange Zellen zu sehen, sondern n "Superzellen", die dann aber nicht gleich lang sind. Und weil der Zustand dieser Superzellen bei BCM direkt den Bits des zu erzeugenden Werts entspricht, nenne ich sie Bits. Bei PWM gibt es überhaupt keine eindeutige Zuordnung zwischen Zellen im Ausgangssignal und Bits im PWM-Wert. Zwar kann man für einen einzelnen PWM-Wert sich eine (von i.d.R. mehreren möglichen) Zuordnungen von aktiven Zellen zu Bits im PWM-Wert aussuchen. Aber verschiedene PWM-Werte verlangen verschiedene Zuordnungen. Im Gegensatz zu BCM, wo diese Zuordnung immer gleich ist. Deswegen kann man bei PWM eigentlich nicht von "Bits" im Ausgangssignal sprechen. Es sei denn, man identifiziert einzelne Zellen als Bits. XL
@Axel Schwenke (a-za-z0-9) >Vorschlag einer anderen Nomenklatur: ein PWM (BCM) Zyklus besteht aus Man muss es nicht immer übertreiben und alles arg akademisch abstrakt beschreiben. Eine klare Sprache kann durchaus einfach sein. >Ich bevorzuge es, bei BCM nicht 2^n einzelne, gleich lange Zellen zu >sehen, sondern n "Superzellen", die dann aber nicht gleich lang sind. >Und weil der Zustand dieser Superzellen bei BCM direkt den Bits des zu >erzeugenden Werts entspricht, nenne ich sie Bits. Eben solche juristisch/akademischen Wortspeilereien gehen mir auf den Keks. Und wenn sie Ausreden sein sollen erst recht. Bits sind Teile von Bytes, welche Zahlen darstellen. Die muss man nicht wieder uindefinieren als Pulse in speziellen Modulationsarten! Manchmal reicht es auch zu sagen, OK, ich hab es missverstanden und mich geirrt! Das zuzugeben ist ein Zeichen von menschlicher Größe, keine Schwäche. Auch wenn das Viele eher ander sehen und darum dazu nicht fähig sind. Ich habe mich hier auch schon mehrfach geirrt! >Bei PWM gibt es überhaupt keine eindeutige Zuordnung zwischen Zellen im >Ausgangssignal und Bits im PWM-Wert. Aber sicher. Nur dass die Zuordnung bzw. Abbildungsvorschift ANDERS ist. > Zwar kann man für einen einzelnen >PWM-Wert sich eine (von i.d.R. mehreren möglichen) Zuordnungen von >aktiven Zellen zu Bits im PWM-Wert aussuchen. Aber verschiedene >PWM-Werte verlangen verschiedene Zuordnungen. Wo ist das nicht so? > Im Gegensatz zu BCM, wo > diese Zuordnung immer gleich ist. Aha, weil der allgemeine Fall den Sonderfall nicht 1:1 erfasst ist der allgemeine Fall Mist. Mann O Mann. >Deswegen kann man bei PWM eigentlich nicht von "Bits" im Ausgangssignal >sprechen. Das tut ausser dir auch keiner. Und das war bisher in Diskussionen um PWM und deren Abarten auch nicht nötig.
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.