Forum: FPGA, VHDL & Co. optimale PWM erzeugen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von BB (Gast)


Lesenswert?

Ich bin mir bezüglich der Erzeugung einer PWM nicht ganz sicher, wie ich 
vorgehen soll. Ich habe eine einfache Zählerschaltung, die den 
vorgegebenen Wert abzählt und den Ausgang entsprechend lange auf 1 hält, 
bis der Wert erreicht ist, was z.B. für den 75% Wert zu diesem 
Signalprinzip führt:

11111111111111111111111100000000

Ich hätte, wegen der Grenzfrequenz aber lieber sowas hier:

11101110111011101110111011101110

Wie macht man das am Einfachsten?

(Ich muss Werte von 0 bis 65535 kHz ausgeben und habe die volle 
FPGA-Frequenz)

von Thomas (Gast)


Lesenswert?

Für eine simple PWM sind prinzipiell zwei Werte relevant. Zählperiode 
und Umschaltzeitpunkt.

In deinem Fall brauchst du nur eine Zählperiode von 4 Cycles einstellen, 
also sobald der Counter den Wert 3 erreicht hat wieder auf 0 
zurücksetzen.
Dann bei einem Zählerstand von 2 den Ausgang clearen und bei einem 
Zählerstand von 0 den Ausgang setzen.

Wenn man immer sauber sequentielle und kombinatorische Logik trennt, 
kann man das sehr einfach und kompakt niederschreiben.

von Duke Scarring (Gast)


Lesenswert?

BB schrieb:
> 11101110111011101110111011101110
>
> Wie macht man das am Einfachsten?
Das was Du willst ist keine PWM sondern ein fractional divider.

Duke

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@  BB (Gast)

>bis der Wert erreicht ist, was z.B. für den 75% Wert zu diesem
>Signalprinzip führt:

>11111111111111111111111100000000

Das ist PWM, PulsWEITENmodulation. Hat den bekannten Nachteil, dass 
man recht niederfrequent filtern muss.

>Ich hätte, wegen der Grenzfrequenz aber lieber sowas hier:

>11101110111011101110111011101110

>Wie macht man das am Einfachsten?

Das ist PulsDICHTEmodulation. Kann man einfach erzeugen, indem man bei 
der PWM-Schaltung die Datenleitungen kreuzt, siehe Anhang.

>(Ich muss Werte von 0 bis 65535 kHz ausgeben

Eher nicht. Du willst vielleicht eine 16 Bit PWM/PDM.

> und habe die volle FPGA-Frequenz)

Die da wäre?

MfG
Falk

von BB (Gast)


Lesenswert?

>Die da wäre?
Nun, so 100 MHz etwa würde ich sagen.

Das mit den "Datenleitungen kreuzen" muss ich mir genauer ansehen.

Danke für die links!

von Uwe (Gast)


Lesenswert?

> 11101110111011101110111011101110
Dir ist schon klar, daß du damit nur folgende Einstellmöglichkeiten zur 
Verfügung stehen :
a)  1111111111111111  100%
b)  1110111011101110  75%
c)  1100110011001100  50%
d)  1000100010001000  25%
e)  0000000000000000  0%

Die Auflösung ist gering die Frequenz jedoch hoch

Wenn du jedoch 65536 unterschiedliche Einstellmöglichkeiten brauchst 
also sozusagen 65536 Einsen oder Nullen (und jede Abstufung dazwischen 
bzw. 1/65536) dann wäre die mögliche Frequenz ca. 65536/4=16384 
geringer.
Was du brauchst und wieso kannst nur du wissen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Uwe schrieb:
> Dir ist schon klar, daß du damit nur folgende Einstellmöglichkeiten zur
> Verfügung stehen :  ...
Zutreffendes bitte ankreuzen:
[ ] Ich habe die PDFs nicht gesehen
[ ] Ich habe die PDFs nicht angesehen
[ ] Ich habe den Inhalt der PDFs nicht verstanden
[ ] Mir ist die eigentliche Frage unklar

von Thomas (Gast)


Lesenswert?

Lothar Miller schrieb:
> [x] Ich habe die PDFs nicht gesehen

Aber warum sollte man dafür nicht einen gewöhnlichen Counter verwenden, 
dessen Periode man setzen kann und zusätzlich noch ein zweites Register, 
welches den Umschaltzeitpunkt bestimmt?

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

> nur 4 Einstellungen

Selbverständlich kann man jede Einstellung verwenden, weil die 
Schaltung sich ja auf den Sollwert einstellt. Die Einstellmöglichkeiten 
sind aber weniger das Problem dieser Lösung. Sie macht ja im Grunde 
nichts anderes, als das voreingestellte Signal zu verrauschen, wie es 
dem Prinzip nach auch beim Dithern vorgenommen wird, bevor man es in 
einen digitalisieren Wert überführt.

@OT: Sieh Dir mal meinen Artikel zum Dithern an, was das bewirkt.

In der vorgestellten Lösung in den PDFs ist es dabei so, dass man eine 
einfache Schaltung benutzt hat und in der Tat wird durch das 
"Bitverwursteln" alles mögliche abgetastet und jeder mögliche Zustand 
des Signals erfasst. Solange sich das Signal nicht ändert, kann damit 
exakt der Mittelwert rekonstruiert werden.

Das Rauschen, dass durch das Bitdrehen entsteht, ist aber keineswegs 
optimal und kann mit etwas mehr Aufwand deutlich verbessert werden. Die 
Sache läuft dann auf das sogenannte noise shaping hinaus, dass man 
pauschal einstellen oder anhand des Spektrums des Nutzsignals optimieren 
kann. Das ist aber eine weitergehende Sache, die etwas Einarbeitung 
erfordert.

Wenn es nur eine vernüftige PWM sein soll, kann man so vorgehen:

Statt der Bitdrehung empfiehlt sich gfs der Blick auf einen 
Sigma-Delta-ADC als DAC. Dabei wird der Verlauf des Signals infolge 
des erzeugten PWM-Rechtecks erraten (durch Aufintegrieren gemessen) und 
der Bitwert so gesteuert, dass er um das theoretische Integral, also den 
sich ändernden Voreinstellungswert, herumregelt. Dies funktioniert schon 
sehr gut und übertrifft die obige Lösung in etwa um 3-6dB 
ripple-Dämpfung. Man nimmt dann einfach einen Zähler, der die Differenz 
zwischen Ist- und Solwert aufaddiert und steuert das höchstwertige Bit 
als Vergleichswert an den Eingangswert heran. Das ist dynamischer, als 
das einfache hin- und herzählen, das man oft sieht.

Noch besser ist es, wenn man nicht linear integriert, sondern das 
Verhalten des dämpfenden RC-Gliedes = Filters inklusive dessen Verlusten 
mitrechnet und die Steuerung des PWM-artigen 1-Bit-Signals da herum 
aufbaut. Mit einer entsprechenden Regelfrequenz und einem guten Modell 
kann man den ripple nach meinen Erkenntnissen nochmals um Faktor 1.5 ... 
2.5 reduzieren. Das ist aber nicht so ganz trivial und erfordert etwas 
Algorithmik und auch Rechenleistung. Im FPGA lohnt sich das eigentlich 
nur dann, wenn man eine ganze Bank an PWM-artigen-Signalen erzeugen und 
steuern muss. Ich verwende eine solche Mimik in einer 
Motorsteuerapplikation, die einen Schrittmotor so weich und präzise 
ansteuern kann, dass dieser mit minimalen Verlusten fast lautlos fährt 
und dennoch hohes Reservemoment gegen drohende Schrittverluste aufweist.

von BB (Gast)


Lesenswert?

J. S. schrieb:
> Noch besser ist es, wenn man nicht linear integriert, sondern das
> Verhalten des dämpfenden RC-Gliedes = Filters
Das Rekonstruktionsfilter noch mit ins Bott zu nehmen, wäre mir ehrlich 
gesagt, zu aufwändig, aber das mit dem Sigma-Delta klingt gut.

J. S. schrieb:
> Man nimmt dann einfach einen Zähler, der die Differenz
> zwischen Ist- und Solwert aufaddiert und steuert das höchstwertige Bit
> als Vergleichswert an den Eingangswert heran.
D.h. der Zähler zählt nicht konstant, sondern mit der Differenz?
Ich nehme an, "IST-Wert" ist der Zählerstand und "SOLL-Wert" der 
PWM-Wert, der erzeugt werden soll?

Was ist dann mein Ausgang?

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.