Glättungsfilter für 1-Bit DA-Wandlung

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

von Jonas K.

Dieser Artikel nimmt am Artikelwettbewerb 2012/2013 teil.

Bei vielen Mikrocontrollern ist ja kein DA-Wandler integriert, man muss sich also helfen, indem man ein PWM-Signal glättet. Zur PWM-Erzeugung und auch zur Glättung gibt es bereits unzählige Artikel und Threads. Ich hatte allerdings mehrmals folgende Anforderung an den Glättungsfilter:

  • starke Glättung der PWM-Frequenz
  • hohe Auflösung des Tastverhältnisses
  • schnelle Reaktionszeit auf Änderung des Tastverhältnisses (da regelungstechnische Anwendung)
    • mehrfache Pole und Pole möglichst nahe beieinander in der Übertragungsfunktion
  • mobile Anwendung:
    • wenig Platz und Gewicht
    • wenig Energieverbrauch => eventuell passiver Filter

Die erste Idee ist natürlich - wegen der mehrfachen Pole - ein LC-Filter. Hier ergibt sich aber ein Problem mit der Induktivität.

Deswegen habe ich mir eine Vorgehensweise überlegt, einen doppelten, passiven und einen vierfachen, aktiven RC-Tiefpass so zu entwerfen, dass die Pole möglichst nahe beieinander liegen.

Warum kein LC-Filter?

Ein recht deutliches Beispiel ist, dass der Mikrocontroller mit einer Taktfrequenz [math]\displaystyle{ f_{Takt} = 1MHz }[/math] läuft, die gewünschte Auflösung/die Anzahl der PWM-Schritte ist [math]\displaystyle{ N = 2^{10} = 1024 }[/math] (10-bit Auflösung). Das ergibt eine Grundfrequenz des PWM Signals von [math]\displaystyle{ f_{PWM} = {f_{Takt} \over N }\approx 1 kHz }[/math]. Um das PWM-Signal in der Grundschwingung stark zu dämpfen, muss man die Grenzfrequenz nach den späteren Ergebnissen bei 26,4 Hz wählen.

Mit der Grenzfrequenz [math]\displaystyle{ \omega_{g} = {1 \over \sqrt{L\cdot C}} }[/math] ergibt sich allerdings für die Induktivität beispielsweise [math]\displaystyle{ L = {1 \over (166)^2 \cdot 100\mu}=363mH }[/math]. Solche Werte sind leicht und platzsparend nicht zu realisieren.

Die erste, passive Schaltung zweiter Ordnung mit einstellbarer Dämpfung

Tiefpass2.png

Die prinzipielle Schaltung eines RC-Tiefpasses zweiter Ordnung ist hier einmal dargestellt. So kann die Schaltung natürlich nur verwendet werden, wenn die Weitervarbeitung des Signals hochohmig erfolgt, z. B. durch einen Operationsverstärker oder einen FET. Denn der Ausgangswiderstand ist durch [math]\displaystyle{ R_2 }[/math] und [math]\displaystyle{ C_2 }[/math] bestimmt. Später wird man zu dem Ergebnis kommen, dass [math]\displaystyle{ R_2 }[/math] relativ groß ist und [math]\displaystyle{ C_2 }[/math] relativ klein. Der Ausgangswiderstand ist also recht hoch, tendenziell größer als [math]\displaystyle{ 100k\Omega }[/math].

Der Spannungsteiler [math]\displaystyle{ \varepsilon ={ R_x \over R_1 + R_x} = {U_{out, max} \over U_0 } }[/math] skaliert die Versorgungsspannung des Mikrocontrollers, z. B. 3,3V oder 5V, auf die gewünschte maximale Ausgangsspannung, z. B. 1V. Natürlich kann man [math]\displaystyle{ R_x }[/math] auch weglassen, dann gilt in allen weiteren Formeln [math]\displaystyle{ R_x\rightarrow\infty }[/math] bzw. [math]\displaystyle{ \varepsilon = 1 }[/math]. Ich werde [math]\displaystyle{ R_x }[/math] erst dimensionieren, wenn der Rest der Schaltung dimensioniert ist.


Forderungen an das Ausgangssignal

Quantisierung.png

Jetzt muss man sich überlegen, wie stark die Welligkeit des Ausgangssignals nach dem Filter noch sein darf. Damit sich die Bereiche der verschiedenen Taktungen klar trennen lassen, ist eine sinnvolle Forderung, dass nach dem Tiefpass für die Restwelligkeit bzw. die Restamplitude gilt:

[math]\displaystyle{ \Delta U_{max} = {U_0 \over 2 N} = {U_0 \over 2\cdot 2^m} }[/math]

Diese Forderung ist rechts graphisch veranschaulicht.


Der korrekte, mathematischere Weg für die nächsten Schritte

Wer in diversen mathematischen Grundlagen - wie Fourier-Reihe oder Laplace-Trafo - nicht so bewandert ist, der sollte ein Kapitel weiterspringen, in dem die nächsten Sachverhalte hoffentlich anschaulicher beschrieben ist. Das Ergebnis ist in etwa dasselbe - zur späteren Verwendung empfiehlt sich natürlich, die genaueren Ergebnisse zu verwenden.

Analyse des PWM-Signals

Um die Forderung erfüllen zu können, muss man zuerst das PWM-Signal in eine Fourierreihe zerlegen. Man findet in entsprechenden Formelsammlungen für ein Signal mit einer Zeit [math]\displaystyle{ \tau_{ein} }[/math], in der es die Amplitude [math]\displaystyle{ U_0 }[/math] hat, und einer Periodendauer [math]\displaystyle{ T }[/math]:

[math]\displaystyle{ f(t)\sim U_0{\tau_{ein}\over T} + {2 U_0 \over \pi}\cdot [\sin \varphi \cos \omega_1 t + {\sin 2 \varphi \over 2} \cos \omega_2 t + {\sin 3 \varphi \over 3} \cos \omega_3 t + {\sin 4 \varphi \over 4} \cos \omega_4 t + ...] }[/math]

