weiqinghong 发表于 2011-9-22 09:57:03

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

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具体意思,个人现在认为是程序中满偏占空比值,具体对否 自己去验证。
希望 各位懂的能无私奉献,别当宝了

weiqinghong 发表于 2011-9-22 09:59:18

回复【楼主位】weiqinghong
--------------------------------------------------------------------目前 一个控制水温 一个控制铁块 效果 均在+-0.3之内,,

weiqinghong 发表于 2011-9-22 10:01:16

回复【1楼】weiqinghong
-----------------------------------------------------------------------

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

weiqinghong 发表于 2011-9-22 10:02:18

回复【2楼】weiqinghong
---------------------------------------------------------------如果感觉有用的话,都留个言吧,顶上去,支持开源。。。。。。。。。。。。。。。。。。。

Excellence 发表于 2011-9-22 10:17:19

恭喜楼主。

Excellence 发表于 2011-9-22 10:17:43

开源吧。呵呵。

weiqinghong 发表于 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);
}
程序都一样有经验的可能会在什么时候加热 等情况下处理

xuejianhua1986 发表于 2011-9-22 22:57:51

mark

luhuaneda 发表于 2011-9-22 23:31:15

想看看自整定

weiqinghong 发表于 2011-9-23 07:53:09

回复【9楼】qd1018
-----------------------------------------------------------------------

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

weiqinghong 发表于 2011-9-23 07:57:05

不清楚,有没人对PID控制下,占控制刷新是多少时间的?一定要的T长刷新一次还是随便 你自己多少时间刷新一次?
比如 我周期是20M,占空长2000,一次中断就是10MS,那我测量值是实时的,但是调用uint pidcalc(uint nextp)
程序是20M一次 还是 自己固定一个时间调用,谁有意见说说。

our2008 发表于 2011-9-23 13:38:26

mark

weixintec 发表于 2011-9-23 13:59:55

mark

qinhya 发表于 2011-9-23 14:13:33

mark

weiqinghong 发表于 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=nextp;f_e=1;} //取初始值
        if(f_d<4)
        {
                if(f_d%2==0)
                {
                        if(sb<=nextp){sb=nextp; count4=0;}
                        else        count4++;
                }
                else       
                {
                        if(sb>=nextp){sb=nextp;count4=0;}
                        else        count4++;
                }
                if(count4>=20)
                {
                        count4=0;
                        if(f_d!=0)sb=sb;
                        if(f_d==3)count2=count1;
                        f_d++;
                }//取值
        }
        else       
        {                                                                          //得到PID参数值
                f_d=0;
                integ = count2>>1;
                deri =integ>>2;
                if(sb>sb) pro=sb-sb;       
                else        pro=sb-sb;
                pro=3312/pro;
                  sss.atc241=1;
                       
        }
}
一切均经过调试测试

weiqinghong 发表于 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<=nextp)&&(f_i==1))sb=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>=nextp)sb=nextp;
                        }
                }
        }
        else
        {
                f_i=0;
                integ = count2>>1;
                deri =integ>>2;
                pro=sb-sb;
                pro=3312/pro;
                sss.atc241=1;
        }
}这个程序是自整定只需要2个周期

sl961102 发表于 2011-9-24 17:58:28

mark,支持一下。

zwc58 发表于 2011-9-24 18:08:05

mark

xwhua188 发表于 2011-9-24 18:44:26

这个要顶的。MARK.

zhangjinxing 发表于 2011-9-24 22:31:47

mark

kill_c 发表于 2011-9-24 22:33:18

支持!

MCU678 发表于 2011-9-24 23:51:19

mark,支持一下。

QQ373466062 发表于 2011-9-25 09:02:09

可以使用凌阳的库有专门的(控制电机的)

Etual 发表于 2011-9-25 09:06:02

mark

kneken 发表于 2011-9-25 10:31:59

mark

weiqinghong 发表于 2011-9-27 10:40:59

如何上图的?

duzhang 发表于 2011-9-27 15:39:06

MARK

lcmdw 发表于 2011-9-27 16:42:48

mark

hongbo3636 发表于 2011-9-27 16:49:13

MARK

czhaii 发表于 2011-9-27 22:56:17

上图 点击 下面

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

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

YS126 发表于 2011-9-27 23:04:45

顶LZ,同BS装B的。

weiqinghong 发表于 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差不多。

jackwang123 发表于 2011-9-28 09:01:37

mark

awfi 发表于 2011-9-28 09:10:09

好资料,
请问LZ,一片运行在12M的ATMEGA32能同时处理三路PID温控点吗?

sunnyhook 发表于 2011-9-28 09:31:14

骂的好!!坛子里装B的太多了,前几天发现个装逼发GSM GPS资料的,后来发现只是广告贴!那货也真他Ma的吊胃口。

weiqinghong 发表于 2011-9-28 09:34:52

回复【34楼】awfi
-----------------------------------------------------------------------
这个芯片没用过啊

weiqinghong 发表于 2011-9-28 09:39:38

回复【36楼】weiqinghong
-----------------------------------------------------------------------

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

Pjm2008 发表于 2011-9-28 09:56:48

支持

kurong2011 发表于 2011-9-28 10:01:12

PID的学习了

weiqinghong 发表于 2011-9-28 14:28:14

Kc= 4d/pi*A?还是KC=4A/PI*D,郁闷了,看见外国文刊上是后面这个

dragon_hn 发表于 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没啥区别.

dragon_hn 发表于 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是类似的.

weiqinghong 发表于 2011-9-29 08:11:26

回复【42楼】dragon_hn
-----------------------------------------------------------------------

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

mutou55 发表于 2011-9-30 08:02:14

记号

ccmj4708 发表于 2011-9-30 08:14:43

mark

yjtyxd 发表于 2011-9-30 08:36:59

mark

swp105 发表于 2011-9-30 09:38:12

mark

weiqinghong 发表于 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+(long)pro*sumerror*sss.atc241/integ)/10;
                        }
                }               
                else               //后来PID函数
                {
                        prb=((long)pro*error+(long)pro*deri*derror/sss.atc241+(long)pro*sumerror*sss.atc241/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<=nextp)&&(f_i==1))sb=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>=nextp)sb=nextp;
                        }
                }
        }
        else
        {
                f_i=0;
                deri =count2>>3;       
                integ = deri<<1 ;
                pro=sb-sb;
                pro=252/pro;       
        }
},
一般能控制在+-0.3,有意向的自己做做实验,然后发个帖子来,看看效果,再一起讨论讨论,
在这里,有个疑问,如果我周期从10S改为20S这样的话,总占空比也放大一倍,那p+i+d是否也需要放大?

ggaaoo 发表于 2011-9-30 21:32:48

收了

wenfengcom 发表于 2011-10-5 14:56:19

weiqinghong ,
能不能详细解释一下自整定程序void aaaadddd(uint nextp)的每一句的含义,看不明白,谢谢

wangyj173 发表于 2011-10-5 17:10:09

呵呵,LZ说得太直白了、、、、

gxy508 发表于 2011-11-13 18:51:59

mark

longxiang 发表于 2011-12-13 09:29:21

开源好啊

jiabin1024 发表于 2011-12-13 13:25:21

mark

etjason 发表于 2011-12-13 13:35:41

PID学习了

czhongli 发表于 2011-12-17 11:15:42

好,谢谢

largeboss 发表于 2011-12-17 12:07:35

mark

fanmj 发表于 2011-12-19 10:25:24

题目够狠

our2008 发表于 2011-12-20 13:07:15

mark

714540 发表于 2011-12-21 11:35:33

个人认为做PID最难是怎样做模型,例如做飞控时总不能把飞机飞上天再量震荡频率与幅度.
我一般都会先做模型再模拟PI(我不用D).但做模型参数是很难得.

dingliming 发表于 2012-1-17 10:24:47

mark

zhaoliang056 发表于 2012-1-17 12:06:43

mark

wwqq 发表于 2012-1-17 13:22:09

mark

cyberjok 发表于 2012-1-17 13:56:47

thanks.

longfei 发表于 2012-1-22 15:57:23

支持。
-----------------------------------------------------------------------

fw190d9 发表于 2012-1-22 20:16:59

mark

wtiechen1969 发表于 2012-3-5 20:54:46

谢谢楼主分享,学习 了

changhui0222 发表于 2012-3-5 21:00:32

mk

GZZXB 发表于 2012-3-24 11:50:15

暂时看不懂,学习

chengtina 发表于 2012-3-26 15:17:18

留个爪,迟早要研究这个。。。。。。

qy815fj 发表于 2012-4-10 14:06:51

程序中有太多变量不清楚,能否把程序贴全呀!

myh_hh 发表于 2012-4-24 22:28:22

不太懂。先下了,学习学习, 学lz{:lol:}

love萍萍 发表于 2012-4-27 18:14:02

但是还是不知道如何调啊。。。。

xiong57785 发表于 2012-9-4 09:47:49

{:smile:}         

qd118118 发表于 2012-9-4 10:05:22

goodmark

perfei89 发表于 2012-9-4 14:44:13

mark
支持下

yfgww 发表于 2012-9-5 09:48:07

PID学习{:lol:}{:lol:}

marshallemon 发表于 2012-9-5 09:59:40

LZ最好把整个程序都发上来以供测试,最好把电路图也附上,简单的介绍下你实际测试时,升温对象,控制对象,设定温度等

mangocity 发表于 2012-9-5 17:26:43

呵呵,凡是不懂PID的,都是上学时没有专心上课的人。

newhand1991 发表于 2012-10-20 23:35:52

没太看懂·~~以后在看看

stmmcu 发表于 2012-10-21 05:05:18

先收藏,,

along 发表于 2012-10-21 11:36:39

mark,支持一下。

optimal 发表于 2012-11-6 22:55:38

MARK{:smile:}

hzwl2007 发表于 2012-11-7 00:44:03

mark...........

aaroncy79 发表于 2012-11-15 15:15:58

PID学习了

miyadai 发表于 2012-11-16 09:24:15

MARK~~~~~~~~~~

mcujack 发表于 2012-11-16 10:04:15

太喜欢这贴了,够直白,可惜后面没接着说
之前自己学了一下PID,水平不够学不下去了

YOU1 发表于 2012-12-1 16:57:16

顶起,学习了

dujuan8693 发表于 2012-12-1 17:02:25

PID的学习了

jz701209李 发表于 2013-4-9 13:34:24

谢谢楼主......

ABCDELF 发表于 2013-4-21 14:35:07

顶一下,PID学习学习

waymcu 发表于 2014-10-23 22:21:19

PID学习学习

gaoshiduo 发表于 2014-10-25 12:30:22

学习一下PID

xyc985314992 发表于 2020-10-24 17:45:47

兄弟 后来解决了吗 我最近折腾三个月了 还是跟对标产品算出来的PID不一样 通过反推理 D的结果是一个变量 不是常量

fengyunyu 发表于 2020-10-24 19:42:12

学习,收藏

motor_control 发表于 2020-10-25 08:19:26

本帖最后由 motor_control 于 2020-10-25 08:21 编辑

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

你需要的是一本《控制系统设计指南》,国外的书,不要看国内的,切记!
页: [1]
查看完整版本: PID参数自我介绍,装逼者去死吧