搜索
bottom↓
回复: 96

PID参数自我介绍,装逼者去死吧

  [复制链接]

出0入0汤圆

发表于 2011-9-22 09:57:03 | 显示全部楼层 |阅读模式
1.        方法有:
1)。经验法
2)。临界比例度法
3)。继电器控制法
4)。模糊控制
根据公式ZIEGLER----NICHOLS
可得以下公式:
KP                          TI                             TD
P             0.5KC
PD           0.65KC                       /                             0.12PC
PI            0.45KC                      0.85PC
PID           0.65KC                      0.5PC                         0.12PC
,继电器法:
              KP                          TI                             TD
PID          0.6KC                       0.5TU                         0.125TU
以上中,可认为PC=TU
KC即为临界增益,TU为周期
继电器法中KC=4D/3.14A   D代表回环幅值,A代表曲线差值(波峰-波谷)
许多书上均没介绍D具体意思,个人现在认为是程序中满偏占空比值,具体对否 自己去验证。
希望 各位懂的能无私奉献,别当宝了

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-9-22 09:59:18 | 显示全部楼层
回复【楼主位】weiqinghong
--------------------------------------------------------------------目前 一个控制水温 一个控制铁块 效果 均在+-0.3之内,,

出0入0汤圆

 楼主| 发表于 2011-9-22 10:01:16 | 显示全部楼层
回复【1楼】weiqinghong
-----------------------------------------------------------------------

有些可能是因为第一次写这个,所以,自己认为用人脑控制 可以全功率 或者 稍大点加热的  ,经过自整定后 不一定有那么大功率 加热,估计需要加上经验,然后再稍加修改程序能达到更好,更快效果。

出0入0汤圆

 楼主| 发表于 2011-9-22 10:02:18 | 显示全部楼层
回复【2楼】weiqinghong
---------------------------------------------------------------如果感觉有用的话,都留个言吧,顶上去,支持开源。。。。。。。。。。。。。。。。。。。

出0入0汤圆

发表于 2011-9-22 10:17:19 | 显示全部楼层
恭喜楼主。

出0入0汤圆

发表于 2011-9-22 10:17:43 | 显示全部楼层
开源吧。呵呵。

出0入0汤圆

 楼主| 发表于 2011-9-22 10:30:51 | 显示全部楼层
回复【5楼】Excellence 精益求精
-----------------------------------------------------------------------

uint        pidcalc(uint        nextp)
{
        int        derror,error;
        uint        sum;
        error=setpoint-nextp;
        if(wd_f==0){laste=error;pre=error;wd_f=1;}
        sumerror+=error;
        derror=laste-pre;
        pre=laste;
        laste=error;
        error=(long)pro*(error*t+(long)deri*derror)/t+(long)pro*sumerror*t/integ;
        if(error<0)sum=0;
        else        sum=error;
        return(sum);
}
程序都一样  有经验的  可能会在什么时候加热 等情况下处理

出0入0汤圆

发表于 2011-9-22 22:57:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-22 23:31:15 | 显示全部楼层
想看看自整定

出0入0汤圆

 楼主| 发表于 2011-9-23 07:53:09 | 显示全部楼层
回复【9楼】qd1018
-----------------------------------------------------------------------

自整定都一样的,给出了以上公式 ,你求一下这些参数值 就对了

出0入0汤圆

 楼主| 发表于 2011-9-23 07:57:05 | 显示全部楼层
不清楚,有没人对PID控制下,占控制刷新是多少时间的?一定要的T长刷新一次  还是随便 你自己多少时间刷新一次?
比如 我周期是20M,占空长2000,一次中断就是10MS,那我测量值是实时的,但是调用uint pidcalc(uint nextp)
程序是20M一次 还是 自己固定一个时间调用,谁有意见  说说。

出50入10汤圆

发表于 2011-9-23 13:38:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-23 13:59:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-23 14:13:33 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-9-24 15:20:10 | 显示全部楼层
回复【13楼】weixintec 睿智
-----------------------------------------------------------------------