mit [math]\displaystyle{ \varphi = \pi {\tau_{ein} \over T} }[/math]

Wenn man nun den Fall betrachtet, dass die Amplitude der Schwingungen maximal ist - also das Tastverhältnis von 50% - vereinfacht sich die Formel folgendermaßen, da sich mit [math]\displaystyle{ \varphi = 0,5\pi }[/math] der Sinus vereinfacht:

[math]\displaystyle{ f(t)\sim 0,5 \cdot U_0 + {2 U_0 \over \pi}\cdot [\cos \omega_1 t - {1 \over 3} \cos \omega_3 t + {1 \over 5} \cos \omega_5 t - { 1 \over 7} \cos \omega_7 t + ...] }[/math]

Der Gleichanteil [math]\displaystyle{ U_{DC} = U_0{\tau_{ein}\over T} }[/math] wird ungedämpft durch den Tiefpass kommen. Die Grundfrequenz des Signals, [math]\displaystyle{ \omega_1 }[/math], soll sich bereits in dem Bereich des Filters befinden, in dem die Dämpfung mit [math]\displaystyle{ 1 \over \omega^2 }[/math] fällt. Dementsprechend gilt in diesem Bereich für die Frequenz [math]\displaystyle{ \omega_k=k\cdot \omega_1 }[/math]:

[math]\displaystyle{ D_1\omega_1^2=D_k \omega_k^2=k^2 D_k \omega_1^2 }[/math]

[math]\displaystyle{ D_k={D_1 \over k^2} }[/math]

Die bisherigen Erkenntisse sind nun einmal in ein Tabelle zusammengefasst. In der untersten Zeile sind die Amplituden der PWM-Frequenz plus Oberwellen, gedämpft durch den Tiefpass, aufgeführt.

f = 0 [math]\displaystyle{ f_1 }[/math] [math]\displaystyle{ f_3 }[/math] [math]\displaystyle{ f_k }[/math] [math]\displaystyle{ f_{2k+1} }[/math]
[math]\displaystyle{ \left|U_k\right| }[/math] [math]\displaystyle{ U_{DC} }[/math] [math]\displaystyle{ {2 U_0 \over \pi} }[/math] [math]\displaystyle{ {2 U_0 \over 3 \pi} }[/math] [math]\displaystyle{ {2 U_0 \over k \pi} }[/math] [math]\displaystyle{ {2 U_0 \over (2k+1) \pi} }[/math]
[math]\displaystyle{ D_k }[/math] 1 [math]\displaystyle{ D_1 }[/math] [math]\displaystyle{ D_3= D_1/9 }[/math] [math]\displaystyle{ D_1/k^2 }[/math] [math]\displaystyle{ D_1/(2k+1)^2 }[/math]
[math]\displaystyle{ \left|U_k\right|\cdot D_k }[/math] [math]\displaystyle{ U_{DC} }[/math] [math]\displaystyle{ {2 D_1 U_0 \over \pi} }[/math] [math]\displaystyle{ {2 D_1 U_0 \over 27 \pi} }[/math] [math]\displaystyle{ {2 D_1 U_0 \over k^3 \pi} }[/math] [math]\displaystyle{ {2 D_1 U_0 \over (2k+1)^3 \pi} }[/math]

Die gesamte Restamplitude liegt also in der Größenordnung von [math]\displaystyle{ \Delta U_{max} = \sum_{k=0}^\infty {2 D_1 U_0 \over (2k+1)^3\cdot T} }[/math]


Die gewünschte Grenzfrequenz

Durch Gleichsetzen der beiden Gleichungen für [math]\displaystyle{ \Delta U_{max} }[/math] ergibt sich für die Dämpfung [math]\displaystyle{ D_1 }[/math] bei der Frequenz [math]\displaystyle{ \omega_1 }[/math]:

[math]\displaystyle{ {U_0 \over 2 N} = \Delta U_{max} = \sum_{k=0}^\infty {2 D_1 U_0 \over (2k+1)^3 \pi} }[/math]

[math]\displaystyle{ { D_1} = { \pi \over 4 N} \cdot { 1 \over \sum_{k=0}^\infty { 1 \over (2k+1)^3}} }[/math]

Nach Wolfram Alpha

[math]\displaystyle{ { D_1} \approx { \pi \over 4 N} \cdot {1 \over 1,0518} \approx{ 0,75 \over N} }[/math]


[math]\displaystyle{ D_{g}\omega_{g}^2=1\cdot\omega_{g}^2=D_1 \omega_1^2 }[/math]

[math]\displaystyle{ \omega_{g}=s_g=\sqrt{D_1 \omega_1^2}=\sqrt{{0,75 \over N }}\cdot \omega_{PWM}= {\pi f_{Takt}} \cdot \sqrt{{3 \over N^3 }} }[/math]

Die Übertragungsfunktion des doppelten RC-Tiefpasses

Die Übertragungsfunktion muss bestimmt werden und mit der gewünschten - doppelter Pol bei [math]\displaystyle{ \omega_{g} }[/math] - gleichgesetzt werden. Diese gewünschte Übertragungsfunktion resultiert aus der Forderung nach der schnellstmöglichen Sprungantwort ohne Überschwinger. D. h., sie stellt den aperiodischen Grenzfall dar.

[math]\displaystyle{ G(s)=\frac{\frac{1}{sC_{2}}}{R_{2}+\frac{1}{sC_{2}}}\frac{\frac{1}{sC_{1}+{1 \over R_x}+\frac{1}{R_{2}+\frac{1}{sC_{2}}}}}{R_{1}+\frac{1}{sC_{1}+{1 \over R_x}+\frac{1}{R_{2}+\frac{1}{sC_{2}}}}}=\frac{\varepsilon}{s^{2}\varepsilon R_{1}R_{2}C_{1}C_{2}+s \varepsilon \left(R_{1}C_{1}+R_{1}C_{2}+R_{2}C_{2}\right)+1}\overset{!}{=}\frac{1}{\frac{s^{2}}{\omega_{g}^{2}}+\frac{2s}{\omega_{g}}+1} }[/math]

Aus dem Koeffizientenvergleich erhält man folgendes Gleichungssystem:

[math]\displaystyle{ \varepsilon R_{1}R_{2}C_{1}C_{2}=\frac{1}{s_{g}^{2}}\,\Rightarrow\, R_{2}=\frac{1}{s_{g}^{2}\varepsilon R_{1}C_{1}C_{2}} }[/math]

[math]\displaystyle{ \varepsilon R_{1}C_{1}+\varepsilon R_{1}C_{2}+R_{2}C_{2}=\frac{2}{s_{g}} }[/math]

[math]\displaystyle{ 0=\varepsilon R_{1}^{2}\left(C_{1}+C_{2}\right)-R_{1}\cdot\frac{2}{s_{g}}+\frac{1}{s_{g}^{2} \varepsilon C_{1}} }[/math]

[math]\displaystyle{ R_{1a,b}=\frac{\frac{2}{s_{g}}\pm\sqrt{\frac{4}{s_{g}^{2}}-4\frac{\varepsilon ( C_{1}+C_{2})}{\varepsilon C_{1}}\frac{1}{s_{g}^{2}}}}{2\varepsilon (C_{1}+C_{2})}=\frac{1\pm\sqrt{1-\frac{C_{1}+C_{2}}{C_{1}}}}{\varepsilon (C_{1}+C_{2})s_{g}} }[/math]

mit der Diskriminante [math]\displaystyle{ D=1-{C_1 + C_2 \over C_1} }[/math]

Da für reelle Lösungen (relle Widerstanswerte) [math]\displaystyle{ D \ge 0 }[/math] gelten muss, muss der Bruch (von unten) gegen null gehen und damit [math]\displaystyle{ C_1 \gg C_2 }[/math] sein.

Für die zwei Gleichungen und die vier Unbekannten [math]\displaystyle{ R_1 }[/math], [math]\displaystyle{ R_2 }[/math], [math]\displaystyle{ C_1 }[/math] und [math]\displaystyle{ C_2 }[/math] hat man jetzt zwei Freiheitsgrade, das heißt man kann z. B. die Kondensatoren frei wählen.

Der anschaulichere Weg

Man betrachte nur die Grundschwingung des Rechtecksignals bei der Taktung 0,5, da hier der Fourierkoeffizient der Grundschwingung am größten ist. In den beiden gezeigten Bilder (einmal Taktung 0,2, einmal 0,5) hat die Grundschwingung bei 0,5 eine deutlich höhere Amplitude.

Fourier-Taktung05.pngFourier-Taktung02.png

Das PWM-Signal wird dann angenähert durch einen Cosinus [math]\displaystyle{ u_{PWM}(t) = {2\over\pi}U_0 \cdot \cos\omega_{PWM}t }[/math]. Die Oberwellen sind sowieso in der Amplitude geringer, und werden zusätzlich noch vom Filter stärker gedämpft. Damit spielen sie nur eine so geringe Rolle, dass wir sie hier vernachlässigen wollen.

Die benötigte Dämpfung bei der PWM-Grundfrequenz ist dann [math]\displaystyle{ D_1={U_{out}\over U_{in}}= {{U_0\over 2N}\over {2\over \pi}}={\pi \over 4N} }[/math]. Anschaulicher ist es wahrscheinlich, wenn man die Dämpfung in dB angibt.

[math]\displaystyle{ D_1\; in\ dB=20\log{\pi \over 4N} = 20 \log{\pi \over 4 } - 20 \log{2^m}\approx -2,1 dB - m \cdot 6 dB }[/math]

Für große n braucht man der der PWM-Grundfrequenz also näherungsweise 6 dB Dämpfung pro Bit. Ein Tiefpass vierter Ordnung fällt ab der Grenzfrequenz ja mit 80 dB pro Dekade, das heißt also für die Grenzfrequenz des Filters:

[math]\displaystyle{ f_g={s_g \over 2 \pi}=f_{PWM} \cdot 10^{-{6\cdot m\over80}} }[/math]

Beziehungsweise in anderer Betrachtungsweise: Ein Tiefpass n.-ter Ordnung fällt im Sperrbereich mit [math]\displaystyle{ D\sim {1 \over \omega^n} }[/math]. Bis zur Grenzfrequenz gilt näherungsweise (im Durchlassbereich), dass das Signal ohne Dämpfung durchkommt.

Demenstprechend gilt wegen der indirekten Proportionalität im Sperrbereich: [math]\displaystyle{ 1 \cdot \omega_{g}^2=const.=D_1 \omega_{PWM}^2 }[/math]

[math]\displaystyle{ \omega_{g}= \omega_{PWM}\sqrt{D_1}=2\pi {f_{Takt}\over N}\sqrt{\pi \over 4 N}=\pi {f_{Takt}}\sqrt{\pi \over N^3} }[/math]

Das ist natürlich recht ähnlich zum "genau gerechneten Ergebniss": [math]\displaystyle{ \omega_{g}=\pi {f_{Takt}}\sqrt{3 \over N^3} }[/math]

Jetzt muss man noch die beiden hintereinandergeschalteten RC-Tiefpässe dimensionieren. Dabei soll gelten (zweimal diesselbe Grenzfrequenz):

[math]\displaystyle{ {1\over\omega_{g}}=\tau_g=(R_1||R_x)C_1=R_2C_2 }[/math]

Damit der zweite Tiefpass den ersten nicht belastet, soll [math]\displaystyle{ R_2 \gg R_1||R_x }[/math] und damit [math]\displaystyle{ C_1 \gg C_2 }[/math] gelten.

Man erhält nach freier Wahl der Kondensatoren die Formeln:

