Guten Abend alle,
ich will Euch hiermit berichten, wie es mir die letzten Tage ergangen ist. Wie so oft bei mir, gab es kleine Fortschritte, aber auch wieder neue Fragen. Vielleicht hat der Eine oder Andere Interesse und Lust, mir noch einmal auf die Sprünge zu helfen.
Kurz zum Stand: Ich bekomme die Werte nun wunderbar nach Labview rein und kann diese hier abgreifen. Sowohl als Pakete als auch als einzelne Werte. Soweit alles wunderbar und das ist sicherlich ein Meilenstein. Ein Problem hat sich jedoch heute offenbart: Meine FFT-Berechnung passt nicht und ich denke, das liegt an der fehlerhaften Zeitbasis –schon auf dem Controller.
Ich habe deshalb mal zwei Ansätze umgesetzt. Ich nenne diese mal Ansatz A (Array-Ansatz) und B (Sample-Ansatz).
Grundsätzlich funktionieren beide Varianten, was schon einmal gut ist. Nur ich glaube, ich habe hier noch ein Problem: Bei der Berechnung der Fouriertransformation in Labview kommen falsche Werte raus. Vorab: Ich bin sicher, dass der Algorithmus richtig ist, da er bei Referenzsignalen, die korrekt abgetastet wurden, richtige Ergebnisse zeigt.
Es wäre wunderbar, wenn Ihr mir ein paar Hinweise zu meinen Gedanken geben könntet.
Zeiten
In der loop()-Schleife schreibe ich ja mit einer gewissen Geschwindigkeit die Daten weg, dazu kommt die Zeit, die ich benötige für die Konstruktion des Arrays und die Schleife an sich dauert ja auch einige Zeit. Ich habe mal einen kleinen Test gemacht und die Zeiten (über micros) für folgende UDP-Blöcke.
Udp.beginPacket(ip, recPort);
Udp.write((byte *) &accels[0],sizeof(accels[0]));
Udp.endPacket();
„gemessen“. Bitte beachtet: Ich schreibe sowohl die Einzelwerte als auch die Pakete über ein Array raus.
Dabei habe ich im Mittel 58 Mikrosekunden = 0,000058 sec = 17.241 Hz gemessen. Das heißt für mich doch, dass ich theoretisch Frequenzen bis zu dieser Frequenz erfassen kann und die Werte einzeln wegschicken könnte, wenn ich alle anderen Einflüsse vernachlässige. Wäre super, wenn Ihr das mal bestätigen oder widerlegen könntet. Das aber nur als Vorbemerkung.
Ansatz B („Einzelwerte“)
Beim Ansatz B schreibe ich jedes Sample einzeln weg. Der Sensor den ich nutze (Datenblatt liegt bei), hat eine Output-Rate von bis zu 3200 Hz. Das heißt wohl, dass jeweils mit dieser Frequenz ein neuer Wert ankommt, das heißt aber nicht unbedingt, dass ich mit diesen Werten abtaste, wenn ich das richtig verstanden habe?! Ich setze zwar im Sketch meine Abtastrate auf die besagten 3.200 Hz, schreibe aber mit einer ganz anderen Frequenz. Entspricht nun diese Frequenz meiner Abtastrate? Ich habe auch schon mit dem Wert der Register ADXL345_INT_DATA_READY_BIT / ADXL345_DATA_READY experimentiert, da ich davon ausgegangen bin, dass hier vielleicht eine saubere Zeitreferenz geschaffen werden kann, die quasi „wartet“ bis ein neuer Wert da ist. Auch bei der maximalen Frequenz von 3.200 Hz (=0,0003125 Sekunden) sollte ich –theoretisch-jeden Wert einzeln wegschicken können. Versteht Ihr was ich meine?!
Ansatz A („Array“)
Beim Array Ansatz schreibe ich jeweils 44 Werte (jeweils 12 Byte) in ein Array und schreibe dieses dann auf einmal weg. Vom Gefühl her und durch Euer Anraten unterstütz hatte ich ja eine Array gesammelt und dieses dann in Paketen weggeschickt. Diese Arrays baue ich dann in Labview wieder zusammen, bis ich eine bestimmte Sampleanzahl habe und mache dann meine FFT. Meine Idee war, dass die Werte hier äquidistant vorliegen, aber auch hier kommen falsche Wert raus.
Zusammenfassung
Mein Sensor kann -theoretisch zumindest- ausreichend hoch abtasten, ich bekomme –ebenso theoretisch- die Daten schnell weg. Was mir fehlt, ist eine „hart“ getaktete Zeitbasis der Messwerte des Sensors. Vielleicht über einen Interrupt? Ich denke, das ist das Problem?! Vielleicht seht Ihr ja aber auch noch andere Probleme.
Es wäre super, wenn Ihr Euch noch einmal Zeit für eine Diskussion nehmen könntet. Ich freue mich über jeden Input.
Euch einen erholsamen Abend und Grüße
Bire
UDP_Web5_send2Packets_ADXL345.ino.ino (6.08 KB)
ADXL345.pdf (855 KB)