Reedschalter auslesen C/C++, Windmesser

  • Hallo zusammen,


    stehe seit einigen tagen vor einem problem, dass ich eigenständig nicht gelöst kriege, dacher bitte ich euch um hilfe:)


    es geht um Auslesung eines Windmessgerätes von Eltako.


    das Problem: bei der ausmessung der Zeit entstehen ab und zu falsche Werte...


    anbei der Code


    Bitte um Hilfe


  • ARTYUSS

    Changed the title of the thread from “Reedschalter Auslesen C/C++, Windmesser” to “Reedschalter auslesen C/C++, Windmesser”.
  • Bei jedem zweiten Puls die Geschwindigkeit zu berechnen duerfte anfaellig fuer alle moeglichen Abweichungen sein.


    Ich wuerde es anders herum anpacken: Impulse zaehlen bis eine bestimmte Zeit verstrichen ist (z. B 60sec), und dann die Geschwindigkeit berechnen. Auch wenn ab und zu ein Impuls zu viel oder zu wenig gezaehlt wird, weicht das Resultat nur wenig ab.

  • Sieht mir aus, als würde der Kontakt prellen und die Berechnung somit im extrem kurzen Zeitabstand auslösen. Bau doch mal eine Bedingung ein, die Zeiten unter 0,005 s ignoriert und den End-Wert dann beim nächsten Signal misst.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hm, wenn Du 100 Mikrosekunden aufloesen willst, dann fallen 20 Mirosekunden bei Taskwechsel schon ins Gewicht. Und wenn Du nicht mittelst, dann schwankt der Berechnete Wert entsprechend.


    Es würde sicher reichen, die Windgeschwindigkeit nur alle 1 Sekunden auszugeben. Dann konntest Du einfach nur die Pulse zaehlen (in einem Programmteil) und in dem anderen Programmteil, der die Ausgabe macht, den Zaehlerstand verarbeiten.


    Im Grunde ist das dann aehnlich wie jetzt schon: Du wartest auf Zahlerstand-altzaehlerstand>0, merkst Dir dann die Zeit, und wartest mindestest 1 Sekunde oder laenger, wenn der Zaehler sich nicht aendert, liest den Zaehlerstand erneut aus und hast dann die Zaehlrate von Neuzaehler-Zaehlerstand geteilt durch (aktuelle Zeit minus gemerkte Zeit).


    Die Genauigkeit der Ratenmessung ist dann +/- MIN(1/Zeit/Zahlerstand, 20 Mikrosekunden/Zeit/Zeit )

    Edited once, last by wend ().

  • ARTYUSS


    double time_spent(0);


    muss meines Erachtens sein:


    double time_spent = 0.0L;


    Du willst doch eine Variable erstellen und nicht den Protytyp einer Funktion.

    Genauso die Deklaration von begin und end


    Im Linux-Konsolenfenster sieht man den Text :"so schnell ist der Wind:"

    Der Text taucht aber in Deiner Routine gar nicht auf ?


    Es wäre hilfreich, den Code zu zeigen, welcher den Text im Linux-Konsolenfenster zur Anzeige bringt.


    printf(" %2.4f sec \n", time_spent);


    Du weist den Compiler an, eine Zahl vom Typ "float" mit insgesamt 2 Stellen anzuzeigen, möchtest aber 4 Stellen nach dem Komma haben ?


    Den Dezimalpunkt mitgezählt, ohne Vorzeichen, 2 Stellen vor dem Komma und 4 Stellen nach dem Komma müsste für eine Variable vom Typ double so aussehen:


    printf (" %7.4lf sec \n", time_spent);


    Zudem könntest Du die Variablen counter, begin und end als "unsigned long" deklarieren.


    Um den Fehler genauer zu beurteilen, könntest Du einmal nachsehen, was angezeigt wird wenn Du folgende Zeile einfügst:


    printf ("Byte-Anzahl = %d\n", sizeof (clock_t));


    Gruß

    Prittzl