[math]\displaystyle{ R_{1}||R_x={R_1R_x\over R_1+R_x}=\varepsilon R_1 \rightarrow \varepsilon R_1 C_1 = \frac{1}{s_g} }[/math]

[math]\displaystyle{ R_{1}=\frac{1}{\varepsilon C_{1}s_{g}} }[/math]

[math]\displaystyle{ R_{2}={1\over s_g C_2}=\frac{1}{s_{g}^{2}\varepsilon R_{1}C_{1}C_{2}} }[/math]

Diese Formeln sind nahezu identisch mit den korrekten Ergebnissen, die als nächstes verwendet werden sollen.

Einfache Anwendung der bisherigen Ergebnisse

Als bekannte Größen werden benötigt:

[math]\displaystyle{ f_{Takt} }[/math]: Die Frequenz, mit der der Mikrocontroller läuft

[math]\displaystyle{ N }[/math]: Die Auflösung der PWM bzw. die Größe des entsprechenden Zählers

[math]\displaystyle{ \varepsilon }[/math]: Falls ein kleinerer Ausgangspegel gewünscht ist, gilt [math]\displaystyle{ \varepsilon = {U_{out, max} \over U_0 } }[/math], ansonsten [math]\displaystyle{ \varepsilon =1 }[/math]


Damit kann man sich die Grenzfrequenz [math]\displaystyle{ s_g = \pi f_{Takt}\sqrt{3\over N^3} }[/math] berechnen.

Wählt man noch nach persönlichen Vorlieben zwei Kondensatoren, die im Wert möglichst weit/ein paar Zehnerpotenzen auseinanderliegen, weil [math]\displaystyle{ C_1 \gg C_2 }[/math] gelten soll, so kann man sich die beiden Widerstände berechnen. Dabei kann man natürlich auch ein bisschen mit den Kondensatorwerten spielen, um eventuell auf bessere Widerstandswerte zu kommen.

Für die Widerstände gilt dann nach der exakten Berechnung:

[math]\displaystyle{ R_{1}=\frac{1}{\varepsilon(C_{1}+C_{2})s_{g}} }[/math]

[math]\displaystyle{ R_{2}=\frac{1}{s_{g}^{2}\varepsilon R_{1}C_{1}C_{2}} = {C_1 + C_2 \over s_g C_1 C_2} }[/math]

Den gewünschten Ausgangspegel kann man noch über den Widerstand [math]\displaystyle{ R_x }[/math] einstellen. Falls keine Dämpfung gewünscht ist, also [math]\displaystyle{ \varepsilon=1 }[/math], kann man einfach [math]\displaystyle{ R_x }[/math] weglassen.

[math]\displaystyle{ R_x = {\varepsilon\over1-\varepsilon}R_1 }[/math]

Vergleich der so gewonnenen Ergebnisse mit dem idealen Frequenzgang und Betrachten des Ausgangssignals

Beispielhaft wähle ich für das PWM-Signal [math]\displaystyle{ f_{Takt}=1MHz }[/math], [math]\displaystyle{ \varepsilon=1 }[/math] und [math]\displaystyle{ N=1024 }[/math], d. h. [math]\displaystyle{ s_g \approx 166 {1 \over s} }[/math]. Für die Kondensatoren soll gelten [math]\displaystyle{ C_1 = 100n }[/math] und [math]\displaystyle{ C_2 = 1n }[/math]. Dann erhält man für die Widerstände [math]\displaystyle{ R_{1}=60k }[/math] und [math]\displaystyle{ R_{2}=6M }[/math].

Als zweites Beispiel habe ich die Kondensatorwerte [math]\displaystyle{ C_{1x} = 100n }[/math] und [math]\displaystyle{ C_{2x} = 10n }[/math] gewählt, die die Bedingung [math]\displaystyle{ C_1 \gg C_2 }[/math] nicht so gut erfüllt. Hier erhält man für die Widerstände [math]\displaystyle{ R_{1x}=55k }[/math] und [math]\displaystyle{ R_{2x}=660k }[/math].

Das m-File für die folgenden Berechnungen ist am Ende des Artikels verfügbar. Außerdem ist dort auch ein LT-Spice-File verfügbar, das u. a. diesen Tiefpass enthält.

Ich habe in Matlab die drei Bode-Diagramm geplottet. Das "ideale" und das mit den guten Kondensatorwerten liegen so nahe übereinander, dass man keinen Unterschied sieht. Das Diagramm mit den schlechten Kondensatorwerten fällt etwas früher etwas flacher ab.

%% Plot der Bode-Diagramme für "idealen" Tiefpass und entsprechend entworfenen "realen"
%  Auflösungsschritte
N=1024;
%  PWM-Frequenz = 1 MHz / 1024
fPWM=977;
%  geforderte Dämpfung 
D1=0.75/N;
%  geforderte Grenzfrequenz
s_g=2*pi*fPWM*sqrt(D1);

%  Wahl der Kondensatorwerte und Berechnen der Widerstandswerte
%  weit entfernte Werte
C1=100e-9;
C2=1e-9;
R1=1/((C1+C2)*s_g);
R2=1/(s_g^2*R1*C1*C2);
%  nahe Werte
C1x=100e-9;
C2x=10e-9;
R1x=1/((C1x+C2x)*s_g);
R2x=1/(s_g^2*R1x*C1x*C2x);

%  Festlegen der drei Übertragungsfunktionen
z=1;

n_ideal=[1/s_g^2 2/s_g 1];
G_ideal=tf(z,n_ideal);

n_meins=[R1*R2*C1*C2 R1*C1+R1*C2+R2*C2 1];
G_meins=tf(z,n_meins);

n_schlecht=[R1x*R2x*C1x*C2x R1x*C1x+R1x*C2x+R2x*C2x 1];
G_schlecht=tf(z,n_schlecht);

%  Plot der drei Bode-Diagramme
figure(12);
bode(G_ideal,'g',G_meins,'b',G_schlecht, 'r');
legend('ideal','real, gut', 'real, schlecht');

Bode-Vergleich-tiefpässe.png

Interessant ist auch noch, ob bei entsprechendem Eingangssignal die Dämpfung groß genug ist, so dass sich die verschiedenen Auflösungsbereiche nicht überlappen. Dabei soll als Eingangssignal ein PWM-Signal mit einem Tastverhältnis von 0,5 betrachtet werden und der Grundfrequenz [math]\displaystyle{ f_{PWM} = {f_{Takt} \over N } = 977 Hz }[/math].


%% Plot des Einschingverhaltens des Filters zum Betrachten der Restwelligkeit
%  Zeitauflösung
Delta=9.77e-6/64;
%  Gesamtzeit
Zeit=9.77/64;
%  Zeitvektor
t=0:Delta:Zeit;

%  Die beiden Impulsantworten
[h]=impulse(G_meins,t);
[h_schlecht]=impulse(G_schlecht,t);

%  Erzeugen des Eingangssignals
Th=1/(fPWM*2)/Delta;
T=Th;
flag=0;
x=zeros(1,length(t));

for i=1:1:(1/Delta * Zeit + 1)
    if(flag==0)
        x(i)=1;
        if(i>T)
            T=T+Th;
            flag=1;
        end
        
    else
        x(i)=0;
        if(i>T)
            T=T+Th;
            flag=0;
        end
    end
    
end

% Berechnen des Ausgangssignals durch Faltung und Anpassen der Länge
y=conv(x,h);
y_schlecht=conv(x,h_schlecht);
y=y(1:length(t))*Delta;
y_schlecht=y_schlecht(1:length(t))*Delta;

%  Plot der beiden Kurven
figure(13);
plot(t,y,t,y_schlecht)
legend('gute Näherung', 'schlechte Näherung')
xlabel('t in Sekunden')
ylabel('U in Volt')

Step-Vergleich-tiefpässe-out.png

Step-Vergleich-tiefpässe-in.png

Man erkennt deutlich, dass die Schwankungen eine Amplitude von ca. 0,00045 haben, was ja recht genau der Forderung von [math]\displaystyle{ { U_0 \over 2N}={1 \over 2048 }\approx 0,000488 }[/math] entspricht. Die "schlechtere" Variante hat dabei im letztendlichen Signal keinen schlechteren Verlauf, aber benötigt eine längere Zeit, um den Gleichanteil zu erreichen.

Aktiver Tiefpass vierter Ordnung mit einstellbarer Verstärkung und Dämpfung

Der soeben besprochene Tiefpass erfüllt fast alle genannten Anforderungen. Die Geschwindigkeitsfrage ist nicht gut gelöst (im Beispiel ist [math]\displaystyle{ \omega_g = 166 {1\over s} }[/math]). Für schnellere Anwendungen ist ein Tiefpass höherer Ordnung hilfreich, weil die Grenzfrequenz dann nach oben verschoben werden kann. Wenn man die Tendenz der Widerstandswerte des letzten Beispieles betrachtet(KOhms, MOhms), wäre für 3. Ordnung dementsprechend entweder ein noch kleinerer Widerstand (Ohms) oder ein noch größerer (GOhms) nötig. Das eine wäre eine zu hohe Belastung für den Mikrocontroller, das andere ist problematisch wegen der Weiterverarbeitung.

Man könnte also beispielsweise hinter die letzte Schaltung noch einen aktiven Tiefpass schalten, der

  1. einen genügend hochohmigen Eingang hat, um das letzte Signal weiterzuverarbeiten und
  2. einen niederohmigen Ausgang hat, wodurch die Weitervarbeitung nach dem Tiefpass keinerlei Schwierigkeit mehr darstellt.

Nachteilig ist der erhöhte Stromverbrauch gegenüber der ersten, rein passiven Lösung, von Vorteil ist nicht nur die bessere Geschwindigkeit, sondern es ist auch eine Verstärkung gegenüber der Versorgung des Mikrocontrollers möglich.

Die zweite Schaltung mit aktivem Teil

Aktiver-tiefpass-4o.png

Der erste Teil, von [math]\displaystyle{ U_{PWM} }[/math] auf [math]\displaystyle{ U_{2} }[/math], ist im Prinzip ja bereits berechnet. Der zweite Teil, [math]\displaystyle{ U_{a} }[/math] zu [math]\displaystyle{ U_{2} }[/math], ist noch zu dimensionieren. Dabei kann man bei dieser Schaltung eine Verstärkung [math]\displaystyle{ V_{0}=1+{R_A \over R_B} }[/math] einstellen. Die Verstärkung darf dabei nicht größer als 3 sein, sonst wird der Filter instabil!

Je nach Anforderung kann man eine Verstärkung über [math]\displaystyle{ V_{0} }[/math] oder eine Dämpfung über [math]\displaystyle{ \varepsilon }[/math] einstellen. Dabei gibt es jetzt 3 Fälle:

  1. [math]\displaystyle{ V_{0}= 1 }[/math] und [math]\displaystyle{ \varepsilon=1:\;\ \;\;R_{x} }[/math], [math]\displaystyle{ R_{B} }[/math] als Leerlauf und [math]\displaystyle{ R_{A} }[/math] Kurzschluss
  2. [math]\displaystyle{ V_{0}= 1 }[/math] und [math]\displaystyle{ \varepsilon\lt 1:\;\ \;\;R_x = {\varepsilon\over1-\varepsilon}R_1 }[/math], [math]\displaystyle{ R_{B} }[/math] als Leerlauf und [math]\displaystyle{ R_{A} }[/math] Kurzschluss
  3. [math]\displaystyle{ V_{0}\gt 1 }[/math] und [math]\displaystyle{ \varepsilon=1:\;\ \;\;R_x }[/math] als Leerlauf, mit [math]\displaystyle{ V_0 = 1 + {R_A \over R_{B}} }[/math] [math]\displaystyle{ R_{A} }[/math] und [math]\displaystyle{ R_{B} }[/math] im festen Verhältnis wählbar

Die Übertragungsfunktion

Der erste Teil der Schaltung hat wie oben besprochen folgende Übertragungsfunktion:

[math]\displaystyle{ G_1(s)=\frac{\varepsilon}{s^{2}\varepsilon R_{1}R_{2}C_{1}C_{2}+s \varepsilon \left(R_{1}C_{1}+R_{1}C_{2}+R_{2}C_{2}\right)+1} }[/math]

Der zweite Teil der Schaltung, ein sogenannter Sallen-Key Tiefpass zweiter Ordnung, hat folgende Übertragungsfunktion:

[math]\displaystyle{ G_2(s)={V_0 \over s^2 R_3C_3R_4C_4 + s[R_3C_3(1-V_0)+R_3C_4+R_4C_4]+1} }[/math]

Damit man die Gesamtübertragungsfunktion einfach bestimmen kann, muss der Ausgangswiderstand des ersten Teils deutlich kleiner sein als der Eingangswiderstand des zweiten Teils. Denn dann kann die Übertragungsfunktion wie folgt bestimmt werden:

[math]\displaystyle{ G(s)=G_1(s)\cdot G_2(s) }[/math]

Deswegen werde ich die Widerstände für DC und bei der Frequenz [math]\displaystyle{ f_{PWM} }[/math] bestimmen.

[math]\displaystyle{ Z_{out, DC}=R_2 + R_x || R_1 }[/math]

[math]\displaystyle{ Z_{in, DC}\rightarrow\infty }[/math]

Für den Gleichanteil ist also die Bedingung [math]\displaystyle{ Z_{in, DC} \gg Z_{out, DC} }[/math] erfüllt.

Für die Werte bei der PWM-Frequenz werde ich annehmen, dass der Impedanzwert der Kondensatoren bereits sehr klein geworden ist und somit kleiner als die verwendeten Widerstandswerte.

[math]\displaystyle{ Z_{out, AC}={1\over j \omega_{PWM} C_2}||(R_2 + ...)\lesssim{1\over j \omega_{PWM} C_2} }[/math]

[math]\displaystyle{ Z_{in, AC}=R_3+...\gtrsim R_3 }[/math]

Durch die Bedingung [math]\displaystyle{ Z_{in} \gg Z_{out} }[/math] gilt dann:

[math]\displaystyle{ Z_{in, AC} \gtrsim R_3 \gg {1\over j \omega_{PWM} C_2} \gtrsim Z_{out, AC} }[/math]

Dementsprechend als einziges weiter zu beachten:

[math]\displaystyle{ R_3 \gg {1\over \left| j \omega_{PWM} C_2 \right|} }[/math]

Somit kann man guten Gewissens die Übertragungsfunktionen multiplizieren.

Aperiodischer Grenzfall beim Tiefpass 4. Ordnung

Durch Ausprobieren mit Matlab habe ich - nicht streng bewiesen sondern nur als Simulationsergebnis - herausgefunden, dass bei der folgenden Übertragungsfunktion [math]\displaystyle{ G(s)=G_1(s)\cdot G_2(s) }[/math] der aperiodische Grenzfall für [math]\displaystyle{ d\approx 0,8 }[/math] erreicht ist.

[math]\displaystyle{ G(s)=G_1(s)\cdot G_2(s)={1\over {s^2 \over s_g^2 }+ {2s\over s_g}+1 }{1\over {s^2 \over s_g^2} + {2ds\over s_g}+1} }[/math]

Das m-File mit der Simulation ist unter Downloads zu finden, die Ergebnisse sind in den nächsten beiden Bildern veranschaulicht.

%% Ausprobieren der Dämpfung d bei einem Tiefpass 4. Ordnung,
%  bei dem ein Teil ein Tiefpass zweiter Ordnung ist mit der
%  Übertragungsfunktion G0 und beim zweiten Teil 
%  d = 0,6(überschwingen)...1(langsam) variiert

%  Beispielhafte Grenzfrequenz, beliebig änderbar
sg=1;

%  Übertragungsfunktion der ersten Schaltung - idealisiert natürlich
G0=tf(1,[1/sg^2 2/sg 1]);


%  Einstellen verschiedener Werte für d, dabei ist das Ergebnis
%  rausgekommen, dass ab d>=0,8 keine Überschinger mehr auftreten.

d=0.6;
G1=G0*tf(1,[1/sg^2 2*d/sg 1]);

d=0.7;
G2=G0*tf(1,[1/sg^2 2*d/sg 1]);

d=.75;
G2a=G0*tf(1,[1/sg^2 2*d/sg 1]);

d=0.8;
G3=G0*tf(1,[1/sg^2 2*d/sg 1]);

d=0.85;
G3a=G0*tf(1,[1/sg^2 2*d/sg 1]);

d=0.9;
G4=G0*tf(1,[1/sg^2 2*d/sg 1]);

d=1;
G5=G0*tf(1,[1/sg^2 2*d/sg 1]);

%  Plot der Sprungantwort
figure(1);
step(G2a,G3,G3a);
legend('0.75','0,8','0,85')


%% Alternativer Plot mit mehr verschiedenen Dämpfungswerten
% figure(1);
% step(G1,G2,G2a,G3,G3a,G4,G5);
% legend('0,6','0,7','0.75','0,8','0,85','0,9', '1')
% 
% figure(2);
% bode(G1,G2,G2a,G3,G3a,G4,G5);
% legend('0,6','0,7','0.75','0,8','0,85','0,9', '1')

Aktiver-tiefpass-4o-Daempfung-d-0,8-out.png

Aktiver-tiefpass-4o-Daempfung-d-0,8-in.png


Bestimmung der Grenzfrequenz und der Übertragungsfunktion

Das Vorgehen erfolgt fast analog zu obiger Berechnung, die einzige Änderung ist die Dämpfung [math]\displaystyle{ D_k = D_1 / k^4 }[/math] wegen der höheren Ordnung.

