马上就要年底了,工作也越来越闲了,趁这个时间写点博文总结下。
公司之前一个的温控项目要给药盒加热,一开始领导就让我们用PID算法来控制温度。由于之前没有接触过自动控制的东东,于是马上去网上查阅关于PID的资料。
我始终认为在自动调节的发展历程中PID的创立是非常重要的一环,就是对输入偏差进行比例微分积分的运算,运算结果去叠加控制执行机构。PID的表述是那么的简单,应用却无比的广泛。从洗澡水的控制到神七上天,从空调温度控制到导弹制导,从能源化工到军事航天等等都有他的影子,角角落都可以发挥它的作用。我对PID理论的发明人非常佩服,说起来很简单不就是比例、微分、积分运算嘛,可是具体要提出这种方法是要一定的天才的。不然瓦特发明蒸汽机的时候到PID理论正确创立怎么会有百年的历史呢?
先来一张PID的图片让大家了解下PID的真面目
公式是这样的:
用位置试的方法把他写成代码如下:
typedef struct PID
{
int SetPoint; //设定目标 Desired Value
long SumError; //误差累计
double Proportion; //比例常数 Proportional Const
double Integral; //积分常数 Integral Const
double Derivative; //微分常数 Derivative Const
int LastError; //Error[-1]
int PrevError; //Error[-2]
} PID;
static PID sPID;
static PID *sptr = &sPID;
/*====================================================================================================
Initialize PID Structure PID参数初始化
=====================================================================================================*/
void IncPIDInit(void)
{
sptr->SumError = 0;
sptr->LastError = 0; //Error[-1]
sptr->PrevError = 0; //Error[-2]
sptr->Proportion = 0; //比例常数 Proportional Const
sptr->Integral = 0; //积分常数Integral Const
sptr->Derivative = 0; //微分常数 Derivative Const
sptr->SetPoint = 0;
}
/*====================================================================================================
增量式PID计算部分
=====================================================================================================*/
int IncPIDCalc(int NextPoint)
{
register int iError, iIncpid; //当前误差
iError = sptr->SetPoint - NextPoint; //增量计算
iIncpid = sptr->Proportion * iError //E[k]项
- sptr->Integral * sptr->LastError //E[k-1]项
+ sptr->Derivative * sptr->PrevError; //E[k-2]项
//存储误差,用于下次计算
sptr->PrevError = sptr->LastError;
sptr->LastError = iError;
//返回增量值
return(iIncpid);
}
PID最难的不是把他写成单片机程序,而是PID的参数整定。关于PID的整定网上有很多方法,感兴趣的可以去查阅这我也不多嘴了 。项目有12个加热组,所有通道公用一个PID产生,温度从0°c到180°c,精度在正负0.5°c以内。经过了长时间的参数调节发现在同一个参数下高温和低温的差别很大而且加热波形过冲也不满足项目要求,主要是积分项从一开始对误差的累积较大,到最后消除静差的时候很难消除,积分项处于一直饱和的状态。我一直以为没有找到合适的参数,便一直在摸索规律。经过很长时间的探索我最终怀疑传统的PID算法是不是不能进行控制,于是在网上看了有关于模糊型的控制算法。
最终我根据模糊型的控制原理编辑了一个温度控制程序,我把温度控制模糊化为低温,中温,高温三个区,又把加热的速度分为缓慢,中速,急速三个层次,再把输出分为细调,匀调,大幅度调(pwm的大小)。经过复杂的策略最终实现了模糊型的控制,而且温度也比较准确满足项目需求。
正当我欣赏自己的成绩的时候,突然发现:一个PID调节中,再简单的不过的调节系统中用模糊型控制就需要7个参数,如果是串及的系统就要十几个参数,这不把人给累死啊!恩,模糊有他的优点但是缺点也太明显了,控制策略也复杂。
后来我的脑海里诞生课模糊+PID控制,精细的用PID算法调节,之外用模糊算法。关于代码我就不贴上来了毕竟是用在我们公司项目里的。
网络上还有许多先进的控制思想,比如神经网路控制,神经网络控制是模拟生物感知控制。他将每个信号进行加权运算和小信号切除后,进行层运算,最终实现多路输出。并进行计算、分步信息存储、容错能力强是它的突出优点。这东西在工业控制上的好处我不太了解后来为了克服它的缺点,又产生了一种模糊神经网络控制。听起来很高大上吧!