Forum: Mikrocontroller und Digitale Elektronik Erweiterung des Messbereiches durch Bit-Verschiebeung


von Vili (Gast)


Lesenswert?

Hi,



Ist es möglich, den Messbereich einer Spannungsmessung nach der Messung 
via Software zu erweitern? Ziel wäre es, die untersten Bits des 
ADC-Wandlers auch zu nutzen?

Ich meine folgendes:
ADC: 10bit - 2^10 = 1014
Zu messende Höchstspannung: 5V

5V / 1024 bit = 0,0048828125 V / bit = 4,8828125 mV / bit

Gewünscht wäre es aber 488,28125mV statt 4,8828125 mV.

Ist es möglich, via Software die Auflösung zu verbessern, indem man 
Bitverschiebung und dann welche Filterung (LP / PT1) verwendet?

Hat jemand vlt. bessere Idee?

: Verschoben durch User
von Arc N. (arc)


Lesenswert?

Irgendwie passt da was nicht zusammen...
Der Messbereich wird nicht erweitert, da maximal 5V gemessen werden 
sollen und ~488 mV statt ~4.88 mV erweitert den Bereich auch nicht und 
verschlechtert die Auflösung...
Sind da vielleicht ~488 uV statt 4.88 mV gemeint?
Falls ja: Geht theoretisch und praktisch, wenn das Eingangssignal 
genügend rauscht (oder Rauschen hinzugefügt wird (Dithering)).
http://www.atmel.com/images/doc8003.pdf

von A. S. (Gast)


Lesenswert?

Arc N. schrieb:
> Irgendwie passt da was nicht zusammen...

Sehe ich auch so, Vili.

Beschreibe an einem Beispiel, wo Dein Problem ist. Sagen wir, Dein 
AD-Wandler spuckt adWert=205 aus, was etwa 1.0V = 1000mV entspricht.

Geht es Dir um Die Umrechnung im µC in Ganzzahl? Die ist für U in mV:

Umv=(adWert*5000)/1024 (bei uint32)

Wenn Du in 16-Bit bleiben willst, dann kannst Du 5000/1024 entsprechend 
kürzen, z.B. mit

Umv=adWert*200/41     (wenn adWert < 300)
Umv=(adWErt*50/41)*4  (wenn >= 300)

Das kannst Du natürlich noch beliebig "optimieren", doch macht man das 
eigentlich nicht
- man lässt den Compiler die 32-Bit-Rechnungen erledigen
- oder verwendet gleich float/double
- UND macht zum Zwecke der Kalibrierreserven 0..5V = 0...1000LSB was die 
Rechnung auf "*5" reduziert.

von Vili (Gast)


Lesenswert?

Arc N. schrieb:
> Irgendwie passt da was nicht zusammen...

Ja.. die Frage habe ich doof gestellt. Danke für den Link, der hat mir 
mal weiter geholfen.

Achim S. schrieb:
> Beschreibe an einem Beispiel, wo Dein Problem ist

zu messende Spannung: 5V
Input Signal: 2500 mV
ADC in Differential-Modus
Auflösung, mit der die gemessene Spannung bereitgestellt werden muss: 
1LSB= 0,000244140625mV -> 0,244140625uV
Faktor: 244140625
Offset: 1000000000 (1 000 000 000)

2^16 = 65.536  -> 5000mV / 65536 bit  = 0,0762939453125 mV/bit  -> 
76,2939453125 uV   -> 76uV
2^17 = 131.072 -> 5000mV / 131072 bit = 0,03814697265625mV/bit  -> 
38,146,97265625 uV -> 38uV
2^18 = 262.144 -> 5000mV / 262144 bit = 0,019073486328125mV/bit -> 
19,073486328125 uV -> 19uV

Theorie:
f_oversampling = 4^n * f_nuyquiest

sf = 2^n

Rohrwert: gemessen mit 16 Bit Auflösung

2500 / 5000 * 65536 = 32768 (Rohrwert / Registerwert)

