Xmega 128A1 ADC erreicht nie 0

OP #1175899
Lesenswert?

Hallo,

habe bei einem Xmega 128A1 den Adc mit Interrupt eigerichtet. Interen 
Referenz 1 Volt. Wenn ich dann den ADC Eingang gegen Masse ziehe ist der 
nie 0 sondern immer etwas drüber.

Liegt das an der Configuration?
Controllertakt 16Mhz
hier die Einstellungen:

ldi temp,ADC_RESOLUTION_8BIT_gc
sts ADCA_CTRLB,temp; für 8 Bit betrieb 8-bit right-adjusted result
clr temp
ldi temp,ADC_CH_INPUTMODE_SINGLEENDED_gc
sts ADCA_CH0_CTRL,temp
clr temp
ldi temp,ADC_CH_INPUTMODE_SINGLEENDED_gc
sts ADCA_CH1_CTRL,temp
clr temp
ldi temp,ADC_CH_INPUTMODE_SINGLEENDED_gc
sts ADCA_CH2_CTRL,temp

ldi temp,ADC_PRESCALER_DIV8_gc;Vorteiler einschalten
sts ADCA_PRESCALER,temp
ldi temp,ADC_REFSEL_INT1V_gc;ADC_REFSEL_VCC_gc;ADC_REFSEL_INT1V_gc 
;Referenzspannung auswählen
sts ADCA_REFCTRL,temp
ldi temp,0x01
sts ADCA_CALCTRL,temp

ldi temp,ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc
sts ADCA_CH0_INTCTRL,temp ;Interrupt auf Kanal 0 für ADC Freigeben
clr temp
ldi temp,ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc
sts ADCA_CH1_INTCTRL,temp ;Interrupt auf Kanal 1 für ADC Freigeben
clr temp
ldi temp,ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc
sts ADCA_CH2_INTCTRL,temp ;Interrupt auf Kanal 2 für ADC Freigeben

clr temp

ldi temp,ADC_CH_MUXPOS_PIN0_gc          ; Pin 0
sts ADCA_CH0_MUXCTRL,temp
ldi temp,ADC_CH_MUXPOS_PIN1_gc          ; Pin 1
sts ADCA_CH1_MUXCTRL,temp
ldi temp,ADC_CH_MUXPOS_PIN2_gc          ; Pin 2
sts ADCA_CH2_MUXCTRL,temp
ldi temp,ADC_ENABLE_bm
sts ADCA_CTRLA,temp; ADC A einschalten


abgefragt wird dann im ADC Interrupt:


           lds SREG_sich,CPU_SREG
           push temp
           lds temp,ADCA_CH0RES ; hier weiß ich nicht genau ob das 8 Bit 
Ergebniss im H oder L Register zu finden ist
     sts 0x2000,temp
           sts PortC_out,temp
           pop temp
           sts CPU_SREG,SREG_sich
           reti
Gast #1175914
Lesenswert?

Ich kenn die XMEGAs jetzt nicht direkt, aber ich könnte mit vorstellen, 
dass dein Ground-Signal nicht ganz sauber ist, d.h. deine Schaltung 
könnte evtl. Schwingen. Setz mal sofern noch nicht vohanden 
Abblockkondensatoren ein.
Kannst du mal deine Schaltung posten??
OP #1175918
Lesenswert?

Hallo,

na ja die Schaltung am ADC ist einfach nur ein Potti gegen Gnd und Aref 
wenn ich aber GND gegen eine negative Spannung "austausche" dann komme 
ich auch auf Null also so denke ich gibt es Probleme mit dem Mittelpunkt 
oder der ADC Kalibriert nicht richtig oder ich bin zu blöd das 
Datenblatt zu verstehen.
Gast #1176222
Lesenswert?

Die Xmegas sollen einen Bug im 12 Bit ADC haben, daher verzögert sich 
auch die Serienfertigung. Käuflich sollen die ersten Xmegas (ohne Bug) 
ab April sein. Muster gibt es zwar noch, aber nur wenn man unterschreibt 
dass man den ADC nicht verwendet bzw. über den Bug informiert ist.
So hat es mir zumindest mein Distri gesagt.
Gast #1177606
Lesenswert?

bei meinem einfachen Aufbau habe ich einfach ACC mit VCC verbunden, mit 
einem 100nF gestützt. Verwendet wird die interne 1V Referenez, 12 bit 
unsigned, single ended. Dabei habe ich dann ca. den Offset wie im 
Datenblatt in Abb. 25-11 ( Seite 295 ) beschrieben ist.
(Firma: TravelRec.) Persönliche Seite #1177620
Lesenswert?

Ach ja, jetzt wird es klar: der XMega kann im Single ended unsigned mode 
etwas unterhalb von GND messen, also laut Datenblatt 0.05x VREF, was 
etwa 200 ADC-Werten entspricht. Dies ist eine Besonderheit, um 
beispielsweise Nulldurchgänge ohne aufwändige, externe Beschaltung 
messen zu können. Für Messungen bis und oberhalb GND zieht man diesen 
Offset einfach vom Wandlergebnis ab. Der obere meßbare Wert ist außerdem 
um 200 reduziert, so daß man maximal bis 3895 (0xF37) messen kann.
OP #1177637
Lesenswert?

Hallo,

ja das hat geholfen.
Was ich jetzt noch festgestellt habe ist das die Eingänge sich 
gegenseitig beeinflussen oder wenn ich die ADC Channels gleichzeitig mit

ldi temp,ADC_CH0START_bm|ADC_CH1START_bm|ADC_CH2START_bm|ADC_ENABLE_bm
sts ADCA_CTRLA,temp

starte.

Abfragen tue ich dann im ADC Interrupt für jeden Kanal extra es gibt 
also für jeden CH einen extra Interrupt.

erhöhe ich den Wert von CH0 dann erhöhen sich auch CH1 und 2 mit erhöhe 
ich CH1 erhöht sich CH2 mit und CH0 verändert sich nicht erhöhe ich CH2 
verändern sich 0 und 1 nicht
OP #1177663
Lesenswert?

ldi temp,ADC_CH_MUXPOS_PIN0_gc          ; Pin 0
sts ADCA_CH0_MUXCTRL,temp

ldi temp,ADC_CH_MUXPOS_PIN1_gc          ; Pin 1
sts ADCA_CH1_MUXCTRL,temp

ldi temp,ADC_CH_MUXPOS_PIN2_gc          ; Pin 2
sts ADCA_CH2_MUXCTRL,temp

ldi temp,ADC_ENABLE_bm
sts ADCA_CTRLA,temp; ADC A einschalten

so hier

und vorher

ldi temp,ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc
sts ADCA_CH0_INTCTRL,temp ;Interrupt auf Kanal 0 für ADC Freigeben
clr temp
ldi temp,ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc
sts ADCA_CH1_INTCTRL,temp ;Interrupt auf Kanal 1 für ADC Freigeben
clr temp
ldi temp,ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc
sts ADCA_CH2_INTCTRL,temp ;Interrupt auf Kanal 2 für ADC Freigeben
OP #1177695
Lesenswert?

so hier:

ldi temp,ADC_RESOLUTION_8BIT_gc
sts ADCA_CTRLB,temp; für 8 Bit betrieb 8-bit right-adjusted result
clr temp
ldi temp,ADC_CH_INPUTMODE_SINGLEENDED_gc
sts ADCA_CH0_CTRL,temp
clr temp
ldi temp,ADC_CH_INPUTMODE_SINGLEENDED_gc
sts ADCA_CH1_CTRL,temp
clr temp
ldi temp,ADC_CH_INPUTMODE_SINGLEENDED_gc
sts ADCA_CH2_CTRL,temp


ldi temp,ADC_PRESCALER_DIV4_gc;Vorteiler
sts ADCA_PRESCALER,temp
ldi temp,ADC_REFSEL_VCC_gc;Referenzspannung auswählen
sts ADCA_REFCTRL,temp
OP #1177701
Lesenswert?

noch vergessen

im Interrupt von CH2 wird der ADC dann wieder für die nächste Messung 
"angeworfen"

so:

ADA_CH2:
         lds SREG_sich,CPU_SREG
         push temp
         lds temp,ADCA_CH2RES ;8 Bit ergebniss auslesen CH 0
         sts 0x2002,temp
         clr temp
         ldi 
temp,ADC_CH0START_bm|ADC_CH1START_bm|ADC_CH2START_bm|ADC_ENABLE_bm
         sts ADCA_CTRLA,temp   ;Start Adwandler auf Kanal0
         pop temp
         sts CPU_SREG,SREG_sich
         reti

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren