Forum: Mikrocontroller und Digitale Elektronik Abtastrate ADC


von Chris N. (Gast)


Lesenswert?

Hallo zusammen.
Ich habe ein kleines Problem mit meinem kleinen Projekt dass ich gerade 
umsetzen will.

Ich hab mir mit einem Atmega16 einen ADC gebastelt.
Ich möchte eifach gearde am Pin ADC0 ein Audio-Signal (0-5Volt) einlesen 
und am Port B an Hand eines R2R Netzwerks wieder ausgeben.
Mein Problem ist jetzt, dass er mir nur die unteren Frequenzen (bis ca 
500Herz) nach dem R2R Netzwerk hören kann.
Ich schließe jetzt mal darauf, dass die Abtastung einfach zu niedrig 
ist.
Nun meine Frage: Kann ich die Abtastung irgendwie erhöhen dass ich das 
komplette Audio-Frequenz-Spektum nach dem R2R Netzwerk bekomme?

So sieht derzeit meine ADC-Initialisierung aus:
1
void initADC(void)                  // for ATmega16
2
{
3
   ADMUX = 0;
4
5
   // set the voltage reference to AVCC
6
7
   ADMUX = ADMUX | (0<<REFS1 | 1<<REFS0);
8
9
   // select the desired input channel ADC0 for test
10
11
   ADMUX = ADMUX | (0<<MUX2| 0<<MUX1 | 0<<MUX0);
12
13
   // set the operation mode and enable the adc
14
15
   ADCSRA = 1<<ADEN | 1<<ADSC | 1<<ADATE | 0<<ADIF | 0<<ADIE | 1<<ADPS2 | 1<<ADPS1 | 0<<ADPS0;
16
}


Ich hoffe mir kann jemand bei meinem Problem helfen.

Gruß Chris

: Bearbeitet durch User
von Chris N. (Gast)


Lesenswert?

So sieht übrigens mein ganzes ADC-Programm aus.

1
#include <avr/io.h>
2
3
4
void initADC(void);                 // Deklarieren der Funktion
5
6
7
// ---------- Hauptprogramm ----------------------------------------------------
8
9
10
int main()
11
{
12
    unsigned int ADC_value;         // Initialisieren der Variablen
13
    unsigned char ADC_8bit;
14
15
                                    // Initialisierung der Ports
16
17
    DDRB = 0xFF;                    // Gesamter Port B auf Ausgang
18
    PORTB = 0xFF;                   // Alle Leds aus
19
    
20
    initADC();
21
22
    while(1)                        // Hauptschleife (Endlosschleife)
23
    {
24
        ADC_value = ADC;            // 10-bit Wert vom ADC-Doppelregister holen,
25
        ADC_8bit = ADC_value >> 2;  //   auf 8-bit Aufloesung bringen
26
        PORTB = ADC_8bit;          //   
27
    }
28
    return 0;
29
}
30
31
32
33
void initADC(void)                  // for ATmega16
34
{
35
   ADMUX = 0;
36
37
   // set the voltage reference to AVCC
38
39
   ADMUX = ADMUX | (0<<REFS1 | 1<<REFS0);
40
41
   // select the desired input channel ADC0 for test
42
43
   ADMUX = ADMUX | (0<<MUX2| 0<<MUX1 | 0<<MUX0);
44
45
   // set the operation mode and enable the adc
46
47
   ADCSRA = 1<<ADEN | 1<<ADSC | 1<<ADATE | 0<<ADIF | 0<<ADIE | 1<<ADPS2 | 1<<ADPS1 | 0<<ADPS0;
48
}

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

Mit welchem Takt läuft dein ATMega?

MfG Spess

von TomToll (Gast)


Lesenswert?

Ich hab zwar Null Plan von C, aber diese Bitzuweisung


> ADMUX = ADMUX | (0<<REFS1 | 1<<REFS0)

>ADMUX = ADMUX | (0<<MUX2| 0<<MUX1 | 0<<MUX0);
>
>    ADCSRA = 1<<ADEN | 1<<ADSC | 1<<ADATE | 0<<ADIF | 0<<ADIE | 1<<ADPS2
> | 1<<ADPS1 | 0<<ADPS0;

sieht irgendwie verkorkst aus.


Tom

von Chris N. (Gast)


Lesenswert?

Liegt bei 125,00 kHz

von Karl H. (kbuchegg)


Lesenswert?

Chris N. schrieb:
> Liegt bei 125,00 kHz

Der Takt mit dem der AVR betrieben wird?
Sicher?
Oder meinst du den ADC-Takt, der sich aus CPU Takt und dem ADC-Prescaler 
ergibt?

Der ADC braucht ein paar CPU-Takte um zu wandeln. Wenn der AVR wirklich 
mit 125kHz betrieben wird, dann bist du mit 500Hz eigentlich noch gut 
bedient.

von Oliver (Gast)


Lesenswert?

Chris N. schrieb:
> Liegt bei 125,00 kHz

Das ist wohl der ADC-Takt. der mit deinen ADPS-Vorteiler-Einstellungen 
(110) auf 8Mhz CPU-Takt schliessen lässt. Hast du tatsächlich einen 
8MHZ-Quarz dran, und auch geprüft, ob der Prozessor tatsächlich mit 8Mhz 
läuft?

125kHz ADC-Frequenz ergäben im free-running mode 9,6kHz Abtastfrequenz, 
was für deutlich mehr als 500 Hz Audiosignal reichen sollte.

Wenn der Prozessor aber auf seiner default-Einstellung von 1MHz läuft, 
dann passt das mit max. 500Hz Audiosignal schon ungefähr.

Oliver

von spess53 (Gast)


Lesenswert?

Hi

>Mit welchem Takt läuft dein ATMega?

>Liegt bei 125,00 kHz

Das ist der ADC-Takt. Dein ATMega hat dann 8MHz.

>        ADC_value = ADC;        // 10-bit Wert vom ADC-Doppelregister holen,
>        ADC_8bit = ADC_value >> 2;  //   auf 8-bit Aufloesung bringen
>        PORTB = ADC_8bit;          //

Die Schieberei ist unnötig, wenn du ADLAR in ADCSRA setzt und nur ADCH 
ausliest. Bei dieser Anwendung mit 8 Bit kannst du auch mal den 
Prescaler des ADC auf 32 oder 16 heruntersetzen.

MfG Spess

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.