Hallo,
ich messe in einer Interrupt Routine zwei ADC Eingänge und die interne
1,23V Referenz. Allerdings scheinen die Werte der Referenz von den ADC
Eingängen beeinflusst zu werden. Was nicht sein kann. Es wird 64x
abwechselnd erst ein und dann der andere ADC Pin und zum Abschluss
einmalig die Referenz gemessen.
1 | ISR(ADC_vect) {
|
2 | u08 cycle_l = cycle; //local variable improves speed
|
3 | if (cycle_l <= 128) {
|
4 | if (cycle_l & 1) { //odd -> lower sum has been converted
|
5 | lowersum_cnt += ADCW;
|
6 | ADMUX = (1<< REFS0) | UPPER_PIN; //upper voltage comes next
|
7 | } else { //even -> upper sum has been converted
|
8 | uppersum_cnt += ADCW;
|
9 | if (cycle_l != 128) {
|
10 | ADMUX = (1<< REFS0) | LOWER_PIN; //lower voltage comes next
|
11 | } else
|
12 | ADMUX = (1<< REFS0) | BANDGAP_PIN; //measure internal vcc
|
13 | //if (cycle_l == 128) {
|
14 |
|
15 | }
|
16 | } else {
|
17 | cycle_l = 0;
|
18 | lowersum_raw = lowersum_cnt;
|
19 | lowersum_cnt = 0;
|
20 | uppersum_raw = uppersum_cnt;
|
21 | uppersum_cnt = 0;
|
22 | bandgap_raw = ADCW;
|
23 | ADMUX = (1<< REFS0) | LOWER_PIN;
|
24 | updated = 1;
|
25 | }
|
26 | ADCSRA |= (1<<ADSC); //start conversion
|
27 | cycle_l++; //number of started conversion
|
28 | cycle = cycle_l; //write back local variable
|
29 | }
|
ist die Interrupt Routine.
Ansonsten:
Intitialisierung:
1 | //A/D converter with a prescaler of 64
|
2 | //resulting in a frequency of 125KHZ (at F_CPU = 8MHZ)
|
3 | ADCSRA = (1 << ADEN) | (1<< ADIE) | (0x06); //enable with prescaler
|
4 | ADMUX = (1<< REFS0) | LOWER_PIN; //set to lower pin
|
5 | cycle = 1; //first conversion will be started
|
6 | ADCSRA |= (1<<ADSC); //start first conversion
|
Konstanten:
#define UPPER_PIN 1
#define LOWER_PIN 0
#define BANDGAP_PIN 0x0e
lowersum und uppersum sind wunderbar, nur die Referenz macht Probleme,
sprich ist von den anderen Werten Abhängig. Der AVR ist ein ATMEGA168.
Ich messe die Referenz um damit festzustellen ob die Betriebsspannung im
ordentlichem Bereich (> 4,7V) liegt. Alle notwendigen Variablen sind
natürlich volatile.
Hat jemand Ideen?