前几天搜索模糊pi控制的相关仿真流程,发现csdn没有比较好的、完整的能跑出结果的模糊pid控制仿真模型。通过几天的学习和查阅文献,我现在将我仿真的步骤和出现的问题给大家分享一下,希望大家也一起交流一下自己的问题和心得。
首先我们要清晰的知道模糊pid的流程,这里简单和大家分享一下:
由上面的图我们可以知道,模糊pid需要确定隶属函数、控制规则,隶属函数是模糊化和反模糊化的关键。
接下来进入simulink模型搭建环节:
step1:在MATLAB命令行窗口中输入fuzzy——目的:打开模糊控制工具箱
输入命令后会弹出这样一个窗口
step2: 确定模糊控制量和模糊输出量
对于模糊pi控制,其结构框图如下:
由此可知,我们要设置的模糊控制工具箱的输入既为e、ec、和。
此处:e为实际值与给定值的差值。
ec为e的导数。
为Kp的增量。
为Ki的增量。
因此,我们在刚才打开的界面,点击左上角Add-Add variable-input增加一个输入,同理:Add-Add variable-output 增加一个输出。
到这一步我们为了与实际相符,更改一下他们的名字,既分别点击每一个框框,更改Name:
设置好就这样:
step3:确定隶属函数(输入、输出都要)——目的:为了模糊化和去模糊化
我们知道,隶属函数是针对输入、输出的,所以我们要打开确定隶属函数窗口的方法也就是双击输入or输出,打开的界面如下:
在这里,我们一般是用中间三角形的隶属函数,两边高斯型的隶属函数,对于这个框图,我们要了解这四个部分:
1)range
这个时设置输入、输出的边界,这里要根据你自己控制的策略去选择,这里我介绍我的设置方法,大家可以做一个例子。
在这里我首先定义,输入和输出的论域和隶属函数如下图:
一共七个等级,论域是【-3,3】(这个要记住哦!!!!后面会用到)
2)Name
大家可能好奇,为啥name都要拉出来,没错,这里我们要严格按照matlab初始的时候给我们的顺序来从左到右定义我们的等级,这样子后面写模糊规则会方便很多。
3)type
在这里,我们就用三角形和高斯,也就是我下图圈出来的部分:
3)Parms
我们知道 等腰三角形定点,分别是与X轴的交点和最高点,输入的这三个数既为与X轴的交点和最高点的横坐标,如:
这四个部分确定好了之后,这里介绍一下高斯函数怎么确定,可能大家觉得三角形定点好确定,那高斯怎么确定呢?我的做法是先把他当作三角形输入,再改变数据类型。
最后确定好的隶属函数图就如下所示:
同理,可以点击输入的另一个量和输出来输入相同的隶属函数。
step 4:确定模糊规则
这一部分就是要查文献啦,比如你研究的领域,肯定会有经验确定的模糊规则表,那我现在只说已经有了模糊控制表,要怎么表达到模糊工具箱。
双击中间这部分,就可以看到这样一个框图,里面的输入输出以及你定义每一个程度
都可以在这里找到:
那我们的控制规则,就是按照if(e is **)and(ec is **)then(d_Kp is **)(d_Ki is **)来书写的,具体方法就是如我现在写的第一条语句,就是点击下面这些再点击Add就可以显示在上面啦:
当然,比如你输错了或者错输,分别可以点击chang rule 和delete rule 。
遍历完所以的可能后,比如我现在是7个等级,那就是7*7=49种可能,也就是49条语句。
step5:在simulink实现模糊控制
首先我们键入以上数据后,右上角点击×,然后弹出save对话框,我们点yes,然后更改一下名字,方便后续simulink搭建:
然后点击我们要进行模糊pi控制的simulink系统,对于模糊控制部分,我们最好建立一个子系统,这样美观:
我们可以看到,差值进入模糊pi子系统后输出,这也另一个方面反应,其实我们的模糊pi实际上也是pi的功效,只不过是要确定更好的kp、ki参数。
模糊pi系统图如下:
对此,我们分别来讲述它的设置与作用:
1)PI controller
这里我用的是离散系统,所以 sample time取-1,同时我们知道,pi参数我们是通过模糊控制得出的,所以选择source为external。
2)Fuzzy Logic Controller
对于这个模型,因为我们刚才已经用工具箱设置了,所以,这里仅更改fis name为刚刚设置的名字。
3)saturation
这个模块一定要加,不然系统运行速度会因为成千上百条的警告而变得十分慢,而且会出不来效果,e和ec这里我都加了限幅模块,设置的上下限即为刚才隶属参数的论域。
4)zero order hold
这个模块我是看人家文献加的,离散的话可以加一下,效果可能会好点。
5)Kp、Ki计算
这个地方不要忘记,我们用模糊控制得出的是 和,所以在这之后,还要与我们通过经验调节的差不多的pi相加,才能得到真实的pi值。因为我之前设置好的pi差不多就是2.5和30,那我就在此基础上调节,用sum相加最后输入到picontroller就可以了。
以上就是整个pi系统的搭建,欢迎大家批评指正,也欢迎在评论区留言分享。