| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- close all
- clc
- %%%%%%%%%%%%%%%%%%%%%%%%% 可修改定义区 %%%%%%%%%%%%%%%%%%%%%%%%% 特别注意!!!电流都应该用幅值
- I_max = 495; % 这里是幅值,扫描电流的最大值
- I_min = 1; % 这里是幅值,扫描电流的最小值
- U_max = 30.022; % 这是 RMS
- p = 3; % 极对数
- Rs = 0; % 定子相电阻 0.0191238
- kw = 0.99493; % 斜槽引起的转矩削弱
- %%%%%%%%%% 调整转速、电流的步长和下面插值的k可以修复map图右下角的马赛克 %%%%%%%%%%
- speed = [200:400:3400 3400:10:8000]; % 计算速度
- current =(I_min:10:I_max); % 计算的电流
- k = 200; % 总的插值次数, 这里多插值可以改善map图右下角马赛克
- %%%%%%%%%%%%%%%%%%%%%% 读取文件,都是原始值 %%%%%%%%%%%%%%%%%%%%%%
- data = load('dq_results.mat');
- id_init = data.id;
- iq_init = data.iq;
- Psid_init = data.psid;
- Psiq_init = data.psiq;
- Psim_init = data.psim; % 永磁同步电机需要Psim, 同步磁阻电机不需要
- Is_init = sqrt(id_init .*id_init +iq_init .*iq_init); % 峰值电流
- ID=zeros(size(speed, 2));
- IQ=zeros(size(speed, 2));
- US=zeros(size(speed, 2));
- TORQUE=zeros(size(speed, 2));
- Torque_all=zeros(size(speed, 2));
- ID_all=zeros(size(speed, 2));
- IQ_all=zeros(size(speed, 2));
- US_all=zeros(size(speed, 2));
- n_current = 0; %定义最大电流循环步数
- for I_max = current
- n_current = n_current+1;
- n_step = 0; %定义最大转速循环步数
- for n = speed
- n_step = n_step + 1 ; %当前最大转速循环次数
- f = n*p/60; % 计算供电频率
- Omega = 2*pi*f; % 计算电角频率
- %%%%%%%%%%%%% 对数据进行进行插值%%%%%%%%%%%%%%%% !!!必须放在循环中间是因为每次dq轴参数需要重置
- [M,N] =size(id_init);
- [X,Y] =meshgrid(1:N,1:M);
- N_step = (N-1)/k; % N的插值步长
- M_step = (M-1)/k; % M的插值步长
- [Xq,Yq] =meshgrid((1:N_step:N),(1:M_step:M)); % 对横纵坐标进行插值
- id = interp2(X,Y,id_init,Xq,Yq);
- iq = interp2(X,Y,iq_init,Xq,Yq);
- Psid = interp2(X,Y,Psid_init,Xq,Yq);
- Psiq = interp2(X,Y,Psiq_init,Xq,Yq);
- Is = interp2(X,Y,Is_init,Xq,Yq);
- %%%%%%%%%%%%%%%%%%%% 计算转矩和端电压 %%%%%%%%%%%%%%%%%%%%%%%%
- Torque = 3/2*p*(Psid.*iq-Psiq.*id)*kw; % 永磁同步电机公式
- %%%%%%%%%%%%%%%%%%% 峰值电流计算公式 %%%%%%%%%%%%%%%%%%%
- %Torque = 3/2*p*(Psid.*iq-Psiq.*id)*kw; % 同步磁阻电机公式
- Us = sqrt(Psid.^2+Psiq.^2)*Omega/sqrt(2)+sqrt(iq.^2+id.^2)/sqrt(2)*Rs; % 这是RMS因为除以了根号2
- %%%%%%%%%%%%%%%%%%% 有效值电流计算公式 %%%%%%%%%%%%%%%%%%%
- %Torque = 3/2*p*(Psid.*iq-Psiq.*id)*kw*sqrt(2); % 同步磁阻电机公式,需要将电流换为峰值电流
- %Us = sqrt(Psid.^2+Psiq.^2)*Omega/sqrt(2)+sqrt(iq.^2+id.^2)*Rs; % 这里的Psi和i都是有效值
- Is(Is>I_max)=NaN; % 剔除超过电流幅值的点
- Us(Us>U_max)=NaN; % 剔除超过电压幅值的点
- Torque = Torque.*(Is./Is).*(Us./Us); % 剔除超过电压电流幅值的转矩点
- %%%%%%%%%%%%%%% 查找转矩最大值,以及对应的行数、列数 %%%%%%%%%%%%%%%
- Torque_max = max(max(Torque));
- [x,y] = find(Torque == Torque_max);
- if ~isnan(Torque_max)
- ID(n_step) = id(x,y);
- IQ(n_step) = iq(x,y);
- US(n_step) = Us(x,y);
- TORQUE(n_step) = Torque(x,y);
- else %% 如果转矩为NaN则说明电压电流超了,此时都赋为NaN然后继续往下扫描
- ID(n_step) = NaN;
- IQ(n_step) = NaN;
- US(n_step) = NaN;
- TORQUE(n_step) = NaN;
- end
- end
- Torque_all(n_current,:) = TORQUE;
- ID_all(n_current,:) = ID;
- IQ_all(n_current,:) = IQ;
- US_all(n_current,:) = US;
- end
- %%%%%%%%%%%%%%% 转矩图 %%%%%%%%%%%%%%%
- figure(1);
- plot(speed,Torque_all,'MarkerSize',15,'Marker','.');
- grid on;
- set(gca,'GridLineStyle',':','GridColor','k','GridAlpha',1);
- set(gcf,'color','w');
- set(gca,'FontSize',14,'FontName','Times New Roman');
- xlabel('Speed, [rpm]');
- ylabel('Torque, [Nm]');
- %title('Torque');
- set(gca,'Xlim',[200,8000]);
- set(gca,'XTick',(200:400:8000));
- % set(gca,'Ylim',[0,200]);
- % set(gca,'YTick',[0:20:200]);
- %%%%%%%%%%%%%%% 画转矩、电流、电压相互关联的图 %%%%%%%%%%%%%%%
- [M,N] = size(Torque_all);
- [X,Y] = meshgrid(1:1:N,1:1:M);
- figure(2);
- stem3(X,Y,Torque_all);
- grid on;
- set(gcf,'color','w');
- set(gca,'FontSize',16,'FontName','Times New Roman');
- xlabel('X');
- ylabel('Y');
- title('Torque');
- view(2);
- figure(3);
- stem3(X,Y,ID_all);
- grid on;
- set(gcf,'color','w');
- set(gca,'FontSize',16,'FontName','Times New Roman');
- xlabel('x position');
- ylabel('y position');
- title('Id');
- view(2);
- figure(4);
- stem3(X,Y,IQ_all);
- grid on;
- set(gcf,'color','w');
- set(gca,'FontSize',16,'FontName','Times New Roman');
- xlabel('x position');
- ylabel('y position');
- title('Iq');
- view(2);
- figure(5);
- stem3(X,Y,US_all);
- grid on;
- set(gcf,'color','w');
- set(gca,'FontSize',16,'FontName','Times New Roman');
- xlabel('x position');
- ylabel('y position');
- title('Us');
- view(2);
- Gama_all = atand(abs(IQ_all)./ID_all)+180; % 对永磁同步电机为:Gama,同步磁阻电机为Kappa
- figure(6);
- stem3(X,Y,Gama_all);
- grid on;
- set(gcf,'color','w');
- set(gca,'FontSize',16,'FontName','Times New Roman');
- xlabel('x position');
- ylabel('y position');
- title('Gama');
- view(2);
- %%%%%%%%%%%%%%%%%%% 永磁同步电机角度输出 %%%%%%%%%%%%%%%%%%%
- % Gama_all = atand(abs(ID_all)./IQ_all)+90;
- % figure(6);
- % stem3(X,Y,Gama_all);
- % grid on;
- % set(gcf,'color','w');
- % set(gca,'FontSize',16,'FontName','Times New Roman');
- % xlabel('x position');
- % ylabel('y position');
- % title('Gama');
- % view(2);
- %%%%%%%%%%%%%%%%%%% 转速输出 %%%%%%%%%%%%%%%%%%%
- Speed_all = repelem(speed,M,1);
- figure(7);
- stem3(X,Y,Speed_all);
- grid on;
- set(gcf,'color','w');
- set(gca,'FontSize',16,'FontName','Times New Roman');
- xlabel('x position');
- ylabel('y position');
- title('Speed');
- view(2);
- %%%%%%%%%%%%% 写入参数 %%%%%%%%%%%%%
- % xlswrite('Torque_Id_Iq',Torque_all,'Torque');% xlswrite('Torque_Id_Iq',ID_all,'Id');
- % xlswrite('Torque_Id_Iq',IQ_all,'Iq');
- % xlswrite('Torque_Id_Iq',Speed_all,'Speed_all');
- %save('Torque_Id_Iq', 'Torque_all', 'ID_all', 'IQ_all','Speed_all');
|