Forum: Analoge Elektronik und Schaltungstechnik PWM TP-Filter


von Jack S. (jack1505)


Lesenswert?

Hallo Forum,
ich habe Probleme die Werte eines TP-Filters zu berechnen.
Ich möchte mittels eines PWM-Ausgangs eine Gleichspannung erzeugen. 
Diese soll für einen nachfolgenden Spannungsfolger genutzt werden. Vor 
diesen Spannungsfolger möchte ich einen TP-Filter einsetzen. Der 
verwendete Prozessor ist ein rp2040. Dessen Systemtakt beläuft sich auf 
133Mhz. So wie ich es verstanden habe ist es am besten den TP-Filter so 
auszulegen, dass dessen Grenzfrequenz der PWM-Frequenz entspricht.
Die PWM Frequenz wird dann über diese Formel berechnet: 
fpwm=fsys/period.
Was ich jetzt nicht ganz verstehe ist, wie berechne ich die Periode. Ich 
möchte eine Ausgangsspannung zwischen 1,55 und 1,65V erzeugen.
VG

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Jack S. schrieb:
> So wie ich es verstanden habe ist es am besten den TP-Filter so
> auszulegen, dass dessen Grenzfrequenz der PWM-Frequenz entspricht.

Wenn du einen R/C Filter meinst: Ich wäre überrascht, wenn der 
verbleibende Ripple für deinen unbekannten Anwendungsfall akzeptabel 
ist. Eine ideale Gleichspannung ist auf diese Art jedenfalls nicht zu 
erreichen.

Siehe 
http://www.mathe-mit-methode.com/schlaufuchs_web/mathematik/mathematik_lernmaterial/elektrotechnik/PWM/glaettung_PWM.html

Die PWM Frequenz berechnet man nicht aus der Taktfrequenz des 
Mikrocontrollers, sondern man stellt sie passend zum unbekannten 
Anwendungsfall ein.

Musst du uns umbringen, wenn wir den Anwendungsfall erfahren?

: Bearbeitet durch User
von Jack S. (jack1505)


Lesenswert?

Der Anwendungsfall sieht wie folgt aus: Die Spannung aus dem OPV soll 
als Offsetspannung für einen Instrumentenverstärker dienen. Dieser wird 
genutzt um die Messwerte einer Einstabmesskette auszunehmen. Der 
Spannungbereich dieser liegt zwischen -200mV und +200mV. Mit Verstärkung 
will ich diesen in den Bereich von 0V-3,3V verschieben.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Angehängte Dateien:

Lesenswert?

Anbei ein Beispiel mit 1 kHz PWM Frequenz und einem R/C Filter mit 1 kHz 
Grenzfrequenz. Wenn du LtSpice verwendest, kannst du andere Parameter 
selbst durchspielen.

> Der Anwendungsfall sieht wie folgt aus ...

Also brauchst du eine annähernd ideale Gleichspannung. Versuche es mal 
mit einer 10000 fach höheren Grenzfrequenz beim R/C Filter. Der reagiert 
dann allerdings auch entsprechend träge auf Änderungen des Signals.

Vielleicht besser einen DAC verwenden? Darin sind bessere und passend 
dimensionierte Filter integriert.

: Bearbeitet durch User
von Jack S. (jack1505)


Lesenswert?

Okay probiere ich mal danke. Die Spannung wird zudem nur einmal richtig 
eingestellt und dann nicht mehr geändert.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Da der Raspi mit 3,3V versorgt wird, müsstest du die Spannung in der 
Simulation wohl auf 3,3V einstellen. Fraglich ist, ob sie für deinen 
Fall stabil genug ist, wenn du nicht ständig nach regeln willst.

von Jack S. (jack1505)


Lesenswert?

Ich möchte die Bibliothek von earlephilhower nutzen und wenn ich das 
richtig gelesen habe ist die Standartfrequenz bei Nutzung von 
analogWrite() fpwm=1kHz mit 16Bit Auslösung. Kann mir das jemand 
bestätigen oder habe ich das falsch verstanden. Das würde alles deutlich 
einfacher machen.

von Kevin K. (nemon) Benutzerseite


Lesenswert?

Deine CPU taktet mit 133 MHz, aber zählt der PWM-Zähler auch mit diesem 
Takt hoch, oder einem Bruchteil davon. Und welche Auflösung hat deine 
PWM? Nehmen wir einmal an, dein PWM-Zähler ist 1/4tel deiner 
Taktfrequenz und deine Auflösung ist 256 Stufen. Dann ist ein Zyklus 
deiner PWM 133 MHz / (4x256) ~130 kHz. Dein Tiefpassfilter scheint keine 
besonderen Anforderungen an die Einschwingzeit zu haben (da statisch). 
Bei der Anforderung eines zügigen setzens würde ich die Grenzfrequenz 
bei 1/10 der PWM-Frequenz setzen (13 kHz), bei dir nochmals etwas 
langsamer, also 1-3 kHz (unter der Berücksichtigung obiger Annahmen).

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:
> Versuche es mal mit einer 10000 fach höheren Grenzfrequenz beim R/C Filter

Korrektur: ich meinte eine "niedrigere" Grenzfrequenz, nicht "höhere".

von Jack S. (jack1505)


Lesenswert?

Ich habe jetzt einmal nur die analogWrite() Funktion genutzt. Ich kann 
nach Messung mit oszi nur zwischen einem Bereich von 8 Bit auflösen mit 
einer Frequenz von 500Hz. Finde ich komisch denn das widerspricht diesem 
Dokument (Beschreibung zur Bibliothek): 
https://arduino-pico.readthedocs.io/en/latest/analog.html

Ziel war es diese für die Arduino IDE zu nutzen. Hat jemand Erfahrung 
damit? Ich kann aus der Doku leider keine Werte zu Zählerfrequenz o.ä. 
entnehmen.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Jack S. schrieb:
> Ich habe jetzt einmal nur die analogWrite() Funktion genutzt. Ich kann
> nach Messung mit oszi nur zwischen einem Bereich von 8 Bit auflösen mit
> einer Frequenz von 500Hz.

Dann benutze doch mal analogWriteRange(), das auf der selben Seite 
dokumentiert ist. 8 Bit als Standardvorgabe ergibt Sinn, denn das ist 
eben historisch bedingt der Standardfall bei Arduino.

Dass die Standardvorgabe dort nicht dokumentiert ist, ist für Arduino 
Sachen typisch. Dadurch erscheint das System einfacher, als es ist und 
lockt genau die Leute an, für die es gemacht wurde.

: Bearbeitet durch User
von Jack S. (jack1505)


Lesenswert?

Hab ich probiert, jedoch dann kommt gibt der PWM Ausgang nichts mehr 
aus.

von Jack S. (jack1505)


Lesenswert?

void analogWriteFreq(uint32_t freq) hab ich auch probiert, aber die 
Funktion ist nicht definiert.

von Vanye R. (vanye_rijan)


Lesenswert?

> ich habe Probleme die Werte eines TP-Filters zu berechnen.

Aehem, du hast das Problem das dir absolut jede Grundlage fehlt.

Du willst eine Gleichspannung erzeugen. Du willst dabei eine gewisse
Qualitaet im Sinne von Rauschabstand haben. Die solltest du benennen.

Du kannst dann deine maximale Aenderungsgeschwindigkeit dieser 
Gleichspannung
definieren.

Du kannst festlegen wie hoch deine PWM-Frequenz sein soll oder darf.

Dann weisst die um wieviel dB du die PWM-Frequenz an deiner
Ausgangsfreuenz filtern musst damit der Traeger unter dem fuer dich
sinnvollen Rauschabstand liegt.

Und dann solltest du wissen welcher Ordnung dein Filter sein soll
und vielleicht auch noch welche Filtercharacterristic du nutzen willst.

Und dann kannst du deinen Filter berechnen.

> Eine ideale Gleichspannung ist auf diese Art jedenfalls nicht zu
> erreichen.

Ich kenne PWM-Systeme die erreichen locker mehr wie 16Bit Systemdynamik. 
Sind dann halt langsam.

Vanye

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Jack S. schrieb:
> Hab ich probiert, jedoch dann kommt gibt der PWM Ausgang nichts mehr
> aus.

Du könntest wenigstens deinen Quelltext zeigen - falls du an Hilfe 
interessiert bist.

von Michael B. (laberkopp)


Lesenswert?

Jack S. schrieb:
> . So wie ich es verstanden habe ist es am besten den TP-Filter so
> auszulegen, dass dessen Grenzfrequenz der PWM-Frequenz entspricht


http://www.lothar-miller.de/s9y/archives/11-RC-Glied-fuer-PWM.html
http://www.tij.co.jp/jp/lit/an/spraa88a/spraa88a.pdf

von Motopick (motopick)


Lesenswert?

Michael B. schrieb:

> http://www.tij.co.jp/jp/lit/an/spraa88a/spraa88a.pdf
--------------------^^-^^-----------------------------

von Jack S. (jack1505)


Lesenswert?

1
#include "hardware/adc.h"
2
#include "hardware/dma.h"
3
#include <Arduino.h>
4
5
uint16_t offset;
6
const int OVERSAMPLING_COUNT = 256;
7
const int pwm = 15;
8
 //int pwm_res = 0 ;
9
10
void setup() {
11
  Serial.begin(9600);
12
  analogReadResolution(12);
13
14
15
//analogWriteResolution(255);
16
  refout();
17
  off();
18
  
19
20
}
21
22
uint16_t off(){
23
  delay(1000);
24
  offset=average(27);
25
  return offset;
26
}
27
28
int average(int channel){
29
  
30
  int result=0;
31
  
32
  for(int i=0; i<OVERSAMPLING_COUNT ;i++)
33
  {
34
  
35
    result += analogRead(channel);
36
  }
37
  
38
  //result=result/OVERSAMPLING_COUNT;
39
  return result >> 8; // nicht unbedingt genauer
40
41
}
42
void refout(){
43
44
 analogWrite(pwm,2048); // ausgang immer 2,55 V
45
 delay(1500);
46
47
}
48
 
49
50
51
52
void loop() {
53
  //analogWrite(pwm,128);
54
  
55
  float res;
56
  //int adc= analogRead(28);
57
  int adc= average(27);
58
59
    //res = (adc-offset) * (3.3 / 4095.0);
60
    res = (adc) * (3.3 / 4095.0);
61
62
  // Ausgabe der Werte
63
  Serial.print("ADC-Wert: ");
64
  Serial.print(adc);
65
  Serial.print(" | Spannung: ");
66
  Serial.print(res,4);
67
  Serial.println(" V");
68
69
  delay(1000);
70
71
72
}


Das ist mein gesamter Code. Er ist noch nicht fertig deswegen noch recht 
unsauber.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:
> Dann benutze doch mal analogWriteRange()

Jack S. schrieb:
> analogWriteResolution(255);

Erkennst du den Unterschied?

> analogWrite(pwm,2048); // ausgang immer 2,55 V

Ja logisch, weil die der Bereich standardmäßig von 0 bis 255 geht. Nach 
einem analogWriteRange(2048) kannst du analogWrite(pwm,2048) benutzen.

Vermutlich wolltest du den Wertebereich 0-2047 (nicht 2048) verwenden.

von Gerhard O. (gerhard_)


Lesenswert?

Moin,

Ich hatte mich mit dem Thema in der Arbeit zu befassen und möchte gerne 
auf zielführende Hinweise verweisen:

https://www.edn.com/cancel-pwm-dac-ripple-with-analog-subtraction-but-no-inverter/

https://www.edn.com/fast-pwm-dac-has-no-ripple/

Duck und weg

von Jack S. (jack1505)


Lesenswert?

Danke für eure Hilfe. Ich muss zugeben ich hatte mich nicht zu 100% in 
das Thema eingelesen, bin jetzt aber besser Informiert. Aufgrund von 
Platzgründen habe ich mich für einen einfachen RP TP-Filter entschieden 
mit R=30k und C=30u

Dieser bracht zwar ca. 5 Sekunden aber das ist nicht schlimm muss man 
halt ein kurzen Moment Geduld haben. Ich habe damit ein schwanken von 
1/2LSB bei 8BIt und 500Hz. Da ich eh die Hälfte des Spannungsbereichs 
nehme, denke ich reicht das aus.

von Flip B. (frickelfreak)


Lesenswert?

Bin ich der einzige, der sich fragt, wieso ein DAC notwendig ist, um 
+-200mV auf 0-3,3V zu skalieren? Oder ist bei der PH- wert messung etwas 
besonderes zu beachten und kompensieren?

Ich mache das mittels Summierverstärker und festem Offset. Dadurch kann 
man eine präzise referenz nutzen und addiert sich nicht die Toleranzen 
von DAC+AMP+ADC auf.

von Joe F. (easylife)


Angehängte Dateien:

Lesenswert?

Flip B. schrieb:
> Bin ich der einzige, der sich fragt, wieso ein DAC notwendig ist, um
> +-200mV auf 0-3,3V zu skalieren?

LOL. Simple Analogtechnik scheint 2025 nicht mehr so beliebt zu sein... 
;-)

von Rainer W. (rawi)


Lesenswert?

Joe F. schrieb:
> LOL. Simple Analogtechnik scheint 2025 nicht mehr so beliebt zu sein...
> ;-)

Scheint mir auch so. Eine derart hohe Ausgangsimpedanz muss man wollen.

von Gerd E. (robberknight)


Lesenswert?

Rainer W. schrieb:
> Eine derart hohe Ausgangsimpedanz muss man wollen.

Geht es nicht um den Offset-Eingang eines Instrumentenverstärkers? Da 
würde ich jetzt eher eine sehr hohe Eingangsimpedanz erwarten, von daher 
würde das nichts ausmachen.

Und zur Not kann man immer noch einen Opamp als Spannungsfolger 
nachschalten. Dann natürlich dessen Offsetspannung beachten, die kommt 
als Fehler hinzu.

von Enrico E. (pussy_brauser)


Angehängte Dateien:

Lesenswert?

Gerd E. schrieb:
> Und zur Not kann man immer noch einen Opamp als Spannungsfolger
> nachschalten.

Man kann auch statt den beiden 5k6
Widerständen am Ausgang, auch einen geeigneten Widerstand vom -Eingang 
nach +3V3 schalten. Dadurch bleibt die Ausgangsimpedanz schön niedrig.

von Joe F. (easylife)


Lesenswert?

Enrico E. schrieb:
> Widerstand vom -Eingang
> nach +3V3

Das könnte man natürlich auch machen, man müsste hier allerdings eine 
negative Spannung hernehmen.

Und ich war jetzt zu faul hier einen passenden Widerstandsteiler zu 
errechnen, der einerseits die richtige Spannung ergibt und dessen 
Widerstände in Parallelschaltung wieder die benötigten 1k ergeben...

Ich würde es dann eher so wie Gerd machen und einfach einen 
Spannungsfolger hinpacken, wenn eine maximal niedrige Ausgangsimpedanz 
nötig ist.
Oder eben erstmal die Widerstände niederohmiger wählen, je nachdem was 
man sich an dieser Stelle eben an Strom "gönnen" kann.

von Flip B. (frickelfreak)


Lesenswert?

hier schlägt nun ein bisschen cunningham's law zu ;)

von Joe F. (easylife)


Lesenswert?

Flip B. schrieb:
> hier schlägt nun ein bisschen cunningham's law zu ;)

Das würde ich so nicht sagen. Wenn jemand fragt "welchen Pudding braucht 
man, um daraus ein Haus zu bauen" und bekommt - neben zahlreichen 
Pudding-Empfehlungen - auch die Antwort "nimm besser Steine" ist das die 
hilfreichste Antwort.

: Bearbeitet durch User
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.