PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeitmessung zwischen zwei Signalflanken



basti85
20.06.2007, 00:22
Hallo zusammen!

Eigentlich gehört diese Frage nicht unbedingt unter die Überschrift Sensoren, aber da ich es bisher noch nicht weiter spezifizieren kann, hoffe ich auch hier Hilfe zu bekommen.
Also, konkret geht es um die Messung der Drehzahl eines Rades an einem 1:5er Modellauto um ein ABS System zu realisieren.
Die Sensoren Hardware steht schon, er hier http://www.conrad.de/goto.php?artikel=182853 schaut auf ein Zahnrad (Modulo 1, 30 Zähne) und gibt somit ein halbwegs brauchbares Rechtecksignal aus. Dieses wir bereits mittels Schwellwertschalter in ein TTL geeignetes Rechtecksignal gewandelt.
Jetzt möchte ich einen möglichst einfachen Zähler aufbauen, der bei der ersten Flanke anfängt zu zählen und bei der nächsten gleichartigen Flanke aufhört.
Wichtig hierbei ist, dass der Zählerwert zwischen gespeichert wird, also immer ein stehender, aktueller Wert am parallelen 8-Bit Ausgang anliegt, den sich der myC dann holen kann. Nach jedem Zahn soll dieses Signal aktualisiert werde, unabhängig davon, ob es ausgelesen wurde oder nicht.
Hab das ganze schon mal für einen GAL geschrieben, aber leider wurde das Programm zu groß für den Baustein. Jetzt habe ich den Tipp bekommen, einen "Counter/Timer-Baustein" zu benutzen, aber bisher hab ich da nichts Passendes gefunden (und auch keine Ahnung davon).

Währe euch für Tipps wirklich sehr dankbar. Und wenn dieser Thread woanders hingehört, nur zu, verschiebt mich ;-)

Und sorry für die viele Worte, kurzfassen ist nicht so mein Ding...

Grüße
Basti

recycle
20.06.2007, 01:02
Was ist myC? Ein Microcontroller Typ? Eine Programmiersprache?

Oder ein verunglücktes µC?



Jetzt habe ich den Tipp bekommen, einen "Counter/Timer-Baustein" zu benutzen, aber bisher hab ich da nichts Passendes gefunden


Viele Microcontroller (vermutlich die meisten) haben Anschlüsse für externe Interrupts. Für diese Interrupt Anschlüsse kannst du vorgeben (programmieren) das automatisch eine bestimmte Funktion (Interrupt Routine) aufgerufen wird, sobald an dem Anschluss eine Flanke auftritt.


D.h. um deinen Sensor auszuwerten, könntest du ihn an einen Interrupt-Pin anschliessen und einen Timer (ebenfalls eine Funktion der meisten Microcontroller) starten.
Die Interrupt-Routine schreibt den Wert des Timers auf deinen Ausgang und setzt ihn dann 0.
Da die Interrupt-Routine bei jeder Flanke automatisch aufgerufen wird, wird so immer der aktuelle Wert auf den Ausgang geschrieben und der Timer fängt von neuem an zu zählen. Die Geschwindigkeit mit der der Timer hochzählt kannst du in einigen Stufen über einen sogenannten Prescaler (Teiler) per Softwarebefehl vorgeben und den Wert den du auf deinen Ausgang gibst, kannst du wenn nötig vorher umrechnen.

Wenn du sowieso mit einem geigneten Microcontroller arbeitest und ihn programmieren kann, ist das nicht allzu kompliziert.
(Du musst eigentlich nur die passenden Befehle hintereinander setzen und meine Denkfehler korrigieren ;-) )

Ob du den Sensor direkt an einen Interrupt-Pin anschliessen kannst, weiss ich allerdings nicht. Eventuell muss du die Spannung noch in eine für den Microcontroller brauchbare Spannung umwandeln.

Wenn myC jetzt allerdings der Kosenamen deines Meerschweinchens ist und du gar keinen Micirocontroller verwendest, habe ich das alles für die Katz geschrieben ;-)

pongi
20.06.2007, 09:08
Ja, das wäre ein Ansatz, damit ist es aber nicht gewährleistet, dass er immer einen stehenden Wert hat. Also muss er in die Interruptroutine noch einbauen, dass der Timerwert automatisch in eine Variable zwischengespeichert wird. Vom Hauptprogramm muss dann diese Variable ausgelesen werden. Achtung: du musst sichergehen, dass die Variable nur einmal verwendet wird, ansonsten kann es passieren, dass mit zwei verschiedenen Werten gerechnet wird.

basti85
20.06.2007, 11:40
Erst einmal danke für die schnellen Antworten! Und ja, mein myC sollte natürlich µC heißen.

Wenn ich das mit einem µC realisieren würde, könnte man das ja theoretisch gleich den Controller erledigen lassen, der auch den Rest des ABS-Algorithmus steuert.
Dazu einmal eine Frage:
Die Welle auf der das Zahnrad sitzt dreht sich mit bis zu 70 1/s. Bei 30 Zähnen sind das 210 Impulse pro Sekunde. Ich kenn mich nicht wirklich mit µControllern aus, aber würde das den Controller nicht ganz schön in Anspruch nehmen und seine eigentlichen Berechnungen verzögern wenn da ständig Interrupts auflaufen?
Soweit ich weiß wird für die Regelung ein ATMEGA2560 verwendet. Ein recht modernes Teil soweit ich weiß...

Dank und Grüße
Basti

robo junior
20.06.2007, 12:15
Hallo,

statt die Zeit zwischen zwei Flanken zu messen kannst du doch auch die Flanken/Impulse pro Zeiteinheit (z.B. 0,1s) messen. Für ein ABS System solle das doch ausreichen.
Was muss der Controller denn noch alles machen, dass du befürchtest, dass er ausgelastet wäre. Wenns nur um das ABS geht denke ich kannst du die Auswertung und Bremsensteuerung allein mit dem Controller machen. (ob das ein ATMega2560 oder 32 ist, ist eigentlich egal, da der unterschied ja nicht in der rechengeschwindigkeit sondern hauptsächlich in den unterschiedlichen Speichergrößen/ zusätzlichen Features (Timer etc) liegt.)
Hast du nicht eigentlich 2100 Imp / sek? Dann würde ich wirklich die Impulse pro Zeitspanne zählen.

recycle
20.06.2007, 12:45
@pongi


Ja, das wäre ein Ansatz, damit ist es aber nicht gewährleistet, dass er immer einen stehenden Wert hat. Also muss er in die Interruptroutine noch einbauen, dass der Timerwert automatisch in eine Variable zwischengespeichert wird.


Da ich auf dem Bereich auch nicht so 100% sattelfest bin - muss er den Wert wirklich unbedingt in einer Variablen zwischenspeichern?

Er schreibt doch, dass er den Wert über einen paralellen 8 Bit Ausgang ausgeben will. Bei Werten kleiner 256 müsste es dann doch theoretisch auch klappen den Ausgang direkt zu setzen.
Ein kompletter 8 Bit Port lässt sich doch soweit ich weiss genauso wie eine Byte-Variable ansprechen.

Dass das bei einem 16 timer und Werten grösser 255 nicht mehr geht und er die Timerwerte dann ausserhalb der Interrupt Routine umrechen muss ist mir klar.

Es dürfte zwar praktisch irrelevant sein, theoretisch weicht der Weg über eine Variable aber etwas von der Aufgabenstellung ab.
Wenn der Interrupt den Timerwert in eine Variable schreibt und diese über eine Funktion ausserhalb der Interrupt-Routine auf den Ausgang geschreiben wird, liegt am parallelen 8 Bit Ausgang nicht immer der aktuelle Timerwert an, sondern nur dann, wenn der µC zwischen den Interrupts genug Zeit hat die Funktion durchzuführen.

Interessiert mich nur zu meinem eigenen Verständnis.
Für Basti85 dürfte es egal sein, denn wenn der µC den Sensor direkt auswertet, muss er die Werte ja eh intern über Variablen weiterverarbeiten und nicht mehr über einen 8 bit Ausgang ausgeben.

basti85
20.06.2007, 12:52
Klar, sind 2100 (wer rechnen kann ist klar im Vorteil...)
allerdings ist das die zu erwartende maximale Anzahl, bei langsamerer Fahrt sind es natürlich weniger Impulse. Viel langsamer als 2 bis 3 Umdrehungen pro Sekunde wird es aber wohl nie werden, weil dann eine ABS Bremsung einfach nicht mehr nötig ist. Dann währen es immer noch 60 bzw 90 Imp/sec, was man auch durchaus noch zählen könnte...
Eigentlich scheint es mir also recht egal zu sein auf welche Art man die Auswertung macht. Bei der Methode mit der Zeitmessung zwischen zwei Impulsen ist die Auflösung und die geschwindigkeit, in der neue Werte vorliegen vermutlich größer.
Was lässt sich denn einfacher realisieren? Hab wie gesagt vom Timer system in µControllern keine Ahnung und bis auf Grundzüge allgemein wenig von Mikroprozessoren.

zu dem Beitrag von recycle:

Soweit ich weiß kann man Ports wie Variablen behandeln, ist ja egal ob ich den Wert jetzt auf eine Speicheradresse oder einen Ausgangsport schreibe. Wichtig ist nur, dass der Zähler schon wieder loslegen kann, während sein letzter Zählwert noch unangetastet aufbewahrt wird. Dadurch soll zum Beispiel bei sehr langsamer Fahrt ruhig zwei mal der selbe Wert ausgelesen werden, hauptsache nie Keiner bzw. ein Unsinniger.

pongi
20.06.2007, 15:34
Es wäre doch schade 8 Ausgänge vom uC für sowas zu verbrauchen, falls man Variablen hat.
Das mit der Portausgabe hat Basti85 glaub ich gemeint, wenn er den Zähler als Peripherie realisiert.