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

"Dämpfung" eines Signalanstieges

 

stm

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2014, 18:09     Titel: "Dämpfung" eines Signalanstieges
  Antworten mit Zitat      
Hallo,

ich würde gerne einen Signalanstieg dämpfen, bin aber momentan noch ratlos wo ich ansetzen kann. Das Signal soll bei einem neuen Wert langsam ansteigen, kann dann steiler werden und zum Endwert hin wieder eine geringe Steigung annehmen (also etwa so wie der Sinus sich im Bereich -0,5pi:0,5pi verjält). Wie kann ich das realisieren?


Danke!
stm


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2014, 08:18     Titel:
  Antworten mit Zitat      
Für beliebige Signalverläufe geht das gar nicht. Den Grund hast Du im Prinzip schon mit zum Endwert hin genannt - woher soll Dein Dingens denn zum Zeitpunkt "jetzt" wissen, dass das Ende nah ist? An dieser Frage sind in allen Lebensbereichen schon viele Menschen gescheitert ;)

Für im Voraus berechnete Signale nehme ich ganz gern ein sin^2 - sieht ganz hübsch aus.
Private Nachricht senden Benutzer-Profile anzeigen
 
stm

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2014, 16:57     Titel:
  Antworten mit Zitat      
Vielen Dank schon einmal für deine Antwort.

Ich habe meine Problemstellung anscheinend ungünstig formuliert. Mein Signal ist nicht beliebig, ich gebe dieses in Form von Eingabewerten vor. Vielleicht kann ich es anhand eines Beispiels besser erklären: Ich habe einen Spannungspegel von 0 Volt und möchte einen definierten Pegel von 3 Volt erreichen, dieses allerdings nicht über einen schnellen Sprung sondern über ein langsames Annähern, wie in folgendem Bild dargestellt:

 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2014, 17:08     Titel:
  Antworten mit Zitat      
Dann musst Du das im Voraus so berechnen. Zum Beispiel so:

Code:

Ts = 1e-3; % Abtastzeit des Ausgabesignals
t_start = 1; % Ab wann soll es losgehen?
t_stop = 6; % Bis wann soll es fertig sein?
y_start = 10; % Bei welchem Wert soll gestartet werden?
y_stop = 50; % Bei welchem Wert endet der Verlauf?

zeit = t_start:Ts:t_stop;
signal = (y_stop-y_start)*(sin(pi/2 * (zeit-t_start)/(t_stop-t_start))).^2 + y_start;

plot(zeit, signal)
 


Das ganze musst Du dann noch nur adequat verpacken (z.B. den Zeitvektor an Deine Simulation anpassen) und mit einem From Workspace-Block in Deine Simulation laden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2014, 17:31     Titel:
  Antworten mit Zitat      
Etwas ähnliches hatte ich bereits (daraus stammt der Screenshot aus meinem obigen Beitrag). Allerdings war das nicht zufriedenstellend da t_start und t_stop variabel gehalten sein sollen, ebenso wie y_start und y_stop. Es ist also nicht immer so dass ich zum Zeitpunkt 0 einen Wert von 0 habe und bei Zeitpunkt 6 einen Wert von 3; Ich möchte, dass ich während das Progamm läuft zu einem beliebigen Zeitpunkt einen Zielwert vorgebe, der dann wie im obigen Screenshot (oder ähnlich) angefahren wird.

Soweit ich das verstanden habe kann ich wohl einen Reglerbaustein verwenden. Allerdings bin ich mit der Handhabung von Reglern nicht vertraut.
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2014, 19:13     Titel:
  Antworten mit Zitat      
Du könntest tatsächlich ein PT2-Glied basteln, was auf einen Sprung so ähnlich antwortet, wie der Verlauf, den mein Skript erzeugt.

Du kannst dazu einfach einen Transfer-Function-Block nehmen und ihn (zum Beispiel) so parametrieren:

Zähler: 1
Nenner: [T^2, 2*T*d, 1]

Dabei sollte d immer kleiner als 1 sein und T passt Du so an, dass es in Deine Anwendung passt. Je kleiner T, desto schneller kommt das Signal am Endwert an.

Oder wahlweise kannst Du mit der System Identifikation Toolbox eine Übertragungsfunktion finden, die zu Deiner Wunsch-Sprungantwort passt, dann musst Du nicht so viel rumprobieren:

Code:

clear all; %auch wenn es hier oft behauptet wird: clear all löscht keine breakpoints.
Ts = 1e-3; %adäquaten wert wählen - lieber zu klein als zu groß
T_endwert = 10; %so lange soll es dauern, bis der Endwert am Ausgang erreicht ist
pole = 2; %Anzahl der Pole des geschätzten Modells
nullstellen = 0; %Anzahl der Nullstellen des geschätzten Modells

zeit = (0:Ts:3*T_endwert)';
in = [zeros(T_endwert/Ts, 1); ones(2*T_endwert/Ts+1, 1)]; %Eingangssignal: Sprungfunktion
out = (sin(pi/2 * (zeit-T_endwert)/T_endwert)).^2; %Ausgang: sin^2
out(1:T_endwert/Ts) = 0; %ungewollte werte ausblenden
out(2*T_endwert/Ts:end) = 1; %ungewollte werte ausblenden
daten = iddata(out,in,Ts); %datenobjekt für system-identification toolbox erzeugen
modell = tfest(daten, pole, nullstellen); %Modellparameter finden (dauert ne Weile)

modell_out = lsim(modell, in, zeit); %Modellantwort auf Eingangssignal berechnen
plot(zeit, in, zeit, out, zeit, modell_out)
legend('Eingang', 'Ausgang (Wunsch)', 'Ausgang (Modell)');
 


Einfach mal ein bisschen mit der Anzahl der Pole und Nullstellen rumspielen und gucken, was gut passt. Du solltest nur darauf achten, dass Du immer mindestens so viele Nullstellen wie Pole hast - sonst hast Du eine Kristallkugel gebaut: http://de.wikipedia.org/wiki/Kausalität#Systemtheorie

PS: 6 Pole und 4 Nullstellen sieht gar nicht schlecht aus und ergibt folgende Parameter:
Code:
zaehler = [1.6437, 3.3867, 141.0030, 83.7446, 2.3295e+03]
nenner = [1, 7.3716, 73.7492, 329.9108, 1.1950e+03, 2.3843e+03, 2.3437e+03]
Private Nachricht senden Benutzer-Profile anzeigen
 
stm

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2014, 21:31     Titel:
  Antworten mit Zitat      
Noch einmal Danke für Deine Hilfe. Ich habe versucht einen Transfer-Function-Block zu implementieren, aber war nicht erfolgreich (der Endwert schießt extem schnell ins Unendliche?).

Im Anhang habe ich mal mein bisheriges Modell hochgeladen. v_soll ist eine Zielgeschwindigkeit, die angefahren werden soll (und deren Wert im Programmablauf verändert werden kannt). Umgesetzt wird die Geschwindigkeit über die Ausgabe eines Sinus-Signals mit der Frequenz, die dem 6,085-fachen der Geschwindigkeit entspricht. Leider ist die Steigung der Frequenzänderung direkt nach Vorgabe einer neuen Geschwindigkeit zu groß für meine Anwendung.

Könntest Du versuchen, den Function Block mit den von Dir genannten Parametern einzubinden?

untitled.slx
 Beschreibung:

Download
 Dateiname:  untitled.slx
 Dateigröße:  14.46 KB
 Heruntergeladen:  382 mal
untitled.slx
 Beschreibung:

Download
 Dateiname:  untitled.slx
 Dateigröße:  14.46 KB
 Heruntergeladen:  398 mal
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2014, 18:21     Titel:
  Antworten mit Zitat      
stm hat Folgendes geschrieben:
Noch einmal Danke für Deine Hilfe. Ich habe versucht einen Transfer-Function-Block zu implementieren, aber war nicht erfolgreich (der Endwert schießt extem schnell ins Unendliche?).

Hast Du Continous -> Transfer Function benutzt? Bei mir geht's.

Zitat:
Im Anhang habe ich mal mein bisheriges Modell hochgeladen.
v_soll ist eine Zielgeschwindigkeit, die angefahren werden soll (und deren
Kleiner Tipp: den Clock-Block in der Sinuserzeugung zu verwenden ist eher unschön, weil das Unstetigkeitsstellen bei Frequenzänderungen gibt. Lieber 2*pi*f aufintegrieren und davon den Sinus ausrechnen. Dann gibt es auch keine Sprünge im Ausgangssignal.
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.