Filter für PWM

May 29, 2006 35 Replies

Ich versuche gerade Sound mit einem Controller per PWM auszugeben. Dazu habe ich einen Chebychev-Filter 5th Ordnung aufgebaut der ein TDA2003 ansteuert.



Der Frequenzgang sieht in der Simulation ausgezeichnet aus (Eckfrequenz bei 4kHz), die Wirklichkeit ist aber wie immer anders.



Ab 4kHz fällt der Frequenzgang sehr schön ab bis auf 8kHz. Ab dort steigt er wieder bis 56kHz, fällt dann wieder ab bis 80kHz, steigt wieder an bis 500kHz (1Vpp, bei 5V PWM) und reist dann ab. Als OpAmp habe ich den LM324 (in der Simulation mit SwitcherCad den LT1028). Auch den TDA2003 habe ich schon auf 4,5kHz Bandbreite begrenz, es ist aber immer noch zu hören.



Eigendlich wollte ich bei 20kHz meine PWM-Frequenz legen, aber die ist dort gut zu hören.



Hat vielleich noch jemand eine Idee, wo ich dran drehen könnte?


-------------------- Filter-Kiddy.net-----------------------



  • C:\Programme\LTC\SwCADIII\Filter-Kiddy.asc XU1 N003 N004 N001 0 N004 NC_01 LT1028N XU2 N007 N006 N001 0 N006 NC_02 LT1028N XU3 N008 Out N001 0 Out NC_03 LT1028N R1 N002 KV3 2.2k R2 N003 N002 24k R3 N005 N004 2k R4 N007 N005 20k R5 N008 N006 11k R6 0 Out 100k C1 N003 0 2.2n C2 N007 0 470p C3 N008 0 6.8n C4 N004 N002 22n C5 N006 N005 68n V1 KV2 0 SINE(2.5 2.5 4k 0 0 0) AC 0 V2 N001 0 8 V4 KV1 0 PULSE(0 5 0 49.8e-6 0.1e-6 0.1e-6 50e-6) AC 5 XU4 KV2 KV1 N001 0 KV3 LT1028 ;ac dec 100 50 20000 .tran 0 1m 0 1000 .lib LTC.lib .backanno .end

-----------------------------------------------------------


