Forum: Mikrocontroller und Digitale Elektronik AVR AT XMEGA ADC brauchbar ?


von Sascha P. (spy007)


Lesenswert?

<<<< Erfahrungsaustausch >>>>

Hallo, ich habe nun mal den tollen ADC-Wandler des ATXmega192A3 
untersucht.
Ich bin zu der Entscheidung gekommen, für 10Bit oder max.11Bit mit 
Mittelwertsberechnung reichts.

Der unsigned single ended Mode hat bei mir so bei 1024 als Messergebniss 
einen starken hänger und knapp drunter sehr starkes Rauschen. Der Mode 
ist somit für mich eigentlich unbrauchbar.

Der PGA verstärker bringt zu viel Offset und rauschen.

Die interne Vref(1V) rauscht auch stark, deshalb habe ich eine externe 
mit 1.25V benutzt.(MAX6190A)

Der signed differenzielle Mode ist noch der beste Mode, man verliert 
halt einen Pin, der auf Masse gelegt werden muss dafür sind mir keine 
großen Nachteile aufgefallen. Die Auflösung beträgt dann halt nur noch 
11Bit.
Mit einer Mittelwertsbildung komme ich eigentlich schon auf saubere 11 
Bit.
Die Versorgungsspannung des ATXmega ist 3.0V clk=24MHz über PLL von 
einem 4MHz Resonator.

Hat jemand bessere Erfahrung mit dem ADC gemacht ?
Oder mache ich etwas falsch (klar einen anderen Chip nehmen....)
Übrigens finde ich die übrige Hardware klasse auf dem Chip.
Verwendung findet er bei mir trotz des ADC problems.
Vieleicht bringt Atmel noch mal eine bessere Revision.

Gruß Sascha



Und hier mal meinen Code vom Test:



  ;ADC Init

  ldi    r16,0b00000011    ;no DMA,no startbit,Flush,enable

  sts    ADCA_CTRLA,r16



  ldi    r16,0b00010000    ;signed,no free run,left adjusted 12 bit

  sts    ADCA_CTRLB,r16



  ldi    r16,0b00100000    ;external Vref,bandgap 0ff,temp sensor off

  sts    ADCA_REFCTRL,r16



  ldi    r16,0b00000000    ;no event

  sts    ADCA_EVCTRL,r16



  ldi    r16,0b00000011    ;Clkper/32

  sts    ADCA_PRESCALER,r16



  ldi    r16,0b00000010    ;Gain=1,differential

  sts    ADCA_CH0_CTRL,r16



  ldi    r16,0b00011001    ;pin3+,pin1-

  sts    ADCA_CH0_MUXCTRL,r16



  ldi    r16,0b00000000    ;conversation complete

  sts    ADCA_CH0_INTCTRL,r16





;----------------------------------------------------------------------- 
-------------------------

Main:

  ;reset mittelwert

  clr    r16

  clr    r17

  clr    r18

  clr    r19



  ;Mittelwerts loop

  ldi    r20,64        ;64 fach



ADC_Loop:



  ;ADC Wandeln

  ;Start conversion

  ldi    r24,0b00000101    ;no DMA,starts only ADC channel 0,enable

  sts    ADCA_CTRLA,r24

  nop

  nop

  nop

  nop



  ;Wait until ready

Wait_for_ADC:

  lds    r24,ADCA_INTFLAGS  ;lese ADC interrupt flags (Bit 0 = Channel 
0)

  andi  r24,0b00000001    ;mask channel 0

  breq  Wait_for_ADC

  sts    ADCA_INTFLAGS,r24  ;clear interrupt flag



  ;Read ADC result

  lds    r21,ADCA_CH0RES    ;lese lowbyte

  lds    r22,ADCA_TEMP    ;lese highbyte



  ;Add to result

  clr    r23

  add    r16,r21

  adc    r17,r22

  adc    r18,r23

  adc    r19,r23



  ;do loop

  dec    r20

  brne  ADC_Loop      ;do loop



  ;nun Wert shiften

  ldi    r20,0x06      ;6 bits right

Shift_Loop:

  lsr    r19

  ror    r18

  ror    r17

  ror    r16

  dec    r20

  brne  Shift_Loop





  ;Messwert in r16,r17

von XMEGA (Gast)


Lesenswert?

Hallo,


Sascha P. schrieb:
> Hat jemand bessere Erfahrung mit dem ADC gemacht ?

habe die selbe Erfahrung gemacht.

Siehe auch hier:

ADR380

http://blog.frankvh.com/2010/09/09/followup-to-atmel-xmega-adc-problems/

Gruß XMEGA

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Fazit: Der ADC des XMEGA ist, so wie er ist, unbrauchbar. Verglichen mit 
denen der Megas, die 1A sauber stehen bei 10 Bit.

von Sascha P. (spy007)


Lesenswert?

Danke, XMEGA für den Tip. Ja das habe ich jetzt auch gelesen, die Analog 
Device Referenz habe ich mir gleich angesehen.
Ich muss sowieso eine externe Vref benutzen, weil bei kaum einem 
Mikrocontroller die Stabilität der internen Vref gut ist.
Ich will auch meine Geräte nicht erst mit dem ADC und der Vref 
abgleichen müssen, sondern es soll gleich stimmen.

Hallo Knut, stehen deine 10Bit auch aufs lsb stabiel ohne 
Mittelwertsbildung oder DSP-Filter ???

Also bei meinem XMEGA192A3 stehen jetzt 11Bit sehr exakt. Ich könnte ein 
Video drehen ist sagenhaft. Aber ohne Mittelwertsberechnung geht halt 
gar nichts.

Ich bin da halt besseres gwöhnt, habe bis vor kurzem noch mit dem Analog 
Device ADuC7026 gearbeitet, da stehen 12 Bit sehr exakt.

Ist halt auch ne frage wie schnell die Signale sind die man messen will.

Wenns auf die Zeit nicht ankommt ist folgender Filter klasse.
Den habe ich mal für einen ARM7 geschrieben, und werde den bald auf dem 
AVR implementieren.

;*  X = X(n-1) + (( X(n)- X(n-1) * K )   *

; Fixed Point DSP Format 16.16



Datafilter:      ;r8 ist Input-Wert

  ldr  r10,[r9,#28]  ;lade X(n-1), also altes Sample (im 16.16 Format)

  rsb  r8,r10,r8,lsl #16    ;erweitere X(n) ins 16.16 Format, und 
subtrahiere altes sample X(n-1)

  ldr  r11,=5000      ;lade Faktor, welcher für die 
Filtergeschwindigkeit steht

  umull  r11,r12,r8,r11      ;r12r11 = r10 * r11, r12 ist dann 
automatisch /2^32

  add  r8,r10,r12      ;x(n-1)+(diff*faktor)

  str  r8,[r9,#28]      ;store back new X->Xn

  mov  r8,r8,lsr #16      ;convertiere Format wieder von 16.16 zu 16



Du bildest zwischen deinem alten und neuen Messwert die differenz, 
teilst die mit einer Zahl(also Faktor) und addierst die zu deiner alten 
zahl hinzu.
Je größer also dein ADC Unterschied umso größer die Zahl die addiert 
wird.
Der Vorteil liegt darin, dass je kleiner die Differenz wird um so feiner 
die addition erfolt. Normalerweise geht das mit Floating Point sehr gut 
aber es geht auch in Integer.

Gruß Sascha

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.