Abtastrate ADC

Gast #3509660
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
Gast #3509668
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
}
Gast #3509690
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
Gast #3509741
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
Gast #3509745
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren