Kennt jemand einen mathematischen Zusammenhang, wie sich durch Oversampling eines ADC der nutzbare Wertebereich erweitert?
Habe selbst ein paar Testreihen gefahren, Ergebnisse weiter unten.
Testplattform war ein mit einem AVR Tiny1627 bestückter Batterieschalter. Skizze anbei, nur als Orientierung. An ADC0...4 hängt der ADC-Mux des Tiny. Dessen ADC hat nominell 12 Bit Auflösung.
Eigentlich reicht die für den primären Zweck, mir kam aber noch die Idee über Ströme die SoC (state of charge) der Batterien abzuschätzen. Da die Shunts aus thermischen Gründen klein dimmensioniert sind, wäre eine 5-stellige Spannungauflösung (dez) sinnvoll. Das entspricht 14 Bit, mehr als der ADC liefert. Und zumindest das LSB ist eh "Rauschen", also nicht stabil. In der Praxis noch mehr.
Aber mit Oversampling sollte es gehen, ist alles zeit-unkritisch.
Die neueren Tinys der Serie 2 bieten einen Akkumulator für den ADC für bis zu 1024 Werte (10 Bit), ohne dass man dafür SW bemühen muss. Den habe ich verwendet.
Außerdem noch im letzten Test eine gleitende Mittelwertbildung von 128 Werten (7 Bit) on Top.
Hier die Ergebnisse meiner Testreihe. Mit "Rauschen" meine ich instabile Werte. Bei 2 Bit beispielsweise, wenn der Messwert von 12,000V bis 12,003V schwankt. Die 12V Speisebatterie hat 50 Ah, die sollte im betrachteten Zeitraum absolut stabil sein.
1
ADC Add Mittlung Zusammen Anzeige - "Rauschen" Stabil
2
12 Bit + 2 Bit + 0 Bit = 14 Bit => 14 Bit - 4 Bit = 10 Bit
3
12 Bit + 8 Bit + 0 Bit = 20 Bit => 14 Bit - 3 Bit = 11 Bit
4
12 Bit +10 Bit + 0 Bit = 22 Bit => 14 Bit - 2 Bit = 12 Bit
5
12 Bit +10 Bit + 7 Bit = 29 Bit => 17 Bit - 2 Bit = 15 Bit
Die Tabelle ist so zu lesen, dass ich mit einem 12 Bit ADC plus 4-fach oversampling (2 Bit) eine stabile Anzeige von 10 Bit Genauigkeit erhalte.
Oder von 29 Bit am Ende 15 Bit stabil anzeigbar sind.
Nochmal die Frage: hat jemand dazu eine theoretische Ableitung zur Hand?
Demnach führt vierfaches Oversampling zu jeweils einem Bit größerem
Wertebereich.
Der Wertebereich kann nicht größer werden als der Umfang / die Auflösung des A/D-Wandlers.
Im realen Aufbau wackelt das letzte Bit, vielleicht ist sogar auf das vorletzte wenig Verlass. Da kommt Oversampling ins Spiel, der Mittelwert mehrerer Messungen verringert die Streubereite.
Der Wertebereich kann nicht größer werden als der Umfang / die Auflösung
des A/D-Wandlers.
Das stimmt so nicht, sowohl die App-Note als auch meine Messungen zeigen eine Wertebereichs-Erweiterung. Rauschen spielt eine Rolle, schau dir das Paper an.
In meiner Tabelle fällt die erste Zeile aus der Rolle, muss mal kontrollieren ob das ein Messfehler ist.
Rauschen spielt eine Rolle, schau dir
das Paper an.
Das ist der entscheidende Punkt aber für mehr als 2 BIT mehr auch nicht zu gebrauchen. Ist wie in den Spionagefilmen in denen man aus einem unscharfen Bild ein gestochen, scharfes Bild macht. In der Praxis nicht sehr gut hinzubekommen.
Rauschen spielt eine Rolle, schau dir
das Paper an.
So ist es, ohne ein Störsignal läßt sich kein einziges Bit mehr erzielen.
Besser als Rauschen ist aber ein Dreieck oder Sägezahn, um den Bereich der Subbits gleichgewichtet zu durchfahren. Ansonsten bleiben die alten ATmega stabil auf 10 Bit stehen.
Nimmt man irgendein Störsignal, erzielt man zwar Subbits, aber das sind dann Mondwerte, d.h. ohne jeden linearen Zusammenhang.
Ich wollte mal einen 3000V Meßbereich und habe daher über je 1024 Meßwerte gemittelt. Es war schön zu sehen, wie die Anzeige jeweils in 3-er Schritten einrastete. Zwischenwerte erschienen jeweils nur bei Änderung der Eingangsspannung.
Das 3000V Netzteil war einfach zu stabil und mein Layout zu störarm.
In vielen Schaltungen hat man ja sinusähnliche 50Hz Brummeinstreuungen.
Das ergibt zwar keine lineare Subbits, aber sie sind wenigstens monoton.
Das große Erstaunen kommt dann aber, wenn die Schaltung für Batteriebetrieb sein soll und dann außerhalb des Labortisches mit der 50Hz Einstreuung plötzlich die Subbits fehlen.
Oder die Subbits davon abhängen, wie rum der Netzstecker eingesteckt ist.
Der Wertebereich kann nicht größer werden als der Umfang / die Auflösung
des A/D-Wandlers.
Wie kommst du darauf? Du darfst keine rauschfreien Signal betrachten. Für die kann das nicht funktionieren.
Damit Oversampling die Auflösung erhöht, muss natürlich möglichst ein amplitudenmäßig gleichverteiltes Rauschen vorhanden sein, dessen Amplitude in der Größenordnung von ein LSB liegt. Sonst hängt der ADC auf einer Bit-Stufe und man hat gar nichts vom Oversampling.
Das ist der entscheidende Punkt aber für mehr als 2 BIT mehr auch nicht
zu gebrauchen.
Nach ein paar mehr Messungen sehe ich das genau so. Zumindest bei meinem Aufbau sind mehr als 14 Bit nur noch Zufallszahlen.
Bin aber ganz ohne Oversampling deutlich von 12 Bit, der ADC-Auflösung, entfernt. Zu viel Geräusch.
Wahrscheinlich muss man die CPU während der Konvertierung stilllegen, will man stabile Werte haben.
Ist wie in den Spionagefilmen in denen man aus einem
unscharfen Bild ein gestochen, scharfes Bild macht. In der Praxis nicht
sehr gut hinzubekommen.
Damit der Vergleich nicht so sehr hinkt, macht man aus 1000 unscharfen Bildern vom gleichen Objekt ein Scharfes. Das könnte gehen.
Dieses ganze Schönrechnen bringt nur minimal etwas. Was man auch immer anstellt, ist die Genauigkeit der Messwerte von der Linearität des ADCs abhängig, und diese ist rechnerisch nicht zu verbessern.
Der Autor hätte besser zwischen Auflösung und Genauigkeit unterscheiden sollen. Oversampling kann nur eine höhere Auflösung liefern, aber nichts an der Genauigkeit ändern. Lediglich der Quantisierungsfehler lässt sich durch Oversampling verringern.
(S.1 "In most cases 10-bit resolution is sufficient, but in some cases higher accuracy is desired.")
https://ww1.microchip.com/downloads/en/appnotes/doc8003.pdf
Damit Oversampling die Auflösung erhöht, muss natürlich möglichst ein
amplitudenmäßig gleichverteiltes Rauschen vorhanden sein, dessen
Amplitude in der Größenordnung von ein LSB liegt.
Der Witz ist aber, dass das letzte "echte" Hardware-LSB eben schon mit +-1/2 LSB spezifiziert ist. Im Idealfall sieht es also so aus:
1
HW ADC
2
0 1 2 3 4
3
Oversampling
4
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Wenn es mit der Nichtlenarität des realen ADC dumm läuft, dann könnte die Schrittweite so aussehen:
1
HW ADC
2
0 1 2 3 4
3
Oversampling
4
0 1 2 3 4 5 6 7 8 9 101112 13 14 15 161718
Dan der Nichtlienarität des HW-ADCs ist also der oversampelte 1-LSB-Schritt von 5 nach 6 "gleich viel wert" wie die 3 Schritte von 1 nach 4.
Leicht erkennbar: man kann auf diese Art nicht aus einem billigen, schlechten ADC einen billigen, guten ADC mit mehr Auflösung und Linearität machen.
Und genauso leicht erkennbar: spätestens bei 3 zusätzlichen oversampelten Bits geht das dann je nach Baustein dramatisch schief.
Damit der Vergleich nicht so sehr hinkt, macht man aus 1000 unscharfen
Bildern vom gleichen Objekt ein Scharfes. Das könnte gehen.
Wie sollte das gehen?
Man könnte bestenfalls aus 1000 "gestörten", aber scharfen Bildern 1 ungestörtes scharfes Bild machen. Und das macht das Oversampling dann letztlich: es fügt Störungen hinzu, die sich dann wieder "rausmitteln". Aber das Wandlungsergebnis des ADC an sich ist schon "scharf".
Und genauso leicht erkennbar: spätestens bei 3 zusätzlichen
oversampelten Bits geht das dann je nach Baustein dramatisch schief.
Ich bin jetzt ganz, ganz fies mit einem Gegenbeispiel: delta-sigma ADC :D
Aber im Grunde hast du völlig recht!
Einzig gibt's die Ausnahme, dass du die Kennlinie gerade biegen kannst, wenn du einen wirklich monotonen ADC hast und den auch vernüngtig charakterisieren kannst.
Das aber gut zu machen ist aber nicht wirklich einfach...
Ich bin jetzt ganz, ganz fies mit einem Gegenbeispiel: delta-sigma ADC
Ja, da geht das genau deshalb wieder gut, weil der nur 1 einziges HW-Bit hat. Und das ist zu sich selber ausreichend linear ;-)
1
HW ADC
2
0 ... 1
3
Oversampling
4
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
wenn du einen wirklich monotonen ADC hast und den auch vernüngtig
charakterisieren kannst.
Ja, "einen", in Zahlen 1, denn diese Lösung ist garantiert nichts für irgendeine Serie. Und der DAC, der den einen billigen ADC dann charakterisieren soll, muss mindestens die Auflösung und Linearität haben, die letztendlich gewünscht ist.
Und der DAC, der den einen billigen ADC dann
charakterisieren soll, muss mindestens die Auflösung und Linearität
haben, die letztendlich gewünscht ist.
Und das ist genau der Punkt bei 1 BIT Wandler, also auch nix.
Damit der Vergleich nicht so sehr hinkt, macht man aus 1000 unscharfen
Bildern vom gleichen Objekt ein Scharfes. Das könnte gehen.
Wie sollte das gehen?
Man könnte bestenfalls aus 1000 "gestörten", aber scharfen Bildern 1
ungestörtes scharfes Bild machen. Und das macht das Oversampling dann
letztlich: es fügt Störungen hinzu, die sich dann wieder "rausmitteln".
Aber das Wandlungsergebnis des ADC an sich ist schon "scharf".
Ich meine das so, dass man zunächst die Bilder jedes für sich auf eine höhrere Auflösung interpoliert. Damit ist erstmal nichts gewonnen, nur Platz geschaffen.
Im nächsten Schritt alle überlagern. Durch das Rauschen vom Bildsensor werden die nicht alle gleich sein.
Wäre mal ein interessantes Experiment, mit einer Digitalkamera und Matlab / Octave leicht umzusetzen. Ist mir aber gerade zu aufwändig.
Das Beispiel vom Delta-Sigma-Wandler hinkt aus meiner Sicht, die HW mit der Subtraktion vom analogen Eingangswert etc ist doch nicht mit dem Oversampling der Ausgangswerte vergleichbar.
Der Witz ist aber, dass das letzte "echte" Hardware-LSB eben schon mit
+-1/2 LSB spezifiziert ist.
Richtig, nur der Quantisierungsfehler lässt sich durch Oversampling reduzieren.
Ein überlagerter Sägezahn und dazu phasensynchronisierte Abtastung wäre eine Methode, um bei einem idealen ADC ohne Rauschstatistik Sub-Bits zu erzeugen. Da würde man z.B. mit 4 Abtastungen bei 0°, 90°, 180° und 270° bereits 2 Bit gewinnen.
ADCs in Microcontrollern haben natürlich immer das Problem die ganzen Störungen von den anderen Funktionen auf dem Chip mit abzubekommen.
Dazu kommt dann noch die Frage was von außen dazu kommt und wie die Stromversorgung ausgelegt ist. Die Datenblätter der Hersteller gaben da typischerweise einige Hinweise was man machen soll, damit der ADC sauber läuft.
Ich hatte hier kürzlich sogar den Effekt, dass zu viel Groundplane und Durchkontaktierungen zu dieser ein Problem erzeugten. Klingt erst mal komisch, aber die sind im Endeffekt kleine Schwingkreise mit Kondensatoren und Spulen. Wir haben dann eine Groundplane raus geworfen und damit war der ADC ruhig.
Ich hatte hier kürzlich sogar den Effekt, dass zu viel Groundplane und
Durchkontaktierungen zu dieser ein Problem erzeugten. Klingt erst mal
komisch, aber die sind im Endeffekt kleine Schwingkreise mit
Kondensatoren und Spulen. Wir haben dann eine Groundplane raus geworfen
und damit war der ADC ruhig.
Ich habe eine 2-Lagen PCB mit einer recht flächig ausgebildeten Masselage. Die untersten zwei Bits von 12 kann man ohne Oversampling komplett vergessen.
Geht das bei dir besser? Wieviel Bits hat dein ADC?
Wie sieht das Layout nun aus, kann mir unter „rausgeworfener Groundplane“ nichts genaues vorstellen?
Evtl. den internen ADC vergessen und z.B. einen ADS1115 über I2C anbinden. So habe ich das gerade mit einem ESP32 auf Lochraster gemacht und das funktioniert ziemlich stabil, obwohl direkt daneben ein einphasiger StepUp-Wandler mit über 500W (~22V->40V) läuft.
Einziger Nachteil: Der ADS1115 scheint extrem langsam zu sein, wenn man gewohnt ist, mit einem µC-internen ADC zu arbeiten.
Ich bin jetzt ganz, ganz fies mit einem Gegenbeispiel: delta-sigma ADC
Ja, da geht das genau deshalb wieder gut, weil der nur 1 einziges
HW-Bit hat.
Hmmm? Es gibt doch auch Multibit-Delta-Sigma-Wandler z.B. MCP3461/2/4 (Bild)
Vom Prinzip her ist das Verfahren auch nicht nur auf AD- bzw. DA-Wandlung begrenzt.
Die quantisierte Gegenkopplung (hier mit dem DAC) ist der Trick!
Damit lassen sich die Fehler zum bereits quantisierten Signal aufintegrieren.
Könnte man auch zu Fuß mit dem ADC des AVR realisieren.
Einziger Nachteil: Der ADS1115 scheint extrem langsam zu sein
So sind Delta-Sigma-Wandler nun einmal.
Das steht gleich auf Seite 1 im Datenblatt. RTFM
Falls du schnell wandeln möchtest, brauchst du einen Wandler, der nach dem Flash-Prinzip arbeitet. Den bekommst du aber für bezahlbares Geld nicht mit 16 Bit Auflösung.