------------------- Filter-Kiddy.asc ---------------------- Version 4 SHEET 1 908 680 WIRE -704 160 -816 160 WIRE -608 240 -608 192 WIRE -608 304 -608 240 WIRE -512 160 -704 160 WIRE -512 192 -608 192 WIRE -480 144 -480 32 WIRE -320 176 -448 176 WIRE -320 256 -320 176 WIRE -256 256 -320 256 WIRE -160 256 -176 256 WIRE -160 256 -160 128 WIRE -64 256 -80 256 WIRE -48 128 -96 128 WIRE -48 224 -48 128 WIRE -32 224 -48 224 WIRE -32 256 -64 256 WIRE -16 32 -480 32 WIRE -16 208 -16 32 WIRE 48 128 -48 128 WIRE 48 240 32 240 WIRE 48 240 48 128 WIRE 96 240 48 240 WIRE 192 240 176 240 WIRE 192 240 192 112 WIRE 208 240 192 240 WIRE 304 112 256 112 WIRE 304 208 304 112 WIRE 304 240 288 240 WIRE 320 208 304 208 WIRE 320 240 304 240 WIRE 336 32 -16 32 WIRE 336 192 336 32 WIRE 400 112 304 112 WIRE 400 224 384 224 WIRE 400 224 400 112 WIRE 432 224 400 224 WIRE 512 192 512 112 WIRE 528 192 512 192 WIRE 528 224 512 224 WIRE 544 32 336 32 WIRE 544 176 544 32 WIRE 608 112 512 112 WIRE 608 208 592 208 WIRE 608 208 608 112 WIRE 688 288 688 208 WIRE 848 32 544 32 WIRE 848 80 848 32 FLAG -64 320 0 FLAG 0 272 0 FLAG 304 304 0 FLAG 512 288 0 FLAG 560 240 0 FLAG 352 256 0 FLAG 688 288 0 FLAG 608 112 Out FLAG -480 208 0 FLAG 848 160 0 FLAG -608 320 0 FLAG -816 240 0 FLAG -704 160 KV1 FLAG -608 192 KV2 FLAG -320 176 KV3 SYMBOL Opamps\\LT1028N 0 176 R0 SYMATTR InstName U1 SYMBOL Opamps\\LT1028N 352 160 R0 SYMATTR InstName U2 SYMBOL Opamps\\LT1028N 560 144 R0 SYMATTR InstName U3 SYMBOL res -160 240 R90 WINDOW 0 0 56 VBottom 0 WINDOW 3 32 56 VTop 0 SYMATTR InstName R1 SYMATTR Value 2.2k SYMBOL res -64 240 R90 WINDOW 0 0 56 VBottom 0 WINDOW 3 32 56 VTop 0 SYMATTR InstName R2 SYMATTR Value 24k SYMBOL res 192 224 R90 WINDOW 0 0 56 VBottom 0 WINDOW 3 32 56 VTop 0 SYMATTR InstName R3 SYMATTR Value 2k SYMBOL res 304 224 R90 WINDOW 0 0 56 VBottom 0 WINDOW 3 32 56 VTop 0 SYMATTR InstName R4 SYMATTR Value 20k SYMBOL res 528 208 R90 WINDOW 0 0 56 VBottom 0 WINDOW 3 32 56 VTop 0 SYMATTR InstName R5 SYMATTR Value 11k SYMBOL res 704 192 R90 WINDOW 0 0 56 VBottom 0 WINDOW 3 32 56 VTop 0 SYMATTR InstName R6 SYMATTR Value 100k SYMBOL cap -80 256 R0 SYMATTR InstName C1 SYMATTR Value 2.2n SYMBOL cap 288 240 R0 SYMATTR InstName C2 SYMATTR Value 470p SYMBOL cap 496 224 R0 SYMATTR InstName C3 SYMATTR Value 6.8n SYMBOL cap -96 112 R90 WINDOW 0 0 32 VBottom 0 WINDOW 3 32 32 VTop 0 SYMATTR InstName C4 SYMATTR Value 22n SYMBOL cap 256 96 R90 WINDOW 0 0 32 VBottom 0 WINDOW 3 32 32 VTop 0 SYMATTR InstName C5 SYMATTR Value 68n SYMBOL Misc\\signal -608 224 R0 WINDOW 3 181 177 Left 0 WINDOW 123 24 132 Left 0 WINDOW 39 0 0 Left 0 SYMATTR Value SINE(2.5 2.5 4k 0 0 0) SYMATTR Value2 AC 0 SYMATTR InstName V1 SYMBOL Misc\\battery 848 64 R0 WINDOW 123 0 0 Left 0 WINDOW 39 0 0 Left 0 SYMATTR InstName V2 SYMATTR Value 8 SYMBOL Misc\\signal -816 144 R0 WINDOW 123 24 132 Left 0 WINDOW 39 0 0 Left 0 SYMATTR InstName V4 SYMATTR Value PULSE(0 5 0 49.8e-6 0.1e-6 0.1e-6 50e-6) SYMATTR Value2 AC 5 SYMBOL Opamps\\LT1028 -480 112 R0 SYMATTR InstName U4 TEXT -294 506 Left 0 !;ac dec 100 50 20000 TEXT 32 456 Left 0 !.tran 0 1m 0 1000



----------------------------------------------------


"Dirk Ruth" schrieb im Newsbeitrag news: snipped-for-privacy@4ax.com...

Ohne mich mit SwitcherCad auszukennen: Zwischen dem LM324 und dem LT1028 liegen Welten in Bezug auf Bandbreite. Da ist es nicht verwunderlich, dass Simulation und Realität nicht zusammen passen.

Ich kann 20kHz nicht mehr hören... Vielleicht ist es eine Schwebung?

Einen schnelleren OpAmp nehmen.

Gruß, Alexander

Alexander Doerrschrieb: "

Schon klar, dass man die beiden nicht miteinander vergleichen kann.

Es klingt in etwa, als wenn man mit der Nadel über eine Schallplatte kratzt.

Der Schneller OpAmp, mit der größeren Bandbreite, sorgt dann dafür, dass die höheren Frequenzen besser unterdrückt werden?

Dirk

Dirk Ruth schrieb:

Übersprechen zwischen den einzelnen Opamps des LM324? Möglicherweise durch ungünstiges Layout, oder gar einfach einen Pufferkondensator vergessen.

Gruß Dieter

Das Gezirpe, das Du da hörst, sind vermutlich Regelschwingungen. Mit einem schellen OpAmp ist es leichter, die Regelung stabil zu bekommen, die Frequenzkompensation wird einfacher. Und mit einer stabilen Regelung bekommt man die Regelschwingungen und damit das Zirpen weg.

Der schnelle OpAmp alleine tut es natürlich nicht. Der Regelkreis muss auch ordentlich (frequenz-)kompensiert werden.

Grüße,

Günther

Dirk Ruth schrieb:

Schaltest Du die "neue" Pulsbreite (neues Sample) in der Software eh zum richtigen Zeitpunkt um?

HTH Wolfgang

--=20 From-address is Spam trap Use: wolfgang (dot) mahringer (at) sbg (dot) at

Wolfgang Mahringerschrieb: "

Das macht der Controller automatisch, wenn die PWM-Periode abgelaufen ist.

Ich habe die beschriebenen Werte mit einem Frequenzgenerator durchgemessen. Mit dem Controller hört man dieses Kratzen aber auch. Der Austausch des Models durch ein LM324-Modell brachte keine nennenswerte Änderung.

Dirk

Dieter Wiedmannschrieb: "

Viel Platz ist bei SO14 nicht, da liegt alles nebeneinander. Wo es geht ist aber alles Massefläche. Versorgung ist Brücke -> 2200u

->100u,100n an TDA2003. Der LM324 geht sternförmig an den 2200u.

Dirk

Hast Du was passendes? SO14, gleiche Pinbelegung, Preis

Hallo Dirk, hast Du da evt. ein Problem beim Platinenlayout? Übersprechen im Filter? Gruß Axel

wenn ich das richtig verstehe, willst Du ein Audio-Signal auf 4 KHz begrenzen und die PWM als "Spar"-DA-Wandler einsetzen ;-). Zu der Qualität des Filters kann ich jetzt nicht soviel sagen, da ich mit der Datei unten nicht viel anfangen kann. Etwas SPICE 2G.6-kompatibles oder ein ASCII-Schaltplan wäre besser gewesen, ich selbst habe hier PSpice

7.1 zur Verfügung.

Natürlich kann das Filter wegen der OPs etwas weniger ideal sein, aber Pi mal Daumen könnte LM324 bis 4 KHz noch ungefähr gehen, er sollte natürlich nicht übersteuert sein.

Was ist nochmal TDA2003, Audio-Power-OP?

Du hast nichts über die Sperrdämpfung gesagt, die hängt natürlich von der Qualität der OPs ab und auch vom Aufbau. Die anderen haben das schon erwähnt. Mehr als 60 dB sind glaube ich in der Praxis nicht mehr leicht erreichbar und hängen IMHO in 1. Linie vom Layout ab. Allerdings glaube ich nicht, daß das Deine beschriebene schlechte Qualität erklärt.

Mal angenommen, Dein Audiosignal ist auf 4 KHz im Spektrum ideal begrenzt, dann müßtest Du schon mit ca. 40 KHz PWM schalten, um ein S/N von etwa 70 dB zu erhalten. Für HIFI-Zwecke geht man da eher auf 500 KHz oder mehr, falls ich mich richtig erinnere.

Das Problem bei PWM ist, daß Du selbst bei idealem Tiefpaß am Ausgang Effekte ähnlich Aliasing bekommst, Stichwort "Bessel-Spektrum", während ein "normaler" DA-Wandler mit R2R-Netzwerk überhaupt keine Aliasing-Effekte produzieren würde. Quantisierungsfehler habe ich jetzt mal nicht berücksichtigt. Ich hatte vor einiger Zeit mal eine interessante Diskussion mit Martin Laabs darüber und habe sein System mal simuliert gehabt und diese Effekte gesehen. Je nach Erzeugung der PWM im uC können sogar glaube ich noch klirrähnliche Effekte hinzukommen, das konnten wir nicht mehr ganz klären.

Also wenn Du zum Testen einen Sinus 4 KHz nimmst und die PWM auf 40 KHz legst, also auf ca. das 10fache, dann sollten wirklich absolut keine Störungen hörbar sein, weil der Klirrfaktor dann unter 0.1% läge. Wenn Du mit der PWM-Frequenz runtergehst, könnten sie sogar quadratisch ansteigen, wenn ich mich richtig erinnere.

Du kannst auch andersrum vorgehen, falls Du nicht mehr als 20 KHz PWM schaffst, solltest Du Dein Audiosignal auf der "digitalen" Seite auf

1/10 begrenzen, also 2 KHz. Falls dann immer noch Störungen zu hören sein sollten, müßte man nach deren Ursache suchen.

Du hast auch nicht die Quelle und Eigenschaften Deines Audio-Signals genannt, deshalb kann ich nur spekulieren. Vielleicht hast Du einfach nur einen Antialiasing-Tiefpaß vor dem AD-Wandler vergessen.

mfg. Winfried

Ich meine es war noch viel mehr. Ich wollte damals IMO ein 500Hz Sinus für einen CW Mithörgenerator damit betreiben. Die PWM Frequenz von einem Atmel hatte aber nicht gereicht um das einigermaßen akzeptabel hinzubiegen. Am Ende habe ich ein Rechteck gefiltert.

