Forum: Mikrocontroller und Digitale Elektronik Drehzahlerfassung - wie?


von jk (Gast)


Lesenswert?

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.

von Christian B. (casandro)


Lesenswert?

Miss doch einfach die Zeit zwischen 2 (oder 10) Impulsen.

von jk (Gast)


Lesenswert?

Das Problem ist, dass ich keine Interrupts auslösen kann sondern nur 
pollen kann.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Praktiker (Gast)


Lesenswert?

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

von Christian B. (casandro)


Lesenswert?

Du brauchst da nicht zwingend einen Interrupt, Du kannst auch einfach 
die Capture-Funktion des Timers verwenden.

von jk (Gast)


Lesenswert?

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
}

von jk (Gast)


Lesenswert?

So in etwa?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
Noch kein Account? Hier anmelden.