Verfasst am: 20.08.2014, 18:09
Titel: "Dämpfung" eines Signalanstieges
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?
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.
stm
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 21.08.2014, 16:57
Titel:
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:
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;
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.
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 21.08.2014, 17:31
Titel:
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.
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:
clearall; %auch wenn es hier oft behauptet wird: clearall 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:
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?
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.
Einstellungen und Berechtigungen
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
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.