Stoppuhr

Was wird wie gelöst, warum geht es nicht, wer bekommt es zum Laufen? Eure Projekte und Programme könnt ihr hier vorstellen, diskutieren und verbessern.

Stoppuhr

Beitragvon DL9MWE » Di 27. Aug 2013, 12:51

Hallo Forum,

zum Ausprobieren stelle ich hier die Beta-Version einer Stoppuhr für "unseren" MSP430 vor.
Erweiterungen sind wünschenswert, daher das "Beta-Stadium".

Gemessen und im Display angezeigt wird die Zeitdauer, während der ein Taster gedrückt ist.
Uhren-Quarzgenau wird die Zeit t im 0,97 Millisekunden-Takt gemessen und kann in zwei Modi ausgewertet werden.
Im "Geschwindigkeits"-Modus wird das Messergebnis t mittels v=s/t in eine Geschwindigkeit [km/h] umgerechnet und angezeigt.
Im "Gewitter"-Modus wird aus der Verzögerung zwischen Blitz und Donner und der Schallgeschwindigkeit die Entfernung zum Blitz gemäß s=v*t errechnet.
(Wenn s=0 angezeigt wird, hat man ein Problem...)

Neben dem Mikrocontroller wird das Display und ein Taster (an P1.1) benötigt.
Und: klar, die Stromversorgung.

Hält man den Taster beim Einschalten gedrückt, so wird der Gewitter-Modus eingestellt.
Die Schallgeschwindigkeit ist mit 343 m/s fest eingestellt, was für trockene Luft bei 20°C gilt.
Sonst ist man im Geschwindigkeits-Modus. Die Distanz s ist z.Zt. fest auf 200m eingestellt.
Warum 200m? Weil das der Abstand ist, in dem die DB die Streckenkilometer beschildert...
Eine Programmerweiterung könnte das flexibler handhaben.

Diese Version benötigt 4900 Bytes an Flash-Speicher. Da ist also noch viel Luft bis zu den maximalen 16kB im MSP430G2553.
Die hier verwendete float-Arithmetik benötigt für die Bibliotheks-Routinen sehr viel Platz im Flash-Speicher.
Gerrit machte zu Recht darauf aufmerksam, dass deutlich weniger Platz benötigt wird, wenn die Rechenvorgänge mittels Festkommaarithmetik ausgeführt werden. Auch hier sind Optimierungen wünschenswert.

Im Zip-File sind mit LCD.c und LCDdogm.c zwei alternative Display-Files enthalten.
LCD.c (und LCD.h) ist für das preiswerte LED-Display gedacht.
LCDdogm.c (und LCDdogm.h) steuert eine stromsparende "Display On Glass"-Anzeige an.

Wer bei Gerrits workshop am 23.6.2013 dabei war, wird in den Programmquellen einige der dort vorgestellten Konzepte wieder erkennen...

vy 73 de Matthias, DL9MWE
Dateianhänge
Stoppuhr.7z
alle Dateien für das Code Composer Studio
(11.09 KiB) 182-mal heruntergeladen
Zuletzt geändert von DL9MWE am Do 22. Mai 2014, 14:17, insgesamt 2-mal geändert.
DL9MWE
 
Beiträge: 37
Registriert: Sa 12. Mai 2012, 09:02

Re: Stoppuhr - Knobelaufgabe

Beitragvon DL9GFA » Di 27. Aug 2013, 23:14

Hallo MC-Freunde,

ich mag die Idee von Matthias sehr, die ein schönes Beispiel ist, welche tollen Anwendungen man mit so einfacher Funktionalität - wie hier einer Stoppuhr - realisieren kann. Mir ist ad-hoc eine weitere eingefallen:
Wenn ich einen tiefen Brunnen bei einer Schloß- oder Klosterbesichtigung vorfinde, habe ich immer den Reflex, einen kleinen Kieselstein hinein zu werfen, um anhand der Falldauer bis zum Auftreffen auf der Wasseroberfläche (oder auch einer trockenen) die Tiefe des Brunnens zur beurteilen (Ich weiß, wenn das jeder tun würde... :mrgreen:). Vernachlässigen wir den Luftwiderstand (ist nicht so groß beim kleinen runden Kieselstein), können wir die Fallhöhe s aus der Fallzeit tf über folgende Formel bestimmen:

s = 1/2 * g *tf²

mit der Erdbeschleunigung g=9.81m/s².

Doch halt, zur Fallzeit tf kommt noch die Verzögerung ts durch die Laufzeit des Auftreffgeräusches zurück bis zu unserem Ohr hinzu, die wir aufgrund der relativ geringen Schallgeschwindigkeit berücksichtigen sollten! Die gemessene Gesamtzeit t setzt sich also aus der Fallzeit tf und dieser Schallaufzeit ts zusammen:

t = tf + ts mit ts = s / v, wobei die Schallgeschwindigkeit wie in Matthias' Beitrag oben mit v = 343 m/s angesetzt wird.

Knobelaufgabe:
Welche Formel muß unser Mikrocontroller berechnen, wenn wir die korrekte Fallhöhe aus der mit der Stoppuhr gemessenen Zeit errechnen wollen?

vy 73 de Gerrit, DL9GFA

P.S.
Statt der Tiefe eines Brunnens kann auf diese Weise auch die eines Schachtes, oder die Höhe einer Mauer bestimmt werden. Das kann z.B. für die korrekte Einstellung der Länge eines Bungee-Jumping-Seils wichtig sein :D. Alternativ fallen mir James Bond-Abseilszenen ein...
P.P.S.
Kleine Hilfe: "Quadratische Gleichung"
DL9GFA
 
Beiträge: 66
Registriert: Do 12. Apr 2012, 22:30

Re: Stoppuhr

Beitragvon DL9GFA » So 27. Okt 2013, 17:14

Hallo MC-Freunde,

ich wurde immer wieder gebeten, diese Aufgabe noch etwas offen zu lassen, aber jetzt ist genügend Zeit zum Knobeln vergangen und ich will auflösen.
Wie bereits geschrieben, setzt sich die Gesamtzeit aus der Fallzeit und der Schallaufzeit zusammen [in eckigen Klammern steht nur die Nummer der Gleichung für spätere Referenz]:

t = tf + ts [1]

Wenn wir die Formel für gleichmäßig beschleunigte Bewegung s = 1/2 * g * tf² nach tf umstellen, erhalten wir

tf = sqrt( 2*s/g ) [2]

( sqrt() ist die Quadratwurzel, vom engl. "square root", Erdbeschleunigung g=9.81m/s²)
Dann stellen wir die "Weg-Zeit-Formel" s = v * ts nach der Schallaufzeit ts um (Schallgeschwindigkeit bei Umgebungstemperatur v=343m/s):

ts = s/v [3]

Beim Einsetzen der Gleichungen [2] und [3] in die erste Gleichung [1] erhält man also folgenden Zusammenhang:

t = sqrt( 2*s/g ) + s/v

Da wir die Zeit t mit der Stoppuhr ermittelt haben und den Weg s ausrechnen wollen, muß die Formel umgestellt werden in die Form s = f( t) (sprich s ist eine Funktion von t). Dazu ist etwas Algebra nötig, deren Anwendung für die meisten sicher relativ lange her ist. Ich versuche es Schritt für Schritt.
Zuerst bringen wir den Term s/v von der rechten Seite auf die linke, indem wir ihn auf beiden Seiten subtrahieren. Solange wir auf beiden Seiten die selbe mathematische Operation anwenden, bleibt das Gleichheitszeichen gültig.

t - s/v = sqrt( 2*s/g )

Nun quadrieren wir beide Seiten, damit die Quadratwurzel rechts verschwindet:

(t - s/v)² = 2*s/g

Den Ausdruck links können wir nun mit Hilfe einer der Binomischen Formeln, (a-b)² = a²-2ab+b², behandeln und erhalten:

t² - 2*t*s/v + s²/v² = 2*s/g

Wir sehen nun, daß unser gewünschter Funktionswert nicht nur in linearer Form vorliegt, sondern auch einen quadratischen Anteil hat. Um die "s-Terme" etwas hervorzuheben, schreiben wir die letzte Formel etwas anders geordnet auf und heben s und - etwas unüblich - durch Unterstreichung hervor:

t² - 2*t/v * s + 1/v² * = 2/g * s

Da wir noch zwei lineare s-Terme links und rechts der Gleichung haben, bringen wir den rechten Teil auf die linke Seite durch Subtraktion des gesamten Terms 2/g*s und erhalten:

t² + (-2*t/v - 2/g) * s + 1/v² * = 0

Vielleicht erkennt der eine oder andere nun die klassische Quadratische Gleichung in der Form a*x² + b*x + c = 0, nur daß in unserer Gleichung die drei Terme genau in der anderen Reihenfolge geschrieben sind. Das ändern wir nun und ersetzen gleich die Koeffizienten zur einfacheren weiteren Betrachtung:

a*s² + b*s + c = 0

mit a = 1/v²,
b = -2*t/v - 2/g und schließlich
c = t².

Für Quadratische Gleichungen haben wir alle mal in der Schule die Lösungsformeln gelernt, die man ggf. bei Wikipedia nachschlagen sollte http://de.wikipedia.org/wiki/Quadratische_Gleichung. Eine Quadratische Gleichung kann 0, 1 oder 2 reelle Lösungen haben. Welche der ggf. zwei Lösungen unsere Brunnentiefe angibt, kann über Plausibilität erkannt werden :mrgreen: .

Die allgemeine Lösungsformel lautet (x gleich durch s ersetzt):

s1 = (-b + sqrt(b² - 4*a*c)) / 2*a und
s2 = (-b - sqrt(b² - 4*a*c)) / 2*a.

Man kann das natürlich auch herleiten, aber das erspare ich uns jetzt. Tatsächlich ergibt das Ergebnis s2 die Brunnentiefe!

Ich habe ein kleines Skript für die freie numerische Simulations-Software Scilab (http://www.scilab.org) geschrieben, in das ich unser Ergebnis eingetragen habe, um die Brunnentiefe als Funtkion der Zeit bis zum Hören des Steinauftreffens grafisch darzustellen. Skript und Grafik füge ich hier bei.

Für die Implementierung auf unserem Mikrocontroller haben wir im Versuch "Thermometer mit NTC" zwei Wege gelernt, die wir hier genauso anwenden können. Zum Einen ist es möglich, die Ermittlung der Brunnentiefe als Funktion der gestoppten Zeit mit Hilfe einer Tabelle vorzunehmen, zum Anderen kann natürlich die mathematische Formel gelöst werden. Im Skript findet Ihr dazu Anregungen, wie man die Koeffizienten a,b,c aus (#define-) Konstanten und temporären Zwischenvariablen ermitteln kann, um schließlich die Formel für s2 auszurechnen.

Ich hoffe es hat dem einen oder anderen etwas Spaß gemacht und freue mich über positive wie negative Rückmeldung!

vy 73 de Gerrit, DL9GFA

P.S.
Ich habe mich selbst etwas gewundert als ich bemerkte, daß es doch etwas komplizierter wurde als ich anfangs erwartet hatte. Die Aufgabe klang ersteinmal so einfach... 8-)
Dateianhänge
Brunnentiefe.sce.zip
Scilab-Skript für eigene Simulation
(861 Bytes) 123-mal heruntergeladen
SkriptAlsBild.png
Skipt als Bild, um ohne Scilab d'raufzuschauen
SkriptAlsBild.png (102.03 KiB) 1668-mal betrachtet
Brunnentiefe.png
Ergebnisgrafik Brunnentiefe
Brunnentiefe.png (8.37 KiB) 1668-mal betrachtet
DL9GFA
 
Beiträge: 66
Registriert: Do 12. Apr 2012, 22:30


Zurück zu Technische Fragen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron