Hallo Hans,
das Generatorsignal durchläuft also Sendetransducer-Medium-Empfangstransducer-Verstärker und triggert dann wieder den Ursprungs-Generator?
Was macht der Generator denn, bei einem Triggersignal? Abbrechen und triggersynchron weiter? Oder wie ne PLL solange rumeiern, bis die Frequenz zusammen mit dem Trigger einen Nulldurchgang zeigt? Bei letzterem hättest Du eine Regelschleife die durch Schallgeschwindigkeit und Strömungsgeometrie auf eine passende Frequenz einrastet. Mit all den Regelcharakteristiken, die so ein Regelkreis nunmal aufwirft.
Ich vermute mal, Du machst letzteres. Das ist aber keine Frequenzmessung, das ist vertrakter. Ich erkläre mal...
Du schreibst ganz richtig, mit steigender Strömungsgeschwindigkeit, steigt die Frequenz und vice-versa. Du beschreibst damit einen instationären Geschwindigkeitszustand und damit eine Beschleunigung. Die Frequenz verhält sich also wie die erste Ableitung zur Geschwindigkeit.
Was Du mit Deiner Frequenznachregelung machst, ist letzlich eine Phasenmessung. Und per Regelung hälst Du die Phase auf einem gemäß der Nyquist-Schwingbedingung, günstigen Wert. Würdest Du den Regelkreis an der Triggerung unterbrechen, könntest Du mit dem Oszi am US-ReceiverTransducerVerstärker Dein Eingangssignal um die Laufzeit, phasenverschoben wiederfinden. Allerdings ist die Phasenverschiebung winzigst.
Ich rechne mal
Angenommen Länge der Meßstrecke L=0,2m, F = 30kHz, C(w)=1500m/s, V(w0) = 0m/s, V(w1) = 0,2m/s, V(w2)=1m/s
Durchlaufzeit t(0) für V(w0):
Wellenlänge Lamda = (1500m/s )/ (30000Hz) = 50mm
Da L ein Vielfaches von 50mm ist, kommt am Ende das Signal nach 4 Perioden mit Phasenversatz von 0 Grad wieder raus.
Die Verzögerung beträgt t(0) = L / C(w) = 133,3333µs
Durchlaufzeit t(1) für V(w1):
Strömungsrichtung von 0,2m/s in Meßrichtung -> Die Schallaufzeit sinkt
t(1) = L / (C(w) + V(w1) = 133,1556µs
Durchlaufzeit t(2) für V(w2):
t(1) = 133,2445µs
Die Skalierung wäre also 133,3333µs - 133,2445µs = 888 Nanosekunden je m/s Strömungsgeschwindigkeit.
Der 16MHz Arduino mit 62,5ns ticks, wären das 888/62,5 = 14,2, oder anders herum eine Strömungsgeschwindigkeits- Auflösung von 1/14,2 = 0,071 m/s
Um diese Auflösung hinzubekommen, brauchts meines Erachtens den Input Capture Eingang des Arduinos. Der hat den Vorzug daß er im Falle eine externen Triggerung den momentanen Wert des Timer1 sofort zwischenspeichert. Der ATmega328 hat aber nur einen davon. Also mußt Du ne externe Logik aufbauen die ein Triggersignal z.B. bei jedem neg. Nulldurchgang der Generatorfrequenz an den InputCapture durchläßt. Der InputCapture registriert, speichert den aktuellen Timer1-Wert zwischen. Anschließend sichert sich Deine Software den Timerwert aus dem Register:
timer1Value[2 * i] = ICR1;
Dann schnell die externe Logic mit anderen AusgangsPortBits umschalten, daß sie fortan nicht mehr die Generatorfrequenz auf den InputCapturePin schaltet, sondern daß Empfangssignal. Das Empfangssignal muß natürlich triggerfähig (Rechteck) konditioniert sein. (Fachbegriff für Deinen Bachelor: Signalkonditionierungsabschnitt)
Und dann mißt Du eine ganze Reihe von Empfangsnulldurchgängen, sagen wir für eine Millisekunde und speichest die Werte in einem Array. Heißt 30 Triggerwerte bei 30 kHz. ...Weil angenommen, daß in dieser kurzen Zeit keine Strömungsbeschleunigung stattfindet. Dann wirst Du feststellen, wenn Du vom ersten Empfangstriggerwert eine Sendeperiode abziehst, vom nächsten 2 Perioden und so weiter, bleibt jedesmal der Phasenversatz übrig. Also mach das, bilde den Mittelwert aus den Phasenvesätzen und rechne das nach obigen Mustern auf die Flußgeschwindigkeit um.
Beim Timer1 gibts zu beachten, es sind unsigned integer werte (uint16_t). Und wenn, um die Differenz zu bilden der frühere, vom späteren Wert abgezogen wird, stimmt das Ergebnis immer noch, wenn der Timer zwischendurch max. einen Überlauf hatte. Also hier nie mit schlichtem int arbeiten.
Willst Du aber bei Deiner Regelschleife bleiben, mußt Du anstatt nach den Werten t(0), t(1), t(2), nach f(0), f(1), f(2) auflösen, für die sich bei Deiner Meßgeometrie immer der selbe Phasenwert ergibt.
Das ist jetzt aber Deine Aufgabe.
In welchem Fachbereich schreibst Du Deinen Bachelor denn?
Man muß heute ja aufpassen, sonst kann man zumindest kein Politiker mehr werden, wenn Teilergebnisse der eigenen Arbeit im Web gefunden werden. *lach*
Ich wünsche Dir auf jeden Fall viel Erfolg bei allem und berichte mal, bitte dann.
Bedenke immer, der Beweis, ob ein Weg geht, oder ob er auch nicht geht hat akadisch gesehen den selben Wert. Nur wirtschaftlich nicht. Will sagen, beweise lieber akurat und begründet was warum nicht funktioniert und führe dann Plan B auf, der ja Deinen Bachelorumfang überschritten hätte, als beides halbherzig- und doch nicht zum gewünschten Erfolgserlebnis zu bringen. Sprechs am Besten mit Deinem Betreuer ab. Wenns ein wirklicher Wissenschaftler ist, wird er Dir genau das sagen.
Gruß, Rainer
Lesezeichen