So, hat ein wenig gedauert, bis ich mir deinen anderen Thread
durchgelesen habe, und glaube verstanden zu haben was zu da vor hast.
Mal ein paar grundsätzliche Überlegungen:
Dein Signal hat 50KHz, das entspricht einer Periodendauer von 20us.
Wenn es dir gelänge, den Samplezeitpunkt deines ADC auf einen
Prozessortakt genau in Relation zum erzeugten Signal zu starten, ist das
eine zeitliche Auflösung für dein Subsampling von 1/16 MHz = 62,5ns.
Das entspricht 1,125° deines 50 KHz Signals.
Bei dem von dir zu untersuchenden Bereiches von 0°-25° hast du also eine
maximal mögliche Auflösung von ca. 23 Phasen-Stufen (1,125°
Genauigkeit). Ich gehe davon aus, dass du das berücksichtigt hast, und
du keine höhere Genauigkeit erreichen möchtest.
Um dein Signal mit 16 MHz abzutasten, benötigst du eine Sample&Hold time
von max. 62,5ns.
Dein ADC wird mit 1 MHz getaktet, und die interne Sample&Hold Stufe
braucht mind. 1 ADC-Taktzyklus (ich glaube irgendwo gelesen zu haben,
dass es sogar 2 Zyklen sind).
D.h. die Sample&Hold Stufe deines ADC ist momentan für mindestens 1/1MHz
= 1us "offen".
Bezogen auf dein 50 KHz Signal entspräche dies 18° des Signals, die von
der Sample&Hold Stufe bereits gemittelt werden.
Wenn es 2 ADC Zyklen sein sollten, wären es 36°.
Ich glaube dies allein macht deine Messung schon sehr unbrauchbar.
Ob dein Code korrekt arbeitet, kann ich nicht beurteilen, ich finde ihn
ziemlich schwer zu lesen.
So wie ich es verstehe, samplest du einen Wert, und mittelst ihn mit den
vorherigen Werten (wobei wohl irgendwie noch der nachträglich ermittelte
genaue Samplezeitpunkt die Array-Adresse bestimmt...?).
Deine "Mittelung"
1 | adc_messwerte[temp+19][0] = (adc_messwerte[temp+9][0]+(ADCH))/2;
|
reduziert allerdings sofort schon mal die Auflösung auf 1/2, und
ausserdem wird nicht linear gemittelt, sondern frühere Messwerte
verlieren mit jedem neuen Messwert zunehmend mehr an Bedeutung (uns zwar
nicht linear)?
Ich verstehe auch nicht, warum einmal temp+19 und einmal temp+9 genommen
wird...
Ich würde mal versuchen, die Mittelung wegzulassen, und die Daten
hintereinander weg in ein Array zu schreiben solange es der Speicher her
gibt, und dies dann hinterher extern auszuwerten.
Dann kannst du besser beurteilen, ob die Werte Sinn machen.
Zusätzlich wäre es vielleicht mal einen Versuch wert, das Timing der ADC
Startpunkte zu überprüfen.
Anstatt den ADC zu starten, könntest du mal einen weiteren Output
high/low togglen lassen, und guckst dir am Oszi an, ob die Startpunkte
einigermaßen gleichmäßig im 62,5ns Abstand über dein zu messendes Signal
verteilt sind.
Mit diesem Start-Signal könnte man dann auch eine geeignet schnelle,
externe Sample&Hold Stufe triggern.
Nachtrag:
Klar ist eine analoge Auswertung etwas "einstellbedürftig", allerdings
hätte sie in deinem Fall wirklich Vorteile.
Da du ja weisst, dass sich dein zu messendes Signal nicht mehr als 180°
verschiebt, kannst du auf die XOR Auswertung komplett verzichten.
Alles was du tun müsstest ist das Eingangssignal und das zu
vergleichende Signal auf eine möglichst gleiche Amplitude zu verstärken,
und das zu messende Signal zu invertieren.
Durch Mischen, aktives Gleichrichten und Tiefpassfiltern erhältst du
direkt eine analoge Spannung, die der Phasenlage entspricht.
Mit einem 8-bit ADC könntest du damit theoretisch eine Auflösung von ca.
0,7° erreichen, da du aber nicht mehr so schnell samplen musst, könntest
du auch auf 10-bit gehen, und hättest eine Auflösung von ca. 0,18° -
oder noch genauer, indem du den Messbereich auf <180° einschränkst.