Ich will einen Analogwert ausgeben. Und weil es so schön wenig Aufwand ist, mach ich das mit PWM. Schnelle Zähler gibts genug im FPGA, also gleich mal einen gebaut mit 1MHz Takfrequenz. Ich möchte gerne 10Bit auflösen, dann ergibt sich eine PWM-Frequenz mit (etwa) 1kHz. Fertig.
Fast.
Denn: wie muß ich jetzt das RC-Glied auslegen?
Und: wie schnell wird der DA-Wandler reagieren?
Der Ausgangspunkt ist:
Ich habe eine Gleichspannung, die mit einer Wechselspannung (die PWM) überlagert ist. Jetzt brauche ich also einen Filter (Tiefpass), das mir den Wechselspannunganteil so stark herausfiltert, daß der Ripple kleiner als die PWM-Auflösung ist.
Ausgehend vom Beispiel der PWM-Frequenz 1kHz mit einer Auflösung von 1024 Schritten (also eine 10-Bit-PWM mit einem Eingangstakt von 1MHz), setze ich einmal ein RC-Glied als Filter an. Damit habe ich ein Filter 1. Ordnung, das mit 20dB/Dekade dämpft. Meine Anforderungen sind 10 Bit Auflösung, d.h. die PWM-Frequenz muß um den Faktor 1024 gedämpft werden. Das sind knapp mehr als 60dB. Mit der Filtersteilheit von 20dB ergibt das einen Abstand der Grenzfrequenz von 3 Dekaden (Faktor 1000). Also muß ich eine Zeitkonstante von 1024* (1/1kHz) = etwas mehr als 1 Sekunde einplanen.
Weiterhin ergibt sich mit einer Zeitkonstante von 1s natürlich der Effekt, dass der DA-Wert erst nach ln(1024) = 7s innerhalb des 1-LSB-Fehler-Fensters von 1024stel vom Endwert ist.
Hier noch ein paar grundlegende Formeln und Tabellen:
Auflösung -> gewünschte Bitanzahl des "AD-Wandlers"
Inkremente -> Anzahl der Takte für einen PWM-Durchlauf
tau -> die nötige Zeitkonstante, um den Ripple nach dem Filter kleiner als 1 LSB zu bekommen
Zeit bis Endwert -> Dauer, bis die Spannung am Kondensator im Bereich 1 LSB vom Endwert ist
Auflösung | Inkremente | Zeitkonstante tau | Zeit bis zum Endwert |
6 Bit | 64 | tpwm*64 | tau*ln(64) = tau*4,15 |
8 Bit | 256 | tpwm*256 | tau*ln(256) = tau*5,5 |
10 Bit | 1024 | tpwm*1024 | tau*ln(1024) = tau*6,93 |
12 Bit | 4096 | tpwm*4096 | tau*8,31 |
14 Bit | 16384 | tpwm*16384 | tau*9,7 |
Man sieht schon: Mit einem einfachen RC-Glied kommt man sehr schnell an die Grenze des Sinnvollen.
Da kann eine deutliche Erhöhung der PWM-Taktfrequenz zwar noch was holen, aber der Weisheit letzter Schluss kann das nicht sein:
10MHz Takt --> 10kHz PWM --> tau=1000/10kHz=0,1s --> Ausregelung in 0,7 Sekunden.
Eine Auflösung von 10 Bit mag noch machbar sein, aber z.B. schon als Spannungsvorgabe für ein Netzteil ist das zu langsam.
Jetzt kann aus der Zeitkonstante die Grenzfrequenz berechnet werden: fg=1/tau.
Und zusammen mit der bekannten Formel
Ergibt sich dann für z.B. tau = 0,1sec eine Grenzfrequenz von 10Hz. Zusammen mit einem Kondensator von 100nF (z.B. MLCC SMD-Kerko) ergibt das einen Widerstand von 159,2k Ohm.
Besser ist allerdings ein höher geordnetes Filter. Bereits mit einem Filter 2. Ordnung (und demnach 40dB/Dekade) reichen mir 2 Dekaden für die benötigten 80dB Abschwächung aus. Also munter zwei RC-Glieder hintereinandergeschaltet. Dabei ist zu beachten, dass die Berechnung der Grenzfrequenz jetzt nicht mehr so einfach ist, da sich die RC-Glieder beeinflussen.
Dazu folgende Simulation:
Oben (grün) ein einzelnes RC-Glied. Dessen Grenzfrequenz ist 235Hz.
Unten (rot) zwei hintereinandergeschaltete RC-Glieder mit identischen Werten. Die neue Grenzfrequenz ist wesentlich tiefer bei 88Hz.
Zu diesem Thema bietet auch die Seite http://sim.okawa-denshi.jp/en/CRCRtool.php einen Rechner für die verschiedensten RC-Kombinationen an.