记得在做测温仪校准台的时候,在做到用PID算法控制温度的时候,对于PID算法的理解的过程很难受也很纠结,尽管有凤舞天和tomsu两位大师在旁边指导还是费了不少时间和精力去理解、领悟和调试。后来另外一个同事需要做高频加热设备的温度控制,也需要用到PID算法对温度的控制,因为这位同事是今年刚毕业的大学生,在学校主要是学软件,基本上没有什么硬件基础,所以她对整个温度控制很难理解和领悟,对PWM的理解刚开始总是很难精确,所以在她做温控的过程更加的纠结和痛苦,同事耗费的时间、精力和人力(需要在旁边指导的同事)也更大。并且她的经历跟我的经历是重复的,在我经历过一遍之后她又按照我走过的经历再经历一遍,这种重复的工作对公司来说是一种很严重的人力资源的浪费。对于一个公司来说,人力资源是最宝贵的一种资源。
而在工控行业,PID算法是软件控制所常用的一种算法,所以对于我们嵌入式组来说,基本上是需要每个人都会用的。那么我们就必须要找到一种方法既能降低学习成本,又能统一软件,降低维护成本,而且还简单、易学、易用。所以,凤舞天建议我先在msOS的基础上添加一个PID算法库的试用实例,面向对象的,把算法都封装在底层,用户只需要调节相对应的门限值和系数就行。
那么我们来介绍一下PID算法库的分层。
msOS是采用分层的,整个系统分为App和System两个目录:
而System是系统库。我们把PID库添加在System目录下,以实现真正的库封装。
在PID目录下,包含Pid.c和Pid.h两个文件。
首先我们从PID库的应用开始入手。我们把用户根据实际情况需要调整的参数做成界面菜单放在event.c文件中。用户可以根据特定需求来更改目标值TargetPointer和获取当前值CurrentPointer;也可以根据控制过程所需要的控制曲线来定P、I、D引入的门限值;还可以设置运算过程中P、I、D的系数和积分处理的模式,用户只需要对此进行注册即可。同时需要对在底层运算后传上来的结果进行怎样的处理在static void Mycallback( int data)中进行控制。
那么该怎样去调节这些参数就得需要我们了解PID的原理和物理意义了。
其实关于PID算法的文章网上很多,可基本上都是基于数学模型讲解的,很难理解也很难运用,后来凤舞天也写了一篇《PID算法》,深入浅出,比较通俗易懂。而作者结合具体项目的实践,和对PID算法理论的理解,简单总结了一下:
P是根据测量值和目标值的误差来决定的负反馈的大小。P的取得公式:P=系数*(目标值-当前值)。但是如果一开始就引入负反馈,很有可能达不到目标值,所以需要设定引入负反馈的门限值。而在引入负反馈门限值之前,如果(目标值-当前值)大于负反馈引入门限值应当全速加热;如果(目标值-当前值)小于负反馈引入门限值应当全速减。
I就是积分,也就是极限误差。当目标值和当前值很接近的时候,如果继续只根据负反馈来调节,那么有可能与目标值产生误差值,而达不到目标值,所以这时候需要引入一个趋势与负反馈相同的期望值来消除这个误差。把这些误差累加起来正向反馈给结果来抑制负反馈,在正负反馈的共同作用下当前值逐渐逼近目标值。
D是为了防止在当前值在P和I的正负反馈作用下出现过冲或者还没达到目标值的情况下更快速的稳定下来而引入的。所以D的门限值不宜太高,应该取比较接近目标值的门限,这样可以减小当前值的振荡,使其更快速的稳定。
接下来我们来分析分析PID算法库的底层。
首先是定义一个PID的结构体:
然后通过注册方式来获取应用层给不同参数的赋值。
在获取了参数之后,就开始PID运算。PID的运算原理就是前面我们所提到的。在这里我们使用systemtick每个10ms调用一次,来确保实时、稳定的控温。
在这个PID运算中,我们为了让计算结果更能符合控制逻辑的曲线分布,提供了三种积分模式:LineMode(线性模式)、TwoRootMode(开二次方根号模式)、ThreeRootMode(开三次方根号模式)。
关于这三种积分模式,作者以测温仪校准台为基础(校准台的发热体是氮化硅)做了三组测试并获取了数据绘制成曲线图来做分析。
在这三组测试中,我们设目标温度都为800度,负反馈门限、负反馈系数、积分门限、微分门限都相同,取积分模式和积分系数不相同。在积分线性模式下积分系数为0.02,二次根号和三次根号积分模式下,积分系数为1。
在线性积分系数远小于开根号的积分系数的情况下,其稳定的波形还是没有开根号的平滑,稳定。
此图为线性积分模式在引入积分和微分后的温度趋于稳定过程的PWM输出。可以看到,在PWM输出稳定之前还会有一个小的波峰。这个波峰的幅度大小就取决于积分系数的大小。
而这两个图是积分模式取开二次方和三次方根号在引入积分和微分后的温度趋于稳定过程PWM的输出。可以看出即使积分系数为1,开根号的次方数越多,在PWM输出稳定之前,它的曲线越平滑。
文章评论(0条评论)
登录后参与讨论