Timer und Sinus Kurve



  • Hallo
    hab da einen kleinen Problem und zwar möchte ich einen Timer Programmieren der erst dann los zählt wenn bei der erste Sinuskure der Null durchgang startet und der Timer bzw erricht, soll dann stoppen wenn bei der 2 sinuskure der Null durchgang startet bzw erreicht. Damit möchte ich die zeit differenz der beiden Kurven ermitteln. Die zeitabstand messung soll kontinuierlich laufen und der Timer soll immer dann vom 0 anfangen zu zählen.

    Wie würde ich das sinvollsten Programmieren? Bitte um kleine Hilfe mit bsp.



  • Ein Timer ist etwas anderes in der MFC.
    Du brauchst nur die Zeitdiff zw. beiden Zeiten ermitteln.
    Einfach die erste und 2te Zeit merken.



  • wo kommt die sinunskurve her? ich denke mal ein mfc timer ist zu langsam um präzise sowas messen zu können... wenn es zudem noch hoh frequenzen sind

    was genau planst du?



  • Ich plane eigentlich nur eine Netztspannung zu Messen und daraus die Phasenverschiebung zu bestimmen. Es muss nicht sehr genau sein Hauptsache annähert würde auch schon reichen.

    Unix-Tom wie soll ich das den machen mit der zeit merken?
    Bin nicht gerade stark in c++ bin mir einiges am selbst bei bringen.

    Gibt es den so was wie eine counter also ein Stopuhr das man Programmieren kann, das bei der erste Kurve los geht und bei der 2 stoppt?



  • dann musst threads verwenden.... thread starten und stoppen je nach kurven null punkt? ich frage mich trozdem woher die kurve kommt.. willst du ne spannung messen?



  • BorisDieKlinge schrieb:

    dann musst threads verwenden.... thread starten und stoppen je nach kurven null punkt? ich frage mich trozdem woher die kurve kommt.. willst du ne spannung messen?

    Ja möchte eine Spannung messung.

    LARGE_INTEGER iFreq;
    LARGE_INTEGER iBegin1 , stop1 ;

    QueryPerformanceFrequency(&iFreq);
    if( statuss >= 0)
    {
    QueryPerformanceCounter(&iBegin1);

    if (wert >= 0)
    QueryPerformanceCounter(&stop1);
    }
    t1=double(stop1.QuadPart - iBegin1.QuadPart)/iFreq.QuadPart;

    Hab hier mal was versucht, meinst das würde vielleicht auch gehen?



  • wo liegt denn die spannung an am PC? das ist kein microcontroller wo direct hardwarenah an den eingängen sitzt...



  • Übereine Messkarte wird die Spannung gemessen.

    Die Funktion die ich gerade geschrieben habe, gibt mir auch was an, weiss du ob das in millisekunden oder in sekunden angezeigt werden?

    Ich wollte auch noch die Funktion gettimeofday() benutzen aber wenn ich das versuche bei mir einzubinden dann bekomme ich fehler Meldungen.

    1. Findet mein System die Header Datei nicht #include <sys/time.h>, kann man dafür auch die time.h benutzen?
    2. Die Funktion int gettimeofday(struct timeval *zeit, void *tzp); wird nicht akzeptiert.



  • schau dir mal timeGetTime() an. du musst evtl .noch die nötige lib datei dazulinken normaler weise die "Winmm.lib" ... denke du verwendern Visual Studio-> Projekteinstellungen-> Linker-> ...

    timeGetTime liefett dir die aktuelle Systemzeit in millisekunden...



  • BorisDieKlinge schrieb:

    schau dir mal timeGetTime() an. du musst evtl .noch die nötige lib datei dazulinken normaler weise die "Winmm.lib" ... denke du verwendern Visual Studio-> Projekteinstellungen-> Linker-> ...

    timeGetTime liefett dir die aktuelle Systemzeit in millisekunden...

    Benutze MVC++ 6.0 das mit den Linken weiss ich schon.
    Ich hab mich mal ein bsichen umgeschaut so genu gibs dafür keine bsp.
    wie startet und beendet man die timeGetTime Funktion?

    Ich dachte an so was:

    if (Kanal1 >= 0)
    start
    if (Kanal2 >= 0)
    Stopp

    Dann halt die Zeit



  • Für deine Belange sollte schon QueryPerformanceCounter verwendet werden. Wenn du mit 50Hz-Signalen arbeitest musst du ja min. mit 100Hz abtasten. Das Problem wird bei dir aber eher sein, exakt den Zeitpunkt mit der Messkarte zu erfassen. Wenn du kontinuierlich messen willst wird das sicher nicht hinreichend genau, denn Windows ist ja kein Echtzeit-OS. Vielleicht gibts ja die Möglichkeit in deiner Messkarte die Phasenverschiebung zu messen? Welche verwendest du denn?



  • Leider gibt es die möglichkeit nicht mit der Messkarte die Phasenverscheibung zu Messen, das habern wir schon geklärt mit der Firma Meilhaus.
    Wir wollen eine kontinuierlich Messung machen, die Werte müssen jetzt zum Glück nicht 100% genau sein.
    Die Funktion QueryPerformanceCounter liefert er die zeit in ms?
    Wir haben die auch bei uns eingebaut und er lieferte uns was komisches zurück z.b 9,98856235212....E-005 so was ähnliches.

    So hatten wir es eingesetzt:
    LARGE_INTEGER iFreq;
    LARGE_INTEGER iBegin1 , stop1 ;

    QueryPerformanceFrequency(&iFreq);
    if( statuss >= 0)
    {
    QueryPerformanceCounter(&iBegin1);

    if (wert >= 0)
    QueryPerformanceCounter(&stop1);
    }
    t1=double(stop1.QuadPart - iBegin1.QuadPart)/iFreq.QuadPart;



  • Was ist daran komisch? Ist dir die Exponentialschreibweise nicht geläufig?
    Aber die Funktion kann sowas nicht zurückliefern, da ja der Zeiger vom Typ LARGE_INTEGER ist. Ich verwende hier immer den Datentyp LONGLONG.
    Wenn du die MSDN richtig gelesen hättest, dann hättest du festgestellt, dass QueryPerformanceCounter die Werte in counts zurückgibt. Deshalb rufst du ja vorher auch QueryPerformanceFrequency auf, um die Frequenz des des Präzisionstimers deines Systems zu ermitteln. Erst wenn du durch diesen Wert teilst erhälst du eine Zeit in Sekunden.



  • AndyDD schrieb:

    Was ist daran komisch? Ist dir die Exponentialschreibweise nicht geläufig?
    Aber die Funktion kann sowas nicht zurückliefern, da ja der Zeiger vom Typ LARGE_INTEGER ist. Ich verwende hier immer den Datentyp LONGLONG.
    Wenn du die MSDN richtig gelesen hättest, dann hättest du festgestellt, dass QueryPerformanceCounter die Werte in counts zurückgibt. Deshalb rufst du ja vorher auch QueryPerformanceFrequency auf, um die Frequenz des des Präzisionstimers deines Systems zu ermitteln. Erst wenn du durch diesen Wert teilst erhälst du eine Zeit in Sekunden.

    Hatte die MSDN durch gelesen aber jetzt nach deier erklärung hab ich es schon besser verstanden, Danke.
    Das mit dem LONGLONG werde ich gleich mal ausprobieren, was ist den der unterschied zwischen den beiden typen?



  • MSDN schrieb:

    typedef __int64 LONGLONG;

    MSDN schrieb:

    typedef struct _LARGE_INTEGER {
    signe__int64 QuadPart;
    } LARGE_INTEGER,
    *PLARGE_INTEGER;

    Dürfte aber keine Unterschiede machen.

    Weitere Infos zur Funktion: http://support.microsoft.com/kb/815668/de



  • Danke für die weiteren Infos, werde nachmittag es mir an meinem Programm anschauen, mal sehen was passiert....



  • Wenn du eine Messkarte verwendest, sollte dann nicht die Messkarte auch eine Zeit mitliefern? Wäre zumindest praktisch.
    Würde ja schon reichen wenn die Messkarte einen "Sample-Zähler" hätte - da du die Messfrequenz der Karte ja wohl kennen wirst kannst du das ja in "Echtzeit" umrechnen.



  • hustbaer schrieb:

    Wenn du eine Messkarte verwendest, sollte dann nicht die Messkarte auch eine Zeit mitliefern? Wäre zumindest praktisch.
    Würde ja schon reichen wenn die Messkarte einen "Sample-Zähler" hätte - da du die Messfrequenz der Karte ja wohl kennen wirst kannst du das ja in "Echtzeit" umrechnen.

    Genau das meinte ich in meinem ersten Post. Ich weiß ja nicht welche Karte er verwendet, aber um eine hinreichende Genauigkeit zu erzielen muss man das über die Hardware machen. Die Timersachen sind mit Windows-Bordmitteln da viel zu ungenau.
    @lehrling: Welche Karte verwendest du denn?



  • Wir haben die ME4610 aber die Messkarte unterstützt nicht die Sample & Hold verfahren wenn ihr das meint.
    das mit dem Timer wird auch wohl nichts, ist zu ungenau und wir kommen nicht uf einen wert mit dem wir arbeiten können.



  • Lehrling1 schrieb:

    Wir haben die ME4610 aber die Messkarte unterstützt nicht die Sample & Hold verfahren wenn ihr das meint.
    das mit dem Timer wird auch wohl nichts, ist zu ungenau und wir kommen nicht uf einen wert mit dem wir arbeiten können.

    Was? Eine ADU-Karte die keine Sample&Hold-Schaltung hat? Dann würde die gar nicht funktionieren.
    Aber mit dieser Karte wird das wohl nichts mit deinem Vorhaben. Wenn ich das richtig verstanden hab willst du auf zwei Kanäle jeweils eine 50 Hz Wechslspannung legen. Dann tastest du so lange Kanal 1 ab bis du einen Nulldurchgang findest. Dann startest du einen (Präzisions-)Timer und tastest so lange Kanal 2 ab, bis auch dieser einen Nulldurchgang hat und du den Timer stoppen kannst. Die Zeit ist dann ein Maß für die Phasenverschiebung.
    Du musst abre folgendes beachten: du wirst es voraussichtlich nie schaffen den Nulldurchgang direkt zu treffen. Zweitens musst du noch detektieren, ob der Nulldurchgang vom positiven zum negativen Signal wechselt oder umgekehrt. Du Zugriffszeiten auf die Karte sind ja auch endlich. Weiterhin wird Windows dir einen Strich durch die Rechnung machen, da du nie sicherstellen kannst, dass du immer dann Rechenzeit bekommst. Alles in allem: machs hardwaremäßig oder mach eine FFT aus beiden Signalen. Der Rest ist reines Rechnen.


Log in to reply