Hallo,
ich hab ein Problem mit der Taktung meines Frequenzgenerators, folgender Code:
C#-Code: |
double dSwIntervall = Stopwatch.Frequency / iHertz);
clientSock.Send(_Messenger.SendMessage(SignalMessenger.MessageType.StartMonitoring));
sw.Start();
while (true)
{
if (sw.ElapsedTicks >= dSwIntervall)
{
clientSock.Send(_Messenger.SendMessage(SignalMessenger.MessageType.Data32));
_Benchmark.UpdateSent();
sw.Restart();
}
}
|
Ziel ist, nach einem auf der GUI gewählten Takt, z.B. 100 Hz, Datenpakete auf die Socket zu senden. Die Daten werden von einer anderen Applikation aufgenommen und dort auf einen Stack gelegt. Klappt soweit wunderbar, jedoch arbeitet die Taktung nach meiner Methode nicht korrekt.
Nehme ich die Stopwatch raus und sende ungetaktet auf die Socket, komme ich laut Benchmark auf 10.000 Hz, ich muss jedoch zwischen 100 Hz und 1000 Hz erzeugen können. Die Taktung schwankt auch erheblich bei jedem neuen Start bzw. Senden. Zeitweise bekomme ich bei 100 Hz auch wirklich 100 Hz auf den Sockel (+/- 30 Hz, das ist okay), aber dann steigt die Taktung plötzlich auf 200 Hz oder senkt sich auf 30-40 Hz, um dann wieder später anzusteigen. Ohne die Parameter zu ändern starte ich den Sendevorgang erneut mit z.B. 500 Hz eingestellt und die Taktung geht nicht über 300 Hz hinaus.
Mir ist klar, dass es sich hier um Systemschwankungen handeln muss, aber das ist vermutlich nicht der einzige Faktor. Wie realisiert man sowas am besten, ist es überhaupt möglich ohne spezielle Hardware? Ich hatte es mit einem ereignisbasierten Timer schon probiert, der war aber noch schlechter und nicht granular genug. Meine Idee wäre hier, den aktuell erzeugten Takt vom Benchmark jede Sekunde auszulesen und dann mit einem Faktor gegenzusteuern, also z.B. +1 auf den Takt, wenn dieser niedriger als der gwünschte Wert ist und -1 falls höher -- aber das kanns doch nicht sein, oder?