szq790601 发表于 2011-5-17 15:42:01

PID参数的标定实验失败,苦恼中

看了fsmcu的实验过程,也想学习一下,但有许多地方搞不明白
原文:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=936512&bbs_page_no=1&bbs_id=1000

我按照楼主的说法做实验,折腾了一夜也没个结果,苦恼中。
我的加热设备是一个500w的电热块,被加热的设备是一个约3斤重的铝块;
也用MAX6675采集温度,用可控硅控制加热,通过串口将数据输出到电脑查看工作曲线;
也是5秒钟计算一次PID,定时器10ms中断一次,5秒钟中断500次;
通过计算得出5秒钟要导通的次数来控制加热量;
以上跟楼主做实验的设备原理基本上是一样的;

源程序如下:

struct pid
{
float sp;
float pv;
float errk;
float errk_1;
float errk_2;
float      sum;
float      kp;
float      ki;
float      kd;
float      Last_Out;
};
struct pid ppid;

//PID计算
void PID_Cal(void)
{
float pterm,iterm,dterm;

//把当前的温度和设定的目标温度定义好
ppid.pv = f_temp;                        //当前温度
ppid.sp = 110;                           //设定的温度

ppid.kp = 200;                           //先求临界震荡
ppid.ki = 0;
ppid.kd = 0;

//PID数学模型
//u(t) = kp * e(t) + ki * + kd *

ppid.errk = (float)(ppid.sp - ppid.pv);         //偏差 = 设定温度 - 当前温度

pterm = ppid.kp * ppid.errk;                  //比例系数 * 偏差   kp * e(t)

ppid.sum += ppid.errk;                        // e(1) + e(2) + ....+ e(t)
iterm = ppid.ki * ppid.sum;                     //ki *

pid_sum = ppid.sum;

dterm = ppid.kd * (ppid.errk_1 - ppid.errk_2);    //kd *    这里与楼主源程序有点区别,源程序是(ppid.errk - ppid.errk_1)

ppid.Last_Out = pterm + iterm + dterm;    //u(t) = kp * e(t) + ki * + kd *

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;

sprintf(tx_buf,"%5.2f\n",f_temp);//输出测量的数据
v_sent_uart1_str(tx_buf,0);
   
}



开始试验,

我要控制达到的温度是110,而我实验比例调节时(Pi,Pd=0),只有KC = 200时,才会震荡,而KC低于70时,温度根本达不到设定的110,楼主的9.3是怎么来的?当kp=9.3时,当温度接近设

定温度时,如相差2度,则pterm = ppid.kp * ppid.errk=9.3*2=18.6,也就是每五秒钟只导通18.6/500*5=0.186秒?可能我理解的不对,可不知道错在哪里。
我试验的数据如图,我的图形远没有楼主的那么平滑。


http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_640456BZ7EYF.JPG
(原文件名:临界震荡.JPG)


根据数据我计算的PID参数:

振荡周期为:Pc=51*5=255
T=5s
Td=0.12Pc=30.6
Ti=0.5Pc=127.5
Kp=0.65KC=130
Kd=Kp*Td/T=795
Ki=Kp*T/Ti=5.1

把这些数据带到程序中,结果一运行,温度到180度都没停下,吓得我赶紧断了电。


另,关于pi的算法,根据公式ki * ,我从最低温加热到设定的温度,这个值会很大,我的达到了几千,再小的Ki与他相乘也会变得

很大,是这样计算的吗?

求高人指点一下我。

qingqng 发表于 2011-5-17 16:09:46

如果觉得积分太大,那么就设上限
还有就是,当error比较大的时候,可以取消积分计算,因为这时候积分对系统调节没什麽好处。接近给定的时候,积分才能发挥本身意义。这个做法称为积分分离。
我太天才了,一年前学的东西居然还记得。。。。。。

szq790601 发表于 2011-5-17 16:18:57

是不是就是说,在温度接近设定值时,再开始PID计算呢?前边就一直满幅度的加热就可以了?

neu_blur 发表于 2011-5-17 16:29:51

温度这种大滞后的控制对象,不适合使用PID控制的………………

qingqng 发表于 2011-5-17 16:30:44

那么做也是完全可以的,因为那样只相当于把系统原本的初始温度提升罢了。

但是嘛,怎么说呢,最近头疼怎么糊弄检查毕设的那些老头们。。。那样做就不是完整的闭环控制了,理论上不好看
虽然什麽什麽啊,都是殊途同归,但是一说闭环,就妥了,一提开环,就不妥了。要么就前馈,可是这么做不算前馈
此刻怎一个囧字了得。

xinjie1023 发表于 2011-8-22 21:31:17

收藏

tangcangeng 发表于 2014-4-14 09:31:14

你好 有联系方式吗? 请留下方便一起讨论
页: [1]
查看完整版本: PID参数的标定实验失败,苦恼中