Forum: Analoge Elektronik und Schaltungstechnik PWM-DAC-Filter


von Willi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

das Thema ist woanders schon aufgegriffen worden, jedoch eröffne ich 
hier ein neuen Thread mit einer neuen Frage, da mit Sicherheit viele 
auch an dieser Antwort interessiert sein werden.

Und zwar habe ich ein PWM-Signal mit einer PWM-Frequenz von 490 Hz (mehr 
kann mein Arduino UNO nicht).

Um daraus nun ein analog Signal zu generieren, schalte ich ein RC-Filter 
dahinter. Werte: R=900 Ohm und C=2e-6

Gedämpft wird es zwar schön, d.h. der Ripple ist in Ordnung, jedoch ist 
die Dynamik nicht ausreichend.

Bei einem Sprung dauert es ca. 15ms, bis die analog-Spannung ihren 
Endwert erreicht.

Nun meine Frage:
Mit welchem Filter kann man das ganze derart realisieren, dass der 
Ripple weiterhin klein bleibt, jedoch die analog-Spannung schneller 
ihren Endwert erreicht.
Ich würde es gerne hauptsächlich nur analog realisieren wollen.

Viele Grüße
Willi

von Linksammler (Gast)


Lesenswert?

im Arduino UNO ist ein Atmega328 verbaut, oder?

Der kann auch viel höhere PWM-Frequenzen, je nach gewünschter Auflösung.

Musst dann allerdings das gewohnte "analogWrite" verlassen, und ein 
klein wenig selber Hand anlegen.

von uwe (Gast)


Lesenswert?

Du brauchst nicht Filtern, der Motor ist der Filter. Aber 490Hz sind 
halt zu wenig. Die maximale Wandler Frequenz kann dann halt nur 1/490s 
sein also ca 2ms. Deine RC kombination läßt aber eh nur 5*RC = 
5*900*2e-6=9ms 1/9ms=111Hz zu. Der µC den du benutzt kann erheblich 
höhere Frequenzen (bei 8bit fast PWM und 16MHz Takt ca 60KHz) wenn man 
nicht die Arduino Firmware benutzt sondern den Atmel C Compiler (und die 
timer direkt programmiert).

von Linksammler (Gast)


Lesenswert?

uwe schrieb:
> nicht die Arduino Firmware benutzt sondern den Atmel C Compiler (und die
> timer direkt programmiert).

Geht auch ohne komplett auf Arduino zu verzichten.
Arduino ist ja nur ein bischen Library-Gewurschtel um einen normalen 
avr-gcc(g++) außenrum, und ansonsten normaler C++-Code mit vollem 
Registerzugriff.

http://playground.arduino.cc/Main/TimerPWMCheatsheet

von Stephan H. (stephan2807)


Lesenswert?

Willi schrieb:
> Und zwar habe ich ein PWM-Signal mit einer PWM-Frequenz von 490 Hz (mehr
> kann mein Arduino UNO nicht).

15bit-PWM? brauchst Du so viel Auflösung?
Bei 8 Bit sind 62,5kHz drin.


Willi schrieb:
> Bei einem Sprung dauert es ca. 15ms, bis die analog-Spannung ihren
> Endwert erreicht.
>
> Nun meine Frage:
> Mit welchem Filter kann man das ganze derart realisieren, dass der
> Ripple weiterhin klein bleibt, jedoch die analog-Spannung schneller
> ihren Endwert erreicht.

Die Zeitkonstante im Screenshot ist etwa 2ms, Grenzfrequenz etwa 80Hz.
Du suchst Filter "höherer Ordnung", und passender Charakteristik 
(Bessel, Tschebyscheff, Butterworth, ...).
Damit du bei einem 100%-Sprung auf die 15 Bit Genauigkeit kommst dauerts 
etwa 10 Zeitkonstanten. Für schnell wird das ein langer Filter werden...

Schau lieber ob die Auflösung wirklich nötig ist. Oder nimm gleich nen 
richtigen (externen) DAC.

Oder: Du weißt ja um den nachgeschalteten Filter mit einer Zeitkonstante 
von sagen wir mal 0,5ms (bei 490Hz PWM brauchst du mehr als das).
Statt 9941/32768 mit 15-Bit-PWM (490Hz) würde auch "78/256 78/256 77/256 
78/256 78/256 77/256..." mit 8-Bit-PWM(62,5kHz) passen 
(=9941.333/32768).
Macht den Filter viel einfacher und die Dynamik besser.

Stephan

von M. K. (sylaina)


Lesenswert?

Willi schrieb:
> Um daraus nun ein analog Signal zu generieren, schalte ich ein RC-Filter
> dahinter. Werte: R=900 Ohm und C=2e-6
>
> Gedämpft wird es zwar schön, d.h. der Ripple ist in Ordnung, jedoch ist
> die Dynamik nicht ausreichend.

Dabei ist der Ripple OK? Also ein Ripple von über 600mV wäre für dich 
OK? Hast du dir das wirklich angeschaut?
Also wenn du zwei oder drei RC-TP hintereinander schaltest solltest du 
problemlos innerhalb von wenigen Millisekunden den Analogendwert 
erreichen.

: Bearbeitet durch User
von Karl (Gast)


Lesenswert?

Einfach mal googlen, dann findet auch herauf, wie man dem Arduino eine 
höhere PWM-Frequenz entlockt:

http://playground.arduino.cc/Code/PwmFrequency

von Willi (Gast)


Lesenswert?

Linksammler schrieb:
> Musst dann allerdings das gewohnte "analogWrite" verlassen, und ein
> klein wenig selber Hand anlegen.

Problem ist, ich steuer das ganze über Simulink, daher wird es schwer 
für mich. Vll. möglich, das über Simulink zu erstellen?

uwe schrieb:
> Du brauchst nicht Filtern, der Motor ist der Filter. Aber 490Hz sind
> halt zu wenig.

Verwende eisenlose Spule, daher ganz geringe Induktivität.

Stephan H. schrieb:
> Die Zeitkonstante im Screenshot ist etwa 2ms, Grenzfrequenz etwa 80Hz.
> Du suchst Filter "höherer Ordnung", und passender Charakteristik
> (Bessel, Tschebyscheff, Butterworth, ...).
> Damit du bei einem 100%-Sprung auf die 15 Bit Genauigkeit kommst dauerts
> etwa 10 Zeitkonstanten. Für schnell wird das ein langer Filter werden...
>
> Schau lieber ob die Auflösung wirklich nötig ist. Oder nimm gleich nen
> richtigen (externen) DAC.

Wird also schwer werden meinst du, oder ?

Michael Köhler schrieb:
> Dabei ist der Ripple OK? Also ein Ripple von über 600mV wäre für dich
> OK? Hast du dir das wirklich angeschaut?
> Also wenn du zwei oder drei RC-TP hintereinander schaltest solltest du
> problemlos innerhalb von wenigen Millisekunden den Analogendwert
> erreichen.

Wo siehst du ein Ripple von 600mV? Etwa 30-50mV laut Simulation in 
Simulink.
Bei zwei RC-TP wirds leider net schneller sondern langsamer..?!?! 
Ebenfalls in Simulink ausprobiert, lasse mich gerne aber auch von dir 
Überzeugen, sofern du eine Simulation hast !

von Uwe (Gast)


Lesenswert?

Ich konzentriere mich mal auf deine Ausgangsfrage, und nicht darauf, ob 
für deine Applikation eine anderer Lösungsweg möglich oder besser wäre:
Willi schrieb:
> Mit welchem Filter kann man das ganze derart realisieren, dass der
> Ripple weiterhin klein bleibt, jedoch die analog-Spannung schneller
> ihren Endwert erreicht.

Analoge Filter, die möglichst schnell den Endwert erreichen, sind die 
Bessel-Filter. Je höher ihre Ordnung, desto steiler der Frequenzabfall, 
d.h., bei gegebener Anstiegszeit die Dämpfung einer bestimmten Frequenz 
jenseits der Grenzfrequenz. Zur Dimensionierung von analogen Filtern 
gibt es Hilfe auf vielen Webseiten, z. B. 
http://www.beis.de/Elektronik/Filter/ActiveLPFilter.html.

von M. K. (sylaina)


Angehängte Dateien:

Lesenswert?

Willi schrieb:
> Wo siehst du ein Ripple von 600mV? Etwa 30-50mV laut Simulation in
> Simulink.

Was hast du da simuliert?
Im Anhang mal meine Simulation, das Testsignal ist ein 500 Hz Signal mit 
einer DutyCycle von 50% (dabei entsteht der größte Ripple), blau ist das 
Eingangssignal, grün das Ausgangssignal des Tiefpasses.

: Bearbeitet durch User
von Possetitjel (Gast)


Lesenswert?

Willi schrieb:

> Wo siehst du ein Ripple von 600mV?

490Hz / 80Hz = 6

Dein Tiefpass dämpft die Schwankungen etwa um Faktor 6.
Wenn Deine PWM mit 5V/0V funktioniert, müssen nach dem
Filter die Schwankungen ungefähr 0.8V betragen.
Bei PWM 3.6V/0V sind es entsprechend 0.6V.

(Das gilt für Tastgrad 0.5. Bei anderen Werten sind die
Verhältnisse besser.)

> Etwa 30-50mV laut Simulation in Simulink.

Haut nicht hin.
Das, was Du simuliert hast, stimmt offensichtlich nicht mit dem
überein, was Du uns geschildert hast.

> Bei zwei RC-TP wirds leider net schneller sondern langsamer..?!?!

Du musst natürlich zwei schnellere Tiefpässe verwenden, z.B.
fg = 160Hz. Wunder darfst Du allerdings nicht erwarten.

> Ebenfalls in Simulink ausprobiert, lasse mich gerne aber auch
> von dir Überzeugen, sofern du eine Simulation hast !

Oh. Ach so. Tut mir leid. Ich konnte ja nicht wissen, dass Du
einer Simulationssoftware mehr glaubst als den Formeln, auf
denen die Software beruht.

von Karl (Gast)


Lesenswert?

Das kommt davon, wenn man eine PWM hat aber nur einen einmaligen Sprung 
von 2,5 V simuliert. Es fehlen einfach die grundlegendsten Dinge. Such 
dir ein anderes Projekt, dass zu dem Niveau deines Wissenstands passt, 
oder lerne dazu. So wie du das angehst wird das nichts!

von Madcat (Gast)


Lesenswert?

Vielleicht will er ja was bei diesem Projekt lernen, Karl ;)
Du hast aber Recht, bei Antworten wie der deinen auf seine Fragen wird 
das nix :(

von Willi (Gast)


Lesenswert?

Uwe schrieb:
> Analoge Filter, die möglichst schnell den Endwert erreichen, sind die
> Bessel-Filter. Je höher ihre Ordnung, desto steiler der Frequenzabfall,
> d.h., bei gegebener Anstiegszeit die Dämpfung einer bestimmten Frequenz
> jenseits der Grenzfrequenz.

Danke UWE, wie sieht es aber mit dem Ripple bei diesen Filtern aus ?

Michael Köhler schrieb:
> Was hast du da simuliert?

Stimmt, sorry, hatte natürlich zwei TP-RC Filter eingesetzt, du hattest 
recht !

von M. K. (sylaina)


Lesenswert?

Willi schrieb:
> Michael Köhler schrieb:
>> Was hast du da simuliert?
>
> Stimmt, sorry, hatte natürlich zwei TP-RC Filter eingesetzt, du hattest
> recht !

Das kommt dann eher hin…schau dir mal ein paar aktive Filter an. 
Schneller als rund 2 ms wird dein System aber nicht reagieren können 
aufgrund des Eingangssignals. Eine Periodenlänge musst du halt schon 
warten bevor aus der Mittlung der PWM auch was sinnvolles raus kommen 
kann.

von Stephan H. (stephan2807)


Angehängte Dateien:

Lesenswert?

Willi schrieb:
>> Schau lieber ob die Auflösung wirklich nötig ist. Oder nimm gleich nen
>> richtigen (externen) DAC.
>
> Wird also schwer werden meinst du, oder ?

Ja, Filter lang und aufwändig, bzw. nicht machbar.

Willi schrieb:
> Danke UWE, wie sieht es aber mit dem Ripple bei diesen Filtern aus ?

Den Ripple bekommst du nur durch höhere Ordnung, bzw. niedrigere 
Grenzfrequenz weg, das bringt aber immer Verzögerung mit sich:

Dein jetziger Tiefpass verschleift das Signal zu stark und dämpft den 
Ripple zu wenig. (blau)
Der selbe TP 3* hintereinander wäre vom Ripple vermutlich ok, 
verschleift/verzögert das Signal aber noch stärker. (grün)

Tiefpass 8-er Ordnung mit 250Hz wäre vom Ripple besser (pink)
Der Anstieg ist steiler, der "Endwert" wird früher erreicht, aber die 
50%-Schwelle des Signals ist etwa zur gleichen Zeit erreicht wie bei 
3*TP 80Hz.



Ripple unter 5% bekommst du ohne deutliche (einige ms) Verzögerung des 
Signals mit keinem Filter hin solange du bei der 490Hz-PWM bleibst.
Mit dem Ripple macht aber auch die "Genauigkeit" einer 15Bit-PWM keinen 
Sinn mehr.
Dann kannste auch 8Bit-PWM machen, die Grenzfrequenz des Filters 
hochsetzen, ggf. Filter 2.-Ordnung, mehr brauchts nicht. Falls wirklich 
notwendig die PWM dithern.

Das Ergebnis wird bei Verzögerung und Ripple deutlich besser sein als 
alles was du bei den 490Hz rausholen kannst.
Genauigkeit ist das gleiche machbar, nur bei sehr kleinen Werten 
(1/32768) klappts nicht mehr. Da geht dann wirklich nur ein heftiger TP.

Stephan

von Uwe (Gast)


Lesenswert?

Willi schrieb:
>> Analoge Filter, die möglichst schnell den Endwert erreichen, sind die
>> Bessel-Filter. Je höher ihre Ordnung, desto steiler der Frequenzabfall,
>> d.h., bei gegebener Anstiegszeit die Dämpfung einer bestimmten Frequenz
>> jenseits der Grenzfrequenz.
>
> Danke UWE, wie sieht es aber mit dem Ripple bei diesen Filtern aus ?

Ganz allgemein geantwortet: Gut. Aber im Ernst: Google nach 
"Bessel-Filter", und du wirst normierte Charakteristiken für die 
verschiedenen Ordnungen finden. Setz dir ein max. Restripple fest. Das 
maximale Ripple entsteht bei 50% PWM und ist in erster Näherung die 
Eingangsamplitude des Filters (3.3V?) multipliziert mit der 
Übertragungsfunktion bei der Frequenz. Willst du also 3,3 mV Restripple, 
muss die Dämpfung ca. 60 dB sein. Ich hoffe, dass du mit normierten 
Diagrammen umgehen kannst, das ist ja eigentlich einfach. Sonst wird mir 
das "Kochrezept" hier zu aufwändig.

von Willi (Gast)


Lesenswert?

Erst mal vielen Dank für eure Antworten.

Ich bin froh, dass ihr mir hilfreiche Tipps gegeben habt.

Danke ! meld mich noch mal, sofern ich mehr weiß =)

von Willi (Gast)


Lesenswert?

ich stelle mir grad die Frage, dass bei der Positionsregelung eines 
Motors durch die Filter nun die bandbreite erheblich eingeschränkt 
worden ist, oder ?

von M. K. (sylaina)


Lesenswert?

Willi schrieb:
> ich stelle mir grad die Frage, dass bei der Positionsregelung eines
> Motors durch die Filter nun die bandbreite erheblich eingeschränkt
> worden ist, oder ?

Definiere "erheblich". Da deine aktuelle PWM eh nur mit 490 Hz läuft ist 
deine Bandbreite eh nicht sonderlich riesig wie ich finde. Wie schon 
gesagt, dein Filter kann gar nicht schneller als ~2 ms sein weil das 
deine Periodendauer deiner PWM ist.
Für deine Positionsregelung kann das aber ausreichen, hier wäre schlicht 
die Frage wie genau du da regeln willst. In manchen Anwendungen genügt 
es auf grade mal einen Millimeter genau zu positionieren, für die 
meisten Anwendungen genügt es auf den zehntel Millimeter genau zu 
positionieren und IMO brauchen nur die wenigsten Anwendungen es noch 
genauer.
Ich denke es wäre gar nicht so verkehrt wenn du uns mal genau sagen 
würdest, was du eigentlich machen willst so getreu nach dem Motto "Ich 
will den Sonnenstand um 12 Uhr Mittags erfassen." und nicht "Ich will 
mit einer PWM einen Motor fahren lassen."

von Willi (Gast)


Lesenswert?

Michael Köhler schrieb:
> Willi schrieb:
>> ich stelle mir grad die Frage, dass bei der Positionsregelung eines
>> Motors durch die Filter nun die bandbreite erheblich eingeschränkt
>> worden ist, oder ?
>
> Definiere "erheblich". Da deine aktuelle PWM eh nur mit 490 Hz läuft ist
> deine Bandbreite eh nicht sonderlich riesig wie ich finde. Wie schon
> gesagt, dein Filter kann gar nicht schneller als ~2 ms sein weil das
> deine Periodendauer deiner PWM ist.
> Für deine Positionsregelung kann das aber ausreichen, hier wäre schlicht
> die Frage wie genau du da regeln willst. In manchen Anwendungen genügt
> es auf grade mal einen Millimeter genau zu positionieren, für die
> meisten Anwendungen genügt es auf den zehntel Millimeter genau zu
> positionieren und IMO brauchen nur die wenigsten Anwendungen es noch
> genauer.
> Ich denke es wäre gar nicht so verkehrt wenn du uns mal genau sagen
> würdest, was du eigentlich machen willst so getreu nach dem Motto "Ich
> will den Sonnenstand um 12 Uhr Mittags erfassen." und nicht "Ich will
> mit einer PWM einen Motor fahren lassen."

Also, mittlerweile habe ich es geschafft, mit meinem UNO auch höhere 
Frequenzen zu generieren.

Bis zu ca. 32 kHZ, das geht super und schnell.

Ich will einen Voice-Coil Motor (LINEARMOTOR) in eine Achse 
positionsregeln. Ideal unter ein zehntel mm, da mein Sensor die 
Anforderungen dbzgl. auch erfüllt. Als Verstärker nehme ich einen 
LeistungsOPV, der ca. 2 Ampere kann, was auch reicht.

von Uwe (Gast)


Lesenswert?

Willi schrieb:
> ich stelle mir grad die Frage, dass bei der Positionsregelung eines
> Motors durch die Filter nun die bandbreite erheblich eingeschränkt
> worden ist, oder ?

Der Motor selbst stellt einen Tiefpassfilter mit sehr viel niedriger 
Grenzfrequenz und höherer Zeitkonstante dar, als die hier besprochenen 
analogen Filter.

