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?
Ich weiß nicht, welches Datenblatt Du benutzt, aber bei mir steht Vcc/1.6 , und zwar ohne Volt, sondern als Dividend.
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.
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.
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
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
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
Hier findet man eine Menge zu allen xmega Themen: http://atmel.com/dyn/products/app_notes.asp?family_id=607#XMEGA
Danke, das hab ich bisher übersehen dass es ein neues Board gibt. Schade, dass Atmel nur die .hex Files herausrückt.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.