mikrocontroller.net

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


Autor: Nyquist-Shannon (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir mal die Errata des ADC des XMega an.

Autor: xmega (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nyquist-Shannon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Nyquist-Shannon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eventuell Batterie leer am DMM?

Autor: Nyquist-Shannon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm. Muss ich bei Gelegenheit mal selbst überprüfen.

Autor: Henk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, nimm den Xmega64A3U die neuesten Xmegas haben die Errata 
weitestgehen gefixt,

Autor: Henk (Gast)
Datum:

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

Autor: Basti M. (counterfeiter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss nicht, aber macht das Entwickeln etwas Stressfreier ;)

http://www.digikey.com/product-search/en?x=0&y=0&l...

Autor: henk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.