roemheld Posted January 14, 2014 Share Posted January 14, 2014 Hallo, ich will ein "Industrial Digital in 4 Bricklet" verwenden, um die Drehzahl zu messen. Als erstes habe ich einen Magnetschalter an Pin0 angeschlossen. Leider konnte ich damit nur Drehzahlen bis 240 U/min genau messen, was einer Schaltfrequenz von 4Hz entspricht, bei weiterem erhöhen der Drehzahl, bleibt die gemessene Drehzahl bei 240 U/min und ab 600 U/min fällt die gemessene Drehzahl sogar auf 180 U/min ab. Danach habe ich eine Gabellichtschranke PMF44P von Panasonic getestet. In der Dokumentation wird diese mit einer maximalen Frequenz von 1000Hz angegeben. Leider hat dies keine Verbesserung bei der Drehzahlmessung gebracht. Wie mit dem Magnetschalter konnte ich Drehzahlen ab 300 U/min nicht mehr messen. Auch ein verändern der Debounce Period (zwischen 3 bis 100) hat keine Verbesserung gebracht Ich programmiere mit Java. Meine Frage ist nun, ob das "Industrial Digital in 4 Bricklet" überhaupt zum messen von Schaltfrequenzen zwischen 1-12 Hz geeignet ist, oder ob ich ein "IO-4 Bricklet" verwenden sollte. Zum Schluss eine Anmerkung. Ich bin weder Elektriker noch Elektroniker. Quote Link to comment Share on other sites More sharing options...
borg Posted January 14, 2014 Share Posted January 14, 2014 12Hz sollte kein Problem sein, kannst du den Source Code den du benutzt um das auszulesen hier posten? Quote Link to comment Share on other sites More sharing options...
photron Posted January 14, 2014 Share Posted January 14, 2014 Da springen mir direkt keine richtig groben Fehler ins Auge. Was mir aber auffällt ist diese Zeile strecke = (zaehler - zwSpeicher1) * (radUmfang / 1000); Wobei zaehler, zwSpeicher1 und radUmfang Integerwerte sind. Dies führt dazu, dass radUmfang / 1000 == 2 ist und nicht 2.184 (bei radUmfang == 2184). Das verfälscht deine Werte etwas. Dann ist da noch das Busy Waiting: while(waitingStartTime + 1000 > System.currentTimeMillis()){} Da könnte man stattdessen Thread.sleep(1000) nehmen. Aber das hat denke ich nichts mit deinem Problem zu tun, außer das Busy Waiting wäre recht ungenau und führt nicht zu 1 Sekunde Wartezeit, was sich auch wieder auf die Genauigkeit deiner Berechnung auswirkt. Ansonsten schlage ich vor, dass du dein Programm und deinen Aufbau auf ein Minimum reduzierst. Also nur Master Brick und Industrial Digital In 4 Bricklet und in deinem Programm nur noch den Flankenzähler abfragst und den Wert umrechnest. Wenn das funktioniert liegt das Problem im entfernten Teil des Aufbaus. Wenn das nicht funktioniert, muss man sich nur noch den minimalen Aufbau genauer ansehen. Quote Link to comment Share on other sites More sharing options...
roemheld Posted January 14, 2014 Author Share Posted January 14, 2014 Vielen Dank, wegen des Integerfehlers, habe es korrigiert. Habe die ganze Hardware welche nicht benötigt wird, abgebaut. Meine Stromversorgung habe ich auch durch eine Batterie ersetzt und ein kleines Testprogramm geschrieben. Ich frage jetzt den Counter nur alle 60 Sekunden ab und setzte in auf 0. Bis 300 U/min klappt das perfekt.Die Drehzahlanzeige meiner Drehmaschine und ausgegeben Drehzahl des "Indusrial Digital In 4" sind identisch. Ab einer höheren Drehzahl bleibt die ausgegebene bei 300 hängen und ab 450U/min fällt sie wieder ab auf etwa 230. Mein Fluke kann auch Schaltfrequenzen messen. Habe damit die Frequenz am Brickleteingang gemessen.Dazu meine Drehmaschine auf 600 U/min beschleunigt und habe dann genau 10 Hz gemessen. Meine Lichtschranke funktioniert also einwandfrei. Habt Ihr die Schaltfrequenz größer 5Hz wirklich getestet? Hier noch meinen Sourcecode: public static void testen() throws Exception { IPConnection ipcon = new IPConnection(); BrickletIndustrialDigitalIn4 idi4 = new BrickletIndustrialDigitalIn4(IDI4UID, ipcon); ipcon.connect(host, port); int value=0; idi4.setDebouncePeriod(70); long waitingStartTime = System.currentTimeMillis(); short eingang =0; // festlegen des impulsgebenden Eingangs des IObricklets while (value<2){ while(waitingStartTime + 60000 > System.currentTimeMillis()){}// jede Sekunde Schleife durchlaufen waitingStartTime = System.currentTimeMillis(); // Systemzeit abfragen System.out.println(idi4.getEdgeCount(eingang,true)); } ipcon.disconnect(); } Quote Link to comment Share on other sites More sharing options...
borg Posted January 14, 2014 Share Posted January 14, 2014 Du hast die Entprellzeit für den Flankenzähler nicht eingestellt. Der Standardwert dafür ist 100ms, was 5Hz entspricht wenn die "high" und "low"-Zeiten je gleich lang sind. Streu mal an einer strategischen Stelle folgendes ein : // Eingang 0 (=bitmask 1), Steigende Flanke, Debounnce 5ms (max ~100Hz) idi4.setEdgeCountConfig(1, BrickletIndustrialDigitalIn4.EDGE_TYPE_RISING, (short)5); das "setDebouncePeriod" setzt nur die Entprellzeit für den InterruptListener. Quote Link to comment Share on other sites More sharing options...
roemheld Posted January 14, 2014 Author Share Posted January 14, 2014 Jetzt funktionierts. Dann kann ich ja alles wieder zusammenbauen . Hatte also in meinem Komplettprogramm nie wirklich die Entprellzeit verändert, da ich idi4.setDebouncePeriod(); verwendet hatte Danke. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.