Forum: Mikrocontroller und Digitale Elektronik differential Adc Input etwas unklar


von extra (Gast)


Lesenswert?

Guten Abend,
ich habe bis jetzt meist an Kommunikationen programmiert.(Can Modbus 
Devicenet usw)
Nun möchte ich mich mal an den Adc wagen. Ich habe jedoch noch nicht 
ganz verstanden wie das mit den Differenzial Eingängen eines Adc ist.
Ich habe bis jetzt Atmel STM32 und Pic programmiert.
Konkret würde ich jetzt den StmF3 nehmen.
Wenn ich nun zB an den negativen Eingang des Adc eine Spannung von 1,65V 
anlege und am Positiven Eingang eine Spannung von 825mV anlege bekomme 
ich dann als Ergebnis 0 oder ist dann das Ergebnis 1023?

Danke für Eure Hilfe

von Sebastian R. (sebastian_r569)


Lesenswert?

extra schrieb:
> Wenn ich nun zB an den negativen Eingang des Adc eine Spannung von 1,65V
> anlege und am Positiven Eingang eine Spannung von 825mV anlege bekomme
> ich dann als Ergebnis 0 oder ist dann das Ergebnis 1023?

Im Prinzip "Weder noch".
Abgesehen davon, dass der Ausgang natürlich abhängig von der Auflösung 
und der Referenzspannung ist, beherrschen diff. ADCs negative 
Differenzen, die dann entweder vorzeichenbehaftet sind oder von der 
Mitte nach 0 gehen.

Bei 10bit (also 0...1023) könnte der Wandler also bei einer Differenz 
von 0V am Eingang ~512 ausgeben. Bei positiver Differenz geht es 
Richtung 1023, bei negativer Differenz Richtung 0.

Wenn das Ergebnis ein Vorzeichen hat, dann hast du bei 0V eine 0 als 
Ausgang, bei voller positiver Differenz ein Wert von 511, bei voller 
negativer Differenz einen Wert von -512.

von Jim M. (turboj)


Lesenswert?

extra schrieb:
> als Ergebnis 0 oder ist dann das Ergebnis 1023?

Differenziell schaltbare ADCs können gerne auch mal Zweierkomplement 
ausgeben, d.h. da könnte (je nach Referenz) so um -500 raus kommen.

von Bastler_HV (Gast)


Lesenswert?

Differenziell heisst, dass der ADC die Differenz mißt.
Beispiel:
Uneg = 2V
Upos = 1V
   Upos - Uneg = -0.5V  (Bzw. der Binärwert der -0.5V entspricht)

Fallstricke:
- Der Adc muss für dieses Beispiel natürlich negative Werte wandeln 
können
- Die Spannungen Uneg, Upos müssen *jeweils* innerhalb des zulässigen 
Bereiches bleiben (meist die Versorungsspannung des Chips) also
Uneg=10V , Upos=11V; Upos-Uneg=1V geht nicht! obwohl 1V durchaus im 
Messbereich liegt.

oops da waren andere schon schneller

von extra (Gast)


Lesenswert?

Also ich bin von 12 Bit Auflösung ausgegangen.
Also bekomme ich bei 0 Differenz (einen Eingang von 1,65V)einen Ergebnis 
von 2046?
Habe ich das richtig verstanden?

von Sebastian R. (sebastian_r569)


Lesenswert?

extra schrieb:
> Also bekomme ich bei 0 Differenz (einen Eingang von 1,65V)einen Ergebnis
> von 2046?

2048. Entweder das oder eben 0 (mit der Möglichkeit, dann von ~2000 bis 
-2000 messen zu können), je nach Wandler.

Die Differenz ist aber auch Null, wenn beide Eingänge auf 0V, auf 1V 
oder auf 3V sind. Solange eben die Differenz der beiden Eingänge 0V 
beträgt.