Verbesserung der Auflösung um 1 Bit:
------------------------------------
Extra samples : 4
n = 1

Extra samples     : 32.764 + 32.769 + 32.768 + 32.766 = 131.067
Verschiebung um 1 : 131.067 >>= 1  -->> 65533

Rückrechnung:
17 Bit : 2500 / 5000 * 65.533 = 32.767

Verbesserung der Auflösung um 2 Bit:
------------------------------------
Extra samples : 6
n = 2

Extra samples     : 4 * (32.764 + 32.769 + 32.768 + 32.766) =  131.066
Verschiebung um 1 : 8008 >>= 4  -->> 16383

Rückrechnung:
18 Bit : 2500 / 5000 * 262144 = 131.072


RegVal = x * Faktor / Offset
x - Spannung in mV

Ergebnis bei 16 Bit:
--------------------
RegVal = 32768 * 244140625 / 1000000000 = 8.000

Ergebnis bei 17 Bit:
--------------------
RegVal = 65533 * 244140625 / 1000000000 = 16.000

Ergebnis bei 18 Bit:
--------------------
RegVal = 16383 * 244140625 / 1000000000 = 32.000



Achim S. schrieb:
> Geht es Dir um Die Umrechnung im µC in Ganzzahl?

Ich habe was gerechnet, sollte soweit passen. Aber irgendwie habe noch 
nicht ein vollständiges Bild bekommen, ob das so wirklich stimmt.
Was ändert sich, wenn ich Float statt Ganzzahl nehme? Werden bei der 
Berechnung die Kommastellen auch mitberücksichtigt. Dadurch wird meine 
Berechnung noch pünktlicher, gell?

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Das sieht alles recht wirr aus und hat einen Haufen Tipp- und 
Rechenfehler.

Was willst du tatsaechlich machen? Welche konkrete Messaufgabe mit 
welchem konkreten Equipment?

Wenn man die "untersten bits" des ADC-Wandlers nicht "nutzen" kann, ist 
die Frage erstmal: Haeh - Warum nicht?

Gruss
WK

von Vili (Gast)


Lesenswert?

Dergute W. schrieb:
> Was willst du tatsaechlich machen?

Ich möchte die Spannung messen und die dann mit einer Auflösung von 
0,000244140625mV bereitstellen. Die Höchstspannung liegt bei +/- 5V.
Als ADC verwende ich ein 16Bit DS-ADC im Differential-Modus.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Vili schrieb:
> Ich möchte die Spannung messen und die dann mit einer Auflösung von
> 0,000244140625mV bereitstellen. Die

Das sind 0.24 µV. Ist das Dein Ernst?

von MaWin (Gast)


Lesenswert?

Vili schrieb:
> Ich möchte die Spannung messen und die dann mit einer Auflösung von
> 0,000244140625mV bereitstellen. Die Höchstspannung liegt bei +/- 5V.
> Als ADC verwende ich ein 16Bit DS-ADC im Differential-Modus.

Und wo ist jetzt das Problem?
Die Auflösung des 16Bit ADC ist größer als deine Anforderung.
Dann ist doch alles in Ordnung, auch ohne Oversampling.

von MaWin (Gast)


Lesenswert?

MaWin schrieb:
> Und wo ist jetzt das Problem?

Oh moment streiche das. Meinst du tatsächlich Millivolt?
Das ist Unsinn auf allen Ebenen.

von Peter D. (peda)


Lesenswert?

Vili schrieb:
> ADC: 10bit - 2^10 = 1014

Vili schrieb:
> Als ADC verwende ich ein 16Bit DS-ADC im Differential-Modus.

Entscheide Dich mal.

von Jim M. (turboj)


Lesenswert?

Vili schrieb:
> Ich möchte die Spannung messen und die dann mit einer Auflösung von
> 0,000244140625mV bereitstellen. Die Höchstspannung liegt bei +/- 5V.
> Als ADC verwende ich ein 16Bit DS-ADC im Differential-Modus.

Für die Auflösung brauchst Du aber einen 24-Bit ADC. Schau Dir z.B. 
mal ADS1299 von TI an.

von Peter D. (peda)


Lesenswert?

Vili schrieb:
> Theorie:
> f_oversampling = 4^n * f_nuyquiest

Alle Theorie ist grau.
In der Praxis habe ich noch keinen einzigen ADC erlebt, der genauer als 
seine Bitauflösung war.
Anders gesagt, die hinzu geschummelten Subbits eignen sich bestenfalls 
als Lottozahlen und sind in der Regel nichtmal monoton.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Vili schrieb:
> und die dann mit einer Auflösung von
> 0,000244140625mV bereitstellen.

Hmmm. Okeeeeeeeeey.
Wem willst du die bereitstellen, was will der mit diesen vielen 
Nachkommastellen?

Gruss
WK

von Patrick B. (p51d)


Lesenswert?

Vili schrieb:
> Ich möchte die Spannung messen und die dann mit einer Auflösung von
> 0,000244140625mV bereitstellen. Die Höchstspannung liegt bei +/- 5V.
> Als ADC verwende ich ein 16Bit DS-ADC im Differential-Modus.

Also, +-5V = 10V Spannungsbereich bei einer ADC Auflösung von 16 Bit 
ergeben 152,58uV. Und selbst das finde ich jetzt sehr sportlich. INL und 
DNL sowie Offset-Fehler des ADC mahl nicht berücksichtigt. Dazu kommt 
noch ein super gutes Layout mit spitzen Filtern und einem Linearregler 
mit einem PSRR >100dB.

Ich denke, du hast bei deiner Aufgabe etwas falsch verstanden. Was du 
machen könntest, ist eine "manuelle" Bereichsumschaltung über einen 
Vorverstärker (Achtung Linearität, PSRR...): Bei kleinen Input-Signalen 
(z.B. +-100mV, oder +-1mV) jeweils auf den vollen Eingangsbereich des 
ADC verstärken (*100 resp. *1000).

Btw. schau dir mal gute Multimeter an. Diese sind meistens auch mit 
Bereichsumschaltung und im uV-Bereich noch genau, aber die kosten über 
600Euro.
Und ausserdem wird dir die Anzeige sowieso nichts bringen, weil 
vermutlich ein schaltendes Gate des uC oder ADC schon einen spürbaren 
Einfluss hat, mal von EMV und thermischen Einflüssen abgesehen...

Vili schrieb:
> Was ändert sich, wenn ich Float statt Ganzzahl nehme? Werden bei der
> Berechnung die Kommastellen auch mitberücksichtigt.

Das sind aber Grundlagen! Du hast es ja schon selber gesagt: Ganzzahl 
kennt keine Kommastellen. Bei einer Division wird alles nach dem Komma 
ignoriert. Wird dann wieder multipliziert, sind die Kommastellen 
verloren und dein Resultat verfälscht. Also musst du entweder die 
Rechnung entsprechend umstellen+skallieren, oder du rechnest mit einem 
grossen Zeitaufwand in float (manche uC haben FPUs, die dir das abnehmen 
könnten).

> Dadurch wird meine Berechnung noch pünktlicher, gell?
Ich weiss jetzt ehrlich gesagt nicht, was du da mit einer Uhrzeit 
meinst... ;)

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

Ich wollte erst fragen, ob Du die Frage vielleicht besser in Englisch 
stellst, da es anscheinend ernste Schwierigkeiten mit der Bedeutung von 
Begriffen gibt. Ich sehe aber, dass Du mit Zahlen ähnlich frei umgehst.

Vielleicht kann man es abkürzen: Wenn das folgende Deine Messwerte sind

Vili schrieb:
> Extra samples     : 4 * (32.764 + 32.769 + 32.768 + 32.766) =  131.066

dann musst Du von Deinen 16 Bit eher 2 Streichen als noch mehr 
herauskitzeln zu wollen.

von Arc N. (arc)


Lesenswert?

Peter D. schrieb:
> Vili schrieb:
>> Theorie:
>> f_oversampling = 4^n * f_nuyquiest
>
> Alle Theorie ist grau.
> In der Praxis habe ich noch keinen einzigen ADC erlebt, der genauer als
> seine Bitauflösung war.

Es gibt schlechte ADCs und brauchbare. Viele LTC24xx haben nominal 
24-Bit, aber noch 4 Sub-LSBs, die für's Oversampling nutzbar sind.
Diese Form von Oversampling ist völlig normal. Bestes Beispiel: 
Delta-Sigma-ADCs, die, in der einfachsten Form, exakt mit einem einzigen 
Bit auflösen...

> Anders gesagt, die hinzu geschummelten Subbits eignen sich bestenfalls
> als Lottozahlen und sind in der Regel nichtmal monoton.

Das ist ja gerade der Witz bei Delta-Sigma-Modulatoren erster Ordnung 
(im Gegensatz zu denen höherer Ordnung), dass die Ausgangsfunktion 
monoton und inhärent linear ist...

Patrick B. schrieb:
> Vili schrieb:
>> Ich möchte die Spannung messen und die dann mit einer Auflösung von
>> 0,000244140625mV bereitstellen. Die Höchstspannung liegt bei +/- 5V.
>> Als ADC verwende ich ein 16Bit DS-ADC im Differential-Modus.
>
> Also, +-5V = 10V Spannungsbereich bei einer ADC Auflösung von 16 Bit
> ergeben 152,58uV. Und selbst das finde ich jetzt sehr sportlich. INL und
> DNL sowie Offset-Fehler des ADC mahl nicht berücksichtigt. Dazu kommt
> noch ein super gutes Layout mit spitzen Filtern und einem Linearregler
> mit einem PSRR >100dB.

Wir sind nicht mehr in den 1980ern...
ADCs die das auch über den gesamten industriellen Temperaturbereich 
schaffen gibt's genug. Als Filter reichen (bei vielen 
Delta-Sigma-Wandlern) häufig passive erster oder zweiter Ordnung 
(X2Y-Kondensatoren sind da ganz nützlich).
Linearregler sind bei 16-Bit nicht unbedingt nötig (ADCs haben auch ein 
PSRR...).
Stand der Dinge sind z.Z. SAR-ADCs wie der LTC2508-32 mit 32-Bit 
Auflösung, INL/DNL oder Delta-Sigmal-Wandler wie der ADS1263 oder 
AD7177-2 mit 32-Bit Auflösung. Die entwickeln und bauen die Hersteller 
nicht zum Spaß, weil sie niemand kauft und einsetzen kann... Beim ADS 
reicht definitiv ein passiver Filter zweiter Ordnung und eine saubere 
Versorgung um auf die Datenblattangaben zu kommen. Nicht nur in klinisch 
sauberer Umgebung...
Allerdings gibt es heute immer noch ein Problem, dass es auch in den 
1980ern gab: Die Spannungsreferenz. Da hat sich seit der LTZ1000 nicht 
wirklich was getan.

(die Links zu den Papern wie man u.a. die INL, mit Hausmitteln, messen 
und korrigieren kann, fliegen hier in anderen Threads rum)

von Peter D. (peda)


Lesenswert?

Arc N. schrieb:
> Viele LTC24xx haben nominal
> 24-Bit, aber noch 4 Sub-LSBs, die für's Oversampling nutzbar sind.

Den LTC2400 habe ich früher auch eingesetzt. Der ist im Eingang sehr 
giftig, unter 2,5V treibt er Strom, darüber zieht er Strom.
Man braucht einen niederohmigen OPV am Eingang und auf keinen Fall 
Kondensatoren. Eine schlechte Eingangsbeschaltung sieht man an nicht 
monotonen Sprüngen.
Die 4 Sub-Bits sind wirklich Lottozahlen. Auch wenn man über 10 Minuten 
aufsummiert, bleiben sie Lottozahlen. Da ist absolut nichts 
rauszukitzeln.

Ich setze lieber etwas teuere und dafür bessere Wandler ein, z.B. 
AD7194BCPZ.

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.