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