mikrocontroller.net

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


Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: starwatcher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe ich bei der Initialisierung was falsch gemacht?

Autor: xmega gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei 8 bit auflösung oder bei 12 bit

Autor: so nicht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<grins> Sonst noch was ?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: xmega gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei meinem TEST sind 12bit single ended.

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Travel Rec.

Deine Muster scheinen aber zu funktionieren?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: xmega gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wienhast Du denn das MUX-Register eingestellt?

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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é

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.