Forum: Mikrocontroller und Digitale Elektronik Xmega ADC Referenzspannung


von Mike (Gast)


Lesenswert?

Hallo ich beschäftige mich nun schon längerer Zeit mit den Xmega128A1.
Nun lese ich im Datenblatt vom Mega dass ich die Referenzspannung vom 
ADC intern auf 1V oder VCC/1,6V schalten kann. Im Datenblatt vom ADC 
steht aber VCC-0,6 und im AVR-Studio wiederum VCC/1,6V.
Das VCC/1,6V hört sich für mich nicht sehr plausiebel an.
Ist das ein Fehler vom Studio?

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


Lesenswert?

Ich weiß nicht, welches Datenblatt Du benutzt, aber bei mir steht 
Vcc/1.6 , und zwar ohne Volt, sondern als Dividend.

von Mike (Gast)


Lesenswert?

Ich benutze das Datenblatt auf der Atmelseite. 
http://www.atmel.com/dyn/resources/prod_documents/doc8077.pdf (Seite 
293)

mir gehts ja jetzt nicht um die Einheitenrechnung sondern ob es -0,6 
oder /1,6 heißen soll.
Hier heißt es -0,6 
http://www.atmel.com/dyn/resources/prod_documents/doc8032.pdf (Seite7)

ps. mein mk2 ist leider noch nicht da deshalb kann ich es auch noch 
nicht ausprobieren.

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


Lesenswert?

Es heißt entweder 1.00V Bandgap-Referenz oder Vcc/1.6, was einen simplen 
Spannungsteiler darstellt. Es heißt nicht Vcc-0.6 oder Vcc-1.6.

von Helmut R. (heru01)


Lesenswert?

Hallo Forum,

auch ich setzte mich gerade mit dem XMEga (128A1) ADC auseinander.
Programmierung erfolgt in GCC.
In einem ersten Schritt habe ich die Eingänge gepollt.
Ergebnis: bis auf einen Offset von konstant 54 mV in Ordung. (Ich lese 
wie im Atmel Beispiel das Calibration Byte aus und korrigiere)  Mein 
Aufbau bekommt keinen Preis was A/D Trennung anbelangt, von daher ist 
das Ergebnis naja, insofern ok, dass nach rechnerischem Abzug die ADC 
Werte passen.

Was ich (noch) nicht kapiere:
Initialisierung:
1
/* Move stored calibration values to ADC A. */
2
ADC_CalibrationValues_Set(&ADCA);
3
/* Get offset value for ADC A. */
4
offset = ADC_Offset_Get(&ADCA);
5
6
/* Set up ADC A to have signed conversion mode and 12 bit resolution. */
7
ADC_ConvMode_and_Resolution_Config(&ADCA, false, ADC_RESOLUTION_12BIT_gc);
8
/* Sample rate is CPUFREQ/8. Allow time for storing data. */
9
ADC_Prescaler_Config(&ADCA, ADC_PRESCALER_DIV512_gc);
10
/* Set reference voltage on ADC A to be VCC-0.6 V.*/
11
ADC_Reference_Config(&ADCA, ADC_REFSEL_INT1V_gc);
12
/* Setup channel 0, 1, 2 and 3 to have single ended input. */
13
ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH0,
14
ADC_CH_INPUTMODE_SINGLEENDED_gc,
15
ADC_CH_GAIN_1X_gc);
16
ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH1,
17
ADC_CH_INPUTMODE_SINGLEENDED_gc,
18
ADC_CH_GAIN_1X_gc);
19
ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH2,
20
ADC_CH_INPUTMODE_SINGLEENDED_gc,
21
ADC_CH_GAIN_1X_gc);
22
ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH3,
23
ADC_CH_INPUTMODE_SINGLEENDED_gc,
24
ADC_CH_GAIN_1X_gc);
25
/* Set input to the channels in ADC A to be PIN 1, 2, 3 and 4. */
26
ADC_Ch_InputMux_Config(&ADCA.CH0, ADC_CH_MUXPOS_PIN0_gc, ADC_CH_MUXNEG_PIN7_gc);
27
ADC_Ch_InputMux_Config(&ADCA.CH1, ADC_CH_MUXPOS_PIN1_gc, ADC_CH_MUXNEG_PIN7_gc);
28
ADC_Ch_InputMux_Config(&ADCA.CH2, ADC_CH_MUXPOS_PIN2_gc, ADC_CH_MUXNEG_PIN0_gc);
29
ADC_Ch_InputMux_Config(&ADCA.CH3, ADC_CH_MUXPOS_PIN3_gc, ADC_CH_MUXNEG_PIN0_gc);
30
/* Setup sweep of all four virtual channels. */
31
ADC_SweepChannels_Config(&ADCA, ADC_SWEEP_0123_gc);
32
/* Enable ADC A with free running mode, Vcc reference and unsigned conversion.*/
33
ADC_Enable(&ADCA);
34
/* Wait until common mode voltage is stable. Default clk is 2MHz and
35
 * therefore below the maximum frequency to use this function. */
36
ADC_Wait_8MHz(&ADCA);
37
/* Enable free running mode. */
38
ADC_FreeRunning_Enable(&ADCA);

Wenn ich den Wandler polle, so habe ich gemuxt nur Zugriff auf Ch0 .. 3 
??
Muss ich in einem zweiten Durchlauf tatsächlich nochmal alles starten ?
1
ADC_Ch_InputMux_Config(&ADCA.CH0, ADC_CH_MUXPOS_PIN4_gc, ADC_CH_MUXNEG_PIN7_gc);
für Kanal 4??

Oder habe ich irgendeinen Denkfehler? Gut, ich kann Eventsystem, DMA, 
Ints etc benutzen; aber auch ein erster Schritt sollte eigentlich alle 8 
Kanäle sequentiell gelesen ausspucken, ohne viel SW-Klimbim....

Register sehe ich aber nur 0..3, also 4 Ergebnisse und nicht deren 8?

Bin gespannt auf Antworten,

Gruß
Helmut

von Helmut R. (heru01)


Lesenswert?

Hallo Forum,

ich schiebe noch eine Frage hinterher: (nicht um den Staub des Threads 
abzuschütteln, sondern als echte Frage)

hat schon jemand probiert externe Referenzspannung für den ADC des 
XMEga128A1 Rev H zu benutzen?
Also entweder habe ich einen Initialisierungsfehler oder der µC 
spinnt....
:-) was ist wohl wahrscheinlicher? :-)

Ich nehme die Init-Routine und schreibe
1
ADC_Reference_Config(&ADCA, ADC_REFSEL_AREFA_gc);

PA0 hat bei mir 2V; Pa1..Pa7 haben Spannungsteiler (in 
Orgelpfeifenmanier) die von 0,8V .. 0,3V gehen (dass ich was sehe)

Mit interner Referenz funktioniert der µC und die ADC Wandlung, extern 
Ref hängt sich der komplette Controller auf.

Bin gespannt ob noch jemand darauf gestossen ist.

Gruß
Helmut

von Helmut R. (heru01)


Lesenswert?

OK, gelöst.
Seltener Fall: der µC spinnt. Hatte alles richtig - mit anderem 
Testboard läufts.

Ich habe nur einen riesigen Offset von 96mV. Die Teilerverhältnisse 
passen aber (==> Ofs konstant)

Gruß
Helmut

von Simon K. (simon) Benutzerseite


Lesenswert?

Hier findet man eine Menge zu allen xmega Themen:
http://atmel.com/dyn/products/app_notes.asp?family_id=607#XMEGA

von Helmut R. (heru01)


Lesenswert?

Danke, das hab ich bisher übersehen dass es ein neues Board gibt.
Schade, dass Atmel nur die .hex Files herausrückt.

von Dr. Grusel (Gast)


Lesenswert?

Mahlzeit!

Ich habe auch mal eine Frage zu dem ADC des XMega128A1:

Wie lade ich die Kalibrierungswerte CALL und CALH (reinschreiben, das 
ist klar). Da ich vorgefertigte Treiber vermeide (die schreinbe ich 
lieber selbst...) muss ich wissen wie ich an die Werte im NVM komme. Da 
bin ich im Moment am verzweifeln.

gruseliger Gruß

Grusel

von XMEGA (Gast)


Lesenswert?

Hallo,

Dr. Grusel schrieb:
> an die Werte im NVM komme

#define ADCACAL0_offset 0x20  // zum Auslesen ADC Offset aus Flash
#define ADCACAL1_offset 0x21  // dsgl


ADCA.CALL=read_calibration_byte(PROD_SIGNATURES_START+ADCACAL0_offset);
ADCA.CALH=read_calibration_byte(PROD_SIGNATURES_START+ADCACAL1_offset);


uint8_t read_calibration_byte( uint8_t index )
{
uint8_t result;

/* Load the NVM Command register to read the calibration row. */
NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;
result = pgm_read_byte(index);

/* Clean up NVM Command register. */
NVM_CMD = NVM_CMD_NO_OPERATION_gc;

return( result );

Gruß XMEGA

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.