Es gibt doch aber trotzdem eine "Treppe". Ich kenne jedenfalls keinen DA Wandler welche die Samplingreihe korrekt umsetzt. Also für jedes Sampel eine si(x) Funktion generiert.

Ich wollte es irgendwann mal richtig rechnen. Aber mir fehlt etwas die Zeit und auch der mathematische Ansatz um sowas konsequent analystisch zu machen. Evt. habe ich in den nächsten Semesterferien genug Zeit dazu ... habe nämlich gerade ein ähnliches Problem mit einem bürstenlosen DC Motor.

Tschüss Martin L.

Nun, hier fühlt sich der Signalverarbeiter auf den Plan gerufen. :-) Ein PCM-Signal ist im Rechner natürlich erst einmal nur eine Abfolge von Werten, die - so stellt man sich das vor - durch Multiplikation eines kontinuierlichen Zeitsignals mit einem Dirackamm und anschließender Quantisierung gewonnen worden ist. Aufgrund der Tatsache, daß die Fouriertransformierte eines solchen Dirackamms wieder ein Dirackamm ist (mit bezüglich der Skalierungskonstanten (=2\pi bei Benutzung von j\omega als Frequenzvariablen, =1 wenn man f verwendet) reziprokem Abstand) ergibt sich die Periodizität des diskreten Signals.

Zur Rekonstruktion des ursprünglichen Signals (Einhaltung des Abtasttheorems vorausgesetzt) muß man also "nur" einen Dirackamm mit den durch die Samples vorgegebenen Gewichtungen erzeugen und den anschließend durch einen idealen Tiefpaß mit der halben Abtastfrequenz als Grenzfrequenz schicken. Soviel zur Theorie. Da der Diracimpulsgenerator in der Abstellkammer aber gleich neben dem Eimer für den Spannungsabfall, dem verstellbaren Augenmaß und dem Hilberttrafo steht, ist das nicht ohne weiteres möglich.

Also erzeugt man statt des Dirackamms eine Treppe. Heißt soviel wie, daß man mit einem Rechteckimpuls der Länge 1/f_Abtast faltet. Heißt, man verhunzt das Spektrum des Ausgangssignals durch Multiplikation mit einem si(f)-Frequenzgang. Die Images wollen natürlich trotzdem mit einem Tiefpaß entfernt werden.

Was ich jetzt damit sagen wollte: Der D/A-Wandler kann nur dann ideal sin(x)/x-Interpolieren, wenn er auch einen idealen Tiefpaß eingebaut hat...

Gruß Henning

im Moment wird bei uns etwas mit dem BTKit aus der C't gebastelt auf Java-Ebene. Der Atmel-uC da drauf (Typ weiß ich jetzt nicht) macht ca.

28 KHz PWM-Frequenz und kann im obigen Sinne ca. bis 2.8 KHz genutzt werden. Ich hatte dafür schon an einen Cauer-TP gedacht, falls die PWM als DA-Wandler genutzt werden sollte, Cauer wäre dann schon so steil wie man es von FIR kennt.

Bei unserer Diskussion damals war das Problem, die Erzeugung der PWM genau zu modellieren in der Simulation. Bei einer bestimmten Art der Erzeugung, so meine ich mich zu erinnern, waren heftige harmonische Störungen zu sehen, die das S/N zusätzlich stark verschlechtert hatten. Allerdings kann ich mir nicht vorstellen, daß Atmel so einen Bug in die PWM-Erzeugung eingebaut haben, vermutlich war das Simulations-Modell nicht ganz richtig.

Ich ging natürlich von einem idealen Tiefpaß aus, den es ja nicht gibt. Die sinx/x-Verzerrung habe ich auch nicht berücksichtigt, die könnte man auch kompensieren. Aber selbst wenn das ideal ginge, wäre das Spektrum bei PWM ähnlich gestört wie bei Aliasing-Effekten, das ist der Unterschied.

Ich hatte damals in de.sci.mathematik ein Teilproblem der FFT geschildert und auch gelöst. Vom Verständnis her kann man sich da beliebig verzetteln, bin da auch an mehrere in dieser Gruppe bekannten sogenannten "Trolle" geraten, war aber trotzdem ganz interessant.

Ich wollte ja noch das FFT-Programm für GNUPlot schreiben. Wenn man das nicht sofort anfängt, muß man sich überwinden ;-). Aber bestimmt interessieren sich Leute, die nicht selber programmieren, für so ein einfaches Programm, das das Spektrum von sehr langen Zeitfunktionen berechnet mit sehr hoher Auflösung.

mfg. Winfried

