基于vc60的常用pid改进的编程实现与仿真研究内容摘要:

信号的影响,改善系统性能。 带死区的数字 PID 算法 在许多实际的控制系统中,并不要求被控量十分精确地与设定值相等,完全无差,而是容许偏差在一定范围内变化。 在这种情况下,计算机控制中为了避免控制动作过于频繁,以消除由于执行机构或阀门的频繁动作所引起的系统振荡,有时采用所谓带死区的 PID 算法,也称带不灵敏区的算法。 该算法是在原 PID 算法的前面增加一个不灵敏区的非线性环节来实现的,即 死区 B 是一个可调参数,其大小一般应根据控制系统对被控量稳态精度的E(S) 1pDfKTsTspiKTspK()Us图 13 不完全微分 PID 结构 () 1 pDffK T sGs Ts ( ) | ( ) |() 0 | ( ) |e k e k Bpk e k B   8 要求以及现场的实验结果来确定。 需要指出的是,死区是一个非线性环节,不能像线性环节一样随便移到 PID控制器的后面,对控制量输出设定一个死区,这样做的效果是完全不同的。 在生产现场有时为了延长执行机构或阀门使用寿命, 有一种错误的做法,即不按设计规范的要求片面地增大执行机构或阀门的回程误差(简称回差),希望能避免执行机构或阀门频繁动作,这就相当于将死区移到了 PID 控制器后面,这样有时会得到适得其反的效果。 使用在 PID 前面带有死区的算法,在一定程度上可以抑制由于执行机构存在回差而可能产生的控制量来回振荡现象。 单神经元自适应 PID控制 神经网络具有大规模并行处理、高度的容错性和鲁棒性、自组织学习和实时处理等特点,可构造有效地用于非线性、时变系统的只能控制器。 单神经元控制器继承了常规 PID 控制器的简单、实 用、易于在 DCS 系统中通过组态实现的优点,现场可调整参数少,易于现场调试,控制品质优于常规PID 控制器。 实用经典的神经元智能控制器算法如图 14: 图 16中 1( ) ( )x k e k ,表示系统误差 2( ) ( ) ( 1)x k e k e k   ,表示一阶差分 3 ( ) ( ) 2 ( 1 ) ( 2)x k e k e k e k     ,表示误差积累 本文主要内容 首先,本文介绍了 PID 的改进方法目前的研究现状,介绍了各种常用方 法图 14 单神经元自适应 PID 控制系统 9 的模型,结构,并着重阐述了积分分离算法,抗饱和积分算法,微分项的改进算法,带死区的数字 PID 算法,这四种方法的结构和具体算法过程。 然后以四种方法为基础,在 VC平台上使用 C语言编写改进程序,其中选用具有滞后特性的热工被控对象并仿真最终结果。 仿真结果表明 : 对于不同的要求不同的改进程序会有更好更稳定的仿真结果相比较常规 PID。 本论文的章节安排 第一章 绪论 简单论述了选题的意义和重要性以及 PID 改进算法的研究现状,并阐述了论文的理论依据,说明了本论文所采用算法的可行性和必要性。 最后介绍了本文所 作的主要工作和文章的结构安排。 第二章 PID 改进控制算法设计 在各种常用的 PID 改进算法中着重选取四种改进控制算法,绘制程序流程图,展示明确的判断运算过程。 第三章 程序设计 在 VC 平台上,使用 C++语言,描述重要的程序中变量以及程序中重要语句的说明。 选用一个典型的热工被控对象,具有一定的滞后特性,经过四种改进程序比较仿真结果。 最后是结论与展望 本部分总结了本论文的成果和不足,提出以后应该注意和改进的地方,并且总结在编写程序过程中遇到的各种问题以及解决方法。 第 2 章 PID 改进控制算法设计 积分分离算法 积分分离控制基本思路是 :当被控量与设定值偏差较大时 ,取消积分作用 ,以免由于积分作用使系统稳定性降低 ,超调量增大。 当被控量接近给定值时 ,引入积分控制 ,以便消除静差 ,提高控制精度。 其具体实现步骤如下 : (1)根据具体系统 ,人为设定阈值Δ 0; (2)当时 |e(k)|Δ ,采用 PD 控制 ; (3)当时 |e(k)|Δ ,采用 PID 控制 ; 积分分离控制算法可表示为 10 0( ( ) ( 1 ) )( ) ( ) ( )k dp i sj sk e k e ku k k e k k e j T T   其中 sT 为采样时间,  为积分项的开关系数: 1 | ( ) |0 | ( ) |ekek     积分分离 PID 控制算法的程序框图如图 21所示 : 11 抗积分饱和算法 当系统存在一个方向的误差时,由于积分的累加作用会使控制量一直增大,可能会使控制量达到执行器的执行阈值,如果此时误差的方向发生改变,控制量会逐渐减小,控制量也会退出饱和区,执行器也会在阈值内执行;如果此时误差方向还是没有改变,控制量会继续增大但是执行器会一直保持在阈值,此时控制量就进入了饱和区。 进入饱和区越深,退出饱和 区时间就会越长,在饱和区时执行器会一直在阈值位置,如果误差发生反向,执行器不会立刻有反应,PID 控制算法 开始 采样输入 r( k) 输出 y( k) 计 算 误 差 e(k)=r(k)y(k)?|e(k)|PD控制算法 计算控制量 u( k) 输出控制 Y N 图 21 积分分离算法程序控制流程图 数据更新 12 控制量会慢慢减小,等执行器推出饱和区才会有反应。 这样就会使控制的动态响应变差,控制性能变差。 抗积分饱和算法。 若 max()u k U ,只累加负的误差;若 min()u k U ,只累加正的误差。 这样就可以避免积分饱和现象。 下图 22 为抗积分饱和算法在 PID 改进过程中的程序框图。 13 不完全微分 PID 控制 Y PID 控制算法 开始 采样输入 r( k) 输出 y( k) 计 算 误 差 e(k)=r(k)y(k)PD控制算法 计算控制量 u( k) 输出控制 N 图 22 抗积分饱和算法程序控制流程图 数据更新 m i n m a x( ) ( ) a n d ( ) 0u k U u k Uek( || ) 14 当信号突变时, PID 控制的微分项输出的控制量可能比较大,尤其是阶跃信号时,微分项急剧增加,容易引起调节过程的振荡,导致系统的动态品质下降。 不完全微分 PID 控制算法就是采用一个带惯性的微分环节来克服常规 PID控制的这一缺点。 它的控制结构如图 23 所示。 微分先行 PID 控制 微分先行 PID 控制是只对输出量进行微分,而对给定指令不起微分作用,因此它适合于给定指令频繁升降的场合,可以避免指 令的改变导致超调过大。 它的控制结构如图 24 所示: 带死区的数字 PID 算法 在计算机控 制系统中,某些系统为了避免控制动作的过于频繁,消除由于频繁动作所引起的振荡,可采用带死区的 PID 控制。 在控制精度要求不高、控制过程要求平稳的场合,可以人为的设置 一个不灵敏区 B,即带死区的 PID 控制。 ( ) | ( ) |() 0 | ( ) |e k e k Bpk e k B   图 23 不完全微分 PID 控制结构图 图 24 微分先行 PID 控制结构图 15 只有不在死区范围内时,才按 PID 算式计算控制量。 其程序框图如图 25,结构如图 26 所示。 开始 采 样输入 r( k) 输出 y( k) 计 算 误 差 e(k)=r(k)y(k)?B|e(k)|计算控制量 u( k) 输出控制 Yes No 图 25 带死区的计算机 PID 控制系统控制流程图 数据更新 ( ) 0pk ( ) ( )p k e k 16 第 3 章 程序设计 研 究现状和开发工具的选择 PID 改进的编程与仿真在 matlab 平台已经有较多的实例,但在实际应用中,matlab 程序并没有简单的可执行程序应用广泛,所以选择面向对象的 C++语言作为开发语言, VC 作为开发平台来编写 PID 改进的程序。 为什么要悬在 C++和VC,因为 matlab 有强大的函数库,而 VC 具有高效率的优点。 首先:用 C++开发效率很高。 由于 OOP,对象会自己管理自己,这样避免了很多维护的麻烦,加快了开发速度。 其次:从运行角度上讲,由于封装引入的效率损失不一定比 C直接做差多少。 所谓 C更具优势对绝大多数 程序员都是不成立的,因为你用非 OOP 思想设计出的 C 程序,本身由于混乱维护造成的损失会远远大于封装带来的损失 现在已经不是讲那么细节的效率的时代了,对于几个指令调用上的损失,往往会被人家忽略,人们更多的会关注项目的可重用性,可维护性和可读性,这些 C都远远不如 C++,所以选择 C++和 VC++来编写常见 PID 改进的编程研究和仿真实现。 程序说明 完整程序见附录, PID 算法程序为附录 1,仿真绘图程序见附录 2。 ()rtB B PID ()ekT()pk()ukT 0()Hs ()Gs()yt 图 26 带死区的计算机 PID 控制系统 17 PID 算法程序说明 完整代码共包括 4 个模块,如图 31: PID 算法 主 程序 主程序 为人机界面的编写,和算法选择的过程。 主要变量有: float a[100],y[100],rin,x=0,z=0,b,um,us,death。 int i。 char c。 a[100],y[100]:为数组,用来储存经过每个周期 T 后更新的 PID 模块输出和最终的 Y输出。 rin:为输入,程序中赋值给单位阶跃输入。 x,z:是初始化数据,是实际微分 PID控制算法中,设置 du 和 u的初值为 0。 Um, us:人机界面时输入的抗积分饱和算法需要的上下 限幅值,然后需要带入子函数进行计算。 B:在进行积分分离算法中需要设定的偏差 Beta 值。 其中包括 switch 进行选择控制方法,界面如图 32,包括: PID 的控制算法 的改进算法 PID 算法 图 31PID 算法程序结构 18 PID 计算算法过程程序 pid pid ,来计算单位阶跃响应,并返回值到 ,然后储存在 a[i],y[i]数组中。 主要变量 有: void PID::initial() { Kp =55。 /*比例增益 55*/ T =。 /*采样周期 */ Ti =。 /*积分时间 */ Td =。 /*微分时间 */ Tf =。 /*惯性时间 */ caculate()。 } void PID::caculate() { C1 =(Tf/(T+Tf))。 /*增量型 PID 运算系数有C1,C2,C3,C4*/ C2 =(Kp*T*(1+T/Ti+Td/T)/(T+Tf))。 C3 =(0Kp*T*(1+2*Td/T)/(T+Tf))。 图 32PID 算法程序运行界面 19 C4 =(Kp*Td/(T+Tf))。 C22=(Kp*T*(1+Td/T)/(T+Tf))。 //C22 为第二种方法积分分离方法中 ,PD 算法的系数 C23=(Kp*T*(1+Td/T)/(T+Tf))。 //C23 为第三种方法抗积分饱和中Ki=0 则 (1/Ti)=0 时 } float New,Sp,u,du, Float Beta, float umin,float umax, float d: New: 反馈回来的输出值; Sp: 输入值; U: 增量型实际微分 PID 控制算法中经过离散化的 u(k); Du: 增量型实际微分 PID 控制算法中的 ()uk ; Beta: 积分分离算法中的设定值 Beta; float umin: 抗积分饱和算法中的下限; floa。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。