[math]\displaystyle{ {U_0\over 2N}=\Delta U_{max}={ \sum_{k=0}^\infty {2 D_1 U_0 \over (2k+1)^5 \pi} } }[/math]

[math]\displaystyle{ D_1={\pi\over 4N}{1\over \sum_{k=0}^\infty {1 \over (2k+1)^5 } }\approx {\pi\over 1,0045\cdot 4N}\approx {0,79 \over N} }[/math]

[math]\displaystyle{ D_{g}\omega_{g}^4=\omega_{g}^4=D_1 \omega_1^4 }[/math]

[math]\displaystyle{ \omega_{g}=s_g=\sqrt[4]{D_1 \omega_1^4}=\sqrt[4]{{0,79 \over N }\cdot \omega_{PWM}^4} = \omega_{PWM}\cdot\sqrt[4]{{0,79 \over N }}= \pi f_{Takt}\sqrt[4]{12,64 \over N^5} }[/math]

Gleichsetzen der Übertragungsfunktionen:

[math]\displaystyle{ G_2(s)= {V_0 \over s^2 R_3C_3R_4C_4 + s[R_3C_3(1-V_0)+R_3C_4+R_4C_4]+1} \overset{!}{=}\frac{1}{\frac{s^{2}}{\omega_{g}^{2}}+0,8\cdot\frac{2s}{\omega_{g}}+1} }[/math]

Aus Koeffizientenvergleich erhält man folgende Gleichungen:

[math]\displaystyle{ R_{3}R_{4}C_{3}C_{4}=\frac{1}{s_{g}^{2}}\,\Rightarrow\, R_{4}=\frac{1}{s_{g}^{2} R_{3}C_{3}C_{4}} }[/math]

[math]\displaystyle{ R_{3}C_{3}\cdot(1-V_0)+ R_{3}C_{4}+R_{4}C_{4}=\frac{1,6}{s_{g}} }[/math]

[math]\displaystyle{ 0= R_{3}^{2}\left(C_{3}\cdot(1-V_0)+C_{4}\right)-R_{3}\cdot\frac{1,6}{s_{g}}+\frac{1}{s_{g}^{2} C_{3}} }[/math]

[math]\displaystyle{ R_{3a,b}=\frac{\frac{1,6}{s_{g}}\pm\sqrt{\frac{4\cdot0,64}{s_{g}^{2}}-{4\over s_g^2}\frac{( C_{3}\cdot(1-V_0)+C_{4})}{ C_{3}}}}{2 (C_{3}(1-V_0)+C_{4})}=\frac{1\pm\sqrt{0,64-\frac{C_{3}(1-V_0)+C_{4}}{C_{3}}}}{ (C_{3}(1-V_0)+C_{4})s_{g}} }[/math]

mit der Diskriminante [math]\displaystyle{ D=0,64-{C_3\cdot(1-V_0) + C_4 \over C_3} }[/math]

Für die doppelte Lösung mit [math]\displaystyle{ D = 0 }[/math] gilt: [math]\displaystyle{ C_3\cdot(V_0+d^2-1)=C_3\cdot(V_0-0,36)= C_4 }[/math] und damit [math]\displaystyle{ C_3(1-V_0)+ C_4=0,64C_3 }[/math]

Jetzt kann man beispielsweise [math]\displaystyle{ C_3 }[/math] wählen und erhält dann [math]\displaystyle{ C_4=C_3\cdot(V_0-0,36) }[/math], [math]\displaystyle{ R_3={1\over s_g d C_3} }[/math] und [math]\displaystyle{ R_4={1\over s_g^2R_3C_3C_4} }[/math]

Aufpassen muss man natürlich, dass man die Bedingung [math]\displaystyle{ R_3 \gg {1\over \left| j \omega_{PWM} C_2 \right|} }[/math] einhält. Diese Bedingung kann mit der Formel für R_3 auch umgeschrieben werden zu:

[math]\displaystyle{ {1 \over s_g C_3} \gg {1\over \omega_{PWM} C_2 } }[/math]

[math]\displaystyle{ {C_3} \ll {\omega_{PWM} C_2\over s_g } }[/math]

[math]\displaystyle{ C_3 \lesssim { \omega_{PWM} C_2 \over 10 s_g } = { C_2 \over 5} \sqrt[4]{N \over 12,64 } }[/math]

Zusammenfassung zur Anwendung der Ergebnisse

Als bekannte Größen werden benötigt:

[math]\displaystyle{ f_{Takt} }[/math]: Die Frequenz, mit der der Mikrocontroller läuft

[math]\displaystyle{ N }[/math]: Die Auflösung der PWM bzw. die Größe des entsprechenden Zählers

[math]\displaystyle{ \varepsilon }[/math] oder [math]\displaystyle{ V_0 }[/math]: Falls ein kleinerer Ausgangspegel gewünscht ist, gilt [math]\displaystyle{ \varepsilon = {U_{out, max} \over U_0 } }[/math] und [math]\displaystyle{ V_0=1 }[/math], bei gleichem Pegel [math]\displaystyle{ \varepsilon =1 }[/math] und [math]\displaystyle{ V_0=1 }[/math] und bei höherem Pegel [math]\displaystyle{ \varepsilon =1 }[/math] und [math]\displaystyle{ 1\lt V_0\lt 3 }[/math]

Damit kann man sich die Grenzfrequenz [math]\displaystyle{ s_g = \pi f_{Takt}\sqrt[4]{12,64\over N^5} }[/math] berechnen.

Jetzt wählt man zwei Kondensatoren [math]\displaystyle{ C_1 }[/math] und [math]\displaystyle{ C_2 }[/math], die im Wert möglichst weit/ein paar Zehnerpotenzen auseinanderliegen, weil [math]\displaystyle{ C_1 \gg C_2 }[/math] gelten soll. Jetzt kann man natürlich auch ein bisschen mit den Kondensatorwerten spielen, um auf bessere Widerstandswerte zu kommen.

Für die Widerstände gilt dann:

