您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 金融资料 > 杂谈PID控制算法最终篇C语言实现51单片机中的PID算法
真遗憾,第二篇章没能够发表到首页上去。趁热打铁。把最终篇——代码篇给发上来。代码的设计思想请移步前两篇文章12345678910111213141516171819202122232425262728293031323334353637383940//pid.h#ifndef__PID__#define__PID__/*PID=Uk+KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式)函数入口:RK(设定值),CK(实际值),KP,KI,KD函数出口:U(K)*/typedefstructPIDValue{int8KP;int8KI;int8KD;int8F;int8BITMOV;intEK[3];intUK;intRK;intCK;intUK_REAL;}pid_str;//PIDValueStrPID;voidpid_exe(pid_str*PID);#endif//pid.c/*PID=PID-UK_REAL+PID-KP*[E(k)-E(k-1)]+PID-KI*E(k)+PID-KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式)函数入口:PID-RK(设定值),PID-CK(实际值),PID-KP,PID-KI,PID-KD函数出口:U(K)*/#includedefines.h#includepid.h#defineMAXOUT0xff//#defineMAXGAP100voidpid_exe(pid_str*PID){PID-EK[2]=PID-EK[1];PID-EK[1]=PID-EK[0];PID-EK[0]=PID-RK-PID-CK;PID-UK_REAL=PID-UK_REAL414243444546474849505152535455+PID-KP*(PID-EK[0]-PID-EK[1])//微分一次后积分即原数+(float)PID-KI*PID-EK[0]/PID-F//直接积分+(float)PID-KD*(PID-EK[0]-2*PID-EK[1]+PID-EK[2])*PID-F;//二阶微分后积分即一阶微分if((PID-UK_REALPID-BITMOV)=MAXOUT){PID-UK=MAXOUT;}elseif(PID-UK_REALPID-BITMOV=-MAXOUT){PID-UK=-MAXOUT;}else{PID-UK=PID-UK_REALPID-BITMOV;}}这里我写的代码用到的是增量型的PID(即UK_REAL+PID-KP*[E(k)-E(k-1)]+PID-KI*E(k)+PID-KD*[E(k)-2E(k-1)+E(k-2)];这句话所对应的是pid控制量在之前pid控制量的基础上增加的值,相当于求了一次导)。最终输出的结果将每一次运算的值累加输出就行了。附上摘抄的位置型pid与增量型pid的区别来。。(1)位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;(2)增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。(3)由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。PS:之前模板看的审美疲劳了。。换个模板换个心情。。PPS:求小编给力。。求过。。。
本文标题:杂谈PID控制算法最终篇C语言实现51单片机中的PID算法
链接地址:https://www.777doc.com/doc-2328791 .html