matlab 赋值维度不匹配,Matlab矩阵赋值问题,维度不匹配,请给予意见

本帖最后由 Banson_Dou 于 2015-2-10 18:54 编辑

请帮忙看下如下程序如何修改。错误提示如下:??? Subscripted assignment dimension mismatch.

Error in ==> BLDC_PWM at 380

p_vabcs(count,:)=[vas vbs vcs];

我的目的是通过循环将 vas vbs vcs赋到矩阵p_vabcs的0行到count计数的最后一行。请高手帮忙看下,谢谢~

clear all;

close all;

global phase rs ls_lm vas vbs vcs eas ebs ecs

global inertia b_fric pole te tl

% BLDC电机参数

% p_hp [HP],rs [Ohm],ls [H],lm [H]

% kb [V/rad/sec (elec)], lamda_p [V/rad/sec (mech), N-m/A]

% inertia [Kg-m∩2], b_fric [N-m/rad/sec]

rs=0.7;

ls_lm=5.21e-3;

inertia=0.00022;

b_fric=0;

p_hp=1;

pole=4;

vdc=160;

kb=0.05238;

lamda_p=kb*(pole/2);

ip_rate=8.5;

te_rate=1.7809;

wbase_rpm=4000;

%各个值得基值

pbase=p_hp*746;

vbase=vdc;

ibase=ip_rate;

tbase=te_rate;

wbase=wbase_rpm*(pi/30)*(pole/2);

%设定初始条件

ias=0;

ibs=0;

ics=0;

%转子速度和位置

wrthr=zeros(2,1);

wr=wrthr(1,1);

thr=wrthr(2,1);

%原来的初始位置

thr_old=thr;

%转速指令

wr_cmd=0;

%转速控制器增益

kp_w=0.1;

ki_w=0.001;

%wr_intg=积分器结果, te_cmd=限定以后的值, te_star=限定之前的值

wr_intg=0;

te_cmd=0;

te_star=0;

%转矩限制到2[p.u]

te_lim_p=2*te_rate;

te_lim_n=-2*te_rate;

%负载转矩

tl=0;

%电流控制器增益

kp_i=100;

%控制器输出

vasc=0;

vbsc=0;

vcsc=0;

%三角波的频率和电压峰值

ftr=4000;

vtr_r=10;

%电压限制指令

vc_lim_p=9;

vc_lim_n=-9;

%初始时间,时间步长和结束时间

tt=0;

dt=10e-6;

tf=0.07001;

%用于绘制图形的变量

count=0;

no_int=0;

no_ds=fix(tf/dt/(no_int+1));

p_vabcs=zeros(no_ds,3);

p_fabcs=zeros(no_ds,3);

p_eabcs=zeros(no_ds,3);

p_isc=zeros(no_ds,4);

p_vabcs=zeros(no_ds,3);

p_iabcs=zeros(no_ds,3);

p_torq=zeros(no_ds,5);

p_wrthr=zeros(no_ds,4);

p_t=zeros(no_ds,1);

%求解电机的动态模型

iter=0;

iter1=0;

while(tt<=tf)

%速度指令

if((tt>0) & (tt<=0.025))

wr_cmd=0.5*wbase;

elseif ((tt>0.025) & (tt<=0.07))

wr_cmd=-0.5*wbase;

end

%用pi计算机转矩指令

wr_err=wr_cmd-wr;

wr_intg=wr_intg+ki_w*(wr_err+te_cmd-te_star)*dt;

te_star=wr_intg+kp_w*wr_err;

if(te_star>=te_lim_p)

te_cmd=te_lim_p;

elseif(te_star<=te_lim_n)

te_cmd=te_lim_n;

else

te_cmd=te_star;

end

%计算峰值电流指令

ip_cmd=te_cmd/(2*lamda_p);

%转换thr的单位rad=>deg

thr_deg=thr*180/pi;

%调整th_deg的变化范围 (0<=th_deg<=360)

while((thr_deg<0) | (thr_deg>360))

if(thr_deg<0)

thr_deg=thr_deg+360;

elseif(thr_deg>360)

thr_deg=thr_deg-360;

end

end

%根据转子位置得出相电流指令

if(((thr_deg>=0) & (thr_deg<30)) | ((thr_deg>=330) & (thr_deg<=360)))

mode=1;

ias_cmd=0;

ibs_cmd=-ip_cmd;

ics_cmd=ip_cmd;

elseif((thr_deg>=30)&(thr_deg<90))

mode=2;

ias_cmd=ip_cmd;

ibs_cmd=-ip_cmd;

ics_cmd=0;

elseif((thr_deg>=90)&(thr_deg<150))

mode=3;

ias_cmd=ip_cmd;

ibs_cmd=0;

ics_cmd=-ip_cmd;

elseif((thr_deg>=150)&(thr_deg<210))

mode=4;

ias_cmd=0;

ibs_cmd=ip_cmd;

ics_cmd=-ip_cmd;

elseif((thr_deg>=210)&(thr_deg<270))

mode=5;

ias_cmd=-ip_cmd;

ibs_cmd=ip_cmd;

ics_cmd=0;

elseif((thr_deg>=270)&(thr_deg<360))

mode=6;

ias_cmd=-ip_cmd;

ibs_cmd=0;

ics_cmd=ip_cmd;

%fas(thr):转子位置相关函数

if((thr_deg>=0) & (thr_deg<30))

fas_thr=thr_deg/30;

elseif((thr_deg>=30)&(thr_deg<150))

fas_thr=1;

elseif((thr_deg>=150)&(thr_deg<210))

fas_thr=-far_deg/30+6;

elseif((thr_deg>=210)&(thr_deg<330))

fas_thr=-1;

elseif((thr_deg>=330)&(thr_deg<=360))

fas_thr=thr_deg/30-12;

end

%fbs(thr):转子位置相关函数

if((thr_deg>=0) & (thr_deg<90))

fbs_thr=-1;

elseif((thr_deg>=90)&(thr_deg<150))

fbs_thr=thr_deg/30-4;

elseif((thr_deg>=150)&(thr_deg<270))

fbs_thr=1;

elseif((thr_deg>=270)&(thr_deg<330))

fbs_thr=-thr_deg/30+10;

elseif((thr_deg>=330)&(thr_deg<=360))

fbs_thr=-1;

end

%fcs(thr):转子位置相关函数

if((thr_deg>=0) & (thr_deg<30))

fcs_thr=1;

elseif((thr_deg>=30)&(thr_deg<90))

fcs_thr=-thr_deg/30+2;

elseif((thr_deg>=90)&(thr_deg<210))

fcs_thr=-1;

elseif((thr_deg>=210)&(thr_deg<270))

fcs_thr=thr_deg/30-8;

elseif((thr_deg>=270)&(thr_deg<=360))

fcs_thr=1;

end

%计算反电动势

eas=fas_thr*kb*wr;

ebs=fbs_thr*kb*wr;

ecs=fcs_thr*kb*wr;

%生成三角载波

vtr=rem(4*ftr*vtr_r*tt,4*vtr_r);

if(vtr

vtr=vtr;

elseif(vtr

vtr=2*vtr_r-vtr;

else

vtr=vtr-4*vtr_r;

end

%计算位置变化

del_thr=thr-thr_old;

thr_old=thr;

%计算A相控制电压:比例控制和续流

if((mode~=1)&(mode~=4))

ias_det=1;

vasc=kp_i*(ias_cmd-ias);

if(vasc>vc_lim_p)

vasc=vc_lim_p;

elseif(vasc

vasc=vc_lim_n;

end

if(vasc>=vtr)

vas=vdc/2;

else

vas=-vdc/2;

end

elseif(((del_thr<0) & (mode==1)) | ((del_thr>=0) & (mode==4)))

if(ias<=0)

ias_det=0;

ias=0;

vas=eas;

else

ias_det=1;

vas=-vdc/2;

end

elseif(((del_thr>=0)&(mode==1))|((del_thr<0)&(mode==4)))

if(ias>=0)

ias_det=0;

ias=0;

vas=eas;

else

ias_et=1;

vas=vdc/2;

end

end

%计算B相控制电压:比例控制和续流

if((mode~=3)&(mode~=6))

ibs_det=1;

vbsc=kp_i*(ibs_cmd-ibs);

if(vbsc>vc_lim_p)

vbsc=vc_lim_p;

elseif(vbsc

vbsc=vc_lim_n;

end

if(vbsc>=vtr)

vbs=vdc/2;

else

vbs=-vdc/2;

end

elseif(((del_thr<0) & (mode==3)) | ((del_thr>=0) & (mode==6)))

if(ibs<=0)

ibs_det=0;

ibs=0;

vbs=ebs;

else

ibs_det=1;

vbs=-vdc/2;

end

elseif(((del_thr>=0)&(mode==1))|((del_thr<0)&(mode==4)))

if(ibs>=0)

ibs_det=0;

ibs=0;

vbs=ebs;

else

ibs_det=1;

vbs=vdc/2;

end

end

%计算c相控制电压:比例控制和续流

if((mode~=5)&(mode~=2))

ics_det=1;

vcsc=kp_i*(ics_cmd-ics);

if(vcsc>vc_lim_p)

vcsc=vc_lim_p;

elseif(vcsc

vcsc=vc_lim_n;

end

if(vcsc>=vtr)

vcs=vdc/2;

else

vcs=-vdc/2;

end

elseif(((del_thr<0) & (mode==5)) | ((del_thr>=0) & (mode==2)))

if(ics<=0)

ics_det=0;

ics=0;

vcs=ecs;

else

ics_det=1;

vcs=-vdc/2;

end

elseif(((del_thr>=0)&(mode==5))|((del_thr<0)&(mode==2)))

if(ics>=0)

ics_det=0;

ics=0;

vcs=ecs;

else

ics_et=1;

vcs=vdc/2;

end

end

%4阶龙格-库塔法计算ias

if(ias_det==1)

phase=1;

grad_1=seq_iabcs(tt,ias);

grad_2=seq_iabcs(tt+dt/2,ias+dt*grad_1/2);

grad_3=seq_iabcs(tt+dt/2,ias+dt*grad_2/2);

grad_4=seq_iabcs(tt+dt,ias+dt*grad_3);

ias=ias+(grad_1+2*grad_2+2*grad_3+grad_4)*dt/6;

end

%4阶龙格-库塔法计算ibs

if(ibs_det==1)

phase=2;

grad_1=seq_iabcs(tt,ibs);

grad_2=seq_iabcs(tt+dt/2,ibs+dt*grad_1/2);

grad_3=seq_iabcs(tt+dt/2,ibs+dt*grad_2/2);

grad_4=seq_iabcs(tt+dt,ibs+dt*grad_3);

ibs=ibs+(grad_1+2*grad_2+2*grad_3+grad_4)*dt/6;

end

%4阶龙格-库塔法计算ics

if(ics_det==1)

phase=3;

grad_1=seq_iabcs(tt,ics);

grad_2=seq_iabcs(tt+dt/2,ics+dt*grad_1/2);

grad_3=seq_iabcs(tt+dt/2,ics+dt*grad_2/2);

grad_4=seq_iabcs(tt+dt,ics+dt*grad_3);

ics=ics+(grad_1+2*grad_2+2*grad_3+grad_4)*dt/6;

end

%计算电磁转矩

tas=(pole/2)*kb*fas_thr*ias;

tbs=(pole/2)*kb*fbs_thr*ibs;

tcs=(pole/2)*kb*fcs_thr*ics;

te=tas+tbs+tcs;

%4阶龙格-库塔法计算[wr thr]

slope_1=seq_wrthr(tt,wrthr);

slope_2=seq_wrthr(tt+dt/2,wrthr+dt*slope_1/2);

slope_3=seq_wrthr(tt+dt/2,wrthr+dt*slope_2/2);

slope_4=seq_wrthr(tt+dt,wrthr+dt*slope_3);

wr=wrthr(1,1);

thr=wrthr(2,1);

end

%保存一些变量

if(iter==no_int)

iter=0;

count=count+1;

p_vabcs(count,:)=[vas vbs vcs];

p_fabcs(count,:)=[fas_thr fbs_thr fcs_thr];

p_eabcs(count,:)=[eas,ebs,ecs];

p_isc(count,:)=[ias_cmd ibs_cmd ics_cmd ip_cmd];

p_iabcs(count,:)=[ias ibs ics];

p_torq(count,:)=[te_cmd te tas tbs tcs];

p_wrthr(count,:)=[wr thr thr_deg wr_deg];

p_t(count,:)=tt;

else

iter=iter+1;

end

if(iter1==1000)

iter1=0;

else

iter1=iter1+1;

end

%时间的增加由dt控制

tt=tt+dt;

end

%绘制曲线

subplot(8,1,1);

plot(p_t,p_wrthr(:,4)/wbase);

ylabel('omega_r_n∩*');

grid off;

box off;

axis([0 tf -0.6 0.6])

set(gca,'Xtick',0:0.01:0.07);

set(gca,'XtickLabel',{})

subplot(8,1,2);

plot(p_t,p_wrthr(:,1)/wbase);

ylabel('omega_r_n');

grid off;

box off;

axis([0 tf -0.6 0.6])

set(gca,'Xtick',0:0.01:0.07);

set(gca,'XtickLabel',{})

subplot(8,1,3);

plot(p_t,p_torq(:,1)/tbase);

ylabel('T_e_n∩*');

grid off;

box off;

axis([0 tf -2.2 2.2])

set(gca,'Xtick',0:0.01:0.07);

set(gca,'XtickLabel',{})

subplot(8,1,4);

plot(p_t,p_torq(:,2)/tbase);

ylabel('T_e_n');

grid off;

box off;

axis([0 tf -2.2 2.2])

set(gca,'Xtick',0:0.01:0.07);

set(gca,'XtickLabel',{})

subplot(8,1,5);

plot(p_t,p_wrthr(:,3)*pi/180);

ylabel('thetar');

grid off;

box off;

axis([0 tf 0 7])

set(gca,'Xtick',0:0.01:0.07);

set(gca,'XtickLabel',{})

subplot(8,1,6);

plot(p_t,p_isc(:,1)/ibase);

ylabel('i_a_s_n∩*');

grid off;

box off;

axis([0 tf -2.2 2.2])

set(gca,'Xtick',0:0.01:0.07);

set(gca,'XtickLabel',{})

subplot(8,1,7);

plot(p_t,p_iabcs(:,1)/ibase);

ylabel('i_a_s_n');

grid off;

box off;

axis([0 tf -2.2 2.2])

set(gca,'Xtick',0:0.01:0.07);

set(gca,'XtickLabel',{})

subplot(8,1,8);

plot(p_t,p_eabcs(:,1)/vbase);

ylabel('e_a_s_n');

grid off;

box off;

axis([0 tf -0.2 0.2])

set(gca,'Xtick',0:0.01:0.07);

set(gca,'XtickLabel',{})

set(gca,'XtickLabel',{'0','0.01','0.02','0.03','0.04','0.05','0.06','0.07'});

xlabel('Time,sec')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值