Frequenzmessung mit Arduino Mega2560

OP #6683402
Lesenswert?
• ▲
▼
Hallo Zusammen,

ich versuche mit meinem Arduino Mega2560 einen Sinus zu messen (50Hz) 
und die Daten anschließend per fft am PC auszuwerten.

Das Signal wird von meinem Oszi/Frequenzgenerator erzeugt

Leider kommt immer eine Grundfrequenz von 30HZ raus.

Hat jemand eine Idee wo mein Denkfehler liegt?

Hier mal der Code vom Arduino:
1
int analogPin = A0; // Pin, der gelesen werden soll: Pin A3
2
int val = 0; // Variable, die den gelesenen Wert speichert
3
int out = 0; // Variable, die den gelesenen Wert speichert
4
int Data[1000];
5

6
void setup() {
7
  Serial.begin(115200); // Setup der seriellen Verbindung
8
  analogReference(INTERNAL1V1);
9
}
10

11
void loop() {
12

13
    for (int i = 0; i <= 1000; i = i + 1) {
14
    Data[i] = analogRead(analogPin); // Pin einlesen
15
    delay(0.2);
16
    }  
17

18

19
    
20
    
21
   
22
    for (int i = 0; i <= 1000; i = i + 1) {
23
    Data[i] = ((Data[i]-581)*1.0742*679/1000);
24
    
25
    Serial.println(Data[i]);
26
    } 
27

28
    delay(5000);
29
    
30
}
#6683410
Lesenswert?
• ▲
▼
Du hast so keine gut definierte Abtastrate. Die Laufzeit des analogRead 
(typ 100µs) kommt zu der Verzögerung per delay hinzu. Wenn du eine 
stabile Abtastung brauchst, dann "musst" du den ADC mit einem Timer 
laufen lassen.

Edit:
hmmmmm, wenn du bei der Auswertung auf dem PC von der eingestellten Rate 
(1/delay) ausgehst, in Wirklichkeit wegen der Laufzeit des analogread 
langsamer abgetastet wird, dann müsste die Frequenz höher erscheinen, 
nicht niedriger. Oder?
Gast #6683497
Lesenswert?
• ▲
▼
Jawoll:

FFT gibt's als Bibliotheksfunktion, dafür braucht's ein paar Samples.
Jetzt noch einen µC mit ADC, dazu eine schlampige Abtastroutine
und schon ist man der König im Messlabor! HAAHA!!!

Auch wenn man eine Bib-Funktion nutzen kann, sollte man die
Bedingungungen für die Qualität dessen, womit man sie füttert
kapiert haben - SONST WIRD DAT NIX!

Wahrscheinlich wurde da zusätzlich auch NULL Gedanke an die
Nyquist-Frequenz, die Quellimpedanz für S&H, oder andere altbackene 
Einschränkungen verschwendet.
Gast #6683564
Lesenswert?
• ▲
▼
Ein Teil der Problemlösung:
1
void loop()
2
{
3
  for (int &d : Data)
4
  {
5
    d = analogRead(analogPin); // Pin einlesen
6
    delayMicroseconds(200);
7
  }
8
}

Für eine stabile Abtastrate könntest du einen der Timer des AVR bemühen.

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.