Forum: Mikrocontroller und Digitale Elektronik XMEGA ADC Schwankungen, Ungenauigkeiten, Seiteneffekte


von Gerald E. (gerald01)


Lesenswert?

Liebe Gemeinde,

-Die Schwankungen des Messergebnisses sind legendär und haben sich auch 
in dem Bereich, indem ich den ADC betreibe, nicht wesentlich in der 
U-Serie verbessert. Dieses Problem habe ich durch einen Filter (PT1) 
ganz gut in den Griff bekommen.

-Die Ungenauigkeiten konnte ich mit Kalibrierung (Gain und Offset) 
weitgehend lösen.

-Schwankungen des Messergebnisses bei Änderung der Messgrösse des 
vorhergehenden Channels (multiple ADC measurements from different 
channels can be converted simultaneously and independently) konnte ich 
verhindern, indem ich jeden Eingang einzeln messe und einen zeitlichen 
Abstand zwischen den Messungen halte.

-Für die Abweichung des Messergebnisses bei Änderung der DAC-Ausgänge 
habe ich noch keine Lösung.

Hätte ich das alles vorher gewußt, hätte ich sicher einen externen ADC 
verwendet.

Der ADC des XMEGA erinnert mich an die Puppe eines Puppenspielers, die 
behauptete schnell rechnen zu können, und als sie dann schnell aber 
falsch rechnete, sagte:" Aber schnell war's!"

von Martin J. (bluematrix) Benutzerseite


Lesenswert?

Hallo,
Kannst du deine Erkenntnisse vielleicht etwas mehr mit Zahlen bzw. 
Aufzeichnungen für uns dokumentieren.

Ich selbst setzte die Xmegas ein, speziell den Xmega128A3 und kann diese 
Probleme nicht bestätigen. Ich verwende den ADC differentiell und mit 
externer Referenzspannung. Mein Eingangssignal ist ein 
Spannungskalibrator und meine ADC Ergebnisse vom Xmega stehen fest und 
entsprechen den Werten des Eingangssignals.

Einen Einfluss des DACs muss ich noch untersuchen.

Ansonsten finde ich die Chips einfach genial, Einfacher Aufbau, 
sinnvoller Aufbau der Register und vorallem dass jedes Modul an jedem 
Port gleich ist und man nur den Port-Namen bzw. Modul-Nummer ändern 
muss.

Grüße Martin

von Hulk (Gast)


Lesenswert?

Wie sieht es bei dir mit Siebkondensatoren aus?
fährst du den ADC niederohmig (mit OPA) an?
Versorgst du die AREF mit Spannungsreferenz / genauem Regler?
Hast du eine Massefläche?
Dass das hinterste(n) Bit wackeln ist bei einem internen ADC nix 
besonderes, muss man halt mitteln.
Den MUX habe ich aber noch nicht ausprobiert.

von Gerald E. (gerald01)


Lesenswert?

Hallo Martin,

bin mit den Xmega meistens auch zufrieden - besonders ist mit der 
Weiterentwicklung vom Mega ein großer technologischer Sprung gelungen.

Verwende auch den Xmega128A3 allerdings die neue USB-Serie. Das du hier 
mit dem ohne U gut zurecht kommst, wundert mich auch deshalb, weil es 
für diesen Chip noch 26 dokumentierte Bugs gibt, davon mindestens vier, 
die den ADC betreffen. Als ich den ohne U noch verwendete, machte ich 
ähnliche Erfahrungen wie
http://blog.frankvh.com/2010/01/03/atmel-xmega-adc-problems-solutions/

Ich war stets bemüht, bin aber sicher noch nicht der Hardwareentwickler 
vor dem Herrn. Hier sind wahrscheinlich noch Verbesserungen möglich(vor 
allem bei der externen Referenzspg). Hier würde mich eine existierene HW 
interessieren (mit Layout), die ev. die Schwankungen verringert oder 
beseitigt.

Meine Abweichungen:
Schwankungen des Messergebnisses: meistens 4 LSB, selten bis zu 12 LSB
INL Integral Non-Linearity: +/-16 LSB
DNL Differential Non-Linearity: 27 LSB in der Nähe des Nullpunkts (bei 
0,1V von max. 2,7V)
Schwankungen des Messergebnisses bei Änderung der Messgrösse des
vorhergehenden Channels um 4096 LSB (von 0V auf 2,7V): mind. 1 LSB
Abweichung des Messergebnisses bei Änderung der DAC-Ausgänge: +/-5 LSB 
...
wobei letzter Fehler dazu führte, dass ich den DAC nicht verwenden kann 
und der mich bewogen hat, meine Beobachtungen hier mit anderen zu 
teilen->
das ergibt bei der Temperaturmessung mit einem PT1000 (in Reihe mit 
einem 2k7 Wid.) ca. eine Abweichung von +/-2°C!

meine Referenzspannung ist 2,7V/2= 1,35V
meine ADC Initialisierung:
void ADC_init(void)
{

  /* Move stored calibration values to ADC A */
  ADC_CalibrationValues_Load(&ADCA);
  ADC_CalibrationValues_Load(&ADCB);

  /* Set up ADC A to have signed conversion mode and 12 bit resolution. 
*/
  ADC_ConvMode_and_Resolution_Config(&ADCA, ADC_ConvMode_Signed, 
ADC_RESOLUTION_12BIT_gc);
  ADC_ConvMode_and_Resolution_Config(&ADCB, ADC_ConvMode_Signed, 
ADC_RESOLUTION_12BIT_gc);

  // The ADC has different voltage reference options, controlled by the 
REFSEL bits in the
  // REFCTRL register.
  ADC_Reference_Config(&ADCA, ADC_REFSEL_AREFA_gc);
  ADC_Reference_Config(&ADCB, ADC_REFSEL_AREFB_gc);

  // The clock into the ADC decide the maximum sample rate and the 
conversion time, and
  // this is controlled by the PRESCALER bits in the PRESCALER register. 
Here, the
  // Peripheral Clock is divided by 512 ( gives 62,5 KSPS with 32Mhz 
clock )
  ADC_Prescaler_Config(&ADCA, ADC_PRESCALER_DIV512_gc);
  ADC_Prescaler_Config(&ADCB, ADC_PRESCALER_DIV512_gc);

  /* Setup channels to have single ended input. */
  ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH0, ADC_CH_INPUTMODE_DIFF_gc, 
ADC_CH_GAIN_1X_gc);
  ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH1, ADC_CH_INPUTMODE_DIFF_gc, 
ADC_CH_GAIN_1X_gc);
  ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH2, ADC_CH_INPUTMODE_DIFF_gc, 
ADC_CH_GAIN_1X_gc);
  ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH3, ADC_CH_INPUTMODE_DIFF_gc, 
ADC_CH_GAIN_1X_gc);
  /* Setup channels to have single ended input. */
  ADC_Ch_InputMode_and_Gain_Config(&ADCB.CH0, ADC_CH_INPUTMODE_DIFF_gc, 
ADC_CH_GAIN_1X_gc);
  ADC_Ch_InputMode_and_Gain_Config(&ADCB.CH1, ADC_CH_INPUTMODE_DIFF_gc, 
ADC_CH_GAIN_1X_gc);
  ADC_Ch_InputMode_and_Gain_Config(&ADCB.CH2, ADC_CH_INPUTMODE_DIFF_gc, 
ADC_CH_GAIN_1X_gc);
  ADC_Ch_InputMode_and_Gain_Config(&ADCB.CH3, ADC_CH_INPUTMODE_DIFF_gc, 
ADC_CH_GAIN_1X_gc);

  // Before the ADC can be used it must be enabled
  ADC_Enable(&ADCA);
  ADC_Enable(&ADCB);

  // Wait until the ADC is ready
  ADC_Wait_32MHz(&ADCA);
  ADC_Wait_32MHz(&ADCB);

  // ADC_CH_MUXNEG_PIN0_gc ist gleichzeitig: _negInput 
(ADC_CH_INPUTMODE_DIFF_gc) und REF-Eingang
  ADC_Ch_InputMux_Config(&ADCA.CH0, ADC_CH_MUXPOS_PIN4_gc, 
ADC_CH_MUXNEG_PIN0_gc);
  ADC_Ch_InputMux_Config(&ADCA.CH1, ADC_CH_MUXPOS_PIN5_gc, 
ADC_CH_MUXNEG_PIN0_gc);
  ADC_Ch_InputMux_Config(&ADCA.CH2, ADC_CH_MUXPOS_PIN6_gc, 
ADC_CH_MUXNEG_PIN0_gc);
  ADC_Ch_InputMux_Config(&ADCA.CH3, ADC_CH_MUXPOS_PIN7_gc, 
ADC_CH_MUXNEG_PIN0_gc);
  ADC_Ch_InputMux_Config(&ADCB.CH0, ADC_CH_MUXPOS_PIN4_gc, 
ADC_CH_MUXNEG_PIN0_gc);
  ADC_Ch_InputMux_Config(&ADCB.CH1, ADC_CH_MUXPOS_PIN5_gc, 
ADC_CH_MUXNEG_PIN0_gc);
  ADC_Ch_InputMux_Config(&ADCB.CH2, ADC_CH_MUXPOS_PIN6_gc, 
ADC_CH_MUXNEG_PIN0_gc);
  ADC_Ch_InputMux_Config(&ADCB.CH3, ADC_CH_MUXPOS_PIN7_gc, 
ADC_CH_MUXNEG_PIN0_gc);
}

@ Hulk
alles beachtet - allerdings die Konstants der ext. Ref. könnte 
wahrscheinlich noch besser sein
beim 8051-Derivat von Infineon (allerdings nur 10bit) hat nur das 
hinterste Bit (1 LSB) gewackelt

Gruß Gerald

von Martin J. (bluematrix) Benutzerseite


Lesenswert?

... ich arbeite schon mit dem Xmega128A3AU , was anderes bekommt man ja 
auch nicht mehr zu kaufen.

von Gerhard G. (g_g)


Lesenswert?

Hallo,

> ... ich arbeite schon mit dem Xmega128A3AU , was anderes bekommt man ja
> auch nicht mehr zu kaufen.

das ist aber die alte Version!

Neu: ATxmega128A3U

Gruß G.G.

von Gerald E. (gerald01)


Lesenswert?

Hallo Martin,

es wäre noch nett, wenn du mir sagen könntest welche Hardware du 
verwendest, und unter welchen speziellen Bedingungen du so ein gutes 
ADC-Ergebnis erreichst.

Vielen Dank im Voraus
Gerald

von Gerald E. (gerald01)


Lesenswert?

Dear customer,

When the data register of the DAC contains values smaller than 0x0100 
(default is 0x0000), it might influence the ADC result. This can happen 
as soon as the DAC output channels 0 or 1 are switched on, even without 
load connected to the pins (as in your case).

You can read more about it in the AVR Freaks forum:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=132076

I am sorry for the inconvenience caused.


Best Regards,
Solveig Fure
Atmel Technical Support Team

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.