# Beschleunigung und geschwindigkeit berechnen



## mac_hawk (13 Mai 2009)

Hallo erstmal,

ich lese Daten von einem Winkelsensor und einem Positionssensor aus.
Nun möchte ich mit den Daten des Winkelsensors gerne die Winkelgeschwindigkeit und vllt Winkelbeschleunigung berechnen.

Mit den Daten des Positionssensors möchte ich gern die Beschleunigung und geschwindigkeit der gemessenen Position errechnen.

Könnt ihr mir da vllt helfen? 
Hab im Forum schon rumgeschaut aber bin noch nicht fündig geworden, deshalb frag ich jetzt einfach mal 

MfG
mac


----------



## Linowitch (13 Mai 2009)

Hallo,
ich bin jetzt nicht voll der Mathematiker, aber ich versuchs mal, die Geschwindigkeit kannst du ermitteln, indem

Messpunkt1        Messpunkt2
       |-------------------|

du die Zeit und Position zum Messzeitpunkt speicherst und die Differenz ermittelst.
 z.B.
Messpunkt1 = 9:32:00 Uhr  -- 100mm
Messpunkt2 = 9:32:03 Uhr -- 105mm

delta t wäre dann 3 sec
delta s wäre dann 5 mm

so ergibt sich "5mm/3 sec" das kannst du dann umrechnen in "km/h" oder was du brauchst.

die Beschleunigung ergibt sich aus der Differenz der aktuellen und der zulezt gemessenen Geschwindigkeit.

könnte mir vorstellen, dass das bei den Winkeln ähnlich/genau so funktioniert.

Hoffe es hilft


----------



## Grubba (13 Mai 2009)

Leg Dir zuerst mal ein Zeitraster fest, in dem Du die folgenden Berechnungen ausführst. (Zeit OB oder über Timer)

Um die Geschwindigkeit zu errechnen, teilst Du die Positionsdifferenz zwischen letzter und aktueller Messung durch Dein Zeitraster. (v=ds/dt)

Für die Beschleunigung nimmst Du anstelle der Positionsdifferenz die Geschwindigkeitsdifferenz (a = dv/dt)

Je kleiner Dein Zeitraster, desto schneller bekommst Du zwar Deine Werte errechnet, desto ungenauer wirds aber auch. Ausserdem wirst Du wahrscheinlich auch immer ein paar Sprünge im Ergebnis von Takt zu Takt bekommen.


----------



## mac_hawk (31 Mai 2009)

Danke erstmal 


Ich habe alles so umgesetzt und bekomme auch Werte ausgegeben. 
Im moment lasse ich den Zeitbaustein alle 5ms aufrufen, bekomme aber Geschwindigkeit's und Beschleunigung's Werte die ich für unsinnig halte..ich vermute das ist das von dir angesprochene "je kleiner der Zeitabstand desto ungenauer" Effekt. Gibt es möglichkeiten daran was zu machen? 
Eigentlich wäre es schön wenn ich die Werte alle 5-10ms hätte..

Ich werde am Dienstag wenn ich im Labor bin erstmal schauen wie die Werte bei 100ms aussehen, eigentlich sollten sie dann ja sinniger sein.


----------



## xhasx (1 Juni 2009)

Bei < 100ms hast du aber keine S7...


----------



## Proxy (1 Juni 2009)

xhasx schrieb:


> Bei < 100ms hast du aber keine S7...



Auch wenn der Vorredner es bezweifelt  Sonst würde der 0,1Sek Takt die die CPU mitliefert nicht funktionieren. Eine CPU hat rund 10-50ms je nach Programm und CPU


Zu deinen Problem. Kann es sein das dein Weg nicht simmt weil du die Beschleunigung auser aucht lässt?

Die Formel ist für die Beschleunigung
s=s0+0.5*a*t²
Wenn es dann läuft kannst du mit
s=v*t

Musst die formel halt nach a bzw. v umstellen.


----------



## xhasx (1 Juni 2009)

Stimmt! Hab mich verlesen - war bei 100us
Meine Bachmann kann das...


----------



## mac_hawk (1 Juni 2009)

Proxy schrieb:


> Die Formel ist für die Beschleunigung
> s=s0+0.5*a*t²
> Wenn es dann läuft kannst du mit
> s=v*t
> ...



ich bin nach dem was mir erst geraten wurde den weg gegangen das ich 2 messpunkte gemacht habe, die differenz als strecke genommen habe und das in den 5ms zwischen den 2 programm durchläufen (mit tempvariablen den letzten wert gesichert etc).
dieses dann jeweils durcheinander geteilt für geschwindigkeit und beschleunigung m/s.

für die geschwindigkeit deckt sich das ja mit dem was du geschrieben hast, nur hab ich für a eben a = v/t

deine formel würde ja lauten a = (s - s0) / (0,5 * t²)
s ist wohl die zurückgelegte strecke, aber was ist s0?


----------



## Ralle (1 Juni 2009)

mac_hawk schrieb:


> (mit tempvariablen den letzten wert gesichert etc).



Nein, keine temp-Variablen nehmen. der OB hat zwar seinen eigenen Lokalstack, je nach Priorität teilt er den aber mit OB gleicher Priorität. Nimm besser einen Datenbaustein und somit globale Variablen.


----------



## mac_hawk (1 Juni 2009)

sind die globalen variablen dann nicht auch temp variablen?
hab noch nie mit datenbausteinen gearbeitet...muss erstmal schauen was das ist/wie das geht

in wieweit spielt das eigentlich ne rolle? dachte die normalen variablen aus der variablen tabelle sind schon global? ich behandle sie jedenfalls so...?


----------



## Proxy (1 Juni 2009)

Also Temp Var sind nur solange aktuell wie der Baustein aktiv ist. Also nur max 1 Zyklus. DB beleiben auch nach dem Zyklus gespeichert.

S0 ist die anfangsstrecke. z.b. 1m aber in deinen fall kannst du es zu 0 setzen


----------



## mac_hawk (8 Juni 2009)

ich bins nochmal, ich brauch nochmal etwas hilfe..
also die geschwindigkeiten funktionieren und vom gefühl her kommen die auch hin.
lasse das ganze nun mit 20ms laufen und die sensoren kommen wohl auch hinterher.

mein problem ist aber das die beschleunigung mir relativ unsinnig vorkommt, vllt kann da nochmal kurz wer nen blick draufwerfen und mir sagen was ich falsch mache?


```
V= -5.219555
A= -260.9778

PosV := (((PosU - PosTEMP) )/0.02) ;//Wagengeschwindigkeit cm/s
PosA := (((PosV - PosVTEMP) )/0.02) ;//Wagenbeschleunigung cm/s²

---------

V= 5.219555
A= 521.9556

PosV := (((PosU - PosTEMP) )/0.02) ;//Wagengeschwindigkeit cm/s
PosA := (((PosU - PosTEMP) )/(0.5 * (0.02 ** 2))) ;
```

hab beide versionen ausprobiert, aber vom gefühl her sollte die beschleunigung ja deutlich kleiner sein die geschwindigkeit..?


----------



## Larry Laffer (8 Juni 2009)

Hallo,
der Fehler in deiner Berechnung ist, dass du immer alle Beschleunigungen auf "0" beziehst. Wenn sich dein "Ding" mit 5 cm/Sek. bewegt und dies gleichmäßig, dann hats du gar keine Beschleunigung mehr. Du mußt also nicht die gemessene Strecke / t² für die Beschleunigung hernehmen, sondern die Änderung zum Vorgängerwert ...

Gruß
LL


----------



## mac_hawk (8 Juni 2009)

aktuelle position - letzte position = positionsänderung ?
oder wie meinst du das nun? das habe ich mit PosU - PosTEMP bereits probiert


----------



## Larry Laffer (8 Juni 2009)

Ich meinte das :


mac_hawk schrieb:


> PosV := (((PosU - PosTEMP) )/0.02) ;//Wagengeschwindigkeit cm/s
> PosA := (((PosU - PosTEMP) )/(0.5 * (0.02 ** 2))) ;


 
diese Formel gefällt mit besser :


mac_hawk schrieb:


> PosV := (((PosU - PosTEMP) )/0.02) ;//Wagengeschwindigkeit cm/s
> PosA := (((PosV - PosVTEMP) )/0.02) ;//Wagenbeschleunigung cm/s²


... und die sollte auch funktionieren, wenn du die Vorgängerwerte korrekt zuweist und wegspeicherst. Wohin schreibst du denn die Vorgänger ? VAR oder TEMP ?

Gruß
LL


----------



## mac_hawk (8 Juni 2009)

die aktuell variable wird ja immer neu berechnet, und am ende des programms der temp variable zugewiesen, diese ist als var_out deklariert.


----------



## Larry Laffer (8 Juni 2009)

mac_hawk schrieb:


> die aktuell variable wird ja immer neu berechnet, und am ende des programms der temp variable zugewiesen, diese ist als var_out deklariert.


Das ist schon der Fehler ...
Was hast du da gebaut ? Einen FC oder einen FB ?
Wenn FC, dann mußt du die Werte über eine IN_OUT-Variable führen. Die darfst du dann aber in der Beschaltung des FC nicht über eine Lokal-Variable abhandeln ! TEMP-Variablen "merken" sich ihren Inhalt nicht ...
Wenn du einen FB hast, dann solltest du diese Werte im STAT-Bereich (also Deklaration VAR) ablegen.

Gruß
LL


----------



## mac_hawk (8 Juni 2009)

ich hab einen FC.
ok also nicht "var_out" sondern "var_in_out" für tempwerte ja?



> Die darfst du dann aber in der Beschaltung des FC nicht über eine Lokal-Variable abhandeln


wie genau meinst du das?

ich habe in der symboltabelle die jeweiligen werte deklariert mit ein und ausgängen bzw merkerworten und übergebe dem FC beim aufruf dann die jeweiligen variablen aus der symboltabelle.
im FC werden sie dann jeweils noch deklariert als in/out usw


----------



## Larry Laffer (8 Juni 2009)

... wenn du MW's oder DBW's für die Beschaltung genommen hast, so ist das OK. Nicht funktionieren würde es, wenn du im Deklarationsbereich des aufrufenden Bausteins die Variablen als TEMP angelegt hättest. Das meinte ich ...

Gruß
LL


----------



## mac_hawk (8 Juni 2009)

achso, nein sind MW's 

ok also liegt das nur am var_in_out... werd ich gleich mittwoch wenn ich wieder im labor bin teste, danke dir


----------

