Hallo,
ich möchte meine Speisespannung (2 x AA 1.5V) messen.
uC: ATxMega32 E5
Dazu hab ich für die referenz die interne Ref 1V und die zu messende
Spannung VCC/10 ausgewählt. 12Bit (eigentlich nur 11Bit, da in signed
mode). Das sollte dann bei 3.0V etwa 614 counts als "Messwert" ergeben.
Bei manchen boards funktioniert das (Messwert von 3V auf 2V: ca 600 auf
400)
Bei manchen leider nicht (Misst nur von 3V auf 2.8V korrekt (600 auf
560).
Unter 2.8V ist der Output sehr schwankend zwischen ca 600 und 230.<br />
Unter 2.6V ist der Output dann geleich nur noch so um 230 rum.
Wieso dass manche Boards funktionieren und manche nicht, ist mir ein
Rätsel.
Es sind die genau gleichen uCs drauf. Und von der Schaltung kann es ja
auch nicht abhängen, da dies ja interne Signale sind. Sonst müsste ja
die Speisung auf ca. 1.12V absinken, was sie aber nicht tut. Dann würde
der Prozessor eh nicht mehr tun.
Hier mal der Code, ich hab alles schon zehnmal durchstudiert, finde aber
den Fehler nicht. Vielleicht sieht ihn ja jemand anders?
1 | void adc_init_1V_ref() {
|
2 | ADCA.CTRLA = ADC_FLUSH_bm | ADC_ENABLE_bm; // Flush and Enable ADC
|
3 | ADCA.CTRLB = ADC_SIGNED_MODE_bm | ADC_RESOLUTION_12BIT_gc;
|
4 | ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm;
|
5 | ADCA.PRESCALER = ADC_PRESCALER_DIV4_gc;
|
6 |
|
7 | ADCA.CH0.CTRL = ADC_CH_GAIN_1X_gc | ADC_CH_INPUTMODE_INTERNAL_gc;
|
8 | ADCA.CH0.MUXCTRL = ADC_CH_MUXINT_SCALEDVCC_gc;
|
9 | ADCA.CH0.INTCTRL = ADC_CH_INTMODE_COMPLETE_gc | ADC_CH_INTLVL_OFF_gc;
|
10 | ADCA.CH0.AVGCTRL = ADC_CH_SAMPNUM_1X_gc;
|
11 | }
|
12 |
|
13 | uint16_t ubat_read_1V_ref(void) {
|
14 | uint16_t adc_res;
|
15 | ADCA.CH0.INTFLAGS = ADC_CH_IF_bm;
|
16 | ADCA.CH0.CTRL |= ADC_CH_START_bm;
|
17 | while (!(ADCA.CH0.INTFLAGS & ADC_CH_IF_bm)) {
|
18 | asm("NOP");
|
19 | }
|
20 | adc_res = ADCA.CH0.RES;
|
21 | return adc_res;
|
22 | }
|