Welch-Methode? Implementieren kann man die ja mit Hilfe der libfftw3.

Gruß Henning

ich hab hier ein FFT-Programm nach decimation in time von Cooley-Tukey, das ist recht schnell. Den Link von libfftw3 habe ich hier, mich aber noch nicht damit beschäftigt. Das Programm funktioniert ja schon so wie ich es will, aber es fehlt ein User-Interface als ein einfaches Konsolenprogramm mit Kommandozeilenparametern. Es ist aber noch nicht jede Frage geklärt. Wenn ich die Abtastwerte ungleich 2**n wähle, so muß ich den Rest der Werte bis zum nächsten 2**n mit 0 auffüllen und die Amplitude korrigieren. Aber wie wähle ich die Fensterfunktion? Passe ich sie dem Zeitfenster ungleich 2**n an oder schließe ich die 0en mit ein? Ich würde ja ersteres sagen, habe es aber noch nicht getestet. Ich habe eine einstellbare Kaiser-Bessel Fensterung benutzt, um keine Wünsche offen zu lassen.

mfg. Winfried

Winfried Salomon schrieb:

Die Fensterung dient ja dazu, die Unstetigkeiten bei der periodischen Fortsetzung zu entfernen (=leakage vermindern). Wenn Du ein mit Nullen aufgefülltes Signal hast, hast Du eine Unstetigkeit ja unter Umständen mitten in Deinem Block und versaust Dir das Spektrum dadurch. Ein fenstern mit der gesamten Blocklänge kann diese Unstetigkeit dann nicht beheben. Wenn man diese Unstetigkeit als unerwünschten Effekt ansieht, der durch Verwendung von zu wenigen Samples enstanden ist, dann kann man ihn durch Fenstern _vor_ dem zero padding beheben.

Gruß Henning

henning paul home: http://www.geocities.com/hennichodernich PM: henningpaul@gmx.de , ICQ: 111044613

Hallo Henning,

so denke ich mir das auch. Ich muß mir das nochmal vornehmen, erfahrungsgemäß stecken da noch einige Detailprobleme drin, die ein zeitaufwendiges Austesten nötig machen.

mfg. Winfried

Der LM324 ist ein kleiner Verstärker für Mess- und Regelaufgaben nahe DC. Die angegebene Filtertopologie ist IMHO stark auf die Qualität der Opamps angewiesen, sonst mogeln sich die hohen Frequenzen via die eigentlich als Gegenkopplung gedachten Kondensatoren an den Opamps vorbei. Günstig sind da schnelle Opamps, insbesondere solche, die auch ohne Gegenkopplung sehr tiefe Ausgangswiderstände haben, auch bei hohen Frequenzen. Sind selten, LM6171 usw sind da ganz nett.

Für den LM324 hab ich auf die schnelle kein wirklich gutes Modell gefunden. Das von National funzt natürlich recht gut ;-). Die Innenschaltung zeigt jedoch eine Ausgangsstufe ohne Ruhestrom, d.h. nur wenn der Opamp schnell genug ist, kommt ein synthetischer tiefer Ausgangswiderstand zu stande, sonst "wackelt" der Ausgang.

mfg Rolf Bombach

Winfried Salomonschrieb: "

Versorgung ist 8V. Angesteuert wird er mit 5V. Einen Schaltplan habe ich mal unter

formatting link
gelegt. Ich hoffe, der Linkt funktioniert.

Ich habe jetzt nochmal genau nachgemessen (habe leider nur am Wochenende Zeit zum Testen und zum Schreiben). Ungewöhnlich scheint mir das Signal am Ausgang des 1. Filters - also an Pin 1.

formatting link
Das sieht mir doch schon sehr verzerrt aus. Eingespeist habe ich ein Sinus mit ca. 40kHz und 5Vpp + 2,5V DC.

Bei dieser Messungen habe ich auch gesehen, dass ein störende Signal bei recht genau 3,4kHz entsteht. Dieses bleibt auch recht konstant in der Frequenz, wenn ich den Generator von 20kHz bis 200kHz verstelle (verschiebt sich bis 3,5kHz). Lediglich die Amplitude verändert sich, wie bereits beschrieben.

Genau, das erklärt es nicht. Mit dem Filter selbst bin ich zufrieden. Er funktioniert ja auch bis ca 20kHz, so wie ich es haben will.

Ich will lediglich eine Art Grußkartenqualität haben. Nichts mit HIFI. Mittelwellenradio reicht völlig.

Ich glaube mein Problem liegt noch an einer anderen Stelle.

Ich habe nur ein Sample im Flash abgelegt, dass ich berechnet habe.

Dirk

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required