ich möchte per m328-adc die Spannung eines 15kW-48-V-PV-Akkus messen und danach den WR an- und ausschalten. Der ADC streut um ca.1v. Wie gleiche ich das am besten aus? Wie viele Messungen, Höchstwert, Mittelwert, Unterwert? Welche genauigkeit ist erreichbar?
1
int16_tadc_read(u8ADCchannel)
2
{
3
// Select ADC channel (0-7) by setting the lower bits of ADMUX
Der AVR Mega328 hat einen 10 Bit-Wandler. Wenn der um 1V streut, machst du was grundsätzlich falsch. Erläutere deinen Aufbau sowie die Schaltung (Stromlaufplan), vielleicht kann man helfen.
Nach meiner Erfahrung mit den moderneren ATTiny mit 12 Bit-Wandler, kann man bei einmaligen Auslesen die beiden unteren Bits vergessen.
Durch starke Überabtastung / Mittlung, was ja bei einer Batteriemessung ohne weiteres geht, ist die nominale Auflösung erreichbar.
Ki-Antwort:
2. Welche Filtermethode ist am besten?
Ich würde für deinen Fall mit 32 Messungen, Verwerfen der Extremwerte und anschließendem Mittelwert anfangen.
Verfahren Vorteil Nachteil Empfehlung
Einzelmessung Schnell Sehr störanfällig Nicht für Schaltentscheidungen
Mittelwert aus 8 Messungen Einfach Filtert starke Ausreißer nur begrenzt Gute erste Verbesserung
-Mittelwert aus 32 Messungen Reduziert zufälliges Rauschen Reagiert langsamer; hilft nicht gegen systematische Fehler Sehr gut
Minimum/Maximum Zeigt Schwankungen Einzelne Störungen verfälschen den Wert stark Zur Diagnose
Median aus 9 Messungen Unterdrückt einzelne Ausreißer Bei normalem Rauschen weniger effizient als Mittelwert Gut bei Störspitzen
32 Messungen, Extremwerte verwerfen Gute Kombination aus Glättung und Ausreißerunterdrückung Etwas mehr Rechenaufwand
Meine Empfehlung
Du musst nicht den höchsten und niedrigsten Wert jeder Messreihe speichern, um daraus die Akkuspannung zu bestimmen. Du kannst beide Werte verwerfen und die übrigen Messwerte mitteln. Minimum und Maximum kannst du zusätzlich zur Diagnose ausgeben.
Wenn du Ausreißer von einem Volt hast, ist es mit Filtern nicht getan. Beseitige erst mal den Fehler im Aufbau, sonst bleiben die Werte ein Lotteriespiel.
Oder du hast dich falsch ausgedrückt. Ohne genauere Infos kann man nichts sagen.
Bei 1V Streuung liegt ein Fehler in der Schaltung oder bei der Messung vor. Ein Filter würde nur an den Symptomen rumdoktern und, je nach Art des Fehlers, evtl. völlig unsinnige Werte liefern.
Beseitige den Schaltungsfehler bzw. die Störungen an der Quelle.
Wie sieht deine Schaltung aus (Schaltplan, Photo)?
Wie sehen Referenzspannung und Spannung am ADC-Mux-Eingang auf dem Oszi aus?
Ich habe vor 3 Jahren einen ausführlichen Test zur Oversampling-Messung mit einem M328 gemacht. Als Voraussetzung habe ich extra ein sauber aufgebautes Testboard erstellt, das absolut kein Rauschen (0 Bit) gezeigt hat.
Das Oversampling habe ich exakt nach AVR121 gemacht. D.h. Oversampling von 16 Werten, die 16 Werte addiert, 2 Bit-Rechtsshift und Teilen durch 4. Das sollte ein Ergebnis
mit 12 Bit Auflösung, d.h 0,27mV bei Vref=1,1V ergeben. Auch das Rauschen
wurde wie vorgeschlagen mit einem Timer erzeugt, das +-2Bit nicht
überschritten hat. Es wurde am Eingang aufaddiert. Dieses Dreieck-Rauschen habe ich synchron mit den 16 Messungen gemacht, also immer eine volle Periode.
Ich habe den ganzen Bereich in engen Stufen durchgefahren mit Rohwerten
von 10 bis 1021. Die Eingangswerte wurden mit meinem HP34401 gemessen
und mit den intern kalibrierten Werten verglichen.
Ich wollte es kaum glauben: es wurde im ganzen Bereich kein einziges Mal eine
Abweichung größer 0,27mV erreicht. D.h. volle 12 Bit Auflösung.
Also: richtig gemacht funktioniert das Oversampling wunderbar.
Also: richtig gemacht funktioniert das Oversampling wunderbar.
Wenn man zudem auch noch Glück gehabt und einen schön linearen ADC erwischt hat. Am nächsten Tag erwischt man dann aber einen, der sich das volle halbe Bit Nichtlinearität aus dem Datenblatt gönnt, und All die hübschen oversampelten Werte sind Makulatur.
Welche Art von "Streuung" ist das?
Zeig deine Schaltung und deinen Schaltungsaufbau. Hast du einfach mal mit einem Oszi am ADC-Eingang gemessen?
Welche genauigkeit ist erreichbar?
Realistisch: knapp unter 10 Bit. Wenn du also z.B einen Messbereich von 0..60V hast, dann wären das ca. 100mV.
Wenn du deine Schaltung aber so aufbaust, dass nur der interessante Bereich von z.B 30..60V gemessen wird, dann bekommst du 1 zusätzliches Bit "geschenkt". Deine Schaltung könnte also auf 50mV auflösen.
Ki-Antwort:
2. Welche Filtermethode ist am besten?
Ich würde für deinen Fall mit 32 Messungen, Verwerfen der Extremwerte
und anschließendem Mittelwert anfangen.
Alles klar, lösche die 'bösen' Werte und die 'wahren' Werte bleiben übrig.
Völliger Quatsch!
Der ADC läuft wohl mit 4 oder 8 MHz weshalb die Auflösung passt. Das hätte die 'KI' selber merken müssen, anstatt irgendwelchen Unsinn nachzuplappern.
ich möchte per m328-adc die Spannung eines 15kW-48-V-PV-Akkus messen
Gönn dir einen INA228 o.Ä., der misst bis zu 80V mit 20Bit-Auflösung, und lässt sich auch leicht an deinen Mega328 verbinden.
Gibt's als Breakout-Board bei den üblichen Maker-Shops.
Der Shunt auf den Boards ist natürlich nix für deinen PV-Akku.
Wenn du auch den Strom messen oder zumindest abschätzen willst, kannst du einen externen Shunt nehmen, oder das Akku-Kabel verwenden. Für einen groben Schätzwert zur Unterscheidung "Wird stark Geladen … fast nix … Wird stark entladen" reicht das auch.
Wenn du auch den Strom messen oder zumindest abschätzen willst, kannst
du einen externen Shunt nehmen, oder das Akku-Kabel verwenden.
Wenn man genau messen möchte, tut man gut daran, auch die Temperatur des Shunts/Kabels zu erfassen, um den Temperaturkoeffizienten zu berücksichtigen. Sonst nützt einem die Genauigkeit des INA228 nicht so richtig viel. Und ein sauberer 4-Leiter-Anschluss ist natürlich Pflicht.
Die Anzahl der Messungen sollte praktischerweise eine 2er Potenz sein damit man die Division mit einer simplen Schiebeoperation erledigen kann. 16 oder 32 Samples sollten dicke ausreichen.
Der ADC benötigt eine Clock zw 50 .. 200kHz! Er hat dafür einen eigenen Prescaler den du passend zur Haupt-Clock einstellen musst.
Was für einen Quarz hast du?
Mit ADMUX = (ADMUX & 0xF8) setzt du:
die Reference Voltage auf die interne 1.1V. Dazu wird ein extra Kondensator an AREF empfohlen.
Wenn deine Vcc deutlich höher als 1.1V ist und stabilisiert dann kannst du die als Referenz verwenden. Als Folge musst du die Messpannung weniger stark herunterteilen und gewinnst etwas Genauigkeit.
ADLAR auf left-adjusted, dein Ergebnis ist daher immer um 6 Bit nach links verschoben, an den "linken Rand". Also eine "voll gefüllte" 16-Bit Zahl/Variable. Ist das so gewünscht? Für die folgende Mittelwertbildung benötigst du dann die nächst grössere Type (uint_32t).
Gönn dir einen INA228 o.Ä., der misst bis zu 80V mit 20Bit-Auflösung,
und lässt sich auch leicht an deinen Mega328 verbinden.
Gibt's als Breakout-Board bei den üblichen Maker-Shops.
Der Shunt auf den Boards ist natürlich nix für deinen PV-Akku.
Das scheint mir die beste Lösung. Messung der Stromstärke brauche ich nicht – das geht über modbus. Das An-und Abschalten des Wechselrichters soll aber unabhängig von Modbus erfolgen – deswegen die Messung per ADC. Kann ich die 60 V direkt an das breakboard anschließen?
Der Aufbau der Schaltung ist relativ einfach. 2 Widerstände als Spannungsteiler um die 60 V zu reduzieren, Stromversorgung über Schaltnetzteil und Stepp Down Regler. Die einzelnen Messungen sind jetzt relativ konstant, d. h. Messungen hintereinander weichen kaum noch voneinander ab. Das Messergebnis schwankt aber zum realen Wert immer noch um knapp 1 V. Also im Prinzip nur eine Schätzung. Das 2. Foto zeigt den Schalter im Wechselrichter, an den das ganze ran soll.
1
voidadc_init()
2
{
3
// Set the ADC reference to AVcc
4
ADMUX=(1<<REFS0);
5
6
// Enable ADC and set prescaler to 128 (16 MHz / 128 = 125 kHz)
ich möchte per m328-adc die Spannung eines 15kW-48-V-PV-Akkus messen und
danach den WR an- und ausschalten
Vermutlich LFP.
Ein Lithium Akku in Reihenschaltung sollte nicht weiter geladen werden, wenn die ERSTE Zelle 3.6V erreicht und nicht weiter entladen werden wenn die Erste 2.5 erreicht, das überwacht normalerweise ein BMS und schaltet fann ab.
Wobei viele Leute den Akku nicht zu 100% nutzen möchten sondern nur von 3.0 bis 3.4V.
Die Spannung der LFP Zelle liegt meist bei 3.2 bis 3.3V, nur am Ende geht es rapide nach 3.6 bzw. 3.
Daher nutzt es NICHTS nur die Gesamtspannung des Akkus zu messen, man braucht die 16 einzelnen Zellenspannungen. Und LFP ist schwer zu balancen, eigentlich muss man die Zelle eine definierte Menge entladen (z.B. 1Ah) die nach einem Ladevorgang die höchste Spannung hatte, WENN ES NICHT DIESELBE IST DIE BEI ENTLADUNG DIE NIEDRIGSTE BEKOMMT.
Wenn du also verhindern willst, dass das BMS den Akku abgeklemmt und ihn nicht zu 100% nutzen willst, dann musst du Einzelzellenspannungen messen und die Entscheidung ob weiter geladen oder entladen wird davon abhängig machen. Und bleibt die vollste Zelle unter 3.5V macht das BMS kein Balancing, musst du es also selber übernehmen.
Ein Atmega328 misst die ca. 60V Messbereich übrigens besser als 0.1V auflösend, wenn er gegen die Interne Referenz vergleicht allerdings um +/-10% ungenau. Kalibriert man die wahre Referenzspannung dieses Exemplars wird es aber auf 0.12V genau. Einen Akku kann man massiv filtern, also z.B.den Mittelwert von 100 Messungen, da sich die chemisch relevante Akkuspannung nur ganz langsam ändert. Schnelle Schwankungen durch unterschiedliche Lade/Entladeströme am Innenwiderstand darf man wegmitteln, die sind für die Chemie des Akkus nicht relevant.
Sonst nützt einem die Genauigkeit des INA228 nicht so richtig viel
Die Anforderung vom TE war ja erstmal nur Spannungsmessung. Den Strom-Schätzwert gäb's für den Preis von einem dünnen Kabel obendrauf. Würde ich so mitnehmen, muss der TE aber natürlich nicht.
Wenn's dann doch ein genauer Coulomb-Counter werden soll, muss natürlich noch ein passender Shunt in die Leitung.
Die Anzahl der Messungen sollte praktischerweise eine 2er Potenz sein
damit man die Division mit einer simplen Schiebeoperation erledigen
kann. 16 oder 32 Samples sollten dicke ausreichen.
16 + 2 = 18 bzw. 32 + 2 = 34
Wenn man vor hat, die beiden Extremwerte rauszuschmeißen, müssen es wohl eher 18 bzw. 34 Messungen sein ;-)
// Je einen kleinsten und größten Wert entfernen.
sum -= min_val;
sum -= max_val;
Aber die ganze Diskussion nützt nichts, solange der Aufbau einen derartigen Mist abliefert.
Die wahre Baustelle ist nicht die Statistik oder der Rechenaufwand für eine Division.
Mach doch mal bitte ordentliche Bilder, bei denen der Fokus richtig liegt und man auch etwas erkennen kann. Einen Schaltplan oder eine Skizze zum Aufbau hat du auch noch nicht geliefert. Bei dem Lochrasteraufbau wundert es mich aber nicht, dass da nur Schätzwerte rausfallen. Was ist mit Abblock-Kondensatoren an AVCC und VREF?
Daher nutzt es NICHTS nur die Gesamtspannung des Akkus zu messen, man
braucht die 16 einzelnen Zellenspannungen.
Der Akku hat ein BMS - da will ich gar nicht eingreifen. Es geht nur darum, den Wechselrichter abzuschalten denn der hat einen Eigenverbrauch von 90Watt - auch nachts wenn die PV-Anlage vom Netz getrennt ist.
Kann ich die 60 V direkt an das breakboard anschließen?
Das hängt von der Verdrahtung der Akkuspannung (Leitungslänge, Massebezug) und vom Breadboard ab. Das Board sollte mindestens eine Schaltung zum Schutz des A/D-Wandlers und ein Filter gegen eingekoppelte Störungen besitzen.
Ansonsten ist zu empfehlen, für den A/D-Wandler eine stabile Referenz zu verwenden. Damit kann man sich eventuell einen Abgleich ersparen.
Ki-Antwort:
2. Welche Filtermethode ist am besten?
Ich würde für deinen Fall mit 32 Messungen, Verwerfen der Extremwerte
und anschließendem Mittelwert anfangen.
Alles klar, lösche die 'bösen' Werte und die 'wahren' Werte
bleiben übrig.
Völliger Quatsch!
Nicht wirklich. "Die KI hat's geschrieben, also ist es Quatsch" stimmt ausnahmsweise mal nicht:
AVCC klemmt man nicht einfach an VCC da kommt ein kleiner LC Filter dazwischen also von VCC mit 100µH zum AVCC-Pin und von dort mit 100nF gegen Masse. Beides möglichst nah den den µC, weiterhin solltest du den ADC Noise Canceler benutzen, da wird der "AD conversion complete interrupt" scharfgeschalten und dann in den Sleep Mode gewechselt, nach erfolgter AD Wandlung wird der µC geweckt, das reduziert weitere Chipinterne Störungen/Rauschen. RC Filter am Analogeingang schadet auch nicht damit das hochfrequente rausgefiltert wird und die Hold an Sample Stufe etwas widerstandsärmer schnell umgeladen wird.
Aber selbst wenn du nur 9 bits rausholt kannst du deine 60V durch 512 teilen was wieder 0,07V wäre (natürlich erst auf 5V runterteilen) und dann 5V/512.
Was verwendest du für einen Wechselrichter, der sich nicht richtig schlafen legt. Meist kannst du die über RS485 Modbus bzw. das BMS über CAN Bus ein und abschalten. Die Spannungswerte kannst du auch direkt auslesen braucht also keinen externe Wandlung.
Eine kleine Stolperfalle gibt es wenn man den Multiplexer verwendet und das ADMUX Register einfach immer um 1 hochzählen lässt, da dies nicht bis 7 zählt und dann wieder auf 0 springt sondern dir die anderen Bits verhunzt, achte also darauf nur di^e eine Bytehälfte zu verändern.
... sagt der Theoretiker. Tausende Boards haben kein LC-Filter und
liefern trotzdem sinnvolle Werte.
Das sagt nicht der Theoretiker sondern ATMEL in seinem Datenblatt
b. The AVCC pin on the device should be connected to the digital VCC supply voltage via an LC network as shown in Figure 23-9 on page 213.
Es ist ja jedem selbst überlassen ob er den Filter einbaut oder nicht. Ein AVR wird auch ohne Abblockkondensator zw. VCC und GND laufen, trotzdem baue ich den ein, genauso wie den LC-Filter für AVCC oder das RC Glied für den Resetpin.
Was verwendest du für einen Wechselrichter, der sich nicht richtig
schlafen legt. Meist kannst du die über RS485 Modbus bzw. das BMS über
CAN Bus ein und abschalten.
deye 12kw lp3. Abschalten per modbus - Register 80 - funktioniert leider nicht zuverlässig/ gar nicht. Ich habe da schon viel probiert. Die radikale Lösung ist per switch abschalten.
Was ich sehe, ist ein Verfahren, aus Lottozahlen einen 'sinnvollen' Mittelwert zu manipulieren. Welche Werte wo weggelassen werden hängt wohl von der Religionszugehörigkeit ab :-(
... sagt der Theoretiker. Tausende Boards haben kein LC-Filter und
liefern trotzdem sinnvolle Werte.
Das sagt nicht der Theoretiker sondern ATMEL in seinem Datenblatt
Das ist nur für Anwender, die nicht selber denken und verstehen möchten, was sie zusammenbauen. Selber habe ich das nie gemacht und immer die volle Genauigkeit des ADCs erreicht.
Was ist den daran so schwer?
Was ich sehe, ist ein Verfahren, aus Lottozahlen einen 'sinnvollen'
Mittelwert zu manipulieren. Welche Werte wo weggelassen werden hängt
wohl von der Religionszugehörigkeit ab :-(
Da muss ich widersprechen. Ich benutze einen ähnlichen Algorithmus seit vielen Jahren - habe aber erst jetzt erfahren, dass er sogar einen eigenen Namen hat. ;-)
Es ist eine sinnvolle Kombination aus average und mean. average ergibt einen schönen geschmeidigen Mittelwert, macht aber grobe Patzer wenn eine Störspitze hinein kommt. mean haut zwar die Störspitzen raus, aber man bekommt nur die eigentliche (integer) Auflösung aus der Mitte zurück.
Wenn man aber zB. mit nicht mehr als zwei Störungen pro 68 Messungen rechnet, dann sortiert man diese Messungen (mean), schmeißt oben und unten jeweils zwei weg und bildet von den mittleren 64 den average.
Das kann man mit gleichbleibenden Signalen, steigenden oder auch fallenden Signalen mal durchspielen. Natürlich nicht mit wilden Wellenformen, da trifft dieses System auf seine Grenzen. Aber langsame Änderungen eines quasi-statischen Systems kann man damit vorzüglich filtern.
Und mit nur wenig Programmieraufwand kann sich dieses System sogar dynamisch anpassen falls die Störsignale sich häufen. (In Grenzen natürlich)
Nimm das 1 pps Signal eines GPS-Empfängers, was systembedingt einen Jitter alle paar Sekunden aufweist. Mit dem o.g. Verfahren kann man diese 'Störenfriede' bestens beseitigen. Allerdings ist das ein Schuss in den Ofen!
Bei sauberem Aufbau der Schaltung und korrekter Programmierung liefert der ADC eines AVRs volle Auflösung mit jeder einzelnen Messung ohne jegliche Mittelwertbildung oder Trickserei.
Jetzt kannst Du mir wieder zustimmen ;-)
... sagt der Theoretiker. Tausende Boards haben kein LC-Filter und
liefern trotzdem sinnvolle Werte.
Das sagt nicht der Theoretiker sondern ATMEL in seinem Datenblatt
b. The AVCC pin on the device should be connected to the digital VCC
supply voltage via an LC network as shown in Figure 23-9 on page 213.
Der Mist ist auch nicht totzukriegen. Vor über 20 Jahren hat ein Praktikant bei Atmel Heilbronn eine Application Note über EMV geschrieben. Da hat er diese Induktivität verwendet. Das war damals schon ungünstig, denn die bildet mit dem Kondensator an AVCC einen Resonanzkreis, der einzelne Störungen verstärkt. Wenn, dann gehört da ein Ferrit hin, denn der dämpft. Das haben wir ihm damals schon gesagt, aber da war das Ding schon im Druck.
Seitdem wird diese Schaltung gedankenlos kopiert und Millionen von Designs haben diesen "LC-Filter" drin. Und die Schaltung taucht sogar in einzelnen Datenblättern auf.
Warum willst Du es nicht einfach im BMS abschalten?
Ich habe zwei Speicher Deye5kW + fellicity 10kW
Abschalten des WR löst ja die Probleme. Da kommt ein kleines Relais parallel zum switch und fertig. Man könnte es sicher auch anders machen. aber das ist eine einfache und für mich handelbare Lösung.
Der uc misst jetzt 63,4 Volt der WR zeigt 53,3V an also absolut unbrauchbar. Da hilft auch Nachbesserung der Schaltung nicht. Ich probier das wie oben vorgeschlagen mit einem ina288
Der uc misst jetzt 63,4 Volt der WR zeigt 53,3V an also absolut
unbrauchbar.
Das sind nicht nur 1V Streuung bei den ADC-Messungen, sondern satte 10 Volt Abweichung zwischen µC und WR (fast 20% !).
Um so dringender wird es Zeit, eine dritte Meinung einzuholen. Wurde Referenzspannung des ADC und Spannungsteiler richtig kalibriert?
Wo bleiben die Messungen?
Das Oversampling habe ich exakt nach AVR121 gemacht.
Leider lesen das viel nicht. Der Grund wird sein, dass man danach suchen muss.
Diese Dokumente werden einem oder wurden, habe schon lange nicht mehr danach gesucht, ja nicht gerade aufs Auge gedrückt.
AVCC klemmt man nicht einfach an VCC da kommt ein kleiner LC Filter
dazwischen also von VCC mit 100µH zum AVCC-Pin und von dort mit 100nF
gegen Masse.
... sagt der Theoretiker. Tausende Boards haben kein LC-Filter und
liefern trotzdem sinnvolle Werte.
Das hängt natürlich von der konkreten Anwendung ab. Grob über den Daumen: wenn auf dem PCB (oder in der Nähe davon) keine hohen und geschalteten Ströme fließen, dann ist dieser Filter meist verzichtbar. Also in den meisten Anwendungen.
Wenn aber hohe Ströme geschaltet werden, dann wird der Filter tendenziell umso notwendiger, je höher diese Ströme sind.
Mieses PCB-Layout und mieses Geräte-Design senkt übrigens die Schwelle, ab der die Ströme hoch genug sind, um den Filter wünschenswert bis unumgänglich werden zu lassen.
Hier wird über 1 Volt Ablage gegenüber 50 mV Auflösung palawert, da
dürfte etwas ganz anderes faul sein.
Das ist allerdings wahr. Das stimmt etwas ganz grundsätzlich nicht. Oder anders ausgedrückt: da wird der Filter auch nicht wirklich helfen.
Abschalten des WR löst ja die Probleme. Da kommt ein kleines Relais
parallel zum switch und fertig. Man könnte es sicher auch anders machen.
aber das ist eine einfache und für mich handelbare Lösung.
ist es nicht eher von hinten durch die Brust ins Bein, oder wie auch immer das Sprichwort heisst?
Eigentlich liegen Dir doch alle relevanten Messwerte durch BMS usw schon vor?
Ich frage hier einen 30kWh Akku per billigem Daly BMS ab, weiss jede einzelne Zellspannung
Kann das sein, dass die Widerstände des Spannungsteilers zu groß sind?
Ne, sind ~2mA die da durchfließen, ~100mW Verlustleistung an den Widerständen.
Da kann man sich langsam Gedanken um die Erwärmung der Widerstände machen...
Schau lieber ob dein Oszi auf "AC" steht.
Ansonsten: kleinen Kerko (100nF oder so) parallel zum 1k-Widerstand. Macht das Messen langsamer, aber schnelle Spannungsänderungen hat der Akku hoffentlich eh nicht.
Wenn du das Ergebnis in mV gerundet haben möchtest:
U = (ADC × 7363653UL + 32768) ÷ 65536UL
Wenn du das Ergebnis in V gerundet haben möchtest:
U = (ADC × 7404UL + 32768) ÷ 65536UL
Keine Angst vor großen Zahlen, der AVR überlebt das. ;-)
Und ein Überlauf entsteht bei 60V auch nicht, nach Multiplikation und Addition: 0xEA60F7EE
Du musst aber dringend mit uint32_t rechnen und auch als Return definieren.
Kann das sein, dass die Widerstände des Spannungsteilers zu groß sind?
Das kannst du leicht selber prüfen. Entferne die Last und gucke, ob sich die Spannung ändert.
Mit dem Oszi kannst du auch prüfen, ob beim Abtasten des Signals durch den ADC etwas passiert. Der Kondensator parallel zum 1kΩ Widerstand, um die dynamische Impedanz zu senken, wurde schon genannt.
Mit dem Multimeter messe ich dort 2,21V. Das Oszilloskope zeigt 180mV
an?
Dann stell erstmal dein Oszi richtig ein (var. Skalierung, Tastkopf) und prüfe an einer soliden 5V-Quelle, ob Multimeter und Oszi ähnliche Werte liefern, bevor du damit irgendetwas untersuchst.
Ich habe jetzt einen 3,6V Akku an den adc angeschlossen. Der adc-Wert schwankt zwischen 945 und 952 - brauchbar. Ich werde das jetzt beobachten und weiß dann, ob es am Spannungsteiler oder an der Referenzspannung liegt. 55V / 23000 OHM = 2,3mA - müsste eigentlich o.k. sein?
Wenn der AD-Wert trotz felsenfest konstanter Spannung des Test-Akkus um 7 Digits zappelt, dann zappelt die Referenzspannung, oder es gibt eine Masseschleife oder eingekoppelte Störungen. Normal ist das nicht. Vielleicht mit minimal-Aufbau erstmal verifizieren. Wo kommt die Referenzspannung her, intern oder extern 5V von einem USB?
Seitdem wird diese Schaltung gedankenlos kopiert und Millionen von
Designs haben diesen "LC-Filter" drin. Und die Schaltung taucht sogar in
einzelnen Datenblättern auf.
Danke für die Aufklärung. Schade dass das in Datenblättern die 10 Jahre später geschrieben wurden immer noch so drin steht, ich hatte das bereits im Datenblatt des AT90S8535 entdeckt.
Ich konnte diese Resonanzüberhöhung bei 160kHz bei mir auch nicht feststellen und das trifft anscheinend deswegen nicht auf, weil ich zum einen einen einen kleinen SMD Linefilter mit >1 Ohm und einen weiteren Filter an der Versorgungsseite habe der mit 3,5 Ohm ausgelegt ist dafür verwendet habe, der diesen Schwingkreis recht stark dämpft. Ansonsten könnte man die 100nF auch gegen 1µF tauschen, was die Resonanzfrequenz weiter nach unten schiebt. Mit einer Power Induktivität hingegen geht die Spitze auf über 40db hoch, aber das würde auch niemanden wegen dem benötigten Platz einfallen.
Wenn du das Ergebnis in mV gerundet haben möchtest:
U = (ADC × 7363653UL + 32768) ÷ 65536UL
Wenn du das Ergebnis in V gerundet haben möchtest:
U = (ADC × 7404UL + 32768) ÷ 65536UL
Wie kommst du auf 7363653 bzw. 7404?
Meine Rechnung:
1
65536 / 1024 * 5 * (22+1) / 1 = 7360
Denn bei einer Vref:5V entsprächen diese Werte einem "3,6V Akku" mit 4,614V…4,648V
Meine Vermutung: Vref ist nicht 5,0V, sondern 4,x V.
Mein Vorschlag: stabilisierte Vref (interne 1,1V oder externe 3,3V) verwenden.
Spannungsteiler so wählen, dass der gesamte ADC-Bereich genutzt wird (1023 bei Vmax).
Vmax ist bei Vref=5V und 22k:1k 5 * 23 = 115V
Brauchst du so viel?
Ich software-filtere ADC mit PT1 (z.B. im 10-Millisekunden-Interrupt)
und erreiche damit theoretisch 16 Bits:
(uint16_t)adcsum += ADC - (adcsum >> 6); //wird maximal 1023*64=65472
Bei Bedarf daraus die Spannung berechnen:
(uint16_t)mVolts = (((uint32_t)adcsum * faktor) + 32768) >> 16;
Das berücksichtigt den ersten Halbschritt und dann die folgenden Vollschritte des ADC gemäß Datenblatt.
Auch ist es auf einen optimalen Kalibrierungspunkt gerechnet. Hier vier verschiedene Punkte (nicht dass es irgend etwas Signifikantes am angezeigten Ergebnis ändern würde)
1
ADC faktor
2
127 7388797 In: 14.319 V … 14.431 V Mess: 14319.000 mV … 14431.000 mV
3
255 7374343 In: 28.694 V … 28.806 V Mess: 28694.000 mV … 28806.000 mV
4
511 7367157 In: 57.444 V … 57.556 V Mess: 57444.000 mV … 57556.000 mV
5
767 7364769 In: 86.194 V … 86.306 V Mess: 86194.000 mV … 86306.000 mV
habe das Schaltnetzteil jetzt durch einen Eisentrafo ersetzt.
Scheint etwas stabiler zu sein. Ich werde berichten.
Besser wäre sicherlich, nicht gegen die Versorgung als Referenz zu messen. Das würde schon mehrfach im Thread vorgeschlagen. Leider bietet der Mega328P hier nur zwei Alternativen, von denen nur eine ohne zusätzliche Hardwareaufwand auskommt.
Bliebe zu klären, was in den 5 Minuten passiert. Vermutung: Der Spannungsregler im Netzteil wärmt sich auf. Geht dessen Spannung direkt ins Ergebnis ein (weil der ADC auf 5V-referenz konfiguriert), machts die Messung nicht besser. Empfehlung: interne Referenz verwenden.