Aber: Schau' dir doch bitte noch einmal die Ausgangsfrage an. Da steht 
nichts von Motor. Der Willi hat diese Frage ganz bewusst auf die 
Theorie der Filter beschränkt, den Motor erwähnt er in einem anderen 
Thread. Deswegen habe auch ich nur auf die Frage geantwortet. Zu dem 
Zusammenhang mit einem Motor haben Andere in dem zugehörigen Thread 
schon das Richtige gesagt.

von Uwe (Gast)


Lesenswert?

Willi schrieb:
> Ich will einen Voice-Coil Motor (LINEARMOTOR) in eine Achse
> positionsregeln.

Willi, du fällst mir in den Rücken ;-)

von Willi (Gast)


Lesenswert?

Uwe schrieb:
> Willi schrieb:
>> Ich will einen Voice-Coil Motor (LINEARMOTOR) in eine Achse
>> positionsregeln.
>
> Willi, du fällst mir in den Rücken ;-)

Warum ? Ich bin doch nur HobbyELEKTRIKER =)

Hmm, also könnte ich direkt mit der PWM von 30kHZ auf die Spule ? Zuvor 
jedoch ein LeistungsOPV oder ein Transistor davor schalten.

Oder könnte man sagen: Ich filter mit RC zunächst PWM in DC, dann mit 
LeistungsOPV auf die Spule .

von Uwe (Gast)


Lesenswert?

Uwe schrieb:
> Willi, du fällst mir in den Rücken ;-)

Au weia, ich Spätmerker... Asche auf mein Haupt... Willi, du hast ja 
selber den Motor hier wieder in die Diskussion gebracht... Wer nicht nur 
lesen kann, sondern es auch tut, ist klar im Vorteil!

von Uwe (Gast)


Lesenswert?

So, nun reiße ich mich aber zusammen:

Willi schrieb:
> Hmm, also könnte ich direkt mit der PWM von 30kHZ auf die Spule ?
Ja, genau so macht man es in der Praxis.
>  Zuvor jedoch ein LeistungsOPV oder ein Transistor davor schalten.
Nein, das wird dann mit einer schnell schaltenden H-Brücke, 
üblicherweise aus MOS-FETs, gemacht. Der elektronische Aufwand ist 
erheblich geringer.
> Oder könnte man sagen: Ich filter mit RC zunächst PWM in DC, dann mit
> LeistungsOPV auf die Spule .
Nein. Nur der Motor filtert 1. mit seiner Induktivität das 
Rechtecksignal in DC (jedenfalls fast) und dann 2. mit seiner Trägheit 
in absolute Ruhe.

von Willi (Gast)


Lesenswert?

Danke Uwe für deine Antworten.

von Stephan H. (stephan2807)


Lesenswert?

Uwe schrieb:
> Nein. Nur der Motor filtert 1. mit seiner Induktivität das
> Rechtecksignal in DC (jedenfalls fast) und dann 2. mit seiner Trägheit
> in absolute Ruhe.

Jo. Und für die Zukunft: Erst mal prüfen was die wirklichen 
Anforderungen sind (Genauigkeit  Speed  ...).

Willi schrieb:
> Also, mittlerweile habe ich es geschafft, mit meinem UNO auch höhere
> Frequenzen zu generieren.
>
> Bis zu ca. 32 kHZ, das geht super und schnell.

Glückwunsch! Und mit der Positionsregelung dahinter wird auch die 
Genauigkeit kein Problem. Das ist ja dann eh mehrstufig: Spannung > 
Strom = Drehmoment = Beschleunigung > Geschwindigkeit > Position.

Um das ganze System schnell zu bekommen sind dann ganz andere Fragen 
wichtig als Ripple, Auflösung oder die Anstiegszeit einer dummen 
DAC-Spannung.

von Willi (Gast)


Lesenswert?

Danke Stephan ! Du hast recht

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.