PID温控实验平台搭建
文章目录
前言
最近,我突发奇想去翻阅了一些我本科期间所做的一些小项目,发现都挺有意思的!当年做这些项目的时候可走了很多弯路,所以想着可以将它们上传到网络上,并通过我的讲解文章可以帮助你们少走一些弯路!
今天,我要分享的是一个PID温控实验平台的搭建,因为我想要讲的详细一点,所以打算做成一个系列,手把手地教你学习和认识PID算法,了解这种算法在温度控制中的应用。由于我知识有限,如果出现一些错误,希望大家可以帮助我指出来,我们一起学习进步!!!
一、PID整定步骤
PID整定即PID参数整定。PID控制器中,需对P、I、D三个参数进行设置,一般通过工程人员的经验技巧进行凑试,此过程即为PID整定,本文介绍的是凑试法整定PID。尽管PID的调节效果比PI算法、PD算法要好,但如果一旦整定不合适,系统将会表现出不稳定的状态,反而适得其反!一般可按照:先比例,再积分,然后才把微分加上。
第一步 调节比例P
先对Kp从小到大地调,调到什么程度?尽可能地大,本着超调小、反应快的原则去选择Kp的值!Kp越大,曲线的斜率越大,达到期望值的速度越快,系统的反应也会越快!但过大会出现较为严重的过冲,导致曲线震荡严重,很长时间才会稳定下来!

第二步 调节积分I
确定好Kp的值后,接下来,从小到大地确定Ki的值,目标是消除余差,我们只要确保Kp所引起的余差被消除就可以。在这里Ki越大,积分时间越短,响应速度就越慢,曲线会出现偏离回复慢的现象;反之,Ki越小,积分时间就越长,响应速度就越快,曲线会出现波动周期长的毛病!

第三步 调节微分D
确定好Kp和Ki时,此时的曲线经过一定时间就可以保持在目标值附近,但是在引入Ki后,由于前期误差的积累,曲线的峰值会变高,而且有一定的震荡时间才能达到目标值。我们还是从小到大地调节Kd,一直调节反复比对,最终获得超调量小、震荡幅度小、达到稳定时间短的曲线!Kd过大就会出现噪声的情况,曲线会变得很奇怪!

系统的三大性能(稳定性能,动态性能,暂态性)能是不可能三角的关系,我们不可能获得稳定性能好、动态性能好、暂态性好的系统。所以我们必须根据我们的调节目标,确定合适的PID参数,进而获得我们想要的效果!

PID整定口诀:
参数整定找最佳,从小到大顺序查;
先是比例后积分,最后再把微分加;
曲线振荡很频繁,比例度盘要放大;
曲线漂浮绕大湾,比例度盘往小扳;
曲线偏离回复慢,积分时间往下降;
曲线波动周期长,积分时间再加长;
曲线振荡频率快,先把微分降下来;
动差大来波动慢。微分时间应加长;
理想曲线两个波,前高后低4比1;
一看二调多分析,调节质量不会低。

二、PID整定的一些细节
1、调节周期
上一节我们提到了调节周期的概念,简单来说,就是多久计算一次PID输出。而调节周期 t 是依据我们想要达到的精度来给定的,如果不注意到这个,你可能永远也调不好PID或者调出来并不理想!首先,你的传感器响应速度?以及执行单元执行到温度传感器得时间是多少?如果我要是想要控制精度在0.5度,那么我的加热器从开始加热到温度传感器发现温度变化0.5所需要的时间是多少?然后将这个时间的0.3~0.6倍去作为采样时间,再以这个采样时间的3~5倍去作为调节周期 t ,并用这个时间去计算PID,才能得到一个理想的PID曲线!当然,这些依据只是工程经验,并不是理论所得,最终还是要依据不同情况,做出调整!
有人会觉得,是不是调节周期越小越好,调节周期越小越精确?我认为并不是这样,当你的调节周期过小,就会导致执行器还来不及变化,以温控系统为例,当你的调节周期过小,就会导致温度还没变化,这会导致Kd参数的失效,不能及时去判断到曲线误差的变化率,导致最终调节效果不好;而且调节周期过小也会引入更多的噪声,导致你获取到的数据并不准确,那么何谈去控制它呢?有些场景下,调节周期大一些,反而会达到比较好的效果!特别针对于那些大惯性系统或者是传感器距离执行器比较远的场景!

注意:采样时间和调节周期是两个概念,应该要区分开!!!
2、各PID调节规律的比较
调节规律的选择原则:尽量采用简单的控制规律

PID的调节效果最好(从超调量、过渡过程时间、稳态误差),PI算法其次,PD算法次之(有差)、P算法再次之,I算法最差



3、积分饱和
我们知道积分项作用可以消除掉系统的稳态误差,但是也会由于前期偏差量大,时间一长在积分项作用下,会带来积分饱和现象。而在误差始终没法被消除的情况下,又会造成积分过量。只有当偏差方向改变后,才能使输出量脱离饱和区,这样又会造成调节滞后的问题,给系统带来明显的超调,恶化调节品质,这是我们不愿意看到的!所以在工程上我们往往会使用积分限幅法和积分分离法的方式来解决积分饱和或者积分过量的问题!
1)积分限幅法
基本思想:当积分项达到限幅值时,则停止计算积分项,从而解决积分饱和问题。
2)积分分离
基本思想:在偏差值大的情况下,不进行积分项的计算,这样可既防止了偏差大时有过大的输出量,也避免了积分过量的问题。
三、PID算法源码
下面就是完整的PID算法分享:
// PID控制结构体
typedef struct _PID
{
float kp,ki,kd;
float error,lastError;//误差、上次误差
float integral,maxIntegral;//积分、积分限幅
float output,maxOutput;//输出、输出限幅
}PID;
// 限幅函数
#define LIMIT(x,min,max) (x)=(((x)<=(min))?(min):(((x)>=(max))?(max):(x)))
// PID初始化
void PID_Init(PID *pid,float p,float i,float d,float maxI,float maxOut)
{
pid->kp=p;
pid->ki=i;
pid->kd=d;
pid->maxIntegral=maxI;
pid->maxOutput=maxOut;
}
//pid计算
void PID_SingleCalc(PID *pid,float reference,float feedback)
{
//更新数据
pid->lastError=pid->error;
pid->error=reference-feedback;
//计算微分
pid->output=(pid->error-pid->lastError)*pid->kd;
//计算比例
pid->output+=pid->error*pid->kp;
//计算积分
pid->integral+=pid->error*pid->ki;
LIMIT(pid->integral,-pid->maxIntegral,pid->maxIntegral);//积分限幅
pid->output+=pid->integral;
//输出限幅
LIMIT(pid->output,0,pid->maxOutput);
}
//清空一个pid的历史数据
void PID_Clear(PID *pid)
{
pid->error=0;
pid->lastError=0;
pid->integral=0;
pid->output=0;
}
总结
通过这节和上节的讲解,相信大家应该已经入门了PID算法,并且学会了如何整定PID,而后面开始讲解从零搭建一个温控PID实验,敬请期待!
这一节的代码源文件,我将稍后会放在评论区,需要的自取!!!