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.)
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?
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