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.
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
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.
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?
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.
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?
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.)
Hmm. Muss ich bei Gelegenheit mal selbst überprüfen.
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?
Hi, nimm den Xmega64A3U die neuesten Xmegas haben die Errata weitestgehen gefixt,
Danke für den Tip. Ich habe einen ATXMEGA128A1, so steht es zumindest auf dem Controller. Müsste ein U dabei stehen?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
