永磁同步電機由于其轉(zhuǎn)動慣量低、效率高、控制方式便捷等優(yōu)點,已成為當(dāng)今伺服系統(tǒng)中最佳的執(zhí)行結(jié)構(gòu)之一。速度、位置和電流組成了永磁同步電機伺服控制系統(tǒng)。實際控制的過程中,電機所帶的轉(zhuǎn)動慣量和負(fù)載轉(zhuǎn)矩都會對系統(tǒng)的伺服性能造成不良的影響。高性能的永磁同步電機伺服控制系統(tǒng)需具備:穩(wěn)態(tài)、抗干擾和魯棒性強的特點。因此,針對永磁同步電機的控制策略需要很強的時變性和抗干擾性。
傳統(tǒng)的控制策略有PID控制方法。PID控制策略由于其易實現(xiàn)、結(jié)構(gòu)簡單常應(yīng)用于伺服系統(tǒng)中。但是當(dāng)永磁同步電機受到外界因素干擾時,該方法往往無法保證得到理想的控制性能。目前,針對永磁同步電機的控制方法專家學(xué)者們提出了很多的方法。包括:滑??刂?、智能算法控制及自適應(yīng)控制等。
(資料圖片)
模糊PID控制方法是一種利用模糊控制器實現(xiàn)整定PID控制器參數(shù)的控制方法,其即有模糊控制器不依賴控制對象數(shù)學(xué)模型的優(yōu)點,也具有PID控制器良好的穩(wěn)態(tài)精度。因此,本期對永磁同步電機(以下簡稱PMSM)模型和矢量控制算法進行了分析,設(shè)計了一種基于模糊PID的復(fù)合控制策略,基于Simulink環(huán)境仿真下的結(jié)果表明,模糊PID控制具有良好的魯棒性。
1、永磁同步電機原理
2、模糊PID控制器
模糊PID控制器可以根據(jù)PID參數(shù)整定經(jīng)驗或方法獲得可行的控制效果,但整定過程具有一定盲目性;盡管初始論域、初始規(guī)則通過在線調(diào)整一般能保證系統(tǒng)的穩(wěn)定性,但規(guī)則本身往往存在一定的粗造性和冗余性,帶來在線調(diào)整時間長等問題。模糊控制器的結(jié)構(gòu)如下圖所示:
把輸入的精確量進行模糊化變成模糊量,得到的模糊量可用相應(yīng)的模糊語言表示,再由模糊控制規(guī)則根據(jù)推理的合成規(guī)則進行模糊決策,得到模糊控制量,最后進行解模糊處理,得到精確的控制量輸入系統(tǒng)。
(1)論域和比例因子量化因子的選擇
模糊控制器的輸入輸出都是精確數(shù)值,而模糊推理的決策量都是模糊值。為了進行模糊化處理,需要將輸入輸出變量從基本論域轉(zhuǎn)化到相應(yīng)的模糊論域中去。
設(shè)置誤差、誤差變化率、Kp和Ki的基本論域分別為:
則,誤差的量化因子Ke、誤差變化率的量化因子Kec、輸出控制量的比例因子Kup和Kui可表示為:
合理的選擇一個模糊控制器的輸入變量的量化因子和輸出控制量的比例因子是非常重要的。試驗結(jié)果表明,量化因子和比例因子的大小及其不同量化因子之間的大小的相對關(guān)系,對模糊控制器的性能影響很大。實際過程中,需要根據(jù)系統(tǒng)要求的性能調(diào)節(jié)適合的量化因子和比例因子。
(2)模糊控制規(guī)則
這里主要以Matlab/Simulink的形式展示:
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 endelse if fis.inputFuzzySetType==1 [antecedentOutputs,sumAntecedentOutputs] = ... fuzzy.internal.codegen.evaluateRuleAntecedent(... inputs,fis,diagnostics); else [antecedentOutputs,sumAntecedentOutputs] = ... fuzzy.internal.codegen.evaluateRuleAntecedentType2(... inputs,fis,diagnostics); endendend
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 endelse 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 endendend
function defuzzifiedOutputs = fcn(sumAntecedentOutputs,... aggregatedOutputs,fis,samplePoints,SimulateUsing,diagnostics)if SimulateUsing==1 && coder.internal.canUseExtrinsic ... && (isa(aggregatedOutputs,"double") || isa(aggregatedOutputs,"single")) defuzzifiedOutputs = zeros(fis.numOutputs,1,"like",aggregatedOutputs); if fis.inputFuzzySetType==1 if strcmp(char(fis.type),"mamdani") if isa(aggregatedOutputs,"double") defuzzifiedOutputs(:) = feval(["fuzzy.internal.codegen." ... "applyMamdaniDefuzzificationMethod_double_mex"],... samplePoints,sumAntecedentOutputs,aggregatedOutputs, ... fis,diagnostics); else defuzzifiedOutputs(:) = feval(["fuzzy.internal.codegen." ... "applyMamdaniDefuzzificationMethod_single_mex"],... samplePoints,sumAntecedentOutputs,aggregatedOutputs, ... fis,diagnostics); end else if isa(aggregatedOutputs,"double") defuzzifiedOutputs(:) = feval(["fuzzy.internal.codegen." ... "applySugenoDefuzzificationMethod_double_mex"],... sumAntecedentOutputs,aggregatedOutputs, ... fis,diagnostics); else defuzzifiedOutputs(:) = feval(["fuzzy.internal.codegen." ... "applySugenoDefuzzificationMethod_single_mex"],... sumAntecedentOutputs,aggregatedOutputs, ... fis,diagnostics); end end else if strcmp(char(fis.type),"mamdani") if isa(aggregatedOutputs,"double") defuzzifiedOutputs(:) = feval(["fuzzy.internal.codegen." ... "applyMamdaniDefuzzificationMethodType2_double_mex"],... samplePoints,sumAntecedentOutputs,aggregatedOutputs, ... fis,diagnostics); else defuzzifiedOutputs(:) = feval(["fuzzy.internal.codegen." ... "applyMamdaniDefuzzificationMethodType2_single_mex"],... samplePoints,sumAntecedentOutputs,aggregatedOutputs, ... fis,diagnostics); end else if isa(aggregatedOutputs,"double") defuzzifiedOutputs(:) = feval(["fuzzy.internal.codegen." ... "applySugenoDefuzzificationMethodType2_double_mex"],... sumAntecedentOutputs,aggregatedOutputs, ... fis,diagnostics); else defuzzifiedOutputs(:) = feval(["fuzzy.internal.codegen." ... "applySugenoDefuzzificationMethodType2_single_mex"],... sumAntecedentOutputs,aggregatedOutputs, ... fis,diagnostics); end end endelse if fis.inputFuzzySetType==1 if isequal(fis.type,uint8("mamdani")) defuzzifiedOutputs = ... fuzzy.internal.codegen.applyMamdaniDefuzzificationMethod(... samplePoints,sumAntecedentOutputs,aggregatedOutputs, ... fis,diagnostics); else defuzzifiedOutputs = ... fuzzy.internal.codegen.applySugenoDefuzzificationMethod(... sumAntecedentOutputs,aggregatedOutputs,fis,diagnostics); end else if isequal(fis.type,uint8("mamdani")) defuzzifiedOutputs = ... fuzzy.internal.codegen.applyMamdaniDefuzzificationMethodType2(... samplePoints,sumAntecedentOutputs,aggregatedOutputs, ... fis,diagnostics); else defuzzifiedOutputs = ... fuzzy.internal.codegen.applySugenoDefuzzificationMethodType2(... sumAntecedentOutputs,aggregatedOutputs,fis,diagnostics); end endendend
(3)模糊推理及解模糊化
3、仿真驗證
為驗證算法的可行性,基于Simulink搭建永磁同步電機仿真模型。
本期對基于矢量控制策略的永磁同步電機數(shù)學(xué)模型進行了分析,根據(jù)系統(tǒng)性能需要,提出了模糊PID策略,將其應(yīng)用到基于矢量控制的永磁同步電機伺服系統(tǒng)中,對系統(tǒng)負(fù)載擾動和慣量擾動的仿真結(jié)果表明,相對于傳統(tǒng)PID控制器,模糊PID控制器具有更好的動靜態(tài)性能和魯棒性。
標(biāo)簽: