Moin,
es hängt mal wieder bei mir, soll heissen ich bräuchte Hilfe, mal wieder.
Folgende Problemlösung wird gesucht:
Messen der Drehzahl eines Spindelmotor (Drehbank) um die Leitspindel per Schrittmotor mit der gewünschten Drehzahl anzusteuern. Das ganze soll zum Gewindedrehen dienen daher sollte die Auswertung und Regelung sich möglichst in Echtzeit abspielen.
Derzeitiges Problem ist das Messen der Drehzahl. Mein Lösungsansatz ist folgender:
eine Scheibe mit 90 "Zähnen" sitz auf der Spindelwelle und durchläuft eine Gabellichtschranke.
Die positive Flanke des Signals zähle ich per Interrupt. Nach 100ms lese ich den Zähler aus und kann so die Drehzahl berechnen. Soweit die Theorie. Gemessene Ergebnisse schwanken : z.B.
effektive Drehzahl = 133 U/min.
gemessen Flanken = 60 - 65
Abfrageintervall = 100ms
ergibt bei mir 60 Flanken * 10 => also 600 Impulse/Sekunde // (60 Flanken * 10 *100ms)
/ 90 Zähne = 6,666 U/sek
400 U/min.
Jetzt die große Frage:
wieso schwankt das Ergebnis so stark (60 - 65) ?????
wo ist bei meiner Berechnung der Fehler ????
Oszi nicht vorhanden,
Vielleicht geht es ja anders einfacher und vor allem genauer
Hallo
das liegt an Deiner Messmethode, ich weiß nicht wie Du an die 65 Zähne kommst die du misst.
Du hast 133u/min x90 Zähne = 11970 Impulse / Minute
das sind in 100 ms =11970 / 600 = 19.9Impulse
bzw. etwa 199Hz
Nun kannst Du aber keine 0,3 Impulse messen Dein Zähler misst entweder 19 oder 20 Impulse. Das ergibt eine Auflösung von etwa 5%.
Bei kleinen Frequenzen sollte man eine Periodendauer Messung machen. Dabei wird die Zeit zwischen zwei gleichen Flanken gemessen. Das kann man mit micros() gut machen. Du misst in der ISR die Differenz zwischen dem aktuelle und dem letzten Aufruf.
Außerhalb der ISR berechnest Du die Drehzahl dann als float Wert. Dabei musst Du natürlich beachten das es sich bei Deinem Messwert um Microsekunden handelt. Du kannst auch erst mal als Hilfsgrösse die Frequenz (Hz) ausrechnen.
Frequenz= 1000000.0 / Messwert
Drehzahl = Frequenz x 60 / 90 müsste es dann sein.
Nachtrag.
Berechnung oben geändert hatte die Anzahl der Zähne mit 60 gerechnet.
@ paulpaulson
brachte nicht den erwünschten Erfolg.
@Rentner
die oben beschriebenen 60 - 65 Impulse wurden innerhalb 100ms gezählt.
Bei kleinen Frequenzen (wo fangen hohe an??) leuchtet ein die Zeit zu messen. Ich habe versucht das mal umzustellen. Ich hoffe ich hab nicht wieder ein Fehler drin. Aber das Ergebnis in Mikrosekunden springt zwischen 8588 und 11636 Microsekunden. Allerdings auch nur noch die zwei Werte. Gemessen an einer anderen Zahnscheibe (36 Zähne) mit in etwa gleicher stabilen Drehzahl.
Wenn Du zu keiner konstanten Messung mit dem Motor kommst könnte ich mir noch vorstellen das der Schrittmotor ein bischen ruckelt und eventuell der ein oder andere Zahn doppelt gemessen wird.
In dem Fall hilft sicher ein kleiner Kondensator 100nF parallel zu der Lichtschranke.
Moin, @Rentner,
"Der Test erfolgt mit Tone und einer Brücke zum testen".
Funktioniert ja geradezu perfekt.
Jetzt hab ich bei meinem Probeaufbau folgendes feststellen müssen, dass das Ergebnis nicht so konstant ausfällt. Da ich ja jetzt die Software ausschließen kann, suche ich die Ursache beim Zahnrad. Es ist aus Sperrholz gelasert und weist trotzdem Toleranzen in den Zahnbreiten und Zahnlücken auf habe ich jetzt nach genauem hinsehen bemerkt. Ich bin jetzt auf der Suche nach einem vernünftigen Drehsensor.
Also derweilen schönen Dank und ich werde weiter berichten.
Gruß Stefan
P.S.
Vielleicht kennt ja jemand einen Sensor bei dem die Teilung auf einer Riemenscheibe aufgeklebt werden kann
Hallo,
was ist mit der12us Messung ? die fällt ja total aus der Rolle.
ja das ist das Problem bei einer Periodenmessung. Wenn Du eine Torzeitmessung machst und du willst auf 1% auflösen dann benötigst Du eine Messzeit von 500ms bei 200 Hz. <1% ist sicher schon gewünscht.
Beruflich habe ich früher viel Periodenmessung verwendet bei Durchfluss Frequenzen 10-500 Hz, allerdings haben wir über mehrere Perioden gemessen. Das gibt dann einen Mittelwert. Wenn Du 20 Zähne messen würdest das hättest Du bei 200Hz etwa eine Messzeit von 100ms. Kleiner Toleranzen bekommst du damit schon weg. Die einzelne Zahnbreite spielt ja keine Rolle , die Periode muss halt möglichst gleich sein. Eventuell kannst Du den ein oder anderen Zahn noch mal mit der Nagelfeile bearbeiten
So als Ansatz
Du könntest bei meinem Sketch auch alle 10ms den Wert auslesen. Damit hast Du sicher 10 verschiedene Zähne-Perioden gemessen. aus z.B 10 Messwerten bildest einen Mittelwert. Dann ist deine gesamte Messzeit 100ms bei hoher Auflösung.
oder
In die ISR eine Periodenzähler einbauen , die micros() werden dann gemessen von z.B. 20 bis 0 . Ausserhalb wird der Periodenzähler abgefragt und bei 0 der Werte für micros() übernommen. Anschließend wir der Periodenzähler wieder auf 20 gesetzt.
Nachdem ich mit neu angefertigten Zahnrädern experimentiert habe gibt es ein kleines Erfolgserlebnis zu berichten, aber erst nachdem ich den Kondensator an Pin2 angeschlossen habe. Guter Tipp
Heute Nachmittag geht es ans bilden des Mittelwertes, ist ja überschaubar
Hallo
Sorry, ganz so einfach ist es nicht.
pulsein(Pin ,HIGH) misst die H Zeit. Mann müsste zusätzlich noch die L Zeit messen und das addieren um an die Periodendauer zu kommen. Das Tastverhältnis muss ja nicht 1:1 sein, bei dem Zahnrad.
Zudem blockiert das dann , insbesondere bei kleine Frequenzen würd das dann suboptimal.
.