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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.