Hallo zusammen. Ich habe vor, mit einem embedded-Board (Raspberry Pi) über dessen GPIO-Pins eine Drehzahl zu eines Verbrennungsmotors (Dieselmotor) zu erfassen und aufgrund des gemessenen Wertes die Einspritzung über einen Getriebemotor zu steuern. Klingt eigentlich total simpel, ist es aber nicht. Mit Regelungstechnik hatte ich noch nicht allzu viel am Hut, deshalb hier die Frage: Zunächst habe ich vor, eine Drehzahl pro Minute zu erfassen, die durch einen Zeitcounter und dem Zählen der Spannungsimpulse des Hallsensors realisiert werden soll. Allerdings ist dabei das Problem, dass nur jede vollständige Minute ein Drehzahlwert aktualisiert wird. So dachte ich "kein Problem"...setze ich einfach den Zählcounter runter. Heißt, dass er nun z.B. die Impulse im 10-Sekunden-Rhythmus zählt und daraus die Drehzahl erfasst. Problem: Ungenauigkeit! Die Solldrehzahl des Motors beläuft sich auf 1500 Umdrehungen/min. . Bereits eine Schwankung auf 1600 Umdrehungen pro Minute wäre fatal! Heißt, dass ich eigentlich schon die Genauigkeit von einer Minute brauche. Problem dabei ist aber, dass ich erst nach einer abgelaufenen Minute auf das Signal reagieren kann. Nun die Idee, den Zeitintervall von 1 Sekunde einzustellen: Bei einer Drehzahl von 1500 U/min. wären das 25 Intervalle in der Sekunde. Bereits bei einer gemessenen Intervallsumme von 24 wäre die Schwankung wieder viel zu groß und ungenau.... HILFE! Gruß u. Danke! joh.
Das Problem ist, dass ich keine Interrupts auslösen kann sondern nur pollen kann.
Wenn das ein Hallsensor ist, gib ihm doch mehr Pulse/Umdrehung - z.B. mit mehreren Magneten auf der Welle. jk schrieb: > Das Problem ist, dass ich keine Interrupts auslösen kann sondern nur > pollen kann. Warum denn das? Das klingt nicht gut, so kannst du schnell mal einen Puls verpassen. Du solltest einen Treiber schreiben, der per Interrupt zählt.
jk schrieb: > Das Problem ist, dass ich keine Interrupts auslösen kann sondern nur > pollen kann. Dann ist es vielleicht das falsche System für Echtzeitaufgaben. Guck dir mal diesen (*) Frequenzzähler an, der hat bei niedrigen Frequenzen das gleiche Problem, wie du mit deiner Drehzahl (*) Beitrag "Frequenzzähler 1Hz - 40MHz" http://www.mikrocontroller.net/articles/Frequenzz%C3%A4hlermodul
Du brauchst da nicht zwingend einen Interrupt, Du kannst auch einfach die Capture-Funktion des Timers verwenden.
Das mit der Zeitmessung zwischen den Impulsen klingt gut. Nur diese "while(1)" macht mir irgendwie Bauchschmerzen.
1 | while(1) |
2 | { |
3 | if($impuls) |
4 | { |
5 | $impuls=0; |
6 | $zeit1 = clock(); |
7 | while!($impuls); |
8 | $zeit2 = clock(); |
9 | } |
10 | $zeitdifferenz = $zeit2-$zeit1; |
11 | } |
Falls du Interesse hast, mein kleiner Linux Robbi hatte damals auch das Zählproblem (bei ihm warens die Räder), deswegen habe ich einen Treiber für Interrupts geschrieben (auf dem uCSimm). Ist für Linux 2.4, aber das Prinzip ist ja das gleiche: http://www.schoeldgen.de/index.php?content=robot.dir Such nach 'speedy.c', das ist der Treiber.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.