Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehzahlmesser mit schneller Reaktionszeit
Hallo zusammen,
mein aktuelles Projekt ist ein Drehzahlmesser mit induktivem Abgriff für 1 Zylinder 4-Takt Motore.
Die Signalaufbereitung mit einer Transistorstufe ist soweit fertig, aus den schwingenden Zündsignalen filtere ich mir nun saubere 5V Rechtecksignale heraus.
Nun kommt das Problem an dem ich jetzt hänge: Die realisierung der Datenerfassung dieser Drehzahl. Das ganze ist nämlich relativ zeitkritisch, heißt ich möchte die geringstmögliche Reaktionszeit zwischen tatsächlicher Drehzahl und am AVR ausgewerteter Drehzahl haben. Mit Gering meine ich Verzögerungen von max 100ms.
Im Klartext also: Ich sage meinem Controller "gib mir ein Signal genau dann, wenn 10000 U/min anliegen, und zwar exakt wenn es so weit ist, nicht erst wenn schon seit >100ms 10000 U/min anliegen"
Man muss sich als Betriebsbedingung vorstellen, dass die Drehzahl sich innerhalb von 2 Sekunden von 10 Hz auf 40 Hz verändern kann (Beschleunigung), was nun das Hauptproblem verursacht. Die Drehzahl ändert sich permanent, und mein Controller muss nun trotzdem genau diesen Zeitpunkt errechnen können.
Ich habe nun 3 potentielle Möglichkeiten:
1. Pulsabstand messen und darüber die Drehzahl ermitteln
2. Pulse über definiertem Zeitintervall zählen
3. Hardwareseitig die Impulse Integrieren (Kondensator parallel zum Signalausgang, je höher die Frequenz desto höher die Spannung) und analog auswerten
Ich habe jetzt noch keine weiteren Mathematischen Überlegungen dazu angestellt, vielleicht hat jemand ja direkt einen Tip wie es am schlauesten ist, oder wie es definitiv nicht gehen wird.
KingTobi
06.10.2009, 16:02
Hi
Ich bin gerade dabei für mein Auto ein digitalen Tacho + Drehzahlmesser zu bauen. Ich mach das nach deiner Variante 2 und rechne dann auf ganze Minuten hoch.
Hallo Powell!
Die schnallstmögliche Reaktionszeit gibt die 1. Möglichkeit, die jedoch eine Umrechnung der Periode (Zeit zwischen zwei gleichen Flanken) in Frequenz und Multiplizieren mal 60 benötigt.
Die beide übrige Methoden hätten längere Reaktionszeit.
MfG
Hallo zusammen,
ich habe ebenfalls mal weiterüberlegt und konkretere Zahlenwerte angenommen: Bei 40 Hz beträgt mein Pulsabstand 25 msec.
Demnach könnte ich doch sagen "sobald der Abstand zwischen zwei eingangspulsen kleiner als 25msec wird, hast du die Bedingung erreicht"
Wie kann ich dies nun über Bascom realisieren? Es gibt da den Pulsein Befehl, allerdings hatte ich schon mal vergeblich damit experimentiert, ggf. ein Verständnisfehler? Weiß jemand bescheid wie man ihn in diesem Konkreten Beispiel einfließen lassen würde? (Heißt: Wenn Pulsabstand größer 25ms mache nichts, wenn Pulsabstand <= 25ms dann gebe Signal. Wichtig ist dabei natürlich dass der Pulsabstand permanent gemessen wird, selbst wenn mal über Stunden gar kein Impuls kommt, vielleicht liegt da das Problem)
Möglichkeit 2 schließe ich nun auch mal kategorisch aus, da ich im Maximalfall über 100ms gerade mal 4 Impulse zu zählen hätte, viel zu geringe auflösung.
KingTobi
06.10.2009, 16:26
Das mit den 25ms Pulslänge kommt aber nur hin wenn ein Puls nahe 0ms lang ist, oder seh ich das falsch?!
Hallo Tobi,
ich meine den Pulsabstand, oder genauergesagt: Den Zeitabstand zwischen zwei ansteigenden Flanken. Hiernach ist es egal wie lang der Puls nun tatsächlich ist, da es immer auf die Flanken ankommt.
KingTobi
06.10.2009, 16:49
Hast recht, hab da was durcheinander gebracht.
Ich denke auf die Art liesse sich das sehr genau und sehr schnell messen. Das werde ich für mein Projekt wohl übernehmen.
Also, ich bin hier gerade wieder am experimentieren und kann mein Problem mal präzisieren: Ich verwende den Timer um ein Rechtecksignal mit einer Pulsbreite von 13ms (also Pulsabstand 26ms) zu generieren. Dies wird über einen Taster an den Eingang zur Pulsabfrage geführt. Drücke ich den Taster liegt das Signal an, drücke ich ihn nicht halt eben nicht.
Folgender Code auszug:
Do
Pulsein Puls , Pind , 1 , 1
If Puls < 1300 Then
Portd.7 = 0
End If
If Puls > 1300 Then
Portd.7 = 1
End If
Loop
End
Timer_irq:
Timer1 = 62285
Toggle Portd.0
Return
Wenn ich mit 13ms Pulsbreite und "Puls" auf 1300 (*10 us) abfrage funktioniert es, meine "Puls LED" geht aus sobald ich den Taster drücke. Wenn ich allerdings die Frequenz variiere passiert folgendes: Senke ich die Frequenz "blinkt" meine Puls LED auf ein mal im takt der Eingangsfrequenz (laut meinem Code geht sie über einer Frequenz aus und unterhalb einer Frequenz an, aber sie kann nicht blinken).
Erhöhe ich die Frequenz passiert gar nichts, die LED behält ihren Zustand wie wenn ich den Taster nicht drücken würde.
Hat jemand eine Idee?
Also ich komme einfach nicht weiter :(
Die Hilfebeschreibung dieses Befehls ist mehr als mau. Wenn ich das ganze über eine Tastereingabe mache, geht gar nichts mehr. Es scheint so als ob der Controller nach dem Aufspielen des Programms kurz auf eine Eingabe wartet, und dann geht die LED des Pulsein-Ausgangs aus und das Programm reagiert einfach nicht mehr auf meine Tastereingabe. Egal ob ich langsam oder schnell drücke, egal ob ich den Pulsein-Wert klein oder groß wähle.
In der Hilfe ist kurz etwas von der ERR Variable erwähnt. Ich vermute dass diese auf eins gesetzt wurde und daher Pulsein nicht mehr ausgewertet wird. Aber das kanns doch nicht sein!?
Gibts denn niemanden der diese Funktion öfter nutzt, sie komplett versteht, und mir nochmal genauer erläutern kann?
Crazy Harry
06.10.2009, 20:52
Die Signalaufbereitung mit einer Transistorstufe ist soweit fertig, aus den schwingenden Zündsignalen filtere ich mir nun saubere 5V Rechtecksignale heraus.
Ist zwar nicht deine Thread-Frage, aber die Schaltung würde mich interessieren :)
Und wie und wo nimmst du das Signal ab ?
Der Signalabgriff erfolgt induktiv vom Zündkabel. Die Transistorschaltung habe ich von Elektor, musst du mal nach "universeller Drehzahlmesser" suchen, gibts da zum Download
Besserwessi
06.10.2009, 22:07
Die naheliegende Methode um Periodendauern zu messen ist es die Input Capture Hardware zu nutzen. Für die Drehzahlmessung sollte auch die Auflösung des 16 Bit Timer vermutlich reichen. Da macht das Programm noch etwas einfacher als im Beispiel (allerdings in C) hier:
http://www.rn-wissen.de/index.php/Timer/Counter_(Avr)#Input_Capture
Zumindest wenn man nur 16 Bit nutzt sollte sich das leicht auch nach Bsic übertragen lassen. Sollte dann nur etwa halb so lang sein, und viel ist ja auch die Ausgabe, die man nicht braicht.
Crazy Harry
06.10.2009, 22:32
Herzlichen Dank - diese Schaltungsvariante kannte ich noch nicht. Ich hab schon vieles versucht und bisher hatte jede Schaltung ihre Macken. Ich werde mal diese testen.
Download ? Nein - hab alle Elektor 1990-2008 auf meinem NAS. Erst vor 2 Monaten gekauft um das Papierwerk los zu werden :lol:
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.