Timer und Sinus Kurve



  • 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.



  • Ja leider hat die Karte das nicht, war auch teuer genug.
    Bin auch schon langsam am verzweifeln!

    Wie du es in deinem ersten Teil beschreibst wollten wir es auch so machen.

    Wir haben es auch schon folgendermaßen versucht, über die erzeugten Ticks für die Abtastung unseres Signales.

    If (Kanal 1 >= 0)
    {
    tick_zähler++;
    If (Kanal 2 >= 0)
    break;
    }

    So wollten wir die Ticks halt von einem Null Position zur nächsten ermitteln und daraus die Zeit ermitteln. Es wird auch gezählt aber bei verändern der Last oder Freqenz ändert sich meisten nichts 😞

    Was meint du den mit FFT?



  • Lehrling1 schrieb:

    Was meint du den mit FFT?

    Du solltest dich langsam mal mit E-Technik-Grundlagen vertraut machen wenn du so ein Problem bearbeiten willst.
    FFT=Fast Fourier Transform oder zu deutsch Schnelle Fourier-Transformation
    Der Grundgedanke dabei ist, das Wechselsignal als Mischung verschiedener Frequenzen (genauer: Grundschwingung und deren Oberwellen oder Harmonische) zusammenzusetzen. Durch diese Transformation in den Frequenzbereich gestalten sich gewisse Vereinfachungen. Lies mal hier: http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm
    Im unteren Teil ist auch eine Phasenmessung erklärt. Die müsstest du allerdings simultan für beide Signale machen. Dafür gibts DSP-Chips, die das erledigen. Dann brauchst du nur noch die beiden Phasenbeträge von einander abzuziehen und hast deinen Wert.
    Noch einen andere Frage: wie bekommst du die Netzspannung auf die 10V runter?



  • Mir ist der FFT nicht bekannt und ist mir auch noch nieübern weggelaufen.

    Über einen Trennverstärker können wir die Eingangsspannung herunter Transformieren.


Anmelden zum Antworten