文章目录
最近正好做我旁边的兄弟一直在做simulink仿真飞行器的设计,我一时兴起,就也想来试试看看会有什么效果,于是决定来上手摸一摸看看咋样,使用之后感觉simulink的功能还是很强大的,可以作为一个不错的学习了解的工具。
下面就来记录下我的整个过程,同时本文多有参考,非常感谢各位大佬提供的参考!
1、使用simulink搭建PID框架
1、使用官方PID框架
这里我使用的平台为MATLAB2017b,个人觉得只要版本高于或者等于这个就可以了。
首先还是我们启动下simulink
这里新建一个空的模版工程,这里我看我隔壁同学是全中文版的,属实要舒服不少,我这里碰到不知道的还要翻译,有点难受
刚进来我们可以先就是设置下我们的仿真环境,点击设置就可以看到了
修改为指定补步长并且离散,这里的时间步长我们可以适当设置,比如我这里设置为1ms,他这里单位都是秒,一般我们做一下控制的时候也都是ms级别的,考虑到我们电脑性能这么优秀,所以完全设置为1ms就OK了
下面就是托块了,也是非常方便的,就是在库里面掉一些东西来用,当然我们这里就不需要调用了,直接双击就可以了
当然想要看的更详细还是调出来看看到底是什么情况的好
所以我们这里要调用PID,也只需要直接输入即可
这样我们就可以凑齐我们这个函数需要的所有部分了,如下所示,从左到右分别是:输入,加法,PID计算,传递函数,最后是显示器。
这里我想大部分的应该都了解,唯独差异就在传递函数上面,那么什么是传递函数呢,这个样子的传递函数又是什么意思呢,我查看了matlab的官方文档,(网址:https://ww2.mathworks.cn/help/simulink/slref/transferfcn.html)解释如下:
可以看出这个函数还是比较复杂的,咱也不管那么多了,这里只是使用,他这里是给线性系统使用的,因此我们这里使用这个问题应该不大,然后就是这个函数的修改,我们可以双击查看这个函数,可以看到他将系数用数组的形式表示了出来,我们也只需要修改这个数组即可改变这个传递函数了
比如我将其修改为如下形式
这样我们就知道如何修改这些参数了,下面我为了比较方便将这个系统改为复制为三项
但是这样还不够,因为控制系统都是有延迟的,所以为了逼近真实的控制系统我们在这里也加入延时的模块,如下所示:
这里我设置延时时间为1ms
同时为了看到纯P调节的效果,我们这里在设置下不同的PID参数,这里三个参数分别设置为5,20,以及80,
点击运行我们可以看到结果如下所示:可以看到红线表示的,就是第三个PID已经出现了超调的现象,同时也是最快的一个接近目标的,但是他仍存在误差
为了能更好的看到净差,我们这里加一个单一的信号看看
再次运行可以看到结果如下,可以看到,即使是KP给了一个很大的值之后仍是存在这一个很小的净差
因此我们下面就可以来修改净差,将PID参数添加I的参数,这里我设置I为5,KP=20,效果如下,可以看到净差消除(绿线)
然后我们将I进一步增大,就可以看大I造成的系统震荡了
当然D具有超纤预测的功能,可以减小这个震荡,这里我就不一一截图了,感兴趣的可以自己尝试。
2、从PID的原理搭建
我们都知道PID是由比例,积分,微分三个环节构成的,因此根据这个理论环节就可以搭建起来PID,包括我们平时在控制电机的时候也可以就是用这样方法来配置PID(就是代码离散化PID的参数)
这里搭建如下所示:
运用这一套我们也可以和上面一样来测试效果,基本上式一样的,这里就懒得截图了。
3、调节分析
这里还是记录下PID的调试经验以及经验上的总结吧,PID控制器的框图如下所示:
三个环节的作用分别为:
-
比例环节的作用
1、对偏差量e(t)瞬间作出反应,只与当前的偏差有关,产生相应的控制量u(t)。
2、控制作用的强弱取决于比例系数Kp ,Kp越大,作用越强,过程越快,静态偏差也就越小,但是Kp越大,也越容易产生振荡,增加系统的超调量,系统的稳定性会变差。
-
积分环节的作用
1、只要偏差e(t)存在,积分作用就会就不断的增加(条件是控制器没有饱和),偏差e(t)就不断减小,当偏差e(t)=0时,积分控制作用才会停止。
2、积分控制会降低系统的响应速度,积分作用太强会增加系统的超调量,系统的稳定性会变差。
-
微分环节的作用
1、微分环节可以根据偏差e(t)的变化趋势(变化速度)预先给出纠正作用,能在偏差变大之前进行修正。
2、有助于减小超调量,克服振荡,使系统趋于稳定,它加快了系统的跟踪速度,减少调节时间。
3、微分作用对输入信号的噪声很敏感,对那些噪声较大的系统一般不用微分,或在微分之前先对输入信号进行滤波
上面是教科书的理解,但实际情况下我看来,积分是会加速相应的,这里加速响应是更快的接近目标,因为单纯靠增大P去让系统更快的接近目标效果不明显,但是I具有明显的效果,但是I稍微偏大就容易造成超调,导致系统反复震荡,所以其实I是个很复杂的参数!
2、simulink联合cubumx生成代码
1、单级PID生成测试
这里我们首先要安装一个包,我这里用的包名称为:STM32MatTarget 4.4.2 setup.zip,这里我看ST官网也提到了这个包,需要的可以自行百度搜索下载;
下载完之后点击EXE安装即可,他会自动匹配到我们电脑安装matlab的位置,安装到那个路径下面的
下一步我们就可以导入包进行测试了,输入如下命令,
然后选择添加并包含子文件夹
将我们的包的位置导入即可,我这里的路径如下,仅供参考
下面我们就可以打开cubemx创建一个空的工程了,什么都不需要配置(当然也可以什么都配置),这个不影响,之后在生成即可,这里我选的编译器是KEIL的编译器
下面就还是输入simulink了,首先还是参数配置
这里我们再生成代码这里要做一下选择,选择成stm32的
选择cubemx的路径,会自动匹配电脑上的cubemx路径位置
这里我们输入stm32,就可以看到stm32的配置了
之后双击就可以选择我们刚才选择的IOC文件了
这样我们就可以看到我们配置的芯片型号如下,还是比较正常的
之后我们就可以按照上面的方法来配置PID控制器了,搭建的框图如下所示:
这里我们跟之前的PID的框图不一样,我们稍微做下修改
之后我们就可以按下CTRL+B进行构建了,构建完成之后我们再次双击我们的STM32的图标,在里面打开IOC,我们在ioc再次生成一次代码即可
点击生成:
这样我们打开Keil就可以看到我们多出了文件夹
打开就可以看到我们的PID函数了
打开.h文件可以看到我们定义的参数结构体
我们也可以编译下,这里我编译也是OK的。
2、串级PID生成测试
那么下面我们就来尝试下搭建一个串级PID,就以角度和速度这个比较常见的电机模型来说吧。
这里我搭建的模型如下
可以看到角度环输出作为了速度环的输入,同时反馈量有真实速度和真实角度两个变量,最终输出定义为PWM,我们再次生成代码,这样就把我们刚才搭建的模型整理出来了。
3、对于串级PID的理解