: Bearbeitet durch User
von extra (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
danke für die Rückmeldung.
Ich habe den Differenzial Adc nun auf einem ST32F334K8T ausprobiert.
Leider verstehe ich das Ergebnis der Wandlung überhaupt nicht.
Ich habe folgendes probiert.
ADC1 IN1 als Differential
ADC1 In3 als single ended
Folgende Konditionen brachten folgende Wandler Ergebnisse:
PA0 1V PA1 1,65V das Ergebnis der Wandlung war 1570
PA0 1V PA1 3,3V das Ergebnis der Wandlung war 1570
PA0 0V PA1 3,3V das Ergebnis der Wandlung war 1570
PA0 3,3V PA1 3,3V das Ergebnis der Wandlung war 1570
PA0 3,3V PA1 0V das Ergebnis der Wandlung war 1570

PA2 0V Ergebnis der Wandlung war 0
PA2 3,3V Ergebnis der Wandlung war 4060

Die Single Ended Messung sieht ok aus.
Aber bei der Differential Messung kann ich mir keinen Reim drauf machen.
Kann mir jemand etwas auf die Sprünge helfen?

Danke

von extra (Gast)


Lesenswert?

Guten Abend,
was für Infos fehlen noch? Wo habe ich mich unklar ausgedrückt?

Danke für die Hilfe

von extra (Gast)


Lesenswert?

Mir ist gerade aufgefallen das ich in meinen Beitrag 
Beitrag "Re: differential Adc Input etwas unklar"

Einen peinlichen Copy Paste Fehler gemacht habe.
Hier noch mal die richtigen
Werte.PA0 1V PA1 1,65V das Ergebnis der Wandlung war 1570
PA0 1V PA1 3,3V das Ergebnis der Wandlung war 550
PA0 0V PA1 3,3V das Ergebnis der Wandlung war 0
PA0 3,3V PA1 3,3V das Ergebnis der Wandlung war 1980
PA0 3,3V PA1 0V das Ergebnis der Wandlung war 4080

PA2 0V Ergebnis der Wandlung war 0
PA2 3,3V Ergebnis der Wandlung war 4060

Ich bitte viel mals um Entschuldigung.
Danke für die Hilfe

von Timo W. (timo)


Lesenswert?

Das sieht nach 12Bit ADC aus. Mit dem Offset 2048.
D.h. Wert 2048 = 0V differenz.
 < 2048 = negative differenz
 > 2048 = positive differenz

extra schrieb:
> PA0 1V PA1 1,65V das Ergebnis der Wandlung war 1570
1V-1.65V = -0.65V differenz, 1570-2048 = -478
> PA0 1V PA1 3,3V das Ergebnis der Wandlung war 550
1V-3.3V = -2.3V differenz, 550-2048 = -1498
> PA0 0V PA1 3,3V das Ergebnis der Wandlung war 0
0V-3.3V = -3.3V differenz, 0-2048 = -2048
> PA0 3,3V PA1 3,3V das Ergebnis der Wandlung war 1980
3.3V - 3.3V = 0V differenz, 1980-2048 = -68
> PA0 3,3V PA1 0V das Ergebnis der Wandlung war 4080
3.3V - 0V = 3.3V differenz, 4080-2048 = 2032

Umgerechnet auf 3.3V Referenz:
-478 = -.768V
-1498 = -2.412V
-2048 = -3.3V
-68 = -.108V
2032 = 3.273V

Ist zwar etwas ungenau (ADC kalibriert?, Referenzspannung genau?, oder 
meine Umrechnung stimmt nicht ganz), aber die Größenordnung stimmt.

von extra (Gast)


Lesenswert?

Timo W. schrieb:
> Umgerechnet auf 3.3V Referenz:
> -478 = -.768V
> -1498 = -2.412V
> -2048 = -3.3V
> -68 = -.108V
> 2032 = 3.273V
>
> Ist zwar etwas ungenau (ADC kalibriert?, Referenzspannung genau?, oder
> meine Umrechnung stimmt nicht ganz), aber die Größenordnung stimmt.

Vielen Dank für die Hilfe!
So ganz ist der Groschen noch nicht gefallen:( Kannst du mir bitte den 
Rechenweg aufzeigen?
Ich habe den Adc nicht kalibriert. Und die Referenzspannung ist einfach 
ein 3V3 Regler wo alles dran hängt.
Mir geht es jetzt aber im ersten Moment um das Verstehen und dann um 
das optimieren und genau Messen.
Vielen Vielen Dank für die Hilfe.

von Achim S. (Gast)


Lesenswert?

extra schrieb:
> So ganz ist der Groschen noch nicht gefallen:( Kannst du mir bitte den
> Rechenweg aufzeigen?

Du nimmst den ADC-Wert
du subtrahierst davon 2048 (weil dein ADC wohl einen Code liefert, bei 
dem 2048 dem Spannungswert 0 entspricht)
du multiplizierst mit V_ref/2048

von Timo W. (timo)


Lesenswert?

Welcher Teil ist denn nicht klar?

1. Was wird gemessen?
 -> Die Differenz zwischen P(PA0) und N (PA1)
 Beispiel: PA0=1V PA1=1,65V
 Gemessen wird PA0-PA1 = 1V-1.65V = -0.65V

2. Wertebereich:
 Da die Differenz negativ sein kann, ist der Wert um einen 
Offset(12Bit/2 = 2048) verschoben. Der gemessene Wert kann von -Vref bis 
+Verf, also bei dir -3.3V bis 3.3V, gehen. 0V liegt bei der Hälfte also 
bei 12Bit der Wert 2048.

-Vref, -3.3V ergibt den Wert 0
0V ergibt den Wert 2048
+Vref, 3.3V ergibt den Wert 4095

3. Umrechnung, Behandlung von Offset und negativen werten:
Es gibt verschieden Möglichkeiten die Werte weiter zu verarbeiten. Z.B. 
die Werte als Spannung zwischen 0 und 6.6V mit Offset 3.3V betrachten 
und mit Unsigned weiter rechnen, negative zahlen verwerfen und nur mit 
positiven weiter arbeiten, umwandeln in signed, oder auch das vorzeichen 
getrennt behandeln.

Ich hab das exemplarisch als Umwandlung in signed vorgerechnet. Dafür 
einfach den Offset (2048) vom ADC Wert abziehen. Dabei wird der 
Wertebereich von 0 bis 4096 auf -2048 bis +2047 verschoben.

Vorher:
-3.3V = Wert 0
0V = Wert 2048
3.3V = Wert 4095

Nach Subtraktion des Offset:
-3.3V = Wert -2048
0V = Wert 0
3.3V = Wert 2047

Beispiel von oben: 1570-2048 = -478

4. Umrechnung des ADC Wertes in Spannung:
Der Wertebereich des ADC umfasst 2^12 Bit, und entspricht einem 
gemessenen Spannungsbereich von 2*Vref. Der Rest ist simpler Dreisatz.
bzw gekürzt:
Vollständig für PA0=1V PA1=1,65V

  

von Timo W. (timo)


Lesenswert?

Der STM32F334x kann übrigens den Offset auch direkt abziehen, dann 
liefert der ADC direkt 16Bit signed Werte.

von extra (Gast)


Lesenswert?

Vielen Dank für die Hilfe!
Danke für die sehr ausführliche Antwort!
So ist es jetzt ziemlich klar:)

Timo W. schrieb:
> Der STM32F334x kann übrigens den Offset auch direkt abziehen, dann
> liefert der ADC direkt 16Bit signed Werte.

Den Adc direkt in 16Bit signed klingt super!
Kannst Du mir dazu einen Hinweis geben wie ich das einstellen kann?

Echt nochmal ein Mega Danke:)

von Timo W. (timo)


Lesenswert?

Reference Manual RM0364:
https://www.st.com/resource/en/reference_manual/dm00093941-stm32f334xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf

Seite 247 bzw. 304

Es gibt pro ADC 4 Offset Register ADCx_OFR1 bis ADCx_OFR4
in die untersten Bits ([11:0]) kommt der Offset, in die Bits [30:26] der 
Input Channel, und mit Bit [31] = 1 wird der Offset aktiviert.

Beispiel Offset1,Input1
ADC1_OFR1=(1ul<<31) | (1ul<<26) | 2048ul

von extra (Gast)


Lesenswert?

Timo W. schrieb:
> Der gemessene Wert kann von -Vref bis
> +Verf, also bei dir -3.3V bis 3.3V, gehen.

Hält der STM32 in diesem Fall wirklich eine Negative Spannung Aus?

Timo W. schrieb:
> Reference Manual RM0364:
> 
https://www.st.com/resource/en/reference_manual/dm00093941-stm32f334xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf
>
> Seite 247 bzw. 304

Danke für den Link! So sieht es gut aus!
Danke für die Hilfe

von Timo W. (timo)


Lesenswert?

extra schrieb:
> Hält der STM32 in diesem Fall wirklich eine Negative Spannung Aus?

An den Eingängen: NEIN An den Eingängen PA0, PA1 ... muss die Spannung 
zwischen 0 und VDDa liegen.

Aber die Differenz zwischen diesen beiden positiven Spannung kann 
negativ werden.

Eben maximal -3.3V wie im Beispiel wenn PA0=VinpP=0V und PA1=VinN=3.3V

von extra (Gast)


Lesenswert?

Vielen Dank für die Erklärung.
Wieder viel gelernt!

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.