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
--------------------------------------------------------------------目前 一个控制水温 一个控制铁块 效果 均在+-0.3之内,, 回复【1楼】weiqinghong
-----------------------------------------------------------------------
有些可能是因为第一次写这个,所以,自己认为用人脑控制 可以全功率 或者 稍大点加热的,经过自整定后 不一定有那么大功率 加热,估计需要加上经验,然后再稍加修改程序能达到更好,更快效果。 回复【2楼】weiqinghong
---------------------------------------------------------------如果感觉有用的话,都留个言吧,顶上去,支持开源。。。。。。。。。。。。。。。。。。。 恭喜楼主。 开源吧。呵呵。 回复【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);
}
程序都一样有经验的可能会在什么时候加热 等情况下处理 mark 想看看自整定 回复【9楼】qd1018
-----------------------------------------------------------------------
自整定都一样的,给出了以上公式 ,你求一下这些参数值 就对了 不清楚,有没人对PID控制下,占控制刷新是多少时间的?一定要的T长刷新一次还是随便 你自己多少时间刷新一次?
比如 我周期是20M,占空长2000,一次中断就是10MS,那我测量值是实时的,但是调用uint pidcalc(uint nextp)
程序是20M一次 还是 自己固定一个时间调用,谁有意见说说。 mark mark mark 回复【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;
}
}
一切均经过调试测试 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个周期 mark,支持一下。 mark 这个要顶的。MARK. mark 支持! mark,支持一下。 可以使用凌阳的库有专门的(控制电机的) mark mark 如何上图的? MARK mark MARK 上图 点击 下面
上传文件((图片请控制在400K,否则不能直接显示))
复制代码 黏贴代码至文本框 顶LZ,同BS装B的。 哪位同志能解释:
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差不多。 mark 好资料,
请问LZ,一片运行在12M的ATMEGA32能同时处理三路PID温控点吗? 骂的好!!坛子里装B的太多了,前几天发现个装逼发GSM GPS资料的,后来发现只是广告贴!那货也真他Ma的吊胃口。 回复【34楼】awfi
-----------------------------------------------------------------------
这个芯片没用过啊 回复【36楼】weiqinghong
-----------------------------------------------------------------------
GSM什么的我08年 什么都不会的时候就用了,买的 是2个 模块,几句C 就解决了,那些人是装逼 支持 PID的学习了 Kc= 4d/pi*A?还是KC=4A/PI*D,郁闷了,看见外国文刊上是后面这个 人家说PID算法难自然有他的道理!
为什么现在还有那么多教授研究PID算法?
PID要让他运行起来很容易,但要运行得好很难.
PID最典型的应用的恒温式电热水器.水平差的公司要40s以上才能达到恒温.水平好的公司只要10s左右就能达到恒温.
PID的控制输出方式有两种:一种是直接控制输出量,例如可控硅导通角.另一种就是直接控制刷新时间(11楼提到的).具体用哪种要根据情况决定,有可能两种方式都用.
例如对用220V 50Hz的热得快烧水
烧5L水与烧10L水的情况是有差别的:10L水比5L水热惯性大.
用塑料桶装水跟用铝桶装水是有区别的:铝桶散热快,热惯性相对小.
另外家用电不稳定,假设有1%的抖动,那么你的可控硅的导通角分辨率设为1/10000与1/1000没啥区别. 回复【11楼】weiqinghong
不清楚,有没人对pid控制下,占控制刷新是多少时间的?一定要的t长刷新一次还是随便 你自己多少时间刷新一次?
比如 我周期是20m,占空长2000,一次中断就是10ms,那我测量值是实时的,但是调用uint pidcalc(uint nextp)
程序是20m一次 还是 自己固定一个时间调用,谁有意见说说。
-----------------------------------------------------------------------
调整控制刷新时间跟调整控制量结果是一样的,但是适用环境不一样.
假设1ms调整一次,调整量范围为0-1000.
那么你调整量固定为-1,0,1,调整周期在1us-1ms是类似的. 回复【42楼】dragon_hn
-----------------------------------------------------------------------
楼上兄弟,能解释下那个公式的意思吗?最好带具体实例。也方便其他朋友都懂 记号 mark mark mark 这几天 一直做实验,现在发现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是否也需要放大? 收了 weiqinghong ,
能不能详细解释一下自整定程序void aaaadddd(uint nextp)的每一句的含义,看不明白,谢谢 呵呵,LZ说得太直白了、、、、 mark 开源好啊 mark PID学习了 好,谢谢 mark 题目够狠 mark 个人认为做PID最难是怎样做模型,例如做飞控时总不能把飞机飞上天再量震荡频率与幅度.
我一般都会先做模型再模拟PI(我不用D).但做模型参数是很难得. mark mark mark thanks. 支持。
----------------------------------------------------------------------- mark 谢谢楼主分享,学习 了 mk 暂时看不懂,学习 留个爪,迟早要研究这个。。。。。。 程序中有太多变量不清楚,能否把程序贴全呀! 不太懂。先下了,学习学习, 学lz{:lol:} 但是还是不知道如何调啊。。。。 {:smile:} goodmark mark
支持下 PID学习{:lol:}{:lol:} LZ最好把整个程序都发上来以供测试,最好把电路图也附上,简单的介绍下你实际测试时,升温对象,控制对象,设定温度等 呵呵,凡是不懂PID的,都是上学时没有专心上课的人。 没太看懂·~~以后在看看 先收藏,, mark,支持一下。 MARK{:smile:} mark........... PID学习了 MARK~~~~~~~~~~
太喜欢这贴了,够直白,可惜后面没接着说
之前自己学了一下PID,水平不够学不下去了 顶起,学习了 PID的学习了 谢谢楼主...... 顶一下,PID学习学习 PID学习学习 学习一下PID 兄弟 后来解决了吗 我最近折腾三个月了 还是跟对标产品算出来的PID不一样 通过反推理 D的结果是一个变量 不是常量 学习,收藏 本帖最后由 motor_control 于 2020-10-25 08:21 编辑
这种东西要做好,还是需要深入理解的,没调过就是没调过,装逼者还是有装逼的本钱的。
你需要的是一本《控制系统设计指南》,国外的书,不要看国内的,切记!
页:
[1]