Forum: Mikrocontroller und Digitale Elektronik PWM mit optimierter Frequenz, Binary Code Modulation


von Florian H. (heeen)


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/

von Ulrich (Gast)


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.

von c-hater (Gast)


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.

von c-hater (Gast)


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.

von Falk B. (falk)


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!

von Falk B. (falk)


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.

von Florian H. (heeen)


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.

von markus (Gast)


Lesenswert?

Sagt der eine Esel zum anderen Esel: Du Esel!

von Florian H. (heeen)


Lesenswert?

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
von Falk B. (falk)


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"

von Florian H. (heeen)


Lesenswert?

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
von Falk B. (falk)


Lesenswert?

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

von MaWin (Gast)


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.

von Mike (Gast)


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.

von Axel S. (a-za-z0-9)


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

von Florian H. (heeen)


Lesenswert?

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.

von Axel S. (a-za-z0-9)


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

: Bearbeitet durch User
von Florian H. (heeen)


Lesenswert?

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.

von Axel S. (a-za-z0-9)


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>

von m.n. (Gast)


Lesenswert?

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

von Falk B. (falk)


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.

von Peter D. (peda)


Lesenswert?

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.

von MaWin (Gast)


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.

von Peter D. (peda)


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.

von Axel S. (a-za-z0-9)


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

von Falk B. (falk)


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.

von Axel S. (a-za-z0-9)


Lesenswert?

Du mich auch. EOD

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
Noch kein Account? Hier anmelden.