Problem beim ADC-Sampling mit dem AVR

OP #4614631
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
}
Gast #4614907
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.

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