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!"
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
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.
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
... ich arbeite schon mit dem Xmega128A3AU , was anderes bekommt man ja auch nicht mehr zu kaufen.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.