ADC auslesen

#5752469
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ß
Angehängte Dateien:
#5752495
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?
#5752508
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.
#5752642
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.
Gast #5752777
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.
Angehängte Dateien:
#5752885
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ß
Gast #5752901
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.
Gast #5752930
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).
#5752985
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren