Forum: Mikrocontroller und Digitale Elektronik Atmel, CPU_clock geändert, ADC läuft nun nicht mehr richtig


von Hans W. (hans_wurst)


Lesenswert?

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.

von Justus S. (jussa)


Lesenswert?

>   Atmega3290p

meinst du Atmega3250p ?

Hans Wurst wrote:

>     // Bit 5 - ADATE: ADC Auto Trigger Enable
>     // ADCSRA |=  (1<<ADATE);
>     // Bits 2:0 - ADPS2:0: ADC Prescaler Select Bits
>     ADMUX &= ~(1<<ADPS2);
>     ADMUX &= ~(1<<ADPS1);
>     ADMUX &= ~(1<<ADPS0);

??..die ADPSX Bits sind doch im ADCSRA

von Benedikt K. (benedikt)


Lesenswert?

Davon abgesehen ist der Teilerfaktor 2 bei 8MHz zu klein. Atmel 
garantiert 50-200kHz, sagt aber, dass es bis 1MHz mit etwas verringerter 
Auflösung auch noch geht. Darüber misst man nur noch Mist.

von Hans W. (hans_wurst)


Lesenswert?

Justus Skorps wrote:
> meinst du Atmega3250p ?

Nein, er nennt sich zwar schon Atmega3290p, jedoch sind die 
Eigenschaften zwischen den meisten Atmels recht ähnlich (so wie ich das 
sehe).

> ??..die ADPSX Bits sind doch im ADCSRA

Ich Depp, was hatte ich denn da nur für einen Mist programmiert ;)

Jetzt funktioniert es wieder. Ich danke euch beiden.

von Justus S. (jussa)


Lesenswert?

Hans Wurst wrote:

> Nein, er nennt sich zwar schon Atmega3290p, jedoch sind die
> Eigenschaften zwischen den meisten Atmels recht ähnlich (so wie ich das
> sehe).

ah shit, ich hatte nur bei 'normalen' Megas geschaur

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.