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
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
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.
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
Okay probiere ich mal danke. Die Spannung wird zudem nur einmal richtig eingestellt und dann nicht mehr geändert.
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.
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.
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).
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".
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.
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
void analogWriteFreq(uint32_t freq) hab ich auch probiert, aber die Funktion ist nicht definiert.
> 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
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.
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
Michael B. schrieb: > http://www.tij.co.jp/jp/lit/an/spraa88a/spraa88a.pdf --------------------^^-^^-----------------------------
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.
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.
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
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.
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.
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... ;-)
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.