Verfasst am: 08.06.2014, 13:53
Titel: Probleme mit s-function
Hi,
muss eine PWM mit einer s-function erstellen und komme nicht weiter. Im Prinzip muss ich folgendes machen. Wenn die Eingangsgröße (u) im Intervall ]0,1[ liegt, soll das Tastverhältnis d bestimmt werden (Frequenz von Ts aus der s-function). Ist u<=0 soll 0 am Ausgang anliegen und wenn u>=1 dann 1. Am Beginn der Schaltperiode soll das Ausgangssignal auf den Wert 1 sein und nach einer Dauer auf den Wert 0 zurückgehen.
Mein code sieht wie folgt aus (habe das template aus Matlab selbst verwendet und umgeschrieben):
Code:
function[sys,x0,str,ts] = pulsweitenmod(t,x,u,flag,pwm) switch flag,
case0,
[sys,x0,str,ts]=mdlInitializeSizes;
case1,
sys=mdlDerivatives(t,x,u);
case2,
sys=mdlUpdate(t,x,u);
case3,
sys=mdlOutputs(t,x,u,pwm,ts);
case4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
case9,
sys=mdlTerminate(t,x,u);
otherwise error(['Unhandled flag = ',num2str(flag)]);
end % end sfuntmpl
function sys=mdlDerivatives(t,x,u)
sys = [];
% end mdlDerivatives
function sys=mdlUpdate(t,x,u)
sys = [];
% end mdlUpdate
function sys=mdlOutputs(t,x,u,pwm,Ts) if((u < 1) && (u > 0))
pwm.d = 1/Ts;
if(t > pwm.d*Ts)
sys = [0];
else
sys = [1];
end end if(u >= 1)
sys = [1];
end if(u <= 0)
sys = [0];
end % end mdlOutputs
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1; % Example, set the next hit to be one second later.
sys = t + sampleTime;
% end mdlGetTimeOfNextVarHit
function sys=mdlTerminate(t,x,u)
sys = [];
% end mdlTerminate
pwm ist eine Struktur mit nur einem Parameter d (pwm.d), den ich bei der Initialisierung auf 0 gesetzt habe. In Simulink hab ich als Eingangssignal eine einfache Rampenfunktion hergenommen.
Bei mir kommt immer der Fehler:
Error in 'simpleES/PWM_sfun' while executing M-File S-function pulsweitenmod', flag = 3 (output), at time 0.
MATLAB error message: Undefined function or variable "ts".
Sehe da den Fehler aber nicht, bin mir aber auch nicht sicher, ob man alles in die Funktion mdlOutputs reintun kann, bzw. ob der Code überhaupt stimmt. Bin über jede Hilfe sehr dankbar!
deine Funktion hat 4 Ausgänge.
Außer für case 0 wird aber nur einer davon auch belegt, die anderen sind also undefiniert.
Im Fall case 3 versuchst du zudem, ts zu verwenden, ohne es vorher definiert zu haben.
danke für die Rückmeldung und sorry für meine späte Rückmeldung! Bin nun draufgekommen wie es funktioniert. Man muss eine zusätzliche diskrete Variable einsetzten (Tastverhältnis) und mit mdlGetTimeOfNextVarHit gibt man die Zeitpunkte an, die das Verhalten der asymmetrischen PWM bestimmen. In mdlOutputs wird dann das Ausgangssignal, je nach Zeitpunkt eingestellt. In mdlUpdate muss darf nur das Eingangssignal stehen.
mfg
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.