Hallo ich hab ein Problem mit dem ADC des ATMega1281: ich will mit den freien ADC-Eingängen die Versorgungsspannungen auf dem Board überwachen. Das sind 12V, 3.3V und -5V. Referenzspannung ist 4.096V. Bei 3.3V (3. Kanal) und -5V (4.Kanal) funktioniert die Messung ohne Probleme. Nur bei 12V (2. Kanal) misst er immer 0; Die 12V werden über einen 30K und 10K Spannungsteiler auf 3V gebracht und dann zum ADC. Da bricht die Spannung auf ca. -0.5V ein. Wenn ich den Pin des ATMega anhebe stimmen die 3V wieder. Der ATMega wurde schon getauscht, hat aber keine Besserung gebracht. Hoffe ihr wisst abhilfe. Sebastian Der Code:
1 | // Messwert erfassen
|
2 | uint16_t adc_mess(uint8_t channel) |
3 | {
|
4 | uint8_t i; |
5 | uint16_t u16Messwert; |
6 | |
7 | // ADC einschalten und Prescaler auf 111 (125 kHz)
|
8 | PRR0 &= ~(1 << PRADC); |
9 | ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); |
10 | |
11 | // Externe Referenzspannung und Ergebnis rechtsbündig / low byte first
|
12 | switch (channel) |
13 | {
|
14 | case 0: // 1.Kanal |
15 | ADMUX = 0x00; |
16 | break; |
17 | case 1: // 2.Kanal |
18 | ADMUX = 0x01; |
19 | break; |
20 | case 2: // 3.Kanal |
21 | ADMUX = 0x02; |
22 | break; |
23 | case 3: // 4.Kanal |
24 | ADMUX = 0x03; |
25 | break; |
26 | default:
|
27 | ADCSRA &= ~(1<<ADEN); |
28 | PRR0 |= (1 << PRADC); |
29 | return 0; |
30 | }
|
31 | |
32 | |
33 | // Dummy-Messung
|
34 | ADCSRA |= (1<<ADSC); |
35 | while ( ADCSRA & (1<<ADSC) ) |
36 | {;}
|
37 | u16Messwert = ADCW; // Register auslesen |
38 | u16Messwert = 0; // Messwert verwerfen |
39 | |
40 | // Messung starten
|
41 | for(i = 0; i < ANZAHL_MESSUNGEN; ++i) |
42 | {
|
43 | ADCSRA |= (1<<ADSC); |
44 | while ( ADCSRA & (1<<ADSC) ) |
45 | {;}
|
46 | u16Messwert += ADC; // Ergebnisse addieren |
47 | }
|
48 | // ADC ausschalten
|
49 | ADCSRA &= ~(1<<ADEN); |
50 | PRR0 |= (1 << PRADC); |
51 | |
52 | // Mittelwert aus den Messungen
|
53 | u16Messwert /= i; |
54 | |
55 | return u16Messwert; |
56 | }
|