用S-FUNCTION函数编写dq变换
用S-FUNCTION函数编写dq变换
代码部分
function [sys,x0,str,ts]=park(t,x,u,flag)
switch flag
case 0
[sys,x0,str,ts]=mdlInitializeSizes;
case 3
sys=mdlOutputs(t,x,u);
case {1,2,4,9}
sys=[];
otherwise
error([‘unhandled flag=’,num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=0;
sizes.NumOutputs=2;
sizes.NumInputs=4;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[];
str=[];
ts=[-1,0];
function sys=mdlOutputs(t,x,u)
theta=u(4);
sys1=[cos(theta),cos(theta-2pi/3),cos(theta+2pi/3);-sin(theta),-sin(theta-2pi/3),-sin(theta+2pi/3)][u(1);u(2);u(3)];
sys=2/3sys1;
%sys=[sin(theta);-cos(theta)];
代码解释
case 0
[sys,x0,str,ts]=mdlInitializeSizes;
此子函数必不可少,相当于初始化
case 3
sys=mdlOutputs(t,x,u);
此子函数是计算函数输出的
其余用不到的子函数写在一起,给他赋值为空
sizes.DirFeedthrough=1;
因为输出直接由输入控制,所以此处为1
sys=2/3*sys1;
此处为恒幅值park变换
仿真
dq仿真
park变换后的dq轴信息
有很多童鞋可能会问为什么此处的d为0,q为-1呢?
其实此时的park变换只是一种映射,是将你的合成矢量映射到你的dq坐标系下。又由于dq坐标系与合成矢量旋转速度相同,才会造成这种现象。
稍微改动一下,结果如下所示。
仿真结果
可以看出,经过s-function编写的park和反park变换,其输出信号和输入信号完全一致,验证了s-function 编写是成功的。
simulink模型
我已将此篇文章对应的模型上传,有需要的自取