发新帖我要提问
12
返回列表
打印

传递函数问题 PID

[复制链接]
楼主: xddzccn
手机看帖
扫描二维码
随时随地手机跟帖
21
xddzccn|  楼主 | 2008-4-15 13:12 | 只看该作者 回帖奖励 |倒序浏览

Z 变换好难

拉氏变换 S 换成Z 成差分方程
但是 即使是知道了 PID算法,微分方程的建模,感觉无从下手,
移相的角度,和温度上升的函数是有一定关系
那三个系数 Kp Ki Kd 是要用实验法测出来
把移相的角度是 a的话
那么P(T-T0)=U^2/R =U2^2(sin(2*a)/4*pi+(pi-a)/2*pi)*(T-To)=C*M*(T-To)-
Q
做拉氏变换 ,把 sin函数傅立叶展开
这个非线性系统 好像很复杂 看到一片文献是这样写的

使用特权

评论回复
22
piter_tan| | 2008-4-15 16:15 | 只看该作者

晕了阿

看到那么多的公式更是晕了
PID,难.......

使用特权

评论回复
23
piter_tan| | 2008-4-15 16:29 | 只看该作者

有个建议

哪位用单片机做过PID的,把程序贴出来
让大家学习学习
一行一行的分板下,这样有实列说明,应该很快就会明白


就像小说中古代人一样,先学好武功,后面再学心法

使用特权

评论回复
24
xddzccn|  楼主 | 2008-4-15 17:45 | 只看该作者

double PIDCalc( PID *pp, double NextPoint )

C51BBS上就有一个 晓奇老师的 程序
程序 很容易懂 ,但是实在不懂怎么 建立数学 模型
怎么去求 Kp Ki Kd
哪怕是自己慢慢调也好,怎么从数据中得到这三个参数,
确实不太懂!
double PIDCalc( PID *pp, double NextPoint )
{
    double  dError,
            Error;

        Error = pp->SetPoint -  NextPoint;          // 偏差
        pp->SumError += Error;                      // 积分
        dError =Error -  pp->LastError;     // 当前微分   
        pp->LastError = Error;
        return (pp->Proportion * Error              // 比例项
            +   pp->Integral * pp->SumError         // 积分项
            +   pp->Derivative * dError             // 微分项
        );
}

使用特权

评论回复
25
好不厉害| | 2008-4-15 19:24 | 只看该作者

你不要去建模

我前面已经说啦,大多数温控系统可以看做是惯性环节和滞后环节的级联,问题是参数的确定是要做试验的,比如一个热水器吧,你需要测给定电压和温度上升的关系,然后做曲线拟合,求得参数,不过实际上呢,也没那么复杂,可以根据水温度上升与吸收热量的关系推到出其温度与电压的关系。
求得了传递函数,将PWM、AD或DA环节近似处理,根据稳态和动态指标,就可以求出PID参数值,用单片机的话,还要做Z变换,可以推导出PID的增量式表达式,所以呢,真正搞一个基于PID算法的控制系统还是比较复杂的,像上面都还没有考虑AD DA的滞后以及采样率的影响。
对与你那个东西呢,你不要去建模型,PID的实质就是根据误差调节,KI主要是消除静差,KD反映误差变换,用于调节动态响应,你这些现别管,开始先调kp,你根据温度传感器的输入和期望的电压输出来确定kp,现别太大,kp大可能会导致过冲超调,太小呢,加热速度不理想,把kp调整到一个比较合适的值之后,然后可以调节ki,ki这个参数跟kp配合,可以达到消除静差的目的,也就是能够是温度达到你的期望,kp和ki调好之后再调kd,kd主要是响应的快速性有关,就是你调节了给定的温度值,使调节器能够更重误差变化率,增大输出,没有模型的话,这三个参数要比较难整定,要多点耐心,反复调整,在kp ki kd基本确定之后,可以根据误差的大小制定不同的控制策略,也就是在误差大于某个值时,采用查表法,只采用kp控制,不同的误差程度,采用不同的kp,而在小于某个值的,控制器不动作,无输出,避免频繁动作,误差在中间区域的时候,采用PID控制策略

使用特权

评论回复
26
xddzccn|  楼主 | 2008-4-15 20:33 | 只看该作者

谢谢

谢谢楼上指点,我也打算不用建模,只是感觉建模比较的NB
其实也用不上了,慢慢调吧,还有个问题就是看到书上有用求系统的阶跃响应
,然后根据经验公式求出 三个系数,不知这样可否,

使用特权

评论回复
27
IceAge| | 2008-4-15 21:03 | 只看该作者

关于建模:会者不难,难者不会

这个我以前做过很多,其实很简单:施加一个方波输入,测量输出,用最小二乘法得到系统的transfer function,然后手工保留主要零极点。
温度系统一般是一个一阶系统,transfer function in time domain:
T(t) = T0 + K * exp(-c * t) 
s domain:
f(s) = K / (s + c), 
这里 c 是物体的时间常数,k 是温度系数,与电流平方成正比。

一旦有了模型,就可以用 matlab/simulink 进行仿真,很快能找到最佳的控制方法或参数。

PID 的程序很简单,我贴过很多遍了。

好不厉害 25楼的调节方法很好,虽然通过实验找到参数辛苦些。



 

使用特权

评论回复
28
piter_tan| | 2008-4-15 21:45 | 只看该作者

RE

TO IceAge
可否再贴一遍呢
搜索论坛里你发过的的贴子
还没有找到

使用特权

评论回复
29
jack.king| | 2008-4-15 22:22 | 只看该作者

想问下高手!建立数学模型主要是要考虑那些问题?

使用特权

评论回复
30
好不厉害| | 2008-4-16 18:23 | 只看该作者

找本系统辨识的书看看吧

~~~~~~~~~~~~~~

使用特权

评论回复
31
IceAge| | 2008-4-16 20:44 | 只看该作者

pid 程序很简单

struct PID_STRUCT 
{
     float Kp;
     fload Ki;
     fload Kd;
     fload X;
     float Intergrator;
};

void PID_Initilize(struct PID_STRUCT* pid, float Kp, float Ki, float Kd)
{
     pid->Kp = Kp;
     pid->Ki = Ki;
     pid->Kd = Kd;
     pid->X = 0;
     pid->Intergrator = 0;
}

float PID_RUN(struct PID_STRUCT* pid, float input)
{
    pid->Intergrator += pid->Ki * input;

//    float output = pid->Kp * input + pid->Intergrator + pid->Kd*(input - pid->X);  becomes:
   float output = (pid->Kp + pid->Kd) * input + pid->Intergrator - pid->Kd * pid->X;  //(pid->Kp + pid->Kd) can be merged.

    pid->X = input;
    return output;
}   

程序完全可以优化,比如用 16-bit int 代替 float.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则