永磁同步電機由于其轉動慣量低、效率高、控制方式便捷等優點,已成為當今伺服系統中最佳的執行結構之一。速度、位置和電流組成了永磁同步電機伺服控制系統。實際控制的過程中,電機所帶的轉動慣量和負載轉矩都會對系統的伺服性能造成不良的影響。高性能的永磁同步電機伺服控制系統需具備:穩態、抗干擾和魯棒性強的特點。因此,針對永磁同步電機的控制策略需要很強的時變性和抗干擾性。
傳統的控制策略有PID控制方法。PID控制策略由于其易實現、結構簡單常應用于伺服系統中。但是當永磁同步電機受到外界因素干擾時,該方法往往無法保證得到理想的控制性能。目前,針對永磁同步電機的控制方法專家學者們提出了很多的方法。包括:滑模控制、智能算法控制及自適應控制等。
模糊PID控制方法是一種利用模糊控制器實現整定PID控制器參數的控制方法,其即有模糊控制器不依賴控制對象數學模型的優點,也具有PID控制器良好的穩態精度。因此,本期對永磁同步電機(以下簡稱PMSM)模型和矢量控制算法進行了分析,設計了一種基于模糊PID的復合控制策略,基于Simulink環境仿真下的結果表明,模糊PID控制具有良好的魯棒性。
1、永磁同步電機原理
2、模糊PID控制器
模糊PID控制器可以根據PID參數整定經驗或方法獲得可行的控制效果,但整定過程具有一定盲目性;盡管初始論域、初始規則通過在線調整一般能保證系統的穩定性,但規則本身往往存在一定的粗造性和冗余性,帶來在線調整時間長等問題。模糊控制器的結構如下圖所示:
把輸入的精確量進行模糊化變成模糊量,得到的模糊量可用相應的模糊語言表示,再由模糊控制規則根據推理的合成規則進行模糊決策,得到模糊控制量,最后進行解模糊處理,得到精確的控制量輸入系統。
(1)論域和比例因子量化因子的選擇
模糊控制器的輸入輸出都是精確數值,而模糊推理的決策量都是模糊值。為了進行模糊化處理,需要將輸入輸出變量從基本論域轉化到相應的模糊論域中去。
設置誤差、誤差變化率、Kp和Ki的基本論域分別為:
則,誤差的量化因子Ke、誤差變化率的量化因子Kec、輸出控制量的比例因子Kup和Kui可表示為:
合理的選擇一個模糊控制器的輸入變量的量化因子和輸出控制量的比例因子是非常重要的。試驗結果表明,量化因子和比例因子的大小及其不同量化因子之間的大小的相對關系,對模糊控制器的性能影響很大。實際過程中,需要根據系統要求的性能調節適合的量化因子和比例因子。
(2)模糊控制規則
function [antecedentOutputs,sumAntecedentOutputs] = fcn(inputs, ...
fis,SimulateUsing,diagnostics)
if SimulateUsing==1 && coder.internal.canUseExtrinsic ...
&& (isa(inputs,'double') || isa(inputs,'single'))
antecedentOutputs = zeros(fis.rfsSize,'like',inputs);
sumAntecedentOutputs = zeros(fis.sumSize,'like',inputs);
if fis.inputFuzzySetType==1
if isa(inputs,'double')
[antecedentOutputs(:),sumAntecedentOutputs(:)] = feval(...
'fuzzy.internal.codegen.evaluateRuleAntecedent_double_mex',...
inputs,fis,diagnostics);
else
[antecedentOutputs(:),sumAntecedentOutputs(:)] = feval(...
'fuzzy.internal.codegen.evaluateRuleAntecedent_single_mex',...
inputs,fis,diagnostics);
end
else
if isa(inputs,'double')
[antecedentOutputs(:),sumAntecedentOutputs(:)] = feval(...
'fuzzy.internal.codegen.evaluateRuleAntecedentType2_double_mex',...
inputs,fis,diagnostics);
else
[antecedentOutputs(:),sumAntecedentOutputs(:)] = feval(...
'fuzzy.internal.codegen.evaluateRuleAntecedentType2_single_mex',...
inputs,fis,diagnostics);
end
end
else
if fis.inputFuzzySetType==1
[antecedentOutputs,sumAntecedentOutputs] = ...
fuzzy.internal.codegen.evaluateRuleAntecedent(...
inputs,fis,diagnostics);
else
[antecedentOutputs,sumAntecedentOutputs] = ...
fuzzy.internal.codegen.evaluateRuleAntecedentType2(...
inputs,fis,diagnostics);
end
end
end
function aggregatedOutputs = fcn(inputs,antecedentOutputs, ...
fis,samplePoints,SimulateUsing)
if SimulateUsing==1 && coder.internal.canUseExtrinsic ...
&& (isa(inputs,'double') || isa(inputs,'single'))
aggregatedOutputs = zeros(fis.aggSize,'like',inputs);
if fis.inputFuzzySetType==1
if strcmp(char(fis.type),'mamdani')
if isa(inputs,'double')
aggregatedOutputs(:) = feval(['fuzzy.internal.codegen.' ...
'evaluateRuleConsequentForMamdaniFIS_double_mex'],...
antecedentOutputs,fis,samplePoints);
else
aggregatedOutputs(:) = feval(['fuzzy.internal.codegen.' ...
'evaluateRuleConsequentForMamdaniFIS_single_mex'],...
antecedentOutputs,fis,samplePoints);
end
else
if isa(inputs,'double')
aggregatedOutputs(:) = feval(['fuzzy.internal.codegen.' ...
'evaluateRuleConsequentForSugenoFIS_double_mex'],...
inputs,antecedentOutputs,fis);
else
aggregatedOutputs(:) = feval(['fuzzy.internal.codegen.' ...
'evaluateRuleConsequentForSugenoFIS_single_mex'],...
inputs,antecedentOutputs,fis);
end
end
else
if strcmp(char(fis.type),'mamdani')
if isa(inputs,'double')
aggregatedOutputs(:) = feval(['fuzzy.internal.codegen.' ...
'evaluateRuleConsequentForMamdaniFISType2_double_mex'],...
antecedentOutputs,fis,samplePoints);
else
aggregatedOutputs(:) = feval(['fuzzy.internal.codegen.' ...
'evaluateRuleConsequentForMamdaniFISType2_single_mex'],...
antecedentOutputs,fis,samplePoints);
end
else
if isa(inputs,'double')
aggregatedOutputs(:) = feval(['fuzzy.internal.codegen.' ...
'evaluateRuleConsequentForSugenoFISType2_double_mex'],...
inputs,antecedentOutputs,fis);
else
aggregatedOutputs(:) = feval(['fuzzy.internal.codegen.' ...
'evaluateRuleConsequentForSugenoFISType2_single_mex'],...
inputs,antecedentOutputs,fis);
end
end
end
else
if fis.inputFuzzySetType==1
if strcmp(char(fis.type),'mamdani')
aggregatedOutputs = ...
fuzzy.internal.codegen.evaluateRuleConsequentForMamdaniFIS(...
antecedentOutputs,fis,samplePoints);
else
aggregatedOutputs = ...
fuzzy.internal.codegen.evaluateRuleConsequentForSugenoFIS(...
inputs,antecedentOutputs,fis);
end
else
if strcmp(char(fis.type),'mamdani')
aggregatedOutputs = ...
fuzzy.internal.codegen.evaluateRuleConsequentForMamdaniFISType2(...
antecedentOutputs,fis,samplePoints);
else
aggregatedOutputs = ...
fuzzy.internal.codegen.evaluateRuleConsequentForSugenoFISType2(...
inputs,antecedentOutputs,fis);
end
end
end
end