只有看的 没人顶的。。。。。。
最新程序,PID整定
void        aaaadddd(uint        nextp)                         //自整定程序
{
        int        error;
        error=setpoint+200-nextp;
        if(error<0)out1=1;
        else        out1=0;
        if((f_e==0)&&(f_d==0)){sb[0]=nextp;f_e=1;} //取初始值
        if(f_d<4)
        {
                if(f_d%2==0)
                {
                        if(sb[0]<=nextp){sb[0]=nextp; count4=0;}
                        else        count4++;
                }
                else       
                {
                        if(sb[0]>=nextp){sb[0]=nextp;count4=0;}
                        else        count4++;
                }
                if(count4>=20)
                {
                        count4=0;
                        if(f_d!=0)sb[f_d]=sb[0];
                        if(f_d==3)count2=count1;
                        f_d++;
                }//取值
        }
        else       
        {                                                                          //得到PID参数值
                f_d=0;
                integ = count2>>1;
                deri =integ>>2;
                if(sb[2]>sb[3]) pro=sb[2]-sb[3];       
                else        pro=sb[3]-sb[2];
                pro=3312/pro;
                  sss.atc241[18]=1;
                       
        }
}
一切均经过调试测试

出0入0汤圆

 楼主| 发表于 2011-9-24 16:34:28 | 显示全部楼层
void        aaaadddd(uint        nextp)                         //自整定程序
{
        int        error;
        error=setpoint+200-nextp;
        if(error<0)out1=1;
        else        out1=0;
        if(f_l==0)
        {
                if(error<0)
                {
                        if(f_j==0)f_j=1;  //表明是第一次达到设定值
                        if(f_k==0)f_k=1;  // 表明是可以计算       
                        if((sb[0]<=nextp)&&(f_i==1))sb[0]=nextp; //取最大值
                }
                else       
                {
                        if(f_j==1)
                        {
                                if(f_k==1)//表明这个数字刚小于设定值
                                {       
                                        if(f_i==1){count2=count1; f_l=1;}
                                        else        f_i=1;
                                        f_k=0;
                                }
                                if(sb[1]>=nextp)sb[1]=nextp;
                        }
                }
        }
        else
        {
                f_i=0;
                integ = count2>>1;
                deri =integ>>2;
                pro=sb[0]-sb[1];
                pro=3312/pro;
                sss.atc241[18]=1;
        }
}这个程序是自整定只需要2个周期

出0入0汤圆

发表于 2011-9-24 17:58:28 | 显示全部楼层
mark,支持一下。

出0入0汤圆

发表于 2011-9-24 18:08:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-24 18:44:26 | 显示全部楼层
这个要顶的。MARK.

出0入0汤圆

发表于 2011-9-24 22:31:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-24 22:33:18 | 显示全部楼层
支持!

出0入0汤圆

发表于 2011-9-24 23:51:19 | 显示全部楼层
mark,支持一下。

出0入0汤圆

发表于 2011-9-25 09:02:09 | 显示全部楼层
可以使用凌阳的库  有专门的(控制电机的)

出0入0汤圆

发表于 2011-9-25 09:06:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-25 10:31:59 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-9-27 10:40:59 | 显示全部楼层
如何上图的?

出0入0汤圆

发表于 2011-9-27 15:39:06 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-9-27 16:42:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-27 16:49:13 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-9-27 22:56:17 | 显示全部楼层
上图 点击 下面

上传文件((图片请控制在400K,否则不能直接显示))

复制代码 黏贴代码至文本框

出0入0汤圆

发表于 2011-9-27 23:04:45 | 显示全部楼层
顶LZ,同BS装B的。

出0入0汤圆

 楼主| 发表于 2011-9-28 08:45:32 | 显示全部楼层
哪位同志能解释:
SV=目标温度 PV=测量温度:
      1。开始SV-PV>0 所以 使控温继电器吸合,开始加热,温度逐渐升高。
      2。当上升到 SV=PV<0 时,使控温继电器断开,由于温度相应的滞后性这时的温度继续上升一会后 才开始下降。
      3。当下降到 SV-PV>0 时,使控温继电器吸合,开始加热,但同样的原因温度还会继续下降一会然 后才会逐渐升高。
      4。反复如上的步骤几个循环,找到稳定的振荡波形。一般情况下,第一个波峰由于从冷态开始上冲 太大不采信,第一个波谷也同样误差较大被排除。
      5。可以从第二个波峰开始记录第一个最高温度,同时为记录时间清零时间计数器。
      6。从第二个波谷开始记录第一个最低温度,同时读取时间计数器以得到这个振荡波形的周期值(注 意是T/2)。
      7。有了波峰温度,波谷温度,振荡周期就可以计算出PID数值了。
      
    8。计算:
    设振荡周期为Tk,我们的采样周期为T(如T为20则每20s测量一次温度并计算一次PID输出量进行控制,如控制量为5就是20s内5s加热20-5s不加热)
    按照:《新型PID控制及其应用》P.235 7.1.3 中提到的经验公式:
    Kp=0.6Kc
    采样周期T=0.1Tk
    积分时间Ti=0.5Tk 所以积分系数 =Kp*T/Ti (Kp未知)
    微分时间 Td=0.125Tk 所以微分系数 =Kp*T/Tc (Kp未知)
   
    又按照:《新型PID控制及其应用》P.243 7.2.1中提到公式:
    增益Kc= 4d/pi*A
    d:回环幅值
    A:正弦波幅值
    pi:3.14
   
    比例增益 Kp=0.6Kc 求出Kp PID参数就可都计算出了。
   
    问题:
    1。 Kc= 4d/pi*A 。 d:具体是什么意思 有的文章上说控制功率变化幅度 我自整定
   
    全速加热是不是d=100%?还有A=波峰-波谷/2对吗?如果d是百分数,A是波峰-波谷/2那么Kc计算出来<1 应该不对吧,有人说d是百分数,A也是百分数,那么A=(波峰-波谷/2)/目标温度 对吗?
    这样计算得到Kp与我手动调节出来的Kp差不多。

出0入0汤圆

发表于 2011-9-28 09:01:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-28 09:10:09 | 显示全部楼层
好资料,
请问LZ,一片运行在12M的ATMEGA32能同时处理三路PID温控点吗?

出0入0汤圆

发表于 2011-9-28 09:31:14 | 显示全部楼层
骂的好!!坛子里装B的太多了,前几天发现个装逼发GSM GPS资料的,后来发现只是广告贴!那货也真他Ma的吊胃口。

出0入0汤圆

 楼主| 发表于 2011-9-28 09:34:52 | 显示全部楼层
回复【34楼】awfi
-----------------------------------------------------------------------
这个芯片没用过啊

出0入0汤圆

 楼主| 发表于 2011-9-28 09:39:38 | 显示全部楼层
回复【36楼】weiqinghong
-----------------------------------------------------------------------

GSM什么的  我08年 什么都不会的时候就用了,买的 是2个 模块,几句C 就解决了,那些人是装逼

出0入14汤圆

发表于 2011-9-28 09:56:48 | 显示全部楼层
支持

出0入0汤圆

发表于 2011-9-28 10:01:12 | 显示全部楼层
PID的学习了

出0入0汤圆

 楼主| 发表于 2011-9-28 14:28:14 | 显示全部楼层
Kc= 4d/pi*A?还是KC=4A/PI*D,郁闷了,看见外国文刊上是后面这个

出0入0汤圆

发表于 2011-9-28 15:19:21 | 显示全部楼层
人家说PID算法难自然有他的道理!
为什么现在还有那么多教授研究PID算法?
PID要让他运行起来很容易,但要运行得好很难.
PID最典型的应用的恒温式电热水器.水平差的公司要40s以上才能达到恒温.水平好的公司只要10s左右就能达到恒温.
PID的控制输出方式有两种:一种是直接控制输出量,例如可控硅导通角.另一种就是直接控制刷新时间(11楼提到的).具体用哪种要根据情况决定,有可能两种方式都用.
例如对用220V 50Hz的热得快烧水
烧5L水与烧10L水的情况是有差别的:10L水比5L水热惯性大.
用塑料桶装水跟用铝桶装水是有区别的:铝桶散热快,热惯性相对小.
另外家用电不稳定,假设有1%的抖动,那么你的可控硅的导通角分辨率设为1/10000与1/1000没啥区别.

出0入0汤圆

发表于 2011-9-28 15:34:29 | 显示全部楼层
回复【11楼】weiqinghong
不清楚,有没人对pid控制下,占控制刷新是多少时间的?一定要的t长刷新一次  还是随便 你自己多少时间刷新一次?
比如 我周期是20m,占空长2000,一次中断就是10ms,那我测量值是实时的,但是调用uint pidcalc(uint nextp)  
程序是20m一次 还是 自己固定一个时间调用,谁有意见  说说。
-----------------------------------------------------------------------
调整控制刷新时间跟调整控制量结果是一样的,但是适用环境不一样.
假设1ms调整一次,调整量范围为0-1000.
那么你调整量固定为-1,0,1,调整周期在1us-1ms是类似的.

出0入0汤圆

 楼主| 发表于 2011-9-29 08:11:26 | 显示全部楼层
回复【42楼】dragon_hn
-----------------------------------------------------------------------

楼上兄弟,能解释下那个公式的意思吗?最好带具体实例。也方便其他朋友都懂

出0入0汤圆

发表于 2011-9-30 08:02:14 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-9-30 08:14:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-30 08:36:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-30 09:38:12 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-9-30 16:19:11 | 显示全部楼层
这几天 一直做实验,现在发现D可能就是输出电压的有效值*(80-100)%,代码如下:
uint        pidcalc(uint        nextp)
{
        int        derror,error,prb;
        uint        sum;
        error=setpoint+200-nextp;  
        derror=laste-pre;
        pre=laste;
        laste=error;
        if((error<50)&&(error>-50))sumerror+=error;
        if(f_m==0)
        {
                prb=(long)pro*error/10;
                pre=error;
                laste=error;
                f_m=1;
        }
        else
        {
                if(f_g==0)         //开始KP函数
                {
                        if(error<0){if(f_h==0)f_h=1;prb=(long)pro*error/10;}
                        else       
                        {
                                if(f_h==1){f_g=1;if(sumerror<0)sumerror=0;}
                                prb=((long)pro*error+(long)pro*deri*derror/sss.atc241[12]+(long)pro*sumerror*sss.atc241[12]/integ)/10;
                        }
                }               
                else                 //后来PID函数
                {
                        prb=((long)pro*error+(long)pro*deri*derror/sss.atc241[12]+(long)pro*sumerror*sss.atc241[12]/integ)/10;
                }
        }
        if(prb<0)sum=0;
        else       
        {
                sum=prb;
                if(error<0)
                {
                        if(sum>100)sum=100;
                }       
        }
        return(sum);
}

void        aaaadddd(uint        nextp)                         //自整定程序
{
        int        error;
        error=setpoint+200-nextp;
        if(error<0)out1=1;
        else        out1=0;
        if(f_l==0)
        {
                if(error<0)
                {
                        if(f_j==0)f_j=1;  //表明是第一次达到设定值
                        if(f_k==0)f_k=1;  // 表明是可以计算       
                        if((sb[0]<=nextp)&&(f_i==1))sb[0]=nextp; //取最大值
                }
                else       
                {
                        if(f_j==1)
                        {
                                if(f_k==1)//表明这个数字刚小于设定值
                                {       
                                        if(f_i==1){count2=count1; f_l=1;}
                                        else        f_i=1;
                                        f_k=0;
                                }
                                if(sb[1]>=nextp)sb[1]=nextp;
                        }
                }
        }
        else
        {
                f_i=0;
                deri =count2>>3;       
                integ = deri<<1 ;
                pro=sb[0]-sb[1];
                pro=252/pro;       
        }
},
一般能控制在+-0.3,有意向的自己做做实验,然后发个帖子来,看看效果,再一起讨论讨论,
在这里,有个疑问,如果我周期从10S改为20S这样的话,总占空比也放大一倍,那p+i+d是否也需要放大?

出0入0汤圆

发表于 2011-9-30 21:32:48 | 显示全部楼层
收了

出0入0汤圆

发表于 2011-10-5 14:56:19 | 显示全部楼层
weiqinghong ,
能不能详细解释一下自整定程序void aaaadddd(uint nextp)的每一句的含义,看不明白,谢谢

出0入0汤圆

发表于 2011-10-5 17:10:09 | 显示全部楼层
呵呵,LZ说得太直白了、、、、

出0入0汤圆

发表于 2011-11-13 18:51:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-13 09:29:21 | 显示全部楼层
开源好啊

出0入0汤圆

发表于 2011-12-13 13:25:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-13 13:35:41 | 显示全部楼层
PID学习了

出0入0汤圆

发表于 2011-12-17 11:15:42 | 显示全部楼层
好,谢谢

出0入0汤圆

发表于 2011-12-17 12:07:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-19 10:25:24 | 显示全部楼层
题目够狠

出50入10汤圆

发表于 2011-12-20 13:07:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-21 11:35:33 | 显示全部楼层
个人认为做PID最难是怎样做模型,例如做飞控时总不能把飞机飞上天再量震荡频率与幅度.
我一般都会先做模型再模拟PI(我不用D).但做模型参数是很难得.

出0入0汤圆

发表于 2012-1-17 10:24:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-17 12:06:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-17 13:22:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-17 13:56:47 | 显示全部楼层
thanks.

出0入0汤圆

发表于 2012-1-22 15:57:23 | 显示全部楼层
支持。
-----------------------------------------------------------------------

出0入0汤圆

发表于 2012-1-22 20:16:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-5 20:54:46 | 显示全部楼层
谢谢楼主分享,学习 了

出0入0汤圆

发表于 2012-3-5 21:00:32 | 显示全部楼层
mk

出0入36汤圆

发表于 2012-3-24 11:50:15 | 显示全部楼层
暂时看不懂,学习

出0入10汤圆

发表于 2012-3-26 15:17:18 | 显示全部楼层
留个爪,迟早要研究这个。。。。。。

出0入0汤圆

发表于 2012-4-10 14:06:51 | 显示全部楼层
程序中有太多变量不清楚,能否把程序贴全呀!

出0入0汤圆

发表于 2012-4-24 22:28:22 | 显示全部楼层
不太懂。先下了,学习学习, 学lz

出0入0汤圆

发表于 2012-4-27 18:14:02 | 显示全部楼层
但是还是不知道如何调啊。。。。

出0入0汤圆

发表于 2012-9-4 09:47:49 | 显示全部楼层
           

出0入21汤圆

发表于 2012-9-4 10:05:22 | 显示全部楼层
good  mark

出100入0汤圆

发表于 2012-9-4 14:44:13 | 显示全部楼层
  mark
支持下

出0入0汤圆

发表于 2012-9-5 09:48:07 | 显示全部楼层
PID学习

出0入85汤圆

发表于 2012-9-5 09:59:40 | 显示全部楼层
LZ最好把整个程序都发上来以供测试,最好把电路图也附上,简单的介绍下你实际测试时,升温对象,控制对象,设定温度等

出0入0汤圆

发表于 2012-9-5 17:26:43 | 显示全部楼层
呵呵,凡是不懂PID的,都是上学时没有专心上课的人。

出0入0汤圆

发表于 2012-10-20 23:35:52 | 显示全部楼层
没太看懂·~~  以后在看看

出0入0汤圆

发表于 2012-10-21 05:05:18 来自手机 | 显示全部楼层
先收藏,,

出0入0汤圆

发表于 2012-10-21 11:36:39 | 显示全部楼层
mark,支持一下。

出0入0汤圆

发表于 2012-11-6 22:55:38 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-11-7 00:44:03 | 显示全部楼层
mark...........

出0入0汤圆

发表于 2012-11-15 15:15:58 | 显示全部楼层
PID学习了

出0入0汤圆

发表于 2012-11-16 09:24:15 | 显示全部楼层
MARK~~~~~~~~~~

出0入0汤圆

发表于 2012-11-16 10:04:15 | 显示全部楼层
太喜欢这贴了,够直白,可惜后面没接着说
之前自己学了一下PID,水平不够学不下去了

出0入0汤圆

发表于 2012-12-1 16:57:16 | 显示全部楼层
顶起,学习了

出0入0汤圆

发表于 2012-12-1 17:02:25 | 显示全部楼层
PID的学习了

出0入0汤圆

发表于 2013-4-9 13:34:24 来自手机 | 显示全部楼层
谢谢楼主......

出0入0汤圆

发表于 2013-4-21 14:35:07 | 显示全部楼层
顶一下,PID学习学习

出0入0汤圆

发表于 2014-10-23 22:21:19 | 显示全部楼层
PID学习学习

出0入0汤圆

发表于 2014-10-25 12:30:22 | 显示全部楼层
学习一下PID

出0入0汤圆

发表于 2020-10-24 17:45:47 | 显示全部楼层
兄弟 后来解决了吗 我最近折腾三个月了 还是跟对标产品算出来的PID不一样 通过反推理 D的结果是一个变量 不是常量

出100入101汤圆

发表于 2020-10-24 19:42:12 来自手机 | 显示全部楼层
学习,收藏

出0入79汤圆

发表于 2020-10-25 08:19:26 来自手机 | 显示全部楼层
本帖最后由 motor_control 于 2020-10-25 08:21 编辑

这种东西要做好,还是需要深入理解的,没调过就是没调过,装逼者还是有装逼的本钱的。

你需要的是一本《控制系统设计指南》,国外的书,不要看国内的,切记!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 19:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表