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 | }
|