Hallo,
ich möchte die ADC beim xMega nutzen, und zwar im unsigned-mode, mit
einer externen Spannungsreferenz (AREF).
Den xMega betreibe ich ich mit 3.3V. Als externe Referenzspannung möchte
ich ebenfalls 3.3V haben. Laut Datenblatt ist die Referenzspannung
jedoch die extern (an Pin PA0) angelegte, MINUS 0.6V. Also will ich
einen Spannungsteiler machen, der mit den Widerständen R1 (100kOhm) und
R2 (330kOhm), siehe Anhang, 3.9V ergibt. Diesen schließe ich mit C1
(100n) über GND an PA0 an. PA0 habe ich als Eingang deklariert.
Das Problem ist nun, dass, sobald ich PA0 an den Spannungsteiler
anschließe, die Spannung von 3.9V auf 1.55V abfällt. Woher kommt das?
Ich möchte, dass, wenn ich an PA4 0V anlege, ADC_result 0 ergbibt (bzw.
den Standard-Offset von ca. 200) und bei 3.3V ADC_result 4096 ergbt.
Anbei der Code:
1 | #define F_CPU 32000000
|
2 | #include <asf.h>
|
3 |
|
4 | uint16_t ADC_result;
|
5 |
|
6 | int main (void)
|
7 | {
|
8 | PORTA.DIR &=~(1<<0); // PA0 als Eingang
|
9 | ADCA.CTRLB |= ADC_RESOLUTION_12BIT_gc; // 12 bit left adjust unsigned
|
10 | ADCA.REFCTRL |= ADC_REFSEL_AREFA_gc; // AREF als externe Spannung
|
11 | ADCA.PRESCALER |= ADC_PRESCALER_DIV4_gc; // Vorteiler von 4
|
12 | ADCA.CTRLA |= ADC_ENABLE_bm; // ADC enablen
|
13 |
|
14 | //Oszillator auf 32Mhz stellen
|
15 | OSC.CTRL |= OSC_RC32MEN_bm;
|
16 | // Warten bis der Oszillator bereit ist
|
17 | while(!(OSC.STATUS & OSC_RC32MRDY_bm));
|
18 | //Schützt I/O Register, Interrupts werden ignoriert
|
19 | CCP = CCP_IOREG_gc;
|
20 | //aktiviert den internen Oszillator
|
21 | CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
|
22 |
|
23 | while(1)
|
24 | { // ADC lesen
|
25 | ADCA.CH0.CTRL |= ADC_CH_INPUTMODE_SINGLEENDED_gc; //Single-Ended
|
26 | ADCA.CH0.MUXCTRL |= ADC_CH_MUXPOS_PIN4_gc; // PA4 als ADC-Eingang
|
27 | ADCA.CH0.CTRL |= ADC_CH_START_bm;
|
28 | while(!ADCA.CH0.INTFLAGS); // Warten bis Messung abgeschlosse
|
29 | ADC_result= ADCA.CH0.RES;
|
30 | delay_ms(100);
|
31 | }
|
32 | }
|