svpwm的matlab模型,svpwm的MATLAB仿真实现(转载)

取Tz为1/(1e+4)这就是说开个频率是10kHz,Vdc为500,这两个参数要根据实际情况自己设置,这里是我任意设的,repeating

sequence的设置如图3所示,这样设的目的是想产生一个周期为Tz,峰值为Tz/2的等腰直角三角形调制波,接下来设置两个比较模块和取反模块,比较模块是大于等于关系,各模块的其他参数,我没说的就当默认设置,细心的读者会在图4中的第一幅图中看到仿真时间设为Ts,这是我设的系统仿真步长,这里就用默认值-1,此外比较模块和取反模块的信号属性signal

atrributes均应设为Boolean格式。

a4c26d1e5885305701be709a3d33442f.png

图3

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

步骤3:设置s-builder模块,这个设置也很简单,但是看起来有点多,图2中的svpwm模块就是用simulink中的s-function

builder建立的,只是名字改成svpwm罢了,有图2可以看出svpwm产生的三个时间比较值与repeating

sequence产生的等腰三角波进行比较,从而产生想要的六路PWM波,svpwm的核心算法是使用C语言编写的,下面详细介绍该模块的设置,s-fanction

builder的界面如下图:

a4c26d1e5885305701be709a3d33442f.png

图5

在s-function name

中输入svpwm,如果你把我下面说的设置完后,再按一下s-function

name旁边的build,接着就会在matlab的显示路径文件夹中(如“我的文档/matlab”)产生几个格式各异的以svpwm开头的文件,如svpwm.c,svpwm.tlc等,不过这是后话,先说说设置,在initialization中的各参数均设为0,sample

mode 设为inherited,如图5所示,这些都是默认值,也是说可以不用管它就可以了,在data

properties中设:

a4c26d1e5885305701be709a3d33442f.png

图6

port name 为u

(默认是u0),行数row为4(因为有四个输入参数),其他选用默认值,如图6所示,设output ports的输出port

name为y(原来为y0),行数rows为3(因为有三个输出),其他参数默认,剩下的两个parameters和data type

attributes均采用默认值;在libraries中全部使用默认值;接下来要改的就是outputs中的内容,也是实现SVPWM的核心算法,必须注意要必须勾选inputs

are needed in the output function(direct

feedthrough),这句话的意思是:输出结果直接用到了输入数据,比如y=u+1,将下面给出的C语言程序复制到空白处,如图7所示:

a4c26d1e5885305701be709a3d33442f.png

图7

int A,B,C,N;

double X,Y,Z,Tx,Ty,T0,Tl,Tm,Th;

if (u[1]>0) A = 1;

else A=0;

if ((1.732051*u[0]-u[1])>0) B = 1;

else B=0;

if

((-1.732051*u[0]-u[1])>0) C = 1;

else C=0;

N=A+2*B+4*C;

X=1.732051*u[1]*u[2]/u[3];

Y=(0.8660*u[1]+1.5*u[0])*u[2]/u[3];

Z=(-0.8660*u[1]+1.5*u[0])*u[2]/u[3];

switch (N)

{

case 1: Tx=

Y;Ty=-Z;break;

case 2:

Tx=-X;Ty= Y;break;

case 3: Tx=

Z;Ty= X;break;

case 4:

Tx=-Z;Ty=-X;break;

case 5: Tx=

X;Ty=-Y;break;

default: Tx=-Y;Ty= Z;

}

if ((Tx+Ty)>u[2])

{

Tx=Tx*u[2]/(Tx+Ty);

Ty=Ty*u[2]/(Tx+Ty);

}

T0=(u[2]-(Tx+Ty))/4;

Tl=(u[2]+Tx-Ty)/4;

Tm=(u[2]-Tx+Ty)/4;

Th=(u[2]+Tx+Ty)/4;

switch (N)

{

case 1

:y[0]=Tm;y[1]=T0;y[2]=Th;break;

case 2

:y[0]=T0;y[1]=Th;y[2]=Tm;break;

case 3

:y[0]=T0;y[1]=Tl;y[2]=Th;break;

case 4

:y[0]=Th;y[1]=Tm;y[2]=T0;break;

case 5

:y[0]=Th;y[1]=T0;y[2]=Tl;break;

default

:y[0]=Tl;y[1]=Th;y[2]=T0;

}

接下来的两个continuous derivatives和discrete

update都不用改,使用默认值,这两个只有在有导数时才会用到,最后一个在build info中勾选show comlile

steps(在build时会显示编译过程)、create a debugged mex-file和generate wrapper

tlc(这个我也不知道干什么用的)。这下所有的细节设置都结束了,

步骤4:设置仿真参数,回到mdl主界面,选择菜单栏中的simulation/configurate

parameters,里面的仿真时间可以根据实际情况自己定,在sover

options中,type建议选fixed-step,fixed step

size应本人设为5e-6,这个参数是仿真时最小的步长,这个参数必须比开关周期Tz小,否则无法仿真,其他参数都不用管它,要想知道这些参数是什么意思,就多看看matlab

中的help,里面都有详细说明。

步骤5是安装lcc,在matlab的command window中输入mex

-setup,然后按照提示将LCC安装上,安装完毕的提示是done。。。,接下来你就可以做跟你有用有关的事了,把SVPWM当做一个模块了使用。

步骤6:打开s-function

builder,单击一下里面的build,接着您就可以看到编译过程,如果看到success,那就说明您已经成功了。编译完后关闭s-function

builder,接下来做你的系统仿真吧,只要您的svpwm模块和编译出来的svpwm.c放在一个文件夹中,以后仿真就不用再点build了。

很简单吧,其实SVPWM的仿真没什么难的!需要提醒同志们的是,在仿真之前必须build一下s-function

builder,不然无法运行模块,采用s-builder的原因是建成的模块很简洁,而且运行速度要比其他方法快的多,接下来同志们该去自己试一下了!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值