[math]\displaystyle{ R_{1}=\frac{1}{\varepsilon(C_{1}+C_{2})s_{g}} }[/math]

[math]\displaystyle{ R_{2}=\frac{1}{s_{g}^{2}\varepsilon R_{1}C_{1}C_{2}} }[/math]

Und für die weiteren Kondensatoren:

[math]\displaystyle{ {C_3} \lesssim {{ C_2\over 5} \sqrt[4]{N\over 12,64} } }[/math]

[math]\displaystyle{ {C_4} =C_3\cdot(V_0-0,36) }[/math]

Und für die weiteren Widerstände:

[math]\displaystyle{ R_{3}=\frac{1}{0,8\cdot C_{3} s_{g}} }[/math]

[math]\displaystyle{ R_{4}=\frac{1}{s_{g}^{2}R_{3}C_{3}C_{4}} }[/math]


Den gewünschten Ausgangspegel kann man noch über den Widerständ [math]\displaystyle{ R_x }[/math], [math]\displaystyle{ R_A }[/math] und [math]\displaystyle{ R_B }[/math] einstellen. Falls keine Dämpfung gewünscht ist, also [math]\displaystyle{ \varepsilon=1 }[/math], kann man einfach [math]\displaystyle{ R_x }[/math] weglassen. Falls keine Verstärkung gewünscht ist, also [math]\displaystyle{ V_0=1 }[/math], kann man [math]\displaystyle{ R_A }[/math] durch einen Kurzschluss und [math]\displaystyle{ R_B }[/math] durch einen Leerlauf ersetzen. Ansonsten gilt:

[math]\displaystyle{ R_x = {\varepsilon\over1-\varepsilon}R_1 }[/math]

[math]\displaystyle{ V_0 = 1 + \frac{R_A}{R_B} }[/math]

Ein weiteres Beispiel: Ausprobieren der Schaltung mit LTSpice

Ich werde wieder das vorherige Beispiel aufgreifen: [math]\displaystyle{ f_{Takt}=1MHz }[/math], [math]\displaystyle{ \varepsilon=1 }[/math], [math]\displaystyle{ V_0=1 }[/math] und [math]\displaystyle{ N=1024 }[/math], d. h. [math]\displaystyle{ s_g \approx 1022 {1 \over s} }[/math]. Für die Kondensatoren soll gelten [math]\displaystyle{ C_1 = 100n }[/math] und [math]\displaystyle{ C_2 = 2,2n }[/math]. Dann erhält man für die Widerstände [math]\displaystyle{ R_{1}=9,57k }[/math] und [math]\displaystyle{ R_{2}=455k }[/math].

Für [math]\displaystyle{ {C_3} }[/math] erhält man [math]\displaystyle{ {C_3} \lesssim {{ 2,2n\over 5} \sqrt[4]{1024\over 12,64} }=1,32n }[/math].

[math]\displaystyle{ {C_3} = 1n }[/math]

[math]\displaystyle{ {C_4} = 0,64n }[/math]


[math]\displaystyle{ {R_3}= \frac{1}{1n \cdot 0,8\cdot 1022}=1223k }[/math]

[math]\displaystyle{ {R_4}= \frac{1}{1n \cdot 0,64n 1022^2\cdot 1223k}=1223k }[/math]

Die deutliche Verbesserung bezüglich der Geschwindigkeit sieht man im folgenden Bild - das Simulationsergebnis der Transientenanalyse mit LT-Spice. Die Zeit, bis sich der Endwert eingestellt hat, hat sich von über 40 ms auf ca. 10 ms verbessert.

Das Schematic zur Simulation steht unten als Download bereit.

Transientenanalyse-tiefpässe.png

Realisierung der berechneten Werte

Betrachtung der Kondensatorwerte

Die ersten drei Kondensatoren sind ja frei wählbar. Hier dürfte sich also kein Problem ergeben.

Beim Kondensator [math]\displaystyle{ {C_4} = C_3 \cdot (V_0 - 0,36) }[/math] verhält es sich schon anders. [math]\displaystyle{ V_0 }[/math] ist ja fest. Deswegen ist es sinnvoll, den Paramter [math]\displaystyle{ d = 0,8 }[/math] etwas größer zu wählen. Damit verzichtet man zwar auf etwas Geschwindigkeit, dafür erhält allerdings man einen Kondensatorwert für [math]\displaystyle{ C_4 }[/math], den man auch kaufen kann.

[math]\displaystyle{ {C_4} \ge C_3 \cdot (V_0 - d) }[/math] mit [math]\displaystyle{ d \ge 0,8 }[/math]

[math]\displaystyle{ d = \sqrt{{C_4 \over C_3} +1 - V_0 } }[/math]

Für der Spezialfall [math]\displaystyle{ V_0=1 }[/math] ergibt sich [math]\displaystyle{ {C_4} \approx C_3 \cdot 0,68 }[/math] (2 Schritte darunter in der E12- bzw. 4 Schritte in der E24-Reihe) und damit für [math]\displaystyle{ d = 0,825 }[/math].

Betrachtung der Widerstandswerte

Mit dem neuen Werte für [math]\displaystyle{ d }[/math] müssen die Widerstände [math]\displaystyle{ R_3 }[/math] und [math]\displaystyle{ R_4 }[/math] neu berechnet werden.

Alle Widerstandswerte können entweder durch eine Parallelschaltung - berechnet z. B. mittels Programm - oder durch den nächsten bzw. nächstgrößeren Widerstandswert realisiert werden. Der höhere Widerstandswert bedeutet einen höhere Zeitkonstante und damit einen niedrigere Grenzfrequenz. Damit wird man zwar etwas langsamer, ist aber bezüglich der Dämpfung des Ausgangssignals auf der sicheren Seite.

Zum Vergleichen der Schaltungen sind auch beispielhafte Realisierungen im LT-SPice-Schematic eingetragen. Die Ergebnisse werden nicht besonders stark verfälscht.

Downloads