Hallo,
ich verwende den Atmega3290p. Default-mäßig läuft er mit internen clk
bei 1MHz. Mit diesem Takt konnte ich die Spannungen am ADC ohne Probleme
messen.
Der zugehörende code (falls er hilfreich ist):
1 | void adc_init(void)
|
2 | {
|
3 | // PRR - Power Reduction Register
|
4 | // Bit 0 - PRADC: Power Reduction ADC
|
5 | PRR &= ~(1<<PRADC); // dont shut down the ADC power
|
6 |
|
7 | // ADMUX - ADC Multiplexer Selection Register
|
8 | // Bit 7:6 - REFS1:0: Reference Selection Bits
|
9 | ADMUX &= ~(1<<REFS1); // AVCC with external capacitor at AREF pin
|
10 | ADMUX |= (1<<REFS0); // AVCC with external capacitor at AREF pin
|
11 | // Bits 4:0 - MUX4:0: Analog Channel Selection Bits
|
12 | ADMUX &= ~(1<<MUX4);
|
13 | ADMUX &= ~(1<<MUX3);
|
14 | ADMUX &= ~(1<<MUX2);
|
15 | ADMUX &= ~(1<<MUX1);
|
16 | ADMUX |= (1<<MUX0);
|
17 |
|
18 | // ADCSRA - ADC Control and Status Register A
|
19 | // Bit 7 - ADEN: ADC Enable
|
20 | ADCSRA |= (1<<ADEN);
|
21 | // Bit 6 - ADSC: ADC Start Conversion
|
22 | ADCSRA |= (1<<ADSC);
|
23 |
|
24 | // Bit 5 - ADATE: ADC Auto Trigger Enable
|
25 | // ADCSRA |= (1<<ADATE);
|
26 | // Bits 2:0 - ADPS2:0: ADC Prescaler Select Bits
|
27 | ADMUX &= ~(1<<ADPS2);
|
28 | ADMUX &= ~(1<<ADPS1);
|
29 | ADMUX &= ~(1<<ADPS0);
|
30 | }
|
31 | void get_ADC(int adc_channel)
|
32 | {
|
33 | // Bits 4:0 - MUX4:0: Analog Channel Selection Bits
|
34 | ADMUX = adc_channel;
|
35 |
|
36 | // Bit 6 - ADSC: ADC Start Conversion
|
37 | ADCSRA |= (1<<ADSC);
|
38 | while ((ADCSRA & ( 1 << ADSC )));// stays high as long as is in progress
|
39 | // Werte stehen nun im ADCL und ADCH
|
40 | }
|
Wenn ich den Takt nun aber auf 8 MHz (intern) erhöhe, bekomme ich nur
noch falsche Werte geliefert. Kann mir jemand sagen was ich falsch
mache?
Auch wenn ich den ADC Prescaler (ADMUX) ändere, stimmen meine Werte
trotzdem nicht (So wie ich es verstanden habe, dürfte sich dies eh nicht
auf die Richtigkeit der Messwerte auswirken).
Danke schon mal für die Antworten.