Forum: Mikrocontroller und Digitale Elektronik Problem beim ADC-Sampling mit dem AVR


von R. B. (dxx255)


Lesenswert?

Hallo,
ich möchte ADC-Messwerte zur Frequenzanalyse mittels FFT nutzen. Der 
Code (siehe unten) funktioniert und liefert auf einem Arduino UNO 
stabile Resultate. Läuft derselbe Code jedoch auf einem atmega328p auf 
einer PCB schwanken die Ergebnisse beinahe beliebig. Woran könnte das 
liegen? Sind die analogen Eingänge am Arduino zusätzlich beschalten?
Bin für jeden Rat dankbar.

Code:
1
#include <avr/io.h>          
2
#ifndef F_CPU
3
#define F_CPU 16000000UL
4
#endif
5
#include <avr/interrupt.h>
6
#include "uart.h"
7
#include <util/delay.h>
8
#include <math.h>
9
#include "ffft.h"
10
#include <stdio.h>
11
#include <stdlib.h>
12
void adcInit(void) {
13
 
14
  uint16_t result;
15
 
16
  ADMUX = (0<<REFS1) | (1<<REFS0)|(1<<ADLAR);      // AVcc als Referenz benutzen
17
  ADMUX |= 5;// CH
18
  ADCSRA = (1<<ADPS2)|(1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
19
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
20
  ADCSRA |= (1<<ADSC);                // eine ADC-Wandlung 
21
  while (ADCSRA & (1<<ADSC) ) {}      // auf Abschluss der Konvertierung warten
22
  result = ADCW;
23
  
24
  
25
}
26
27
uint8_t cnt=128;
28
int16_t capture[FFT_N];      /* Wave captureing buffer */
29
complex_t bfly_buff[FFT_N];    /* FFT buffer */
30
uint16_t spektrum[FFT_N/2];    /* Spectrum output buffer */
31
char buf[16];
32
int main (void) {           
33
   adcInit();
34
   uart_init( UART_BAUD_SELECT(9600,F_CPU) );              
35
   sei();
36
   int16_t *c;
37
   while(1) {
38
       cnt=128;
39
       c = &capture[0];  
40
       ADCSRA |=(1<<ADSC);
41
       while(cnt--){
42
         
43
         while (ADCSRA & (1<<ADSC) ) {}
44
        *c++=((ADCH<<7)-32768);
45
        ADCSRA |=(1<<ADSC);
46
       }
47
       fft_input(capture, bfly_buff);
48
    fft_execute(bfly_buff);
49
    fft_output(bfly_buff, spektrum);
50
    uint16_t max=0;
51
    for(cnt=2;cnt<64;cnt++){
52
      if(spektrum[cnt] > max) max = spektrum[cnt];
53
    }
54
    itoa(max,buf,10);
55
    uart_puts(buf);
56
    uart_putc('\n');
57
/*    uart_putc( (char) (max >> 8) );*/
58
/*    uart_putc( (char) (max & 0xFF) );*/
59
   }
60
   return 0;                
61
}

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Zeig doch mal deinen Schaltplan.

von R. B. (dxx255)


Angehängte Dateien:

Lesenswert?

Hier der Schaltplan

von R. B. (dxx255)


Lesenswert?

Die Spannungsversorgung erfolgt über drei AA Batterien (4,5V).

Muss ich den Resetpin beschalten? Fehlen mir Entstörkondensatoren? 
Benötige ich eine Schaltung an Aref?

von STK500-Besitzer (Gast)


Lesenswert?

Roman B. schrieb:
> Muss ich den Resetpin beschalten?
Solltest du.

> Fehlen mir Entstörkondensatoren?
Die üblichen 100nF dicht an den Versorgungspins des Controllers fehlen.

> Benötige ich eine Schaltung an Aref?
Häng' da auch einen 100nF gegen GND ran - besser ist das.

von R. B. (dxx255)


Lesenswert?

Nach Beschaltung des Resetpins und 100nF zw Vcc und Gnd erhalte ich 
schließlich brauchbare Werte!

Danke für die Hilfe

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.