<<<< 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
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
Fazit: Der ADC des XMEGA ist, so wie er ist, unbrauchbar. Verglichen mit denen der Megas, die 1A sauber stehen bei 10 Bit.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.