Forum: Mikrocontroller und Digitale Elektronik Xmega 128A1 ADC erreicht nie 0


von R--- S. (rene66)


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

von starwatcher (Gast)


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

von R--- S. (rene66)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Das wird ein Layoutproblem sein. AGND muß von DGND insofern abgetrennt 
sein, daß sich beide nur an einem Punkt, nämlich an der 
Spannungsversorgung treffen. Kein digitales Signal und kein 
nennenswerter Strom darf über AGND fließen.

von R--- S. (rene66)


Lesenswert?

habe ich bei der Initialisierung was falsch gemacht?

von xmega gast (Gast)


Lesenswert?

Hallo,

das ist normal, das hab ich auch. Der Nullpunkt liegt bei mir ca. 200 
counts unter dem GND. Steht aber auch im Datenblatt..

von R--- S. (rene66)


Lesenswert?

bei 8 bit auflösung oder bei 12 bit

von so nicht (Gast)


Lesenswert?

<grins> Sonst noch was ?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>das ist normal, das hab ich auch. Der Nullpunkt liegt bei mir ca. 200
>counts unter dem GND. Steht aber auch im Datenblatt..

Wie bitte? Von 2 LSB ist die Rede also maximal +-3 AD-Werte bei 12 Bit. 
Mein XMega macht +-2 ADC-Werte bei 12 Bit. Bei ARef >2,5V gibt es 
größere Abweichungen, das ist in den Errata vermerkt.

von xmega gast (Gast)


Lesenswert?

bei meinem TEST sind 12bit single ended.

von R--- S. (rene66)


Lesenswert?

ich habe die Interne 1V Spannung benutzt aber den Aref pin über eine 
10uH Induktivität mit VCC versorgt und 100n gegen Masse geschalten.

von R--- S. (rene66)


Lesenswert?

bei 8 Bit auflösung welche Byte muß ich eigentlich auslesen das High 
oder Low
also ADCA_CH0RES oder ADCA_CH0RES+1?
das Datenblatt sagt bei 8 Bit das High Byte also ADCA_CH0RES+1. Aber 
wenn ich das nehme dann geht nix.

von Gast (Gast)


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.

von R--- S. (rene66)


Lesenswert?

@Travel Rec.

Deine Muster scheinen aber zu funktionieren?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Klar funktionieren die Muster, lediglich ARef muß unter 2.5V bleiben, 
also meinethalben 2V. Habe ich seinerzeit über eine LED als Referenz 
extern angeschaltet.

>ich habe die Interne 1V Spannung benutzt aber den Aref pin über eine
>10uH Induktivität mit VCC versorgt und 100n gegen Masse geschalten.

ARef |= AVcc

von xmega gast (Gast)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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.

von R--- S. (rene66)


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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Wienhast Du denn das MUX-Register eingestellt?

von R--- S. (rene66)


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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Und wie sind die Control-Register des ADC geladen, speziell was die Art 
der Messung angeht?

von R--- S. (rene66)


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

von R--- S. (rene66)


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

von R--- S. (rene66)


Lesenswert?

Hallo,

mein Fehler war der ich hatte den ADC_PRESCALER auf /4 Eignestellt bei 
16Mhz Taktfrequenz sind das 4Mhz das ist zu schnell habe dann auf /8 
Eingestellt das war dann auch noch zu schnell mit /16 lief es dann.

Mfg
René

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
Noch kein Account? Hier anmelden.