Gast
#1905685
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.
