Forum: Mikrocontroller und Digitale Elektronik ADC des AtxMega digitalisiert nicht richtig


von Nyquist-Shannon (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Mikrocontroller-Gemeinde.

Ich habe den AtxMega64A3. Ich kann den uC programmieren und hab schon 
eine größeres Programm erfolgreich zum laufen

gebracht. Das einzige, was mir nicht gefällt, ist der ADC des 
Mikrocontrollers.
Ich benutze den PA4 als Eingang und an den Pin ACO/AREF hab ich eine 
Referenzspannung von 2,5V angelegt.

Versorgungsspannung des uC beträgt 3,3V.

Ich brauche eine präzise und schnelle A/D Convertierung. Da der xMega 
leider einen Offset beim "Unsigned Mode" hat,

wollte ich den signed Mode verwenden und deshalb liegt PA2/ADC2 an 
Masse.

Die Initialisierung des ADC:
void ADC_initialisieren(void)  //signed
{
//load the calibration
ADCA.CALL = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, 
ADCACAL0) );
ADCA.CALH = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, 
ADCACAL1) );

ADCA.CTRLB = 0x10;    // CONVMODE: signed; RESOLUTION: 12Bit
ADCA.REFCTRL = 0x30;    // REFSEL: External ref. AREF pin on PORT B
ADCA.PRESCALER = 0x01;    // PRESCALER: 512  -> 62.5kHz

ADCA.CH1.CTRL = 0x02;    // INPUTMODE: Differential Input Signal
ADCA.CH1.MUXCTRL = 0x22;  // MUXPOS: ADC4 pin; MUXNEG: ADC2 pin

ADCA.CTRLA |= 0x01;    //ADC enable
}

Mit einem Poti habe ich die Eingangsspannung an PA4 verändert und den 
digitalen Wert per RS232 ausgegeben.

Die Digitalisierung erfolgt mit:
ADCA.CH1.CTRL |= ADC_CH_START_bm;
while(!ADCA.CH1.INTFLAGS);
ADCA.CH1.INTFLAGS=ADC_CH_CHIF_bm;

Das Ergebnis steht dann in ADCA_CH1RES.

Das Diagramm zeigt ganz deutlich einen nichtlinearen Verlauf des ADC. Da 
ich eine 2,5V Referenzquelle benutze, solle auch bei einem Eingangspegel 
von 2,5V der digital Wert von 2047 errechnet werden. Dies ist leider 
nicht der Fall. Egal was ich

mache, der AtxMega digitalisiert nicht richtig.
Den uC hab ich 30 Minuten warmlaufen lassen. Alle Signale wurden mit 
einem Multimeter und Oszi überprüft.
Der uC wird mit dem internen Quarz (32MHz) betrieben. Benutze AVR Studio 
v4.18 mit WinAVR und Optimization:-O1.

Über jede Hilfe wäre ich dankbar.

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


Lesenswert?

Schau Dir mal die Errata des ADC des XMega an.

von xmega (Gast)


Lesenswert?

Servus,



Nyquist-Shannon schrieb:
> Über jede Hilfe wäre ich dankbar

leg doch mal einen Kondensatorvon 10 -> 100nF an den Mittelpunkt deines 
Potis.
Das Poti sollte nicht zu hochohmig sein 10K bis max 100k ist ein guter 
Wert.

Gruß xmega

von Nyquist-Shannon (Gast)


Lesenswert?

Hallo

Aus Errata, rev.B:
{
7. ADC has increased INL error for some operating conditions
Some ADC configurations or operating condition will result in increased 
INL error.
In differential mode INL is increased to:
– 6 LSB for sample rates above 1 Msps, and up to 8 LSB for 2 Msps sample 
rate.
– 6 LSB for reference voltage below 1.1V when VCC is above 3.0V.
– 20 LSB for ambient temperature below 0 degree C and reference voltage 
below 1.3V.
In single ended mode, the INL is increased up to a factor of 3 for the 
conditions above.

Problem fix/Workaround:
None, avoid using the ADC in the above configurations in order to 
prevent increased INL error.
}

Keines der oben genannten Punkte verletze ich.

Beim der Messung habe ich einen 22kOhm Poti verwendet. Ein zusätzlicher 
Kondensator, wie von xmega gewünscht, brachte keine Verbesserung.

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


Lesenswert?

Auch aus den Errata:

2.   ADC gain stage output range is limited to 2.4 V
The amplified output of the ADC gain stage will never go above 2.4 V, 
hence the differential
input will only give correct output when below 2.4 V/gain. For the 
available gain settings, this
gives a differential input range of:

–       1x     gain:         2.4     V
–       2x     gain:         1.2     V
–       4x     gain:         0.6     V
–       8x     gain:        300     mV
–     16x     gain:        150     mV
–     32x     gain:          75     mV
–     64x     gain:          38     mV

Problem fix/Workaround
Keep the amplified voltage output from the ADC gain stage below 2.4 V in 
order to get a cor-
rect result, or keep ADC voltage reference below 2.4 V.


Ach und womit hast Du denn die analoge Eingangsspannung gemessen an PA4?

von Nyquist-Shannon (Gast)


Lesenswert?

Deshalb hab ich den "ADC gain" vermieden. Der interne ADC Verstärker ist 
auf 2,4V limitiert und erzeugt unnötige Fehler.

Die Eingangsspannung hab ich mit einem Multimeter gemessen und mit einen 
Oszi nachgeprüft. Habe immer auf eine "gemeinsame Masse" geachtet.

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


Lesenswert?

Nyquist-Shannon schrieb:
> Deshalb hab ich den "ADC gain" vermieden. Der interne ADC Verstärker ist
> auf 2,4V limitiert und erzeugt unnötige Fehler.
>
> Die Eingangsspannung hab ich mit einem Multimeter gemessen und mit einen
> Oszi nachgeprüft. Habe immer auf eine "gemeinsame Masse" geachtet.

Und Du meinst, dass das Multimeter keinen Linearitätsfehler hat?

von Simon K. (simon) Benutzerseite


Lesenswert?

Eventuell Batterie leer am DMM?

von Nyquist-Shannon (Gast)


Lesenswert?

Knut Ballhause schrieb:
> Und Du meinst, dass das Multimeter keinen Linearitätsfehler hat?

Natürlich hat jedes DMM einen Linearitätsfehler. Der Fehler erscheint 
mir aber als zu groß, da ich verschiedene DMMs (verschiedene Typen, 
verschiedene Hersteller) zum Test verwendet habe und bei allen die selbe 
Kennlinienform, wie im Diagramm dargestellt herausgekommen ist.
Daher kann auch nicht die Vermutung von Simon K. zutreffen, dass die 
Batterie leer ist. (Hab ich aber bei den Batteriebetriebenen DMMs 
überprüft.)

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


Lesenswert?

Hmm. Muss ich bei Gelegenheit mal selbst überprüfen.

von Henk (Gast)


Lesenswert?

Hallo,

sehr interessantes Thema. Ich bin auch nicht ganz zufrieden mit dem ADC.
In bestimmten Bereichen scheint nicht richtig digitalisiert zu werden. 
Der Fehler ist ehr ein Springen. Wird zB ein bestimmtes Digit angefahren 
durch anlegen einer analgoen Spannung, die sich ändert, so kann ich 
Sprünge über mehrere Digits feststellen. Mehrere sind in dem Fall 
bestimmt 50. Das ist sehr reproduzierbar. Ist sowas bekannt oder sollte 
ich meine Software nochmals genau unter die Lupe nehmen?

void init_adc_A_frun(char gain)
{
  ADCA.CTRLA = 0x01;       //ADC enable
  ADCA.CTRLB = 0x18;      //
  ADCA.REFCTRL = 0x01;    //    =
         ADC_PRESCALER_DIV32_gc;  //
         ADCA.CH0.CTRL = gain;   //input mode differenz mit Gain

  ADCA.EVCTRL = 0x40;
  ADCA.CH0.MUXCTRL = 0x04;// PA0 als ADCPin
    ADCA.CH1.MUXCTRL = 0x08;// PA1 als ADCPin

}

Bedeutet der errata von oben eigentlich, dass ich niemals ein produkt 
aus anliegender Spannung und interner ADC Spannung > 2.4 erzeugen darf? 
wenn doch, was ist dann?

von Christoph (Gast)


Lesenswert?

Hi, nimm den Xmega64A3U die neuesten Xmegas haben die Errata 
weitestgehen gefixt,

von Henk (Gast)


Lesenswert?

Danke für den Tip. Ich habe einen ATXMEGA128A1,  so steht es zumindest 
auf dem Controller. Müsste ein U dabei stehen?

von Basti M. (counterfeiter)


Lesenswert?

Muss nicht, aber macht das Entwickeln etwas Stressfreier ;)

http://www.digikey.com/product-search/en?x=0&y=0&lang=en&site=us&KeyWords=ATXMEGA128A1U

von henk (Gast)


Lesenswert?

Hallo,

es scheint so als hät ich den Fehler gefunden.

ADCA.REFCTRL = 0x01;

Als Referenz war nur der TemSensor aktiv.

ADCA.REFCTRL = 0x10;


Nun ist Vcc/1.6

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.