查看: 118|回复: 1|关注: 0

[未答复] FCS-MPC三电平三相电流幅值不一致

[复制链接]

新手

10 麦片

财富积分


050


1

主题

3

帖子

0

最佳答案
发表于 2019-10-6 11:46:30 | 显示全部楼层 |阅读模式
本帖最后由 猫和三文鱼i 于 2019-10-6 11:52 编辑

实在是不知道为什么不对了。。求大神教育
两个电容的电压不是一直相同而是有一个一直减少一个一直增加
三相的负载是一样大的,就是电流不同
S函数程序如下
{code}function [sys,x0,str,ts] = try_1(t,x,u,flag)
% SFUNTMPL 是M-文件 S函数模板
%??通过剪裁,用户可以生成自己的S函数,不过一定要重新命名
%??利用S函数可以生成连续、离散混合系统等,实现任何模块的功能
%
%??M-文件S函数的语法为:
%???????[SYS,X0,STR,TS] = SFUNC(T,X,U,FLAG,P1,...,Pn)
%
%??参数含义:
%???????t是当前时间
%???????x是S函数相应的状态向量
%???????u是模块的输入
%???????flag是所要执行的任务
%
%???FLAG???结果???????????????功能
%???-----??------?????????????--------------------------------------------
%???0??????[SIZES,X0,STR,TS]??模块初始化
%???1??????DX?????????????????计算模块导数
%???2??????DS?????????????????更新模块离散状态
%???3??????Y??????????????????计算模块输出
%???4??????TNEXT??????????????计算下一个采样时间点
%???9??????[]?????????????????结束仿真
%
%
%??用户切勿改动输出参数的顺序、名称和数目
%??输入参数的数目不能小于1,这四个参数的名称和排列顺序不能改动
%??用户可以根据自己的要求添加额外的参数,位置依次为第5,6,7,8,9等。
%??S函数的flag参数是一个标记变量,具有6个不同值,分别为0,1,2,3,4,9
%??flag的6个值分别指向6个不同的子函数
%??flag所指向的子函数也成为回调方法(Callback Methods)
switch flag,
%初始化,调用“模块初始化”子程序%
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
%连续状态变量计算,调用“计算模块导数”子函数%
case 1,
sys=mdlDerivatives(t,x,u);
%更新,调用“更新模块离散状态”子函数%
case 2,
sys=mdlUpdate(t,x,u);
%输出,调用“计算模块输出”子函数%
case 3,
sys=mdlOutputs(t,x,u);
%计算下一时刻采样点,调用“计算下一个采样时刻点”子函数%
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
%结束,调用“结束仿真”子函数%
case 9,
sys=mdlTerminate(t,x,u);
%其他的flag%
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
% end sfuntmpl
%=============================================================================
% “模块初始化”子函数
% 返回大小、初始条件和样本
function [sys,x0,str,ts]=mdlInitializeSizes
global g temp itriger
%??调用simsizes函数,返回规范格式的sizes构架
%??这条指令不要修改
sizes = simsizes;
%??模块的连续状态个数,0是默认值
%??用户可以根据自己的要求进行修改
sizes.NumContStates= 0;
%??模块的离散状态个数,0是默认值
%??用户可以根据自己的要求进行修改
sizes.NumDiscStates= 0;
%??模块的输出个数,0是默认值
%??用户可以根据自己的要求进行修改
sizes.NumOutputs= 19;
%??模块的输入个数,0是默认值
%??用户可以根据自己的要求进行修改
sizes.NumInputs= 11;
%??模块中包含的直通前向馈路个数,1是默认值
%??用户可以根据自己的要求进行修改
sizes.DirFeedthrough = 1;
%??模块中采样时间的个数,1是默认值,至少需要一个样本时间
%??用户可以根据自己的要求进行修改
sizes.NumSampleTimes = 1;
%??初始化后的构架sizes经simsizes函数处理后向sys赋值
%??这条指令不要修改
sys = simsizes(sizes);
%??给模块初始值变量赋值,[]是默认值
%??用户可以根据自己的要求进行修改
x0= [];
%??系统保留变量
%??切勿改动,保持为空
str = [];
%??“二元对”描述采样时间及偏移量。[0 0]是默认值
%??[0 0]适用于连续系统
%??[-1 0]则表示该模块采样时间继承其前的模块采样时间设置
ts=[25e-6 0];
g=2000;
temp=[0 1 1 0 0 1 1 0 0 1 1 0];
itriger=[0 0 0 0 0 0];
% end mdlInitializeSizes
%=============================================================================
% 计算导数向量
function sys=mdlDerivatives(~,~,~)
%??此处填写计算导数向量的指令
%??[]是模块的默认值
%??用户必须把算得的离散状态的导数向量赋给sys
sys = [];
% end mdlDerivatives
%=============================================================================
% 计算离散状态向量
function sys=mdlUpdate(~,x,u)
%??此处填写计算离散状态向量的指令
%??[]是模块的默认值
%??用户必须把算得的离散状态向量赋给sys
sys = [];
% end mdlUpdate
%=============================================================================
% 计算模块输出向量
function sys=mdlOutputs(t,~,u)
%??此处填写计算模块输出向量的指令
%??[]是模块的默认值
%??用户必须把算得的模块输出向量赋给sys
global id iq ed eq E1 E2 ic1 ic2 theta
global Im Wout Ia Ib Ic
global Ji g temp itriger
id=u(1);
iq=u(2);
ed=u(3);
eq=u(4);
E1=u(5);
E2=u(6);
ic1=u(7);
ic2=u(8);
Ia=u(9);
Ib=u(10);
Ic=u(11);
Ts=25e-6;
L=10e-3;
R=8;
fo=50;
C1=4400e-6;
C2=4400e-6;
Iref=2*(Ia+Ib*(-0.5+sqrt(3)/2*1i)+Ic*(-0.5-sqrt(3)/2)*1i)/3;  %三相参考电流合成矢量
E=650;
V1=[0 0 0 E/3 E/3 E/6+1i*sqrt(3)*E/6 E/6+1i*sqrt(3)*E/6 E/2+1i*E*sqrt(3)/6 2*E/3 E/3+1i*sqrt(3)*E/3];
V2=[0 0 0 E/6+1i*sqrt(3)*E/6 E/6+1i*sqrt(3)*E/6 -E/6+1i*sqrt(3)*E/6 -E/6+1i*sqrt(3)*E/6 1i*E*sqrt(3)/3 E/3+1i*sqrt(3)*E/3 -E/3+1i*sqrt(3)*E/3];
V3=[0 0 0 -E/6+1i*sqrt(3)*E/6 -E/6+1i*sqrt(3)*E/6 -E/3 -E/3 -E/2+1i*sqrt(3)*E/6 -E/3+1i*sqrt(3)*E/3 -2*E/3];
V4=[0 0 0 -E/3 -E/3 -E/6-1i*E*sqrt(3)/6 -E/6-1i*E*sqrt(3)/6 -E/2-1i*sqrt(3)*E/6 -E*2/3 -E/3-1i*sqrt(3)*E/3];
V5=[0 0 0 -E/6-1i*sqrt(3)*E/6 -E/6-1i*sqrt(3)*E/6 E/6-1i*sqrt(3)*E/6 E/6-1i*sqrt(3)*E/6 -1i*E*sqrt(3)/3 -E/3-sqrt(3)*1i*E/3 E/3-1i*sqrt(3)*E/3];
V6=[0 0 0 E/3 E/3 E/6-1i*sqrt(3)*E/6 E/6-1i*sqrt(3)*E/6 E/2-1i*E*sqrt(3)/6 E/3-1i*sqrt(3)*E/3 2*E/3 ];
E1_1=E1+Ts*ic1/C1;
E2_1=E2+Ts*ic2/C2-Ts*ic1/C1;
I_ang=angle(Iref);
if (I_ang>=0&&I_ang<=pi/3)
    V=V1;
    triger=[0 1 2 3 4 5 6 15 21 22];
    Vkelo=1;
elseif (I_ang>=pi/3&&I_ang<=2*pi/3)
    V=V2;
    triger=[0 1 2 5 6 7 8 16 22 23];
    Vkelo=2;
elseif (I_ang>=2*pi/3&&I_ang<=pi)
    V=V3;
    triger=[0 1 2 7 8 9 10 17 23 24];
    Vkelo=3;
elseif (I_ang>=-pi&&I_ang<=-2*pi/3)
    V=V4;
    triger=[0 1 2 9 10 11 12 18 24 25];
    Vkelo=4;
elseif (I_ang>=-2*pi/3&&I_ang<=-pi/3)   
    V=V5;
    triger=[0 1 2 11 12 13 14 19 25 26];
    Vkelo=5;
elseif (I_ang>=-pi/3&&I_ang<=0)
    V=V6;
    triger=[0 1 2 3 4 13 14 20 26 21];
    Vkelo=6;
end
Iref_1=Iref*(cos(-2*pi*fo*Ts)+1i*sin(-2*pi*fo*Ts));
Iref_2=Iref_1*(cos(-2*pi*fo*Ts)+1i*sin(-2*pi*fo*Ts));
Iref_3=Iref_2*(cos(-2*pi*fo*Ts)+1i*sin(-2*pi*fo*Ts));
Iref_11=4*Iref-6*Iref_1+4*Iref_2-Iref_3;
Iref_1d=real(Iref_11);
Iref_1q=imag(Iref_11);
for j=1:10
    i_1(j)=(1-R*Ts/L)*(id+1i*iq)+Ts/L*(V(j)-ed-1i*eq);
    i_1d(j)=real(i_1(j));
    i_1q(j)=imag(i_1(j));
    g(j)=abs(Iref_1d-i_1d(j))+abs(Iref_1q-i_1q(j))+40*abs(E1_1-E2_1);   
end   
[~,Ji]=min(g);
Vtriger=triger(:,Ji);
if Vtriger==0
    temp=[0 0 1 1 0 0 1 1 0 0 1 1];
    itriger=[0 0 0 0 0 0];
elseif Vtriger==1
    temp=[0 1 1 0 0 1 1 0 0 1 1 0];
    itriger=[0 0 0 1 1 1];
elseif Vtriger==2
    temp=[1 1 0 0 1 1 0 0 1 1 0 0];
    itriger=[1 1 1 0 0 0];
elseif Vtriger==3
    temp=[1 1 0 0 0 1 1 0 0 1 1 0];
    itriger=[1 0 0 0 1 1];
elseif Vtriger==4
    temp=[0 1 1 0 0 0 1 1 0 0 1 1];  
    itriger=[0 0 0 1 0 0];
elseif Vtriger==5
    temp=[1 1 0 0 1 1 0 0 0 1 1 0];
    itriger=[1 1 0 0 0 1];
elseif Vtriger==6
    temp=[0 1 1 0 0 1 1 0 0 0 1 1];
    itriger=[0 0 0 1 1 0];
elseif Vtriger==7
    temp=[0 1 1 0 1 1 0 0 0 1 1 0];
    itriger=[0 1 0 1 0 1];
elseif Vtriger==8
    temp=[0 0 1 1 0 1 1 0 0 0 1 1];  
    itriger=[0 0 0 0 1 0];
elseif Vtriger==9
    temp=[0 1 1 0 1 1 0 0 1 1 0 0];
    itriger=[0 1 1 1 0 0];
elseif Vtriger==10
    temp=[0 0 1 1 0 1 1 0 0 1 1 0];
    itriger=[0 0 0 0 1 1];
elseif Vtriger==11
    temp=[0 1 1 0 0 1 1 0 1 1 0 0];
    itriger=[0 0 1 1 1 0];
elseif Vtriger==12
    temp=[0 0 1 1 0 0 1 1 0 1 1 0];
    itriger=[0 0 0 0 0 1];
elseif Vtriger==13
    temp=[1 1 0 0 0 1 1 0 1 1 0 0];
    itriger=[1 0 1 0 1 0];
elseif Vtriger==14
    temp=[0 1 1 0 0 0 1 1 0 1 1 0];
    itriger=[0 0 0 1 0 1];
elseif Vtriger==15
    temp=[1 1 0 0 0 1 1 0 0 0 1 1];
    itriger=[1 0 0 0 1 0];
elseif Vtriger==16
    temp=[0 1 1 0 1 1 0 0 0 0 1 1];
    itriger=[0 1 0 1 0 0];
elseif Vtriger==17
    temp=[0 0 1 1 1 1 0 0 0 1 1 0];
    itriger=[0 1 0 0 0 1];
elseif Vtriger==18
    temp=[0 0 1 1 0 1 1 0 1 1 0 0];
    itriger=[0 0 1 0 1 0];
elseif Vtriger==19
    temp=[0 1 1 0 0 0 1 1 1 1 0 0];
    itriger=[0 0 1 1 0 0];
elseif Vtriger==20
    temp=[1 1 0 0 0 0 1 1 0 1 1 0];
    itriger=[1 0 0 0 0 1];
elseif Vtriger==21
    temp=[1 1 0 0 0 0 1 1 0 0 1 1];
    itriger=[1 0 0 0 0 0];
elseif Vtriger==22
    temp=[1 1 0 0 1 1 0 0 0 0 1 1];
    itriger=[1 1 0 0 0 0];
elseif Vtriger==23
    temp=[0 0 1 1 1 1 0 0 0 0 1 1];
    itriger=[0 1 0 0 0 0];
elseif Vtriger==24
    temp=[0 0 1 1 1 1 0 0 1 1 0 0];
    itriger=[0 1 1 0 0 0];
elseif Vtriger==25
    temp=[0 0 1 1 0 0 1 1 1 1 0 0];
    itriger=[0 0 1 0 0 0];
elseif Vtriger==26
    temp=[1 1 0 0 0 0 1 1 1 1 0 0];
    itriger=[1 0 1 0 0 0];
end
sys = [temp itriger Ji];
% end mdlOutputs
%=============================================================================
% 计算下一采样时刻
function sys=mdlGetTimeOfNextVarHit(t,~,~)
%??该子函数仅在“采样时间”情况下使用
%??sampleTime = 1 是模块默认设置,表示在当前时间1秒后再调用本模块
%??用户可以根据自己的要求修改
sampleTime = 1;
%??将计算得到的下一采样时刻赋给sys
%??切勿改动
sys = t + sampleTime;
% end mdlGetTimeOfNextVarHit

%=============================================================================
function sys=mdlTerminate(~,~,~)
%??模板默认设置,一般情况不要改动
sys = [];{/code}



新手

10 麦片

财富积分


050


1

主题

3

帖子

0

最佳答案
 楼主| 发表于 2019-10-6 11:48:32 | 显示全部楼层
点附件和代码怎么没有反应。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表