永磁同步電機(jī)由于其轉(zhuǎn)動(dòng)慣量低、效率高、控制方式便捷等優(yōu)點(diǎn),已成為當(dāng)今伺服系統(tǒng)中最佳的執(zhí)行結(jié)構(gòu)之一。速度、位置和電流組成了永磁同步電機(jī)伺服控制系統(tǒng)。實(shí)際控制的過(guò)程中,電機(jī)所帶的轉(zhuǎn)動(dòng)慣量和負(fù)載轉(zhuǎn)矩都會(huì)對(duì)系統(tǒng)的伺服性能造成不良的影響。高性能的永磁同步電機(jī)伺服控制系統(tǒng)需具備:穩(wěn)態(tài)、抗干擾和魯棒性強(qiáng)的特點(diǎn)。因此,針對(duì)永磁同步電機(jī)的控制策略需要很強(qiáng)的時(shí)變性和抗干擾性。
傳統(tǒng)的控制策略有PID控制方法。PID控制策略由于其易實(shí)現(xiàn)、結(jié)構(gòu)簡(jiǎn)單常應(yīng)用于伺服系統(tǒng)中。但是當(dāng)永磁同步電機(jī)受到外界因素干擾時(shí),該方法往往無(wú)法保證得到理想的控制性能。目前,針對(duì)永磁同步電機(jī)的控制方法專(zhuān)家學(xué)者們提出了很多的方法。包括:滑模控制、智能算法控制及自適應(yīng)控制等。
模糊PID控制方法是一種利用模糊控制器實(shí)現(xiàn)整定PID控制器參數(shù)的控制方法,其即有模糊控制器不依賴(lài)控制對(duì)象數(shù)學(xué)模型的優(yōu)點(diǎn),也具有PID控制器良好的穩(wěn)態(tài)精度。因此,本期對(duì)永磁同步電機(jī)(以下簡(jiǎn)稱(chēng)PMSM)模型和矢量控制算法進(jìn)行了分析,設(shè)計(jì)了一種基于模糊PID的復(fù)合控制策略,基于Simulink環(huán)境仿真下的結(jié)果表明,模糊PID控制具有良好的魯棒性。
1、永磁同步電機(jī)原理
2、模糊PID控制器
模糊PID控制器可以根據(jù)PID參數(shù)整定經(jīng)驗(yàn)或方法獲得可行的控制效果,但整定過(guò)程具有一定盲目性;盡管初始論域、初始規(guī)則通過(guò)在線(xiàn)調(diào)整一般能保證系統(tǒng)的穩(wěn)定性,但規(guī)則本身往往存在一定的粗造性和冗余性,帶來(lái)在線(xiàn)調(diào)整時(shí)間長(zhǎng)等問(wèn)題。模糊控制器的結(jié)構(gòu)如下圖所示:
把輸入的精確量進(jìn)行模糊化變成模糊量,得到的模糊量可用相應(yīng)的模糊語(yǔ)言表示,再由模糊控制規(guī)則根據(jù)推理的合成規(guī)則進(jìn)行模糊決策,得到模糊控制量,最后進(jìn)行解模糊處理,得到精確的控制量輸入系統(tǒng)。
(1)論域和比例因子量化因子的選擇
模糊控制器的輸入輸出都是精確數(shù)值,而模糊推理的決策量都是模糊值。為了進(jìn)行模糊化處理,需要將輸入輸出變量從基本論域轉(zhuǎn)化到相應(yīng)的模糊論域中去。
設(shè)置誤差、誤差變化率、Kp和Ki的基本論域分別為:
則,誤差的量化因子Ke、誤差變化率的量化因子Kec、輸出控制量的比例因子Kup和Kui可表示為:
合理的選擇一個(gè)模糊控制器的輸入變量的量化因子和輸出控制量的比例因子是非常重要的。試驗(yàn)結(jié)果表明,量化因子和比例因子的大小及其不同量化因子之間的大小的相對(duì)關(guān)系,對(duì)模糊控制器的性能影響很大。實(shí)際過(guò)程中,需要根據(jù)系統(tǒng)要求的性能調(diào)節(jié)適合的量化因子和比例因子。
(2)模糊控制規(guī)則
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