浅析基于模糊PID的永磁同步电机矢量控制

永磁同步电机由于其转动惯量低、效率高、控制方式便捷等优点,已成为当今伺服系统中最佳的执行结构之一。速度、位置和电流组成了永磁同步电机伺服控制系统。实际控制的过程中,电机所带的转动惯量和负载转矩都会对系统的伺服性能造成不良的影响。高性能的永磁同步电机伺服控制系统需具备:稳态、抗干扰和鲁棒性强的特点。因此,针对永磁同步电机的控制策略需要很强的时变性和抗干扰性。
传统的控制策略有pid控制方法。pid控制策略由于其易实现、结构简单常应用于伺服系统中。但是当永磁同步电机受到外界因素干扰时,该方法往往无法保证得到理想的控制性能。目前,针对永磁同步电机的控制方法专家学者们提出了很多的方法。包括:滑模控制、智能算法控制及自适应控制等。
模糊pid控制方法是一种利用模糊控制器实现整定pid控制器参数的控制方法,其即有模糊控制器不依赖控制对象数学模型的优点,也具有pid控制器良好的稳态精度。因此,本期对永磁同步电机(以下简称pmsm)模型和矢量控制算法进行了分析,设计了一种基于模糊pid的复合控制策略,基于simulink环境仿真下的结果表明,模糊pid控制具有良好的鲁棒性。
1、永磁同步电机原理
2、模糊pid控制器
模糊pid控制器可以根据pid参数整定经验或方法获得可行的控制效果,但整定过程具有一定盲目性;尽管初始论域、初始规则通过在线调整一般能保证系统的稳定性,但规则本身往往存在一定的粗造性和冗余性,带来在线调整时间长等问题。模糊控制器的结构如下图所示:
把输入的精确量进行模糊化变成模糊量,得到的模糊量可用相应的模糊语言表示,再由模糊控制规则根据推理的合成规则进行模糊决策,得到模糊控制量,最后进行解模糊处理,得到精确的控制量输入系统。
(1)论域和比例因子量化因子的选择
模糊控制器的输入输出都是精确数值,而模糊推理的决策量都是模糊值。为了进行模糊化处理,需要将输入输出变量从基本论域转化到相应的模糊论域中去。
设置误差、误差变化率、kp和ki的基本论域分别为:
则,误差的量化因子ke、误差变化率的量化因子kec、输出控制量的比例因子kup和kui可表示为:
合理的选择一个模糊控制器的输入变量的量化因子和输出控制量的比例因子是非常重要的。试验结果表明,量化因子和比例因子的大小及其不同量化因子之间的大小的相对关系,对模糊控制器的性能影响很大。实际过程中,需要根据系统要求的性能调节适合的量化因子和比例因子。
(2)模糊控制规则
这里主要以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); endendendfunction 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 endendendfunction 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搭建永磁同步电机仿真模型。
本期对基于矢量控制策略的永磁同步电机数学模型进行了分析,根据系统性能需要,提出了模糊pid策略,将其应用到基于矢量控制的永磁同步电机伺服系统中,对系统负载扰动和惯量扰动的仿真结果表明,相对于传统pid控制器,模糊pid控制器具有更好的动静态性能和鲁棒性。

LCD屏不能使用指纹识别吗,此问题现已被解决
触摸式高频M1卡智能水表的工作原理及设计
虹科分享 | 谈一谈俄乌大地优秀的AR技术
机器视觉的下一个阶段可能就是机器学习
空闲模式下的UE
浅析基于模糊PID的永磁同步电机矢量控制
荣耀9、荣耀V9对比评测:华为荣耀9与华为荣耀V9外观、配置、价格对比,荣耀9与V9该如何选择?
科创板福光股份独立董事冯玲介绍、履历信息
多用户环境下阵列响应的闭式盲估计方法
三星HDMI2.1接口QLED电视,给你带来视觉上的享受
电容的表示方法都有哪些?
盘点半导体分立器件国内主要厂商
从大数据角度洞察了疫情影响下,国人云健身的健康宅生活
魅族ZERO无孔手机众筹失败 一加7的真机照疑似曝光
IBM:银行积极转型变革,传统金融企业从焦虑到突围
AR眼镜公司ODG完成5800万美元A轮融资
DC/DC电源模块高温失效原因分析
富士通F-01B手机选用Cypress TrueTouch触
工程师职称究竟有啥用
3分钟轻松实现网关网口远程监控安川PLC