WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Mittelwertbildung über variable Zeitschritt-Zahl in Echtzei

 

Geri1710
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 11.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2013, 14:51     Titel: Mittelwertbildung über variable Zeitschritt-Zahl in Echtzei
  Antworten mit Zitat      
Hallo zusammen,
ich bin langsam am verzweifeln, deshalb möchte ich mein Problem mal hier schildern in der Hoffnung, dass jemand DIE Lösung hat.
Und zwar möchte gerne in einem Simulinkmodell die Fräskraft über eine Fräserumdrehung in Echtzeit mitteln. Die Kräfte und Fräserdrehzahl erhalte ich über eine Eingangskarte.
Meine Abtastzeit liegt bei 0,1ms. Wenn ich beispielsweise gerade eine Drehzahl von 8000 U/min habe, so dauert eine Umdrehung
t = \frac{60}{8000}=7,5ms
und ich müsste über die letzten 75 Zeitschritte mitteln.

Ich habe bisher versucht, das Ganze in einer Embedded Matlab Function umzusetzen, bei der als Eingangsgrößen die aktuelle Kraft und Drehzahl hereinkommen. In einem persistenten Array füge ich die einzelnen Kräfte hintereinander ein, bis das Ende erreicht ist, dann wird der erste Wert überschrieben usw.
Wenn ich jetzt eine andere Drehzahl habe, so ändert sich auch die Anzahl der Werte, über die ich mitteln muss. Da liegt auch das Problem in der Embedded Matlab Function, da deren Ausführung in jedem Zeitschritt unterschiedlich lang dauern kann.

Hat vielleicht von euch jemand eine Idee, wie ich mein Vorhaben umsetzen kann?

Gruß,
Gerold
Private Nachricht senden Benutzer-Profile anzeigen


Bibonaut
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 06.06.13
Wohnort: Berlin
Version: 2013a
     Beitrag Verfasst am: 18.06.2013, 23:21     Titel:
  Antworten mit Zitat      
Hallo,

ich hab gerade auch lange überlegt.

Ich gehe jetzt einfach mal davon aus, dass du immer für ganze Umdrehungen den Mittelwert bilden willst.

Hab da mal was ausprobiert, liegt im Anhang Wink


Und zwar ist meine Idee, das ganze mit Integration zu lösen:
Du hast dein Signal x(t) und erzeugst dir daraus ein verzögertes Signal $x(t-t_{0})$.

Dann solltest du dir den Mittelwert mit

<br />
\overline{x}(t)=\frac{1}{t_{0}} \left(\int_{0}^{t}x(t)d\tau-\int_{0}^{t}x(t-t_{0})d\tau\right)
<br />
berechnen können. Wenn du t_0 änderst macht der Integrator einen Fehler, also sollten die Integratorblöcke in Simulink wieder resettet werden. Braucht dann leider auch eine Umdrehung, bis der korrekte Wert neu berechnet wird.

Vielleicht hilft es ja. Mathematisch nicht so schön, aber mir ist gerade nicht eingefalle, wie ichs besser schreiben kann Wink Ist ja eigentlich auch ein diskretes Signal...
Schau am besten in die Datei Smile

Viele Grüße

dyn_moving_average.mdl
 Beschreibung:

Download
 Dateiname:  dyn_moving_average.mdl
 Dateigröße:  43.01 KB
 Heruntergeladen:  407 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
knilumis_baltaM
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 20.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2013, 12:45     Titel:
  Antworten mit Zitat      
Zitat:
Da liegt auch das Problem in der Embedded Matlab Function, da deren Ausführung in jedem Zeitschritt unterschiedlich lang dauern kann.


Wieso ist das ein Problem? Ist es nicht egal solange die Ausführung schneller beendet wird als sie erneut aufgerufen wird?

Wieso kannst nicht einfach über die benötigte Anzahl mitteln:
Code:

fucntion [kraft_mittel, geschw_mittel] = mittelung(kraft_last_200,geschw_last_200)

n = round(600000/geschw_last_200(1));
kraft_mittel = mean(kraft_last_200(1:n));
geschw_mittel = mean(geschw_last_200(1:n));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Geri1710
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 11.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2013, 09:16     Titel:
  Antworten mit Zitat      
Also erstmal vielen Dank für eure Mühen.
@knilumis_baltaM:
Das n berechnet sich aus der Eingangsvariablen der Drehzahl. Dadurch ist n ja auch eine Variable. Jedenfalls krieg ich immer die Fehlermeldung
"Could not determine the size of this expression" bzgl. dem Ausdruck (1:n)
Beim Recherchieren habe ich gelesen, dass die Embedded Matlab Function keine dynamische Speicherreservierung unterstützt und dadurch die Größe jeder Datenstruktur bereits beim Kompilieren festgelegt sein muss (siehe dazu http://www.mathworks.com/matlabcent.....reader/view_thread/248277).
Und da mein n ja kein fester Wert ist, sondern sich ständig ändert mit der Drehzahl funktioniert das so nicht.

@Bibonaut:
Deinen Ansatz find ich ganz interessant, auf die Idee, das Ganze über Integration zu lösen, wär ich nie gekommen.
Dein Anhang war war bei mir leider ein leeres Simulinkmodell. Aber ich weiß nicht ob das so bei mir funktionieren würde. Ich berechne mir ja aus der aktuellen Drehzahl die Zeit für eine Umdrehung und mittle die Kraft über diese Zeitschritte, und das in jedem Abtastschritt.

Ich hab das ganze jetzt etwas umständlich mit vielen Memory-Blöcken und Switches gelöst, wobei n in den Bedingungseingang des Switches geht und dort als Kriterium u2 >= Threshold eingestellt ist.
Falls es einen interessiert, lade ichs mal hoch Smile

Grüße,
Gerold

Kraftmittelung_ueber1Umdrehung.mdl
 Beschreibung:

Download
 Dateiname:  Kraftmittelung_ueber1Umdrehung.mdl
 Dateigröße:  435.54 KB
 Heruntergeladen:  445 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
knilumis_baltaM
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 20.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2013, 09:51     Titel:
  Antworten mit Zitat      
Du brauchst ja keinen dynamischen Speicher. Speichere einfach so viele Werte wie viel du brauchst bzw. erwartest. Setze fest das du z.B. höchsten die letzten 300 Werte brauchen wirst. Dann noch selber Mittelwert bilden und es sollte klappen.
Code:

fucntion [kraft_mittel, geschw_mittel] = mittelung(kraft_last_300,geschw_last_300)

n = round(600000/geschw_last_300(1));
if n>300
    n = 300;
end
kraft_mittel = 0;
for i=1:n
     kraft_mittel = kraft_mittel + kraft_last_300(i);
end
kraft_mittel/n;

Analog mit der Geschwindigkeit. Code lässt sich problemlos erstellen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Bibonaut
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 06.06.13
Wohnort: Berlin
Version: 2013a
     Beitrag Verfasst am: 20.06.2013, 10:24     Titel:
  Antworten mit Zitat      
@Geri: Vielleicht liegt es an der Version. Welche Version nutzt du denn?
Private Nachricht senden Benutzer-Profile anzeigen
 
Geri1710
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 11.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2013, 11:01     Titel:
  Antworten mit Zitat      
@ knilumis_baltaM:
So hatte ich es auch schon versucht, kamen aber auch Fehlermeldungen.

Ich habe hier MATLAB Version 7.6.0.324 (R2008a).
Ich benutze RT-Lab um aus dem Simulinkmodell Echtzeitcode zu generieren, und deswegen kann ich keine neuere Version nutzen, da unsere RT-Lab-Version damit nicht kompatibel ist (laut meinem Betreuer).

Vielleicht liegt es wirklich an meiner Version...

Grüße
Gerold
Private Nachricht senden Benutzer-Profile anzeigen
 
Bibonaut
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 06.06.13
Wohnort: Berlin
Version: 2013a
     Beitrag Verfasst am: 20.06.2013, 11:14     Titel:
  Antworten mit Zitat      
Höchstwahrscheinlich Wink Ich hab nochmal ein bisschen rumgebastelt.
Das Ergebnis ist eine Mittelwertberechnung mit Integrator und ein Halteglied mit Integrator.
Hier gab es auch eine ähnliche Frage, wo ich das mit dem Halteglied kurz erläutert habe: http://www.gomatlab.de/wie-werte-in.....fend-erneuern-t29341.html
Wenn du die DSP-System Toolbox hast, kannst du am besten dessen Halteglied (Sample and Hold) verwenden.


Ist das System denn sehr dynamisch in der Drehzahl oder werden Betriebspunkte gehalten?

Schau dir das ganze mal an. Ich hatte Probleme bei der Mittelwertbildung wegen der Integratoren. Dann hab ich die Diskreten genommen, kenne mich damit aber nicht so gut aus.
Prüfe mal die Sample-Rate der einzelnen Blöcke, wenn du das so oder so ähnlich verwenden willst. Ich gebe keine Garantie Wink Leichte Abweichungen beim Mittelwert sind noch zu erkennen...

Vielleicht hilfts Smile

Viele Grüße

dyn_moving_average_2008a.mdl
 Beschreibung:

Download
 Dateiname:  dyn_moving_average_2008a.mdl
 Dateigröße:  26.92 KB
 Heruntergeladen:  401 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.