ich habe mal versucht Reibung einzubauen, aber dass geht irgendwie schief
Wenn die Bewegung zu langsam dabei wird, müßte es stehen bleiben. Aber wie baut man das ein.
Ich habe mal ein Beispiel angehängt.
aus deltaVektor ar = ist die in eine Beschleunigung umgerechnete Reibkraft.
function deltaVektor(const inWerte: TResults; var Parameter: tParameter): tResults;
var
resA,resb : double;
//Hier passiert die eigentliche Berechnung der Werte
//praktisch die Aenderungswerte für die einzelnen Anteile
begin
with Parameter do
begin
// Beschleunigung durch Feder/Stoßdämpfer und äußere Kraft
resA :=-inWerte.x * c - inWerte.v * b + ax;
if ar <> 0 then
Begin
// Reibung wirkt entgegen der Bewegung -ar oder +ar
resb := resA - (2*Ord(inWerte.v > 0)-1)*ar;
//Hier ist wohl der Denkfehler
// Falls Reibkraft > Beschleunigung durch die anderen Kräfte
IF resA*resB <0 then
Begin
iF inWerte.v > 0.01 then
resA := 0.0
else
// stoppen wenn zu langsam
resA := -inWerte.v;
end;
end;
Result.a := resA; // nur fuer Anzeige gebraucht
Result.v := resA;
Result.x := inwerte.v;
end;
end;
Man sieht auf dem Bild, dass statt 1.000 nur 0.984 bei Reibung erreicht wird.
Gruß Horst
Dateianhänge
capture27424.png (5.53 KiB) 2343 mal betrachtet
Zuletzt geändert von Horst_h am Do 26. Mär 2015, 19:07, insgesamt 1-mal geändert.
ch vermute mal fuer stehenbleiben bei reibung brauchst du die masse des zeigers/werkes und die geschwindigkeit des jeweiligen meomentes um den drahmoment zu berechnen der gegen die reibkraft wirkt. dann muesste beim loslegen aber auch die haftreibung (ist ja kleiner als rutschreibung) beruecksichtigt werden
function deltaVektor(const inWerte: TResults; var Parameter: tParameter): tResults;
var
resA,resb : double;
//Hier passiert die eigentliche Berechnung der Werte
//praktisch die Aenderungswerte für die einzelnen Anteile
begin
with Parameter do
begin
resA :=-inWerte.x * c - inWerte.v * b + ax;
if ar <> 0 then
Begin
resB := resA - (2*Ord(inWerte.v > 0)-1)*ar;
// Reibung > Antrieb
IF (resA*resB)< 0 then
// Geschwindgkeiten klein > 0 (Sonst bewegt sich ein stehender Zeiger nicht mehr weiter )
iF (abs(inWerte.v) > 0) AND (abs(inWerte.v) < 0.001)then
resB := -inwerte.v*2; // Vollbremsung in einer Berechnungs Stufe
resA := resB;
end;
Result.a := resA;
Result.v := resA;
Result.x := inwerte.v;
end;
end;
Haftreibung > Gleitreibung außer bei Teflon/PTFE und andere Exoten.
Gruß Horst
EDIT;
Auf Seite 3 neue Version
Zuletzt geändert von Horst_h am Mo 30. Mär 2015, 11:11, insgesamt 1-mal geändert.
Das Beispiel mittels "Impuls-invarianter Z-Transformation" von mse habe ich auf Lazarus probiert und starte mit einem Button eine Berechnung. Dabei bekomme ich aber nur Wert um 1... 5 und -5..... heraus. Es wäre sehr hilfreich, etwas über die Variablen und dem Ablauf zu erfahren. Ein lauffähiges Beispiel als .exe hätte auch interessiert, wo man sieht, wie das Instrument "tut".
Einen schönen Tag wünscht HPT
hpt hat geschrieben:Es wäre sehr hilfreich, etwas über die Variablen und dem Ablauf zu erfahren.
Da gibt es sehr viel Literatur. Suche nach IIR-Filter (Infinit Impulse Response).
Ein lauffähiges Beispiel als .exe hätte auch interessiert, wo man sieht, wie das Instrument "tut".
Hier im Anhang. Das Beispiel verwendet ausschliesslich MSEgui Bordmittel, zum Zeichnen müssen lediglich die Properties im Entwurfsmodus gesetzt werden.
Danke Martin (mse)- das ist ein Motivationsschub !!! Schaut toll aus und funktioniert so wie ich es mir vorstelle! Schade, dass es das Selbe nicht als Lazarus-source gibt. Wenn man sich mit dem mathematischen Hintergrund auseinandersetzt, kann einem ja schwindlig werden. Auch wann, man was, und wie und wo richtig einbindet ist doch ein relativ schwerer Stein, den man erst mal heben muß. Vielleicht gibt es dort oder da noch jugendliche Resourcen - ich befinde mich gerade in einer Rehabilitations-Anstalt....
Der Imperte hpt (Gegenteil von Experte)
schwere steine sind leichte steine die viel zeit brauchen und auf reha hast du die. mir gings auch so, ich hab da meine ersten laz-schritte gelernt gute besserung !
... jedenfalls weiß ich mir keinen Rat mehr wie ich hinter das Geheimnis der " Impuls-invarianten Z-Transformation" kommen soll. Ich habe in meiner Unwissenheit und Verzweiflung, den Inhalt der Prozedur von mse --> " tmainfo.paramchangeexe" (siehe im Beispiel oben) in einer Button onClick-Prozedur gestartet. Da diese Prozedur ihrerseits einen Timer startet, habe ich die Prozedur "tmainfo.tiexe" in der ja Ue eingelesen wird, in einen Timer gepackt - läuft also mit der eingestellten Sample-Frequenz im ms-Takt. Es wird tatsächlich etwas gerechnet, aber die Werte die sich ergeben bewegen sich im niedrigen negativen Bereich. Ziemlich egal, was ich eingebe....
Sehe ich es nicht, oder fehlt etwas - vor allem in meinem Verständnis? Lernwillig wäre ich und der Durchblick wäre von Vorteil und so ist es nicht ausgeschlossen, dass ich mit Eurer Hilfe noch zu einem positiven Ergebnis kommen könnte! Für mich wäre das wohl soetwas wie ein Ostergeschenk.
mfG HPT
Anmerkung 23:00 Uhr --> Kann einen Teilerfolg zu melden. Es waren andere Zahlenwerte notwendig - muß noch optimieren, aber prinzipiell läuft es ...........
FROHE OSTERN
Frage an mse: Bei der Berechnung treten in bestimmten Bereichen kleinere und größere Fehler, vor allem bei Endausschlag gut zu sehen, auf. Auch in deiner Beispielanwendung kommt, wenn man z.B.in der Sample-time 50ms in der LP_frequenz: 5Hz und in Dämpfung:0,1 eingibt, bei Schieber ganz rechts, anstatt 10 nur 8 in CurrentValue und Skala ! Fehler 20%. Was versteht man eigentlich in diesem Fall unter Sample-Time und LP_Frequenz? Was kann man sich in den Formeln unter wOT , Fa, Fb, Fz vorstellen?
mfG HPT
Das sind aliasing Effekte: http://en.wikipedia.org/wiki/Nyquist%E2 ... ng_theorem
Wenn du mit der Grenzfrequenz speziell bei kleiner Dämpfung zu nahe an die Abtastfrequenz heranrückst, solltest du die bilineare statt der Impuls-invarianten Z-Transformation verwenden, siehe das schon erwähnte MSEgui tsigfilter. Die Impulsantwort wird dann allerdings verfälscht. Der Verstärkungsfehler bei der Frequenz 0 könnte auch durch einen Korrekturfaktor kompensiert werden.
Sample-Time ist die Abtastzeit, LP-Frequenz ist die 3-dB Grenzfrequenz des modellierten analogen Tiefpasses. w0T ist die auf die Abtastzeit normierte LP-Kreisfrequenz, fa* sind die Faktoren des Nenner Polynoms, fb* die Faktoren des Zähler Polynoms, fz* sind die Verzögerungsglieder, siehe das Flussdiagramm in der Software.