本帖最后由 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')