Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung mit Arduino Mega2560


von Dominik W. (dominik009)


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
}

von Harry R. (harry_r2)


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?

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Dominik W. schrieb:
> delay(0.2);

Wie bringst du diese Art des Aufrufs zusammen mit

Syntax: delay(ms)

Parameters:

ms: the number of milliseconds to pause. Allowed data types: unsigned 
long.
https://www.arduino.cc/reference/en/language/functions/time/delay/

von Knut (Gast)


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.

von Alexander S. (alesi)


Lesenswert?

Hallo,

neben anderen wichtigen Dingen stellt "int Data[1000]" ein Feld für 1000 
Integer, Data[0] bis Data[999], zur Verfügung. In den Schleifen zählt i 
aber bis inklusive 1000, so dass unberechtigt auf die Stelle hinter dem 
Feld zugegriffen wird.

von Proz Entrechner (Gast)


Lesenswert?

Alexander S. schrieb:
> so dass unberechtigt auf die Stelle hinter dem
> Feld zugegriffen wird.

Na wer wird denn bei so einer anspruchsvollen Arduino-Anwendung
so kleinlich sein. Es geht doch nur um ein Promille.

von Einer K. (Gast)


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.

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.