-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Quellcode für Geschwindigkeitsmessung

  1. #1

    Quellcode für Geschwindigkeitsmessung

    Anzeige

    Moin,
    wir bauen gerade eine Art Geschwindigkeitsmessung auf. Dabei verwenden wir 4 Lichtschranken. Diese ist sowohl hell als auch dunkel schaltend. D.h. wir erhalten bei der Durchfahrt der Schranke eine STEIGENDE und FALLENDE Flanke. Mit dieser Flanke wollen einen TIMER Starten. Bei jeder Durchfahrt des Probekörpers, soll der ZEITPUNKT der Durchfahrt notiert werden.
    Für unseren Aufbau haben wir ein ATMEL EVALUATION-BOARD mit dem ATmega32 Mikrokontroller.
    Dem Datenblatt haben wir schon die Belegung der PORTS entnommen. Allerdings bleibt immer noch das Problem eine Stoppuhr zu programmieren. Unser C-KURS hat uns leider diesbezüglich keine Informationen gegeben. Vielleicht kann uns jemand sagen wie man mit C (wir programmieren in AVR Studio) eine Art Stoppuhr basierend auf Digitalen Eingängen programmiert?

    Wir sind für eure Hilfe sehr Dankbar.

    Gruß Tanja

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554

    Re: Quellcode für Geschwindigkeitsmessung

    Hallo Tanja,

    willkommen im Forum.

    Zitat Zitat von Tanja1986
    ... eine Art Geschwindigkeitsmessung ...
    Vermutlich also eine Geschwindigkeitsmessung. Nix "Art" (polemisch grinsend).

    Zitat Zitat von Tanja1986
    ... STEIGENDE und FALLENDE Flanke. Mit dieser Flanke wollen einen TIMER Starten ...
    ... Bei jeder Durchfahrt des Probekörpers, soll der ZEITPUNKT der Durchfahrt notiert werden ...
    Prima, "steigende ..." und so zeigen, dass Du Dich mit der Materie schon auskennst. Wird die Geschwindigkeit eines Objekts gemessen oder können konkurrierende Objekte evtl. gemeinsam durch die Lichtschranke fahren? Ich nehme mal an - nur ein Objekt.

    Noch mehr Polemik (aber nicht wirklich):
    Ich gehe jetzt also davon aus, dass Du sowohl die Momentan-Geschwindigkeit als auch den Zeitpunkt dieser Geschwindigkeit haben willst. Um den Zeitpunkt festzuhalten, muss eine Uhr mitlaufen. Jetzt wäre die Frage offen, wie genau die Zeitnahme und die Geschwindigkeit sein muss. Die Genauigkeit der Geschwindigkeit hängt ja z.T. von der Länge der Messstrecke ab. Für ne Durchschnittsgeschwindigkeit würde ja die "Runden-"Zeit reichen.

    Ich habe etwas ähnliches so gelöst, dass ich mir einen Timer so initialisiert hatte, dass der alle 50 µs in einer ISR einen Zähler hochsetzt. Bei 16bit-unsigned-integer sind das dann max. über 3 sec. Das kann man für Langzeitmessungen so abfangen, dass z.B bei > 20000 der 50µs-counter auf Null und ein Sekundenzähler eins rauf gesetzt wird.

    Nun könntest Du den INT0 (ein "externer" Interrupt, löst einen Interrupt aus wenn ein Signal am Pin ansteht, der hat noch einen Bruder, den INT1) auf steigende (od. fallende) Flanke initialisieren und eine ISR dazu bauen. In dieser ISR liest Du den aktuellen Zeitstand aus, subtrahierst ihn vom alten Wert, sicherst den neuen Wert - der wird "neuer" alter *gggg* - und musst noch den/die Sekundenwechsel abfangen. Damit könntest Du die Torzeit (oder die Durchfahrtzeit) auf 50 µs genau auflösen und den momentanen Zeitstand notieren. Wenn Deine Genauigkeitsforderung höher ist, könnte man das auch etwas anders machen.

    Bevor ich noch ein ätzend seitenlanges Tutorial schreibe,
    Frage: Wäre das in Deinem Sinne?

    Ach so, noch etwas: guck Dir vielleicht mal diesen Link an und zur Abrundung auch noch diesen hier.
    Ciao sagt der JoeamBerg

  3. #3
    Hallo Joe,
    Danke für deine schnelle Antwort.
    Du hast schon richtig angenommen, dass immer nur ein Körper durch die Schranken gleiten soll. Und mit dem Begriff "gleiten" bin ich schnell beim Kern meines Vorhabens. Ich versuche mit Hilfe der Schranken und der Geschwindigkeitsmessung eine Beschleunigung (und somit eine "Art" Geschwindigkeit ) zu messen. Mit Hilfe der Beschleunigung lässt sich dann auf die Gleitreibung und somit den Gleitreibungskoeffizienten µ schließen. Die Schranken sind in einem Abstand von 10cm angebracht. Mit dem ersten Interrupt würde ich gerne eine "globale" Uhr starten. Dazu soll an jeder Schranke noch mal eine einzelne „lokale“ Stoppuhr bei steigender Flanke starten und bei fallender stoppen. Es soll dann lokal eine Geschwindigkeit gemessen werden, sowie die Zeit gestoppt werden die der Körper zwischen zwei Schranken braucht. Das soll eine redundante Messung ergeben. So viel zu meinem Vorhaben. Ich hoffe dir damit beschrieben zu haben was in meinem Sinne ist

    Zu deinem Vorschlag: So wie ich das verstehe, hast du durch den ersten Interrupt INT0 eine Uhr gestartet. Durch das hochsetzen des Zählers erhältst du durch Multiplikation der Anzahl mit 50µs die unterbrochene Zeit. So weit kann ich dir folgen. Mein Problem liegt aber viel eher darin, dies in einen funktionierenden Quellcode zu übersetzen Wie sah denn dein Code aus? Ich hab mein hintergrund eher in Mechanik als im Programmieren, leider ! Meinst du, du kannst mir dabei trotzdem Helfen?

    Grüße Tanja

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Man braucht für die Aufgabe nur eine Uhr. Die kann man wenn man will sogar vor der eigentlichen Messung starten. Bei jeder Flanke wird einfach die Zeit in die passende Variable geschrieben. Nachdem die Messung dann fertig ist, kann man die Zeitdifferenzen berechenen.

    Wenn einem die 50 µs (oder etwas kürzer) ausreichen, kann man den Zähler im Interrupts nehmen. Alternativ kann man auch direkt den Timerstand auslesen und nimmt ggf. die Zahl der Überläufe dazu. Für die meisten Lichtschranken sollten aber 10-50 µs Schritte ausreichen.

    Der Messteil des Programms besteht dann im Wesenlichen aus kruzen Schleifen die darauf warten, das die nächste Flanke kommt. Also z.B.:
    while (PINA & 1) ;
    cli();
    zeit1= Zeit;
    sei();
    while (~ (PINA & 1)) ;
    cli();
    zeit2= Zeit;
    sei();
    usw.....


    Das Cli / Sei wird man brauchen wenn "Zeit" im Interrupt hochgezählt wird.

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Hallo Tanja,

    Zitat Zitat von Tanja1986
    ... wie ich das verstehe ... durch den ersten Interrupt INT0 eine Uhr gestartet ...
    Nein, in der beschriebene Version läuft "die Uhr" dauernd. Das hatte ich wegen der "Zeitmarke" als notwendig angesehen, Zeitmarke im Sinne einer laufenden Uhr.

    Aber die Aufgabe sieht wohl so aus, dass Du nur die Laufzeit von einem Interrupt zum nächsten brauchst. Stimmts?

    Zitat Zitat von Tanja1986
    ... mit Hilfe ... Geschwindigkeitsmessung eine Beschleunigung ... auf die Gleitreibung ... Gleitreibungskoeffizienten ...
    Heee, das klingt ja nach etwas richtig Sinnvollem *ggg*. Ist der Körper ein Webschütz? Hmmm, ich nehme so etwas als Richtwert. Schätzen wir rund 30 m/s als maximale Geschwindigkeit. Als fauler Denker rechne ich mit meiner 50µs-Zeitmarke, das hieße, dass Du in diesem Bereich, 100 kmh, allenfalls auf 1,5 kmh auflöst. Reicht das?
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Man braucht für die Aufgabe nur eine Uhr. Die kann man wenn man will sogar vor der eigentlichen Messung starten. Bei jeder Flanke wird einfach die Zeit in die passende Variable geschrieben. Nachdem die Messung dann fertig ist, kann man die Zeitdifferenzen berechenen.

    Wenn einem die 50 µs (oder etwas kürzer) ausreichen, kann man den Zähler im Interrupts nehmen. Alternativ kann man auch direkt den Timerstand auslesen und nimmt ggf. die Zahl der Überläufe dazu. Für die meisten Lichtschranken sollten aber 10-50 µs Schritte ausreichen.

    Der Messteil des Programms besteht dann im Wesenlichen aus kruzen Schleifen die darauf warten, das die nächste Flanke kommt. Also z.B.:
    while (PINA & 1) ;
    cli();
    zeit1= Zeit;
    sei();
    while (~ (PINA & 1)) ;
    cli();
    zeit2= Zeit;
    sei();
    usw.....


    Das Cli / Sei wird man brauchen wenn "Zeit" im Interrupt hochgezählt wird.

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Hallo Besserwessi,

    ahhhhh, stimmt - Polling ist, wenn man NUR die Zeit braucht, sicher eine gute und einfache Möglichkeit. Andernfalls käme ich bei vier Lichtschranken auch mit den zwei externen Interrupts am m16 nicht aus, zumal der auch keinen PCI hat.
    Ciao sagt der JoeamBerg

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    der M16 hat 4 Timer!! ich versuch grad ins datenblatt zu schaun aber atmel hat ne bescheidene übertragungsrate ... wenn da 4 inputcapture einheiten dran sind könnte man die ja für exakte messungen einsetzen

    EDIT: nein er hat nur eine input capture unit, aber man könnte ja dennoch alle lichtschranken auf die ICP legen und dann mittels interrupt einfach 4 werte hintereinander speichern udn dann asuwerten (inklusive überschlag, wenn der timer überlaufen sollte)

  9. #9
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Oft sind die Lichtschranken nicht so schnell, das man die ICP Einheit braucht, man kann sie aber nutzen. Man kann den ICP Eingang über den Multiplexer vom ADC auch an den ADC-eingängen nutzen. Damit geht zwar nur jeweils eine Eingang, aber wenn man weiss in welcher reihenfolge die Flanken kommen geht das auch so. Zur ICP funktion ist eine Beispielcode in WIKI-bereich:
    http://www.roboternetz.de/wissen/index.php/Timer/Counter_(Avr)#Input_Capture

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Hi Ceos,

    Zitat Zitat von Tanja1986
    ... Für unseren Aufbau ... mit dem ATmega32 ...
    Zitat Zitat von Ceos
    der M16 hat 4 Timer!! ...
    Zitat Zitat von Atmel Doc zum Mega16 2466P–AVR–08/07
    – Two 8-bit Timer/Counters with Separate Prescalers and Compare Modes
    – One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture Mode
    ... trotzdem vielen Dank für den Hinweis. Übrigens ist der M32 auch nicht besser bestückt. Das ist ja das zeitraubende für mich an einer halbwegs vernünftigen Antwort, dass ich nicht total firm bin - selbst bei meinen "Spezial-"Controllern - und immer wieder ins doc sehen muss, um einigermassen sinnig zu bleiben.

    Zitat Zitat von Ceos
    ... ich versuch grad ins datenblatt zu schaun aber atmel hat ne bescheidene übertragungsrate ...
    Da ich am Rande der Zivilisation wohne, eher schon ausserhalb, habe ich viele solche Dinge "on board", besser "on disk" - und noch dazu die Atmel Parameterlisten etc.

    Zitat Zitat von Ceos
    ... aber man könnte ja dennoch alle lichtschranken auf die ICP legen und dann mittels interrupt ...
    Ich meine, dass der Tip von Besserwessi wirklich sehr pfiffig ist und eine vermutlich aufwendige Schaltung mit Oder-Gliedern etc. erspart. Man legt alle vier Lichtschranken an vier Pinne, vielleicht die erste an einen extInt, und kann dann in einer gemütlichen Spaghettimethode (na ja, die gilt dann vielleicht als unschön oder popelig) den Durchlauf des Gegenstandes durch die Lichtschranken-Straße einschließlich der steigenden und fallenden Flanken abklappern.
    Ciao sagt der JoeamBerg

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •