|
PID的源代码在网上基本都是公开的,既然大家都希望看一看,我还是贴出来吧,估计看了也很失望,因为我的也是网上的代码一模一样的,既然数学模型已经建立,程序只是把这个模型用语言把他表达出来而已,其实很多人PID实验不成功,就是没有仔细去分析参数的调节过程,我是想通过上面的实验过程来给大家一个思路去如何调节这几个参数,而不是在网上到处搜索源程序,然后抱怨下载的PID源程序都不能满足自己的调节要求。
经过实验发现:位置式整定的参数不能直接用在增量式上面,会出现超调的时间居多,无法稳定在目标值上
//PID计算
UINT16 PID_Cal(void)
{
float xdata pterm,iterm,dterm;
//把当前的温度和设定的目标温度定义好
ppid->pv = SystemRealTemprature;
ppid->sp = SystemSetTemprature;
//根据实验得出:Kp=5.98 T=5 Td=27 Ti=112.5
//PID数学模型
//u(t) = kp * e(t) + ki * [e(1) + e(2) + ....+ e(t)] + kd * [e(t) - e(t-1)]
ppid->errk = (float)(ppid->sp - ppid->pv);
pterm = ppid->kp * ppid->errk;
ppid->sum += ppid->errk;
iterm = ppid->ki * ppid->sum;
dterm = ppid->kd * (ppid->errk - ppid->errk_1);
ppid->Last_Out = pterm + iterm + dterm;
ppid->errk_2 = ppid->errk_1;
ppid->errk_1 = ppid->errk;
if(ppid->Last_Out > SampleT)
ppid->Last_Out = SampleT;
else if(ppid->Last_Out < 0)
ppid->Last_Out = 0;
printf("%d p=%d i=%d d=%d ",SystemRealTemprature, (int)pterm, (int)iterm, (int)dterm);
printf("H=%d\n", (UINT16)ppid->Last_Out);
return (UINT16)ppid->Last_Out;
} |
|