phi_dq_torque.m 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. close all
  2. clc
  3. %%%%%%%%%%%%%%%%%%%%%%%%% 可修改定义区 %%%%%%%%%%%%%%%%%%%%%%%%% 特别注意!!!电流都应该用幅值
  4. I_max = 495; % 这里是幅值,扫描电流的最大值
  5. I_min = 1; % 这里是幅值,扫描电流的最小值
  6. U_max = 30.022; % 这是 RMS
  7. p = 3; % 极对数
  8. Rs = 0; % 定子相电阻 0.0191238
  9. kw = 0.99493; % 斜槽引起的转矩削弱
  10. %%%%%%%%%% 调整转速、电流的步长和下面插值的k可以修复map图右下角的马赛克 %%%%%%%%%%
  11. speed = [200:400:3400 3400:10:8000]; % 计算速度
  12. current =(I_min:10:I_max); % 计算的电流
  13. k = 200; % 总的插值次数, 这里多插值可以改善map图右下角马赛克
  14. %%%%%%%%%%%%%%%%%%%%%% 读取文件,都是原始值 %%%%%%%%%%%%%%%%%%%%%%
  15. data = load('dq_results.mat');
  16. id_init = data.id;
  17. iq_init = data.iq;
  18. Psid_init = data.psid;
  19. Psiq_init = data.psiq;
  20. Psim_init = data.psim; % 永磁同步电机需要Psim, 同步磁阻电机不需要
  21. Is_init = sqrt(id_init .*id_init +iq_init .*iq_init); % 峰值电流
  22. ID=zeros(size(speed, 2));
  23. IQ=zeros(size(speed, 2));
  24. US=zeros(size(speed, 2));
  25. TORQUE=zeros(size(speed, 2));
  26. Torque_all=zeros(size(speed, 2));
  27. ID_all=zeros(size(speed, 2));
  28. IQ_all=zeros(size(speed, 2));
  29. US_all=zeros(size(speed, 2));
  30. n_current = 0; %定义最大电流循环步数
  31. for I_max = current
  32. n_current = n_current+1;
  33. n_step = 0; %定义最大转速循环步数
  34. for n = speed
  35. n_step = n_step + 1 ; %当前最大转速循环次数
  36. f = n*p/60; % 计算供电频率
  37. Omega = 2*pi*f; % 计算电角频率
  38. %%%%%%%%%%%%% 对数据进行进行插值%%%%%%%%%%%%%%%% !!!必须放在循环中间是因为每次dq轴参数需要重置
  39. [M,N] =size(id_init);
  40. [X,Y] =meshgrid(1:N,1:M);
  41. N_step = (N-1)/k; % N的插值步长
  42. M_step = (M-1)/k; % M的插值步长
  43. [Xq,Yq] =meshgrid((1:N_step:N),(1:M_step:M)); % 对横纵坐标进行插值
  44. id = interp2(X,Y,id_init,Xq,Yq);
  45. iq = interp2(X,Y,iq_init,Xq,Yq);
  46. Psid = interp2(X,Y,Psid_init,Xq,Yq);
  47. Psiq = interp2(X,Y,Psiq_init,Xq,Yq);
  48. Is = interp2(X,Y,Is_init,Xq,Yq);
  49. %%%%%%%%%%%%%%%%%%%% 计算转矩和端电压 %%%%%%%%%%%%%%%%%%%%%%%%
  50. Torque = 3/2*p*(Psid.*iq-Psiq.*id)*kw; % 永磁同步电机公式
  51. %%%%%%%%%%%%%%%%%%% 峰值电流计算公式 %%%%%%%%%%%%%%%%%%%
  52. %Torque = 3/2*p*(Psid.*iq-Psiq.*id)*kw; % 同步磁阻电机公式
  53. Us = sqrt(Psid.^2+Psiq.^2)*Omega/sqrt(2)+sqrt(iq.^2+id.^2)/sqrt(2)*Rs; % 这是RMS因为除以了根号2
  54. %%%%%%%%%%%%%%%%%%% 有效值电流计算公式 %%%%%%%%%%%%%%%%%%%
  55. %Torque = 3/2*p*(Psid.*iq-Psiq.*id)*kw*sqrt(2); % 同步磁阻电机公式,需要将电流换为峰值电流
  56. %Us = sqrt(Psid.^2+Psiq.^2)*Omega/sqrt(2)+sqrt(iq.^2+id.^2)*Rs; % 这里的Psi和i都是有效值
  57. Is(Is>I_max)=NaN; % 剔除超过电流幅值的点
  58. Us(Us>U_max)=NaN; % 剔除超过电压幅值的点
  59. Torque = Torque.*(Is./Is).*(Us./Us); % 剔除超过电压电流幅值的转矩点
  60. %%%%%%%%%%%%%%% 查找转矩最大值,以及对应的行数、列数 %%%%%%%%%%%%%%%
  61. Torque_max = max(max(Torque));
  62. [x,y] = find(Torque == Torque_max);
  63. if ~isnan(Torque_max)
  64. ID(n_step) = id(x,y);
  65. IQ(n_step) = iq(x,y);
  66. US(n_step) = Us(x,y);
  67. TORQUE(n_step) = Torque(x,y);
  68. else %% 如果转矩为NaN则说明电压电流超了,此时都赋为NaN然后继续往下扫描
  69. ID(n_step) = NaN;
  70. IQ(n_step) = NaN;
  71. US(n_step) = NaN;
  72. TORQUE(n_step) = NaN;
  73. end
  74. end
  75. Torque_all(n_current,:) = TORQUE;
  76. ID_all(n_current,:) = ID;
  77. IQ_all(n_current,:) = IQ;
  78. US_all(n_current,:) = US;
  79. end
  80. %%%%%%%%%%%%%%% 转矩图 %%%%%%%%%%%%%%%
  81. figure(1);
  82. plot(speed,Torque_all,'MarkerSize',15,'Marker','.');
  83. grid on;
  84. set(gca,'GridLineStyle',':','GridColor','k','GridAlpha',1);
  85. set(gcf,'color','w');
  86. set(gca,'FontSize',14,'FontName','Times New Roman');
  87. xlabel('Speed, [rpm]');
  88. ylabel('Torque, [Nm]');
  89. %title('Torque');
  90. set(gca,'Xlim',[200,8000]);
  91. set(gca,'XTick',(200:400:8000));
  92. % set(gca,'Ylim',[0,200]);
  93. % set(gca,'YTick',[0:20:200]);
  94. %%%%%%%%%%%%%%% 画转矩、电流、电压相互关联的图 %%%%%%%%%%%%%%%
  95. [M,N] = size(Torque_all);
  96. [X,Y] = meshgrid(1:1:N,1:1:M);
  97. figure(2);
  98. stem3(X,Y,Torque_all);
  99. grid on;
  100. set(gcf,'color','w');
  101. set(gca,'FontSize',16,'FontName','Times New Roman');
  102. xlabel('X');
  103. ylabel('Y');
  104. title('Torque');
  105. view(2);
  106. figure(3);
  107. stem3(X,Y,ID_all);
  108. grid on;
  109. set(gcf,'color','w');
  110. set(gca,'FontSize',16,'FontName','Times New Roman');
  111. xlabel('x position');
  112. ylabel('y position');
  113. title('Id');
  114. view(2);
  115. figure(4);
  116. stem3(X,Y,IQ_all);
  117. grid on;
  118. set(gcf,'color','w');
  119. set(gca,'FontSize',16,'FontName','Times New Roman');
  120. xlabel('x position');
  121. ylabel('y position');
  122. title('Iq');
  123. view(2);
  124. figure(5);
  125. stem3(X,Y,US_all);
  126. grid on;
  127. set(gcf,'color','w');
  128. set(gca,'FontSize',16,'FontName','Times New Roman');
  129. xlabel('x position');
  130. ylabel('y position');
  131. title('Us');
  132. view(2);
  133. Gama_all = atand(abs(IQ_all)./ID_all)+180; % 对永磁同步电机为:Gama,同步磁阻电机为Kappa
  134. figure(6);
  135. stem3(X,Y,Gama_all);
  136. grid on;
  137. set(gcf,'color','w');
  138. set(gca,'FontSize',16,'FontName','Times New Roman');
  139. xlabel('x position');
  140. ylabel('y position');
  141. title('Gama');
  142. view(2);
  143. %%%%%%%%%%%%%%%%%%% 永磁同步电机角度输出 %%%%%%%%%%%%%%%%%%%
  144. % Gama_all = atand(abs(ID_all)./IQ_all)+90;
  145. % figure(6);
  146. % stem3(X,Y,Gama_all);
  147. % grid on;
  148. % set(gcf,'color','w');
  149. % set(gca,'FontSize',16,'FontName','Times New Roman');
  150. % xlabel('x position');
  151. % ylabel('y position');
  152. % title('Gama');
  153. % view(2);
  154. %%%%%%%%%%%%%%%%%%% 转速输出 %%%%%%%%%%%%%%%%%%%
  155. Speed_all = repelem(speed,M,1);
  156. figure(7);
  157. stem3(X,Y,Speed_all);
  158. grid on;
  159. set(gcf,'color','w');
  160. set(gca,'FontSize',16,'FontName','Times New Roman');
  161. xlabel('x position');
  162. ylabel('y position');
  163. title('Speed');
  164. view(2);
  165. %%%%%%%%%%%%% 写入参数 %%%%%%%%%%%%%
  166. % xlswrite('Torque_Id_Iq',Torque_all,'Torque');% xlswrite('Torque_Id_Iq',ID_all,'Id');
  167. % xlswrite('Torque_Id_Iq',IQ_all,'Iq');
  168. % xlswrite('Torque_Id_Iq',Speed_all,'Speed_all');
  169. %save('Torque_Id_Iq', 'Torque_all', 'ID_all', 'IQ_all','Speed_all');