Forum: Mikrocontroller und Digitale Elektronik XMega128A1 ADC


von Michelin (Gast)


Lesenswert?

Hallo,

ich beschäftige mich gerade mit dem ADC des XMega128A1. Leider weiß ich 
gerade nicht mehr weiter, ich hoffe, dass sich jemand von euch damit 
auskennt. Aus dem Datenblatt werde ich auch nicht ganz schlau!

Ich versuche eine Einzelmessung des ADC anzutriggern. Das funktioniert 
prinzipiell auch, auf den ADC Kanälen 0...3. Wenn ich aber auf den 
Kanälen 4...7 Messen will weiß ich nicht welches Bit in welchem Register 
ich setzen soll. Ebenfalls weiß ich nicht, in welchem register dann der 
AD-Wert abzuholen ist.

Für die Kanäle 0...3 gibt es die Register ADCB.CH1...3.CTRL und 
ADCB.CH1...3.RES. Im CTRL-Register trigger ich die Messung an und hole 
den Wert dann im RES-Register ab.

Diese Register gibt es aber für die Kanäle 4...7 nicht, was soll ich 
tun.

So mache ich es z.B. bei Kanal 1:
1
ADCB.CH1.CTRL = 0x81;   // ADCB Kanal 1 starten / sigle ended positiv input
2
while(ADCB.INTFLAGS == 0)  // Warten bis AD-Wandlung beendet
3
{}
4
value = ADCB.CH1.RES;    // AD-Wert abholen
5
ADCB.INTFLAGS = 0x01;    // ADC Neustart frei schalten

Danke für eure Hilfe!

Gruß

von Michelin (Gast)


Lesenswert?

Entschuldigung, ich hab noch vergessen zu schreiben, dass es auf den 
Kanälen 1...3 einwandfrei funktioniert!

von Michelin (Gast)


Lesenswert?

Ich hab mir schon gedacht, dass niemand gleich ne Antwort hat. Schade!

von Reader (Gast)


Lesenswert?

Hallo,

die "Kanäle 0...3" haben nichts mit den ADC-Eingangspins zu tun.
Du kannst auf einem Kanal bleiben und im MUXCTRL Register die Eingänge 
auswählen.

ADCB.CH1.MUXCTRL = 0x00 // ADC0  0x08 ADC1  0x10 ADC2  u.s.w.
ADCB.CH1.CTRL = 0x81;   // ADCB Kanal 1 starten / sigle ended positiv 
input
while(ADCB.INTFLAGS == 0)  // Warten bis AD-Wandlung beendet
{}
value = ADCB.CH1.RES;    // AD-Wert abholen
ADCB.INTFLAGS = 0x01;    // ADC Neustart frei schalten

von Michelin (Gast)


Lesenswert?

Danke für die Antwort!

Ich versteh dann aber nicht, was das mit ch0...ch3 soll?

Kann ich dann immer auf ch0 messen und nur das mux umschalten?

Gruß

von Dominik M. (lauso)


Lesenswert?

Auf den Analogeingängen des PORT B stehen Dir vier Kanäle Ch0 bis Ch3 
zur verfügung. Du hast nun die Möglichkeit über den Multiplexer einem 
Pin einen Kanal zuzuordnen.
So kann mann mit einem Kanal, nach beendeter Messung über den Multplexer 
das Eingangssignal eines anderen Eingangs messen.
Ich kann aber auch einem Pin alle vier Kanäle zuweisen und Messen.

von Michelin (Gast)


Lesenswert?

Ich glaub ich habs jetzt verstanden! Jetzt funktioniert es auch bestens. 
Ich hab jetzt ch0 auf PORTA, ch1 auf PORTB und ch2 auf interner 
Temperatur. Geht einwandfrei.

Danke für eure Hilfe!

Sind die ch0...ch3 vier unabhängige AD-Wandler, oder steckt da auch ein 
Multiplexer dahinter?

Gruß

von Dominik M. (lauso)


Angehängte Dateien:

Lesenswert?

Die AD Channels sind unabhängig. Die Wandlung funktioniert ja folgender 
maßen. Im ersten Step der Wandlung wird geprüft ob der angelegte Wert 
größer oder kleiner Uref/2 ist. Im zweiten Step wo er im Bereich von 
Uref/4 liegt. Das wir bei einer 12Bit AD Wandlung insgesammt 12x 
durchgeführt. Das ganze findet im Pipelined ADC Block statt. Wann jetzt 
der Wert von Channel0 im Step2 ist kann der Wert von Channel1 im Step1 
bearbeitet werden. Durch dieses verfahren besteht die Möglichkeit 2 
Millionen Wandlungen pro Sekunde durchzuführen. Anbei ein Screenshot 
damit Du das Prinzip besser erkennst.

von Michelin (Gast)


Lesenswert?

Vielen Dank für die tolle Erklärung, ich bin jetzt auch auf der Höhe!

Danke

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.