Forum: Mikrocontroller und Digitale Elektronik ADC Xmega plötzliche Unstetigkeit


von Sepp (Gast)


Lesenswert?

Hallo,
ich hab ein Problem mit meinem ADC auf dem Xmega 16A4U.
Bei der Nachkontrolle meier AD-Wandlerroutine ist mir eine enorme 
Unstetigkeit bei meinem Wandler aufgefallen.

Gemessen wird eine Spannung über einen Spannungsteiler (2k/127k).
Soll Signed und 12Bit sein, was dann ja 2047 entsprechen soll.

Bis ziemlich genau 512 Digit passen die Werte relativ genau, knapp über 
512 Digit fangen die Ausgangswerte extrem zu schwanken an(ca. zw. 490 
und 690), was sich dann bei wieder höherer Messspannung wieder ruhig 
wird, aber dann einen enormen Offset zu den theoretisch "richtigen" 
Werten aufzeigt.

Sowohl eine Änderung von interner (Bandgap) zu externe Ref.Spannung 
helfen nicht und zeigen gleiches Problem.

Hat von euch jemand ne Ahnung woran das liegen könnte.

Schon mal Danke für Eure Ideen... mir gehen se langsam aus;(

1
ADCA.CTRLA=0x01;              ADCA.CTRLB = ADC_CONMODE_bm | ADC_RESOLUTION_12BIT_gc;  // signed 12 Bit
2
//ADCA.REFCTRL = ADC_REFSEL_AREFB_gc;      // Ext Ref 1,225V
3
ADCA.REFCTRL = ADC_REFSEL_INT1V_gc;      // Int 1,0V Ref       
4
ADCA.PRESCALER = ADC_PRESCALER_DIV16_gc;       // 2MHz
5
6
//Konfiguration vom Kanal CH0
7
ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN7_gc |ADC_CH_MUXNEG_PIN1_gc;  
8
9
//1Dummymessung                
10
ADCA.CH0.CTRL=ADC_CH_START_bm|ADC_CH_INPUTMODE_DIFF_gc;      
11
while(!ADCA.CH0.INTFLAGS);            
12
ADCA.CH0.INTFLAGS=ADC_CH_CHIF_bm;              
13
14
 //2.Dummymessung
15
ADCA.CH0.CTRL=ADC_CH_START_bm |ADC_CH_INPUTMODE_DIFF_gc;
16
while(!ADCA.CH0.INTFLAGS);
17
ADCA.CH0.INTFLAGS=ADC_CH_CHIF_bm;
18
... 
19
8 echte Messungen zur gewerteten Mittelung

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Sepp schrieb:
> Gemessen wird eine Spannung über einen Spannungsteiler (2k/127k).

Es kann gut sein, das das zu hochohmig für den ADC Eingang ist. Als 
schnellen Test kannst du mal 1 nF parallel zum 2k (ich nehme an, der ist 
das untere Ende des Spannungsteilers) schalten und sehen, ob sich die 
Werte verbessern. Wenn ja, lässt du den C entweder drin, wenn dir das 
aber die Abtastung zu sehr verschleift, füge einen OpAmp als 
Spannungsfolger ein.

Du kannst auch mal die Abtastrate verringern und schauen, ob das was 
ändert.

: Bearbeitet durch User
von Stumpf (Gast)


Lesenswert?

Servus,

vielleicht ein Ansatz.

Hatte das Problem bei einem LM3S, das an anderen Pin's (Digital) die 
3,3V überschritten wurden. Anscheinend hatte sich das auf irgend einen 
internen Weg auf den ADC ausgewirkt. Und hat dann falsche Werte 
geliefert.

Die Werte begrenzt und schon gings.
Aber ob das natürlich bei dir so ist ...... kann ich dir nicht sagen.
Aber halt vielleicht ein Ansatz.

Gruß
Stumpf

von Sepp (Gast)


Lesenswert?

Also Spannungsteiler wurde testweise schon verringert, und Controller 
getauscht mit gleichem Ergebnis.
Interessant ist aber dass beim Austausch gegen einen Xmega 16D4 alles 
funktioniert wie es soll... Wenn auch ein größeres Grundrauschen dabei 
ist.

von Simon K. (simon) Benutzerseite


Lesenswert?

Der Spannungsteiler hat einen Innenwiderstand von 2k || 127k = ca. 2k. 
Das dürfte also niederohmig genug sein.

von Bernie (Gast)


Lesenswert?

Bisher gabs nur wildes Rätselraten.

Beschreibe doch mal dein DRUMHERUM etwas genauer.
Erst mal fällt auf, dass du 12 Bit mit 2047 in
Verbindung bringst: Mit 12 Bit lassen sich 4096
Zustände von 0...4095 darstellen!

Software:
- Werden die 12 Bit richtig vom ADC ausgelesen?
  (ADLAR & Co) ???
- Werden die 12 Bit richtig verarbeitet?
  Da könnte eine Software-Simulation mit
  Werten von 0...4095 in "krummen" Steps von
  z.B. 0, 37, 74, ... helfen.

Schaltungstechnik:
- Wie veränderst du die zu messende Spannung?
  Kratzendes Poti?
- Hast du ein Messgerät parallel?

von Bernie (Gast)


Lesenswert?

Achso: Signed und +/- 2047 haut bei 12 Bit etwa hin.

Bist du sicher, dass du das Vorzeichen auch passend
anwendest? Also erst mal das Vorzeichen des ADC-Werts
auf 16 Bit ausdehnen, DANN im 16-Bit-Mode weiter-rechnen!

von Sepp (Gast)


Lesenswert?

Zur Hardware:
Der Controller hängt an ner 24V Versorgung und ich messe "Highside" an 
dem 2k Widerstand. Controllermasse macht n lm337 auf ca. -3,3V von den 
24v runter.
Daher auch der Differenzielle Mode mit positivem Adc-Pin 7 auf den 24v.

Adc-register wurden auch schon manuell ausgelesen und verarbeitet... Da 
entsteht der Fehler nicht.
Messgerät bzw. Oszi hingen auch schon mal dran aber ohne große 
Erkenntnis... Messspannung sieht sauber aus.

Messspannung ändert sich abhängig von der Eingangsspannung 24v +- 
....aber Poti auch mit selben Ergebnis getestet.

von Timmo H. (masterfx)


Lesenswert?

Der Eingangswiderstand vom ADC ist bei 2msps ist schon recht klein.

für n-Bit Genauigkeit:
mit R_channel+R_switch ~4,5k, Csample = 4,4pF und 3 Bit Genauigkeit 
kommt man da also auf: 47kOhm, wenn ich mich nicht verrechnet habe.

Zudem sind 2 msps schon recht sportlich.

Achja die Kalibrierungsregister scheinst du auch nicht beschrieben zu 
haben:
1
uint8_t ReadCalibrationByte( uint8_t index ){
2
  uint8_t result;
3
4
  /* Load the NVM Command register to read the calibration row. */
5
  NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;
6
  result = pgm_read_byte(index);
7
8
  /* Clean up NVM Command register. */
9
  NVM_CMD = NVM_CMD_NO_OPERATION_gc;
10
11
  return( result );
12
}
13
14
  //Read factory calibration bytes
15
  ADCA.CALL = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCACAL0) );
16
  ADCA.CALH = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCACAL1) );

: Bearbeitet durch User
von Tom (Gast)


Lesenswert?

muss der Widerstand für eine höhere Genauigkeit höher sein?!?
ICh dachte, je niedriger, desto besser?!

von Timmo H. (masterfx)


Lesenswert?

Tom schrieb:
> muss der Widerstand für eine höhere Genauigkeit höher sein?!?
Der Widerstand der zu messenden Quelle? Nein
> ICh dachte, je niedriger, desto besser?!

ja R_source <= 47k für >=3 bit genauigkeit

Zeichne dir mal den Innenwidestand des ADC an deinen Spannungsteiler 
ran, und überleg/rechne mal wie sich dein Spannungsteiler dann verhält.

: Bearbeitet durch User
von Tom (Gast)


Lesenswert?

k.a worauf Du hinaus willst, ich frage ja für ne schnelle Antwort. egal 
muss jetzt sowieso los.

Die Quelle ist neiderohmig natürlich immer bessser.

Wenn ich mit nem Opaamp messe kann ich das notfalls mit nem 
Spannungsfolger verbessern..logisch abre wenn ich dann direkt mit dem 
OPAmp Ausgang auf den ADC Eingang gehe ist das schelcht?

von Paul (Gast)


Lesenswert?

Sepp schrieb:
> Hat von euch jemand ne Ahnung woran das liegen könnte.

Am ATXmega. Ich hatte mit den Sch...teilen auch riesige Schwierigkeiten.

Tom schrieb:
> muss der Widerstand für eine höhere Genauigkeit höher sein?!?
> ICh dachte, je niedriger, desto besser?!

Je höher der Widerstand, desto höher das Rauschen.

von Tom (Gast)


Lesenswert?

hattest Du die U Serie oder noch die alte?
Der neue U soll nen deutlich besseren ADC als der ARM STM z.B. haben

von Paul (Gast)


Lesenswert?

Tom schrieb:
> besseren ADC als der ARM STM z.B. haben

Quelle?

von Tom (Gast)


Lesenswert?

errata, der STm rauscht wegen eines Bgs, beim U sind alle bugs rund um 
den ADC behoben

von Thomas (Gast)


Lesenswert?

Bin auch gerade am erproben des Xmegas und ebenfalls auf das Problem 
gestoßen.

Bei mir ist es nicht ganz so auffällig. Ist mir nur durch einen relativ 
großen Offset im Endberreich aufgefallen.
Ich nutze den Free-running-mode, differenziell und hab auch nen Sprung 
in meiner Wertelinie.
Liegt auch etwa bei 500 ( ab ca. 530 Sprung auf ca 590) und hab dann 
auch n offset von ca 60-70 digits für den Rest der Kennlinie.


Gibts da schon ne Lösung für das Problem?
Ich habe auch einen ADC Pin auf Vcc liegen und messe nur negativ.

von da1l6 (Gast)


Lesenswert?

Hallo

Ein Schuss ins Blaue, aber laut Datenblatt empfiehlt Atmel bei 
Verwendung des ADC die "Input/Sense Configuration" für den jewaligen PIN 
auf "Digital input buffer disabled" zu stellen.

Siehe XMegaAU Manual Abschnitt 13.13.15

da1l6

von Paul (Gast)


Lesenswert?


von alex (Gast)


Lesenswert?

Zwar schon wieder länger her als ich mit denen zu kämpfen hatte, aber 
müssen die Eingänge nicht weiter von der Versorgung weg. Also nicht 
direkt auf Vcc legen!

von Sepp (Gast)


Lesenswert?

Danke erstmal für die Tips, aber das Richtige war noch nicht dabei.

Hab schon einige Konfigurationen durch und auch die Tips überprüft... 
aber immer zwischen 500 und 600 taucht der Fehler auf und er 
"überspringt" ein paar Bits. Mal nur 50 mal gleich 150.... einfach zum 
ko.....

@alex:
Laut Spezifikation ist diese Betriebsart erlaubt... wenn auch die 
falsche Wahl.
Wenn ich einen Eingang auf Masse leg funktioniert er wie er soll ohne 
große Abweichungen.

von Sepp (Gast)


Lesenswert?

Noch kurze Anmerkung zu meiner Lösung:

Nachdem ich schon interne Bandgap, Ucc/2 und eine externe 
Referenzspannung (1,225V/ 0,1%) ohne großen Erfolg getestet habe, bin 
ich nun doch noch auf die glorreiche Idee einer weiteren externen 
Spannungsreferenz gekommen.

Und sieh da: Mit ner 2,048V (1%)externen Referenz ist der Fehler weg!

Vieleicht hilfts ja irgendwann mal jemanden auch weiter.

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.