Go Down

Topic: Auswertung Impulse Volkswindmesser (Read 9 times) previous topic - next topic

BigBangTheory

Hey Leute,

nachdem hier bisher sehr wenig weiter passiert ist, weil ich leider keine Zeit für das Projekt gefunden hab, nun ein neuer Anlauf.

Irgendwie bekomm ich das Kontaktprellen nicht weg, egal wie hoch in den delay pack.

Jetzt hab ich nochmal ganz rudimentär angefangen und mir direkt die Werte in der Interrupt Routine ausgeben lassen.

Hierbei sieht man, dass mein "RISING" immer genau 2 Werte kommen.

Ich habe dafür folgenden Code verwendet:

Code: [Select]
int i = 0;
unsigned long j;


void setup()
{
  Serial.begin(9600);

  attachInterrupt(0,Interrupt,RISING);
}

void Interrupt()
{

  noInterrupts();
  j = micros();
  delay(100);
  Serial.print("Wert Nr. ");
  Serial.print(i++);
  Serial.print(";");
  Serial.println(j);
  interrupts();


}


void loop()
{
  }


Dabei bekomm ich folgende Ausgabe im Serial Monitor:

Wert Nr. 0;2402216
Wert Nr. 1;2402996
Wert Nr. 2;3884176
Wert Nr. 3;3885744
Wert Nr. 4;5123992
Wert Nr. 5;5124788
Wert Nr. 6;6213224
Wert Nr. 7;6214328
Wert Nr. 8;7237460
Wert Nr. 9;7238324
Wert Nr. 10;8308352
Wert Nr. 11;8309476
Wert Nr. 12;9405480
Wert Nr. 13;9407204
Wert Nr. 14;10376576
Wert Nr. 15;10378008
Wert Nr. 16;11555068
Wert Nr. 17;11556632
Wert Nr. 18;12729400
Wert Nr. 19;12731160
Wert Nr. 20;13625240
Wert Nr. 21;13626140
Wert Nr. 22;14694512
Wert Nr. 23;14696212
Wert Nr. 24;15819660
Wert Nr. 25;15820572
Wert Nr. 26;16833956
Wert Nr. 27;16835348
Wert Nr. 28;18306752
Wert Nr. 29;18307868
usw...

Dabei beträgt der Mittelwert über alle Abstände, die sich bei 2 aufeinander direkt folgenden Impulsen ergeben: 1249,.. Mikrosekunden
Der Maximalwert beträgt: 1760 Mikrosekunden.
Der Minimalwert beträgt: 780 Mikrosekunden.

Nun habe ich auch schon versucht ein delayMicroseconds() das etwas über dem maximalwert liegt einzuführen, damit das kontaktprellen aufhört. leider ohne erfolg.

könnt ihr mir da weiterhelfen? habt ihr vielleicht noch ideen?

danke schonmal für eure antworten!

jurs


Irgendwie bekomm ich das Kontaktprellen nicht weg, egal wie hoch in den delay pack.


Erinnerst Du Dich eigentlich an diesen Thread:
http://forum.arduino.cc/index.php?topic=156239.0
Und dort an meine "Reply #1" im Thread?
Und dort an meine "Reply #3" im Thread?

Das ist doch jetzt exakt dasselbe, was Du hier im März bereits vorgetragen hast: "Wind Datenlogger zählt 2 mal bei einem Impuls"

Und jetzt hältst Du denselben Vortrag über denselben Windmesser in diesem Thread noch einmal.

Wenn Du tatsächlich immer zwei Schaltungen bei einer Vorbeibewegung des Magneten hast, davon eine extrem kurze, dann ist das kein Prellen, sondern dann ist das eine Einbaulage des Reedkontakts mit zwei Schließungen. Das gibt es und das ist nichts besonderes. Wenn Du es immer noch nicht glaubst, dann klicke nochmal auf die im März von mir geposteten Links zum Reekontakthersteller Meder und schaue Dir die Animationen an!

Da ist nichts zu entprellen, sondern Du mußt eben beide Schließungen bei der Auswertung berücksichtigen: Die kurze und die lange Dauer zwischen zwei Schließungen des Kontakts.

Du kannst sogar eine Plausibilitätsprüfung durchführen und feststellen, ob tatsächlich ein Kontaktprellen vorliegt:

- Du mißt die Zeit für einen kurzen Impuls in Mikrosekunden
- Du mißt die Zeit für einen langen Impuls in Mikrosekunden
- Plausibilitätsprüfung: Die der lange Impuls muß mindestens zehnmal so lang sein wie ein kurzer Impuls
- Wenn ja: Dauer beider Impulse zusammenzählen = Zeit für eine Umdrehung, sonst Messung verwerfen

Da es teils um sehr kurze Zeiten geht (bei der kurzen Schließdauer) ermittelst Du die Impulse am besten mit einer Interruptbehandlungsroutine. Jede Impulsdauer packst Du aus der Interruptbehandlungsroutine abwechselnd in Variablen ("volatile" deklariert) z.B. Impuls_A und Impuls_B.

Und in der loop-Funktion schaust Du in regelmäßigen Zeitabständen nach den beiden Variablen, ermittelst ob eine mindestens 10mal größer ist als die andere, und wenn ja zählst Du sie zusammen und berechnest aus der Summe/Gesamtdauer der beiden Werte die Windgeschwindigkeit.




Linpotec

Wenn Du

'Hierbei sieht man, dass mein "RISING" immer genau 2 Werte kommen'

heraus gefunden hast, dann nimm dies als einen stabilen Sensor Parameter. Impulse / 2 und habe fertisch...

Setze am Besten die Plausibilitätsbetrachtung um, dann filters Du eine Menge Fehler heraus.

Greetz,

Linpo
????? ????? ?? ????? ????????

BigBangTheory

@ jurs

Du hast da vollkommen Recht. Ich hab das ganze nochmal getestet. Es werden genau 2 Signale durch den Reedkontakt pro Umdrehung erzeugt, wobei ein kurzer und ein langer Impuls entsteht.

Sorry nochmal für meine Beratungsresistens :D.

Momentan bin ich soweit, dass ich mir die Werte (die Abstände zwischen den einzelnen Schaltungen) im Serial Monitor ausgeben lasse.

Hierbei sieht man, dass zuerst ein kurzer und dann ein langer Impuls entsteht.

In der Interrupt Routine frage ich nun ab, ob meine Variable "Abstand" größer ist als 1000 (es hat sich gezeigt das der kurze Impuls max. 640 Mikrosekunden groß ist). Dann wird der Abstandswert in die Variable limpuls gespeichert (langer Impuls)...ansonten wird der Wert in der Variable kimpuls gespeichert (kurzer Impuls).

Hier der Code:
Code: [Select]
unsigned long i,abstand,kimpuls,limpuls;
unsigned long j=0;



void setup()
{
  Serial.begin(9600);

  attachInterrupt(0,Interrupt,RISING);
}

void Interrupt()
{

  noInterrupts();
 
  i = micros();
 
  abstand = i-j;
 
  j=i;
 
  if (abstand >= 1000)
  {
   limpuls=abstand;
  Serial.print("langer Impuls: ");
  Serial.println(limpuls);
  }
  else
  {
   kimpuls=abstand;
  Serial.print("kurzer Impuls: ");
  Serial.println(kimpuls);
  }

  interrupts();


}


void loop()
{

}


Mein vorrangiges Ziel besteht momentan darin, aus den Abständen (kurzer + langer Impuls) eine Periode zu bekommen, anhand derer ich direkt nach jeder Periode die ich gemessen habe, die Windgeschwindigkeit zu berechnen.

Hierzu habe ich anhand der Werte des Herstellers zu Frequenz und Windgeschwindigkeit in Excel eine Formel erstellt, die den Werten des Herstellers des Anemometers gleicht.

Nun meine Frage:

Wie kann ich es programmiertechnisch elegant lösen, das genau ein kurzer und ein langer Impuls addiert werden (die beide zusammen gehören) und dann erst wieder der nächste kurze und der nächste lange Impuls aufsummiert werden, nicht aber schon der bereits benutze lange und dann der nächste kurze Impuls?

Vielen Dank für eure Antworten!

Hier noch eine kurze Ausgabe meine Serial-Monitors:
langer Impuls: 1288736
kurzer Impuls: 548
langer Impuls: 1373776
kurzer Impuls: 552
langer Impuls: 940952
kurzer Impuls: 500
langer Impuls: 891320
kurzer Impuls: 496
langer Impuls: 571136
kurzer Impuls: 496
langer Impuls: 454896
kurzer Impuls: 496
langer Impuls: 422892

usw...

uwefed

Summiere einfach 2 aufeinanderfolgende Impulse ohne zu kontrollieren ob es ein langer oder kurzer impuls ist.

lang - kurz und kurz - lang sind gleichwertig. Es ist egal in welcher Reihenfolge die Impulse kommen, Hauptsache es sind 2 aufeinanderfolgende.

Grüße Uwe

Go Up