Zeiger Instrument mit Dämpfung

Rund um die LCL und andere Komponenten
mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zeiger Instrument mit Dämpfung

Beitrag von mse »

wbeppler hat geschrieben:h
ich finde das thema aber spannend :-)
Jup!
Hier ein Beispiel mittels Impuls-invarianter Z-Transformation:

Code: Alles auswählen

 
procedure tmainfo.paramchangeexe(const sender: TObject);
var
 w0T: real; //normalised lowpass frequency
 damp: real;
begin
 w0T:= 2*pi*lped.value*samplinged.value;
 damp:= damped.value;
 fb0:= 0;
 fb1:= (w0T/(sqrt(1-damp*damp))) * exp(-damp*w0T) * sin(w0T*sqrt(1-damp*damp));
 fb2:= 0;
 fa1:= -2*exp(-damp*w0T)*cos(w0T*sqrt(1-damp*damp));
 fa2:= exp(-2*damp*w0T); 
 
 timer.interval:= round(samplinged.value*1000000); //micro seconds
 timer.enabled:= true;
end;
 
//     +---------+---------+---------+--->
//     |       -a1       -a2       -aN-1
//     +---(z)<--+---(z)<--+---(z)<--+
//     b0       b1        b2        bN-1
// >---+---------+---------+---------+
 
procedure tmainfo.tiexe(const sender: TObject);
var
 Ue,Ua: real;
begin
 Ue:= valueed.value;
 Ua:= Ue*fb0 + fz1;
 fz1:= fz2 + Ue*fb1 - fa1*Ua;
 fz2:= Ue*fb2 - fa2*Ua;
 currentvalue.value:= Ua;
end;
 
Das Projekt ist hier:
https://gitlab.com/mseuniverse/mseunive ... th/damping
Die Zeigerbewegung sieht wirklich aus wie bei meinem uralt Spannband-Zeigermultimeter.
Dateianhänge
damping.png
damping.png (18.11 KiB) 2359 mal betrachtet

hpt
Beiträge: 48
Registriert: Sa 26. Jul 2014, 18:45
OS, Lazarus, FPC: Lazarus
CPU-Target: 32Bit

Re: Zeiger Instrument mit Dämpfung

Beitrag von hpt »

Servus mse. Schaut ja super aus!!! Leider kann ich die 5 Dateien nicht downloaden - zumindest ich nicht. Wie geht das bitte ?
LG HPT

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zeiger Instrument mit Dämpfung

Beitrag von mse »

hpt hat geschrieben:Servus mse. Schaut ja super aus!!! Leider kann ich die 5 Dateien nicht downloaden - zumindest ich nicht. Wie geht das bitte ?
Auf den 'Download zip'-Knopf rechts oben klicken.

wbeppler
Beiträge: 131
Registriert: So 20. Jul 2014, 10:27
OS, Lazarus, FPC: kubuntu, raspbian, laz 1.2 / 0.9 microcontroller
CPU-Target: 8-64 bit
Wohnort: bodensee
Kontaktdaten:

Re: Zeiger Instrument mit Dämpfung

Beitrag von wbeppler »

hi mse,

gratuliere !!! sieht super aus !!!
ich musste das per hardware machen weil ich auch analoge anzeigen liebe
also elektronik auf atmel-basis
platine
platine
tachoplatine_auf_halter.png (105.13 KiB) 2350 mal betrachtet
und bei analogen anzeigen am pc nehme ich mir nun ein beispiel an dir :-)

reparierter tacho:
Dateianhänge
reparatur eines tacho
reparatur eines tacho
tacho200.png (250.16 KiB) 2350 mal betrachtet

Horst_h
Beiträge: 74
Registriert: Mi 20. Mär 2013, 08:57

Re: Zeiger Instrument mit Dämpfung

Beitrag von Horst_h »

Hallo,

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.

Code: Alles auswählen

 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
capture27424.png (5.53 KiB) 2344 mal betrachtet
Zuletzt geändert von Horst_h am Do 26. Mär 2015, 19:07, insgesamt 1-mal geändert.

wbeppler
Beiträge: 131
Registriert: So 20. Jul 2014, 10:27
OS, Lazarus, FPC: kubuntu, raspbian, laz 1.2 / 0.9 microcontroller
CPU-Target: 8-64 bit
Wohnort: bodensee
Kontaktdaten:

Re: Zeiger Instrument mit Dämpfung

Beitrag von wbeppler »

hallo horst,

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

scharfes thema ! physik pur :-)

Horst_h
Beiträge: 74
Registriert: Mi 20. Mär 2013, 08:57

Re: Zeiger Instrument mit Dämpfung

Beitrag von Horst_h »

Hallo,

Ich habe den Code jetzt geändert.Jetzt bleibt der Zeiger "ruckartig" stehen, wenn Geschwindigkeit und Beschleunigung gering sind.

Code: Alles auswählen

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.

hpt
Beiträge: 48
Registriert: Sa 26. Jul 2014, 18:45
OS, Lazarus, FPC: Lazarus
CPU-Target: 32Bit

Re: Zeiger Instrument mit Dämpfung

Beitrag von hpt »

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

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zeiger Instrument mit Dämpfung

Beitrag von mse »

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.
Dateianhänge
damping.zip
(589.23 KiB) 83-mal heruntergeladen

hpt
Beiträge: 48
Registriert: Sa 26. Jul 2014, 18:45
OS, Lazarus, FPC: Lazarus
CPU-Target: 32Bit

Re: Zeiger Instrument mit Dämpfung

Beitrag von hpt »

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)

wbeppler
Beiträge: 131
Registriert: So 20. Jul 2014, 10:27
OS, Lazarus, FPC: kubuntu, raspbian, laz 1.2 / 0.9 microcontroller
CPU-Target: 8-64 bit
Wohnort: bodensee
Kontaktdaten:

Re: Zeiger Instrument mit Dämpfung

Beitrag von wbeppler »

hi hpt,

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 !

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zeiger Instrument mit Dämpfung

Beitrag von mse »

hpt hat geschrieben:Wenn man sich mit dem mathematischen Hintergrund auseinandersetzt, kann einem ja schwindlig werden.
Es wurde auch von Übelkeit und Kopfschmerzen berichtet, vereinzelt soll es auch zu Nervenzusammenbrüchen gekommen sein. ;-)

hpt
Beiträge: 48
Registriert: Sa 26. Jul 2014, 18:45
OS, Lazarus, FPC: Lazarus
CPU-Target: 32Bit

Re: Zeiger Instrument mit Dämpfung

Beitrag von hpt »

... 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

hpt
Beiträge: 48
Registriert: Sa 26. Jul 2014, 18:45
OS, Lazarus, FPC: Lazarus
CPU-Target: 32Bit

Re: Zeiger Instrument mit Dämpfung

Beitrag von hpt »

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

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zeiger Instrument mit Dämpfung

Beitrag von mse »

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.

Code: Alles auswählen

 
//     +---------+---------+---------+--->
//     |       -a1       -a2       -aN-1
//     +---(z)<--+---(z)<--+---(z)<--+
//     b0       b1        b2        bN-1
// >---+---------+---------+---------+
 
-> H(z^-1) =
 
b0 + b1 * z^-1 + b2*z^-2
------------------------
 1 + a1*z^-1 + a2*z^-2
 

Antworten