Forum: Mikrocontroller und Digitale Elektronik ADC auslesen


von Chris M. (chris_appment)


Angehängte Dateien:

Lesenswert?

Nabend,

Leider hängts gerade bei mir nicht nur zwischen den Beinen.
Ich programmiere mir gerade den ADS7961SBDBTR (8bit) von TI mit Python 
über ein Raspi.
Kommunikation klappt. Die Bits erhöhen sich auch bei steigender 
Spannung. Nur stehe ich bei der Bitauswertung auf dem Schlauch.
Der gibt mir einen Datenword wie angehängt im Bild aus.
Mein Problem ist, dass er die 4 ersten Bits des 1. Bytes dazu nutzt, um 
den abgefragten Channel zu "nennen". Da ich aber sowieso immer explizit 
nur einen definierten Channel anspreche ist diese "Info" für mich 
unnütz.
Wie rechne ich jetzt die restlichen 12 Bits der 2 Bytes in Volt um?

Vin=ADCwert∗Vref/256 is klar..

Aber ich stehe gerade aufm Schlauch wie ich das hier anwenden soll.
Ich ahne schon, dass die Lösung wieder so einfach ist, dass ich mich 
gleich schämen muss, hier gefragt zu haben :D.

Danke und Gruß

: Bearbeitet durch User
von Samuel C. (neoexacun)


Lesenswert?

Vin=(ADCwert & 0x0FFF)∗Vref/4096

von Chris M. (chris_appment)


Lesenswert?

Das Word gibt er mir als ein ByteArray aus.

Habe das jetzt so.

Bitmask = 0b00001111
Volt = (((Array[0] & Bitmask)+Array[1])*Vref/4096)

Wieso jetzt 4096? Dachte die Auflösung bezieht sich auf den Typ des 
ADC's. Spricht bei meinem 8-bit 256? Oder war meine Vermutung da ein 
Griff ins Klo und die Auflösung bezieht sich auf die Datenausgabe?

von Samuel C. (neoexacun)


Lesenswert?

Chris M. schrieb:
> Das Word gibt er mir als ein ByteArray aus.
> [...]
> Bitmask = 0b00001111
> Volt = (((Array[0] & Bitmask)+Array[1])*Vref/4096)

In dieser Form passt das. Das war vorher nicht ersichtlich.


> Wieso jetzt 4096? Dachte die Auflösung bezieht sich auf den Typ des
> ADC's. Spricht bei meinem 8-bit 256?

Da hast du Recht. Ich habe mir das Datenblatt nicht angeschaut. Bei 12 
Bit Result bin ich auch von 12 Bit Conversion ausgegangen. Aber ja, dein 
7961 macht nur 8 Bit. Also kannst dir vermutlich das 0-te Byte komplett 
sparen und einfach nur das letzte anschauen. Und dann selbstverständlich 
auch durch 256 teilen.

: Bearbeitet durch User
von Chris M. (chris_appment)


Lesenswert?

Das seltsame ist mit der 12-Bit-Rechnung hat die Spannung ziemlich gut 
gepasst und mit der 8-Bit so überhaupt nicht.

von Samuel C. (neoexacun)


Lesenswert?

Stelle das bitte mal genauer dar. Welche Spannung legst du an? Welche 
Werte erhältst du?

Edit: Wieviele Bytes ließt du pro Messung?

: Bearbeitet durch User
von Chris M. (chris_appment)


Lesenswert?

Samuel C. schrieb:
> Stelle das bitte mal genauer dar. Welche Spannung legst du an?
> Welche
> Werte erhältst du?

Es liegen 0.8V an und 0.78 misst er

>
> Edit: Wieviele Bytes ließt du pro Messung?

Pro Messung 2 Bytes.

von Samuel C. (neoexacun)


Lesenswert?

Chris M. schrieb:
> Es liegen 0.8V an und 0.78 misst er

Na, soooo weit ist das ja nicht weg.

von Chris M. (chris_appment)


Lesenswert?

Geb mich auch voll damit zufrieden, nur interessiert mich jetzt, warum 
unsere "falsch angenommene" Rechnung doch ins schwarze trifft :D

von M. K. (sylaina)


Lesenswert?

Chris M. schrieb:
> Geb mich auch voll damit zufrieden, nur interessiert mich jetzt, warum
> unsere "falsch angenommene" Rechnung doch ins schwarze trifft :D

Schau dir mal das Array genau an. 0.78 V hat in 8 bit den Value 40 
(Annahme: du benutzt 2*Vref, also 5V als Referenzspannung, ansonsten 
einfach mal für 2.5 V nachfolgende Überlegungen betrachten). Das ist das 
Bitmuster 101000. 0.78 V in 12 bit hat den Value 640 und das ist das 
Bitmuster 1010000000. Wie man sieht ist das 12 Bit Bitmuster lediglich 
das 8 Bit Bitmuster um 4 Bit nach links verschoben, sieht also schwer 
nach einem Left Alignment aus.
Und wenn jetzt dein Array nicht wirklich 8 bit ist sondern 16 bit 
(Datentyp beachten) würde das prima hinkommen.
Aus der anderen Richtung nämlich überlegt: Bei 12 Bit und 5 V VRef 
braucht es für 0.8 V den Value 640, der passt aber in keine 8 Bit, d.h. 
den maximalen Wert, den du mit einer 8 Bit Variablen ausrechnen könntest 
wäre 255/4096*5.0 und das sind etwa 0.31, da könntest du nie 0.78 heraus 
bekommen.

Ist jetzt aber alles irgendwie Stochern im Nebel.

von A. S. (Gast)


Lesenswert?

Das einfachste wird sein:
Du schreibst hier die adc-rohwerte für 0, 1, 2, 3, 4, 5V hin und welche 
ref-spannung du annimmst.

von Achim S. (Gast)


Angehängte Dateien:

Lesenswert?

M. K. schrieb:
> Wie man sieht ist das 12 Bit Bitmuster lediglich
> das 8 Bit Bitmuster um 4 Bit nach links verschoben, sieht also schwer
> nach einem Left Alignment aus.

Ich weiß nicht, aus welchem Datenblatt die Abbildung des TO kommt. Aber 
in folgendem Datenblatt
http://www.ti.com/lit/ds/symlink/ads7961.pdf
wird das genau so beschrieben:
- Erst kommen 4 Sonderbits (der Kanal oder der Wert der GPIOs),
- dann 8 Bit vom ADC-Wert (von MSB bis LSB),
- dann vier Dummy-Bits.

Das hätte der ADC-Hersteller natürlich auch anders machen können, aber 
auf diese Art kann man jeden der drei ADCs (8Bit, 10Bit oder 12Bit) 
einsetzen ohne etwas an Hardware oder Software ändern zu müssen.

von Chris M. (chris_appment)


Lesenswert?

Achim S. schrieb:
> M. K. schrieb:
>> Wie man sieht ist das 12 Bit Bitmuster lediglich
>> das 8 Bit Bitmuster um 4 Bit nach links verschoben, sieht also schwer
>> nach einem Left Alignment aus.
>
> Ich weiß nicht, aus welchem Datenblatt die Abbildung des TO kommt. Aber
> in folgendem Datenblatt
> http://www.ti.com/lit/ds/symlink/ads7961.pdf
> wird das genau so beschrieben:
> - Erst kommen 4 Sonderbits (der Kanal oder der Wert der GPIOs),
> - dann 8 Bit vom ADC-Wert (von MSB bis LSB),
> - dann vier Dummy-Bits.
>
> Das hätte der ADC-Hersteller natürlich auch anders machen können, aber
> auf diese Art kann man jeden der drei ADCs (8Bit, 10Bit oder 12Bit)
> einsetzen ohne etwas an Hardware oder Software ändern zu müssen.

Danke für eure Hilfe! Ich habe eben nochmal verglichen. Das Datenblatt 
bei Conrad ist leicht unterschiedlich als das direkt von TI. Conrad hat 
wohl eine alte Version...

Zusammenfassend: Durch 4096 teilen ist richtig? Scheint ja so sonst 
würde das Ergebnis ja nicht stimmen

Eine Frage hab ich dann noch. Ich habe jetzt zum Beispiel einen 12 
Bit-ADC. In wie weit verbessert sich jetzt die Datenqualität, wenn in 
der Software alles gleich bleibt? Ist er bei der internen bzw. 
hardwareseitigen Datenauswertung dann einfach genauer bei 
gleichbleibendem Rechenweg?

Gruß

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Chris M. schrieb:
> Ist er bei der internen bzw. hardwareseitigen
> Datenauswertung dann einfach genauer bei gleichbleibendem Rechenweg?

Nö, nicht genauer, nur hochauflösender. Bedenke: Genauigkeit != 
Auflösung ;)

von Chris M. (chris_appment)


Lesenswert?

Jetzt noch ne Amateurfrage dazu: In wie weit merke ich das dann? Bzw. wo 
macht sich das bemerkbar?

von Achim S. (Gast)


Lesenswert?

M. K. schrieb:
> Nö, nicht genauer, nur hochauflösender. Bedenke: Genauigkeit !=
> Auflösung ;)

Doch, in dem Fall bedeutet es auch genauer.

Es stimmt zwar, dass Genauigkeit != Auflösung ist. Aber beim ADS796x 
sind auch alle Genauigkeitsangaben (INL, Offset, Gain...) auf das LSB 
bezogen. In dem Fall gilt also: zwei Bit mehr an Auflösung liefern auch 
zwei Bit mehr an Genauigkeit.

Chris M. schrieb:
> In wie weit merke ich das dann? Bzw. wo
> macht sich das bemerkbar?

Der vom ADC umgesetzt Wert liegt entsprechend näher am tatsächlichen 
Spannungswert.

von Chris M. (chris_appment)


Lesenswert?

Super danke! Sehr lehrreich und hat mir total geholfen!

von Achim S. (Gast)


Lesenswert?

Achim S. schrieb:
> In dem Fall gilt also: zwei Bit mehr an Auflösung liefern auch
> zwei Bit mehr an Genauigkeit.

Sorry, in der Allgemeinheit war meine Aussage falsch. Es gibt so viele 
ADC-Varianten im Datenblatt, dass ich die Werte vertauscht habe.

die 8 Bit Version hat z.B. eine INL von 0,1LSB, die 10Bit Version eine 
INL von 0,2LSB. Die Erhöhung der Auflösung um 2 Bit (Faktor 4) bringt 
also eine Erhöhung der Genauigkeit (in dem Fall Parameter INL) um 1 Bit 
(Faktor 2).

von Stefan S. (chiefeinherjar)


Lesenswert?

Chris M. schrieb:
> Jetzt noch ne Amateurfrage dazu: In wie weit merke ich das dann? Bzw. wo
> macht sich das bemerkbar?

Abgesehen davon, dass oftmals ADCs mit höherer Auflösung auch genauer 
sind, hilft es sich, folgendes Szenario zu verinnerlichen:

Man nehme eine ideale Spannungsquelle mit exakt 1,00000000 Volt.
Du kannst mit einem ADC mit einer geringen Auflösung beispielsweise 0,99 
Volt messen. Erhöht man die Auflösung, aber nicht die Genauigkeit, so 
kann es passieren, dass man 0,9512875691 Volt misst. Die Auflösung ist 
zwar höher, das Ergebnis ist aber weniger genau bzw die Abweichung von 
der Realität ist größer.

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.