PWM mit optimierter Frequenz, Binary Code Modulation

OP #3605961
Lesenswert?

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/
Gast #3605982
Lesenswert?

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.
Gast #3606008
Lesenswert?

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.
Gast #3606018
Lesenswert?

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.
#3606020
Lesenswert?

@ 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!
#3606031
Lesenswert?

@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.
OP #3606032
Lesenswert?

^ 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.
#3606134
Lesenswert?

@ 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"
Gast #3606156
Lesenswert?

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.
Gast #3606271
Lesenswert?

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.
#3606719
Lesenswert?

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
#3606764
Lesenswert?

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
#3606779
Lesenswert?

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>
#3606911
Lesenswert?

@ 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.
Gast #3606923
Lesenswert?

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.
#3606960
Lesenswert?

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.
#3607158
Lesenswert?

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
#3607194
Lesenswert?

@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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren