mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Xmega ADC Referenzspannung


Autor: Mike (Gast)
Datum:

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

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

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

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze das Datenblatt auf der Atmelseite. 
http://www.atmel.com/dyn/resources/prod_documents/... (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/... (Seite7)

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

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

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

Autor: Helmut Ru (heru01)
Datum:

Bewertung
0 lesenswert
nicht 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:
/* Move stored calibration values to ADC A. */
ADC_CalibrationValues_Set(&ADCA);
/* Get offset value for ADC A. */
offset = ADC_Offset_Get(&ADCA);

/* Set up ADC A to have signed conversion mode and 12 bit resolution. */
ADC_ConvMode_and_Resolution_Config(&ADCA, false, ADC_RESOLUTION_12BIT_gc);
/* Sample rate is CPUFREQ/8. Allow time for storing data. */
ADC_Prescaler_Config(&ADCA, ADC_PRESCALER_DIV512_gc);
/* Set reference voltage on ADC A to be VCC-0.6 V.*/
ADC_Reference_Config(&ADCA, ADC_REFSEL_INT1V_gc);
/* Setup channel 0, 1, 2 and 3 to have single ended input. */
ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH0,
ADC_CH_INPUTMODE_SINGLEENDED_gc,
ADC_CH_GAIN_1X_gc);
ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH1,
ADC_CH_INPUTMODE_SINGLEENDED_gc,
ADC_CH_GAIN_1X_gc);
ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH2,
ADC_CH_INPUTMODE_SINGLEENDED_gc,
ADC_CH_GAIN_1X_gc);
ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH3,
ADC_CH_INPUTMODE_SINGLEENDED_gc,
ADC_CH_GAIN_1X_gc);
/* Set input to the channels in ADC A to be PIN 1, 2, 3 and 4. */
ADC_Ch_InputMux_Config(&ADCA.CH0, ADC_CH_MUXPOS_PIN0_gc, ADC_CH_MUXNEG_PIN7_gc);
ADC_Ch_InputMux_Config(&ADCA.CH1, ADC_CH_MUXPOS_PIN1_gc, ADC_CH_MUXNEG_PIN7_gc);
ADC_Ch_InputMux_Config(&ADCA.CH2, ADC_CH_MUXPOS_PIN2_gc, ADC_CH_MUXNEG_PIN0_gc);
ADC_Ch_InputMux_Config(&ADCA.CH3, ADC_CH_MUXPOS_PIN3_gc, ADC_CH_MUXNEG_PIN0_gc);
/* Setup sweep of all four virtual channels. */
ADC_SweepChannels_Config(&ADCA, ADC_SWEEP_0123_gc);
/* Enable ADC A with free running mode, Vcc reference and unsigned conversion.*/
ADC_Enable(&ADCA);
/* Wait until common mode voltage is stable. Default clk is 2MHz and
 * therefore below the maximum frequency to use this function. */
ADC_Wait_8MHz(&ADCA);
/* Enable free running mode. */
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 ?
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

Autor: Helmut Ru (heru01)
Datum:

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

Autor: Helmut Ru (heru01)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier findet man eine Menge zu allen xmega Themen:
http://atmel.com/dyn/products/app_notes.asp?family...

Autor: Helmut Ru (heru01)
Datum:

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

Autor: Dr. Grusel (Gast)
Datum:

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

Autor: XMEGA (Gast)
Datum:

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

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.