DDC单回路PID闭环控制系统的设计及实时仿真课程设计报告
DDC单回路PID控制实验实验报告

DDC 单回路PID 控制实验实验报告一、对象动态特性实验22111121()1(2)1(1)(G −−++−+=ZZ K z T T T T G(s)离散化得: 差分方程:Y(k)=a0*Y(k-1)+b0*Y(k-2)+c0*R(k) 其中:a0=2.0*T1/T/(1+T1/T)b0=0.0-pow(T1/T,2.0)/(1+T1/T)/(1+T1/T)c0=K1/(1+T1/T)/(1+T1/T)程序框图:相关源程序段:double T,r0,K1,T1,Kp,Ti,Td,Beta;//定义全局变量便于参数传递void CMainFrame::OnDrawObject() { // TODO: Add your command handler code here if(T==0){ ErrorDlg errorDlg; errorDlg.DoModal(); } else{CDC * pDC=GetDC(); CPen pen1,* oldpen;oldpen=pDC->SelectObject(&pen1);//画坐标轴pen1.CreatePen(PS_SOLID,1,RGB(0,0,255));pDC->SelectObject(&pen1);pDC->MoveTo(50,50);pDC->LineTo(50,300);pDC->MoveTo(50,50);pDC->LineTo(46,58);pDC->MoveTo(50,50);pDC->LineTo(54,58);pDC->MoveTo(50,300);pDC->LineTo(490,300);pDC->LineTo(482,295);pDC->MoveTo(490,300);pDC->LineTo(482,305);pDC->SetTextColor(RGB(0,0,255));pDC->TextOut(40,298,"0");pDC->TextOut(56,48,"Y");pDC->TextOut(492,300,"t");pDC->MoveTo(50,180);pen1.DeleteObject();pen1.CreatePen(PS_DASH,1,RGB(0,0,255));pDC->SelectObject(&pen1);pDC->LineTo(480,180);pDC->TextOut(35,174,"r0");pen1.DeleteObject();pen1.CreatePen(PS_SOLID,1,RGB(255,0,0));pDC->SelectObject(&pen1);y=300,t,unity,unitt=2;//两坐标轴单位长intunity=120.0/r0;a0,b0,c0,y0=0,y1=0,y2;doublea0=2.0*T1/T/(1+T1/T);b0=0.0-pow(T1/T,2.0)/(1+T1/T)/(1+T1/T);c0=K1/(1+T1/T)/(1+T1/T);text;CStringtext.Format("对象动态特性曲线:K1=%4.1f, T1=%3.2f, T=%3.2f, r0=%3.1f",K1,T1,T,r0);pDC->TextOut(80,320,text);pDC->MoveTo(50,300);for(t=52;t<=480;t+=unitt){y2=a0*y1+b0*y0+c0*r0;pDC->LineTo(t,y-unity*y2);y0=y1;y1=y2;}pDC->SelectObject(oldpen);}}程序界面及实验输出响应曲线:二、单回路PID控制实验采用增量式:delta_u=a*e(k)+b*e(k-1)+c*e(k-2)其中:a=Kp*(1+T/Ti*L+Td/T) L为积分分离系数b=0.0-Kp*(1+2*Td/T)c=Kp*Td/T;程序框图:相关源程序段:double T,r0,K1,T1,Kp,Ti,Td,Beta;//定义全局变量便于参数传递bool pid=FALSE;void CMainFrame::OnDrawU() // CMainFrame::OnDrawY()基本相同,不再另附源程序{// TODO: Add your command handler code hereif(T==0||(!pid)){ErrorDlgerrorDlg;errorDlg.DoModal();}else{pDC=GetDC();*CDCCPen pen1,* oldpen;oldpen=pDC->SelectObject(&pen1);//画坐标轴pen1.CreatePen(PS_SOLID,1,RGB(0,0,255));pDC->SelectObject(&pen1);pDC->MoveTo(50,50);pDC->LineTo(50,300);pDC->MoveTo(50,50);pDC->LineTo(46,58);pDC->MoveTo(50,50);pDC->LineTo(54,58);pDC->MoveTo(50,300);pDC->LineTo(490,300);pDC->LineTo(482,295);pDC->MoveTo(490,300);pDC->LineTo(482,305);pDC->SetTextColor(RGB(0,0,255));pDC->TextOut(40,298,"0");pDC->TextOut(56,48,"U");pDC->TextOut(492,300,"t");pDC->MoveTo(50,180);pen1.DeleteObject();pen1.CreatePen(PS_DASH,1,RGB(0,0,255));pDC->SelectObject(&pen1);pDC->LineTo(480,180);pDC->TextOut(35,174,"r0");pen1.DeleteObject();pen1.CreatePen(PS_SOLID,1,RGB(0,124,111));pDC->SelectObject(&pen1);u=300,t,unitt=2;//两坐标轴单位长intdoubleunitu=120.0/r0;a,b,c,e0=0,e1=0,e2=r0,u1=0,u2,delta_u;doublea0,b0,c0,y0=0,y1=0,y2;doubleL=1;//积分分离逻辑系数inta0=2.0*T1/T/(1+T1/T);b0=0.0-pow(T1/T,2.0)/(1+T1/T)/(1+T1/T);c0=K1/(1+T1/T)/(1+T1/T);b=0.0-Kp*(1+2*Td/T);c=Kp*Td/T;text1,text2;CStringtext1.Format("PID控制u(t)阶跃响应曲线:Kp=%4.1f, Ti=%3.2f, Td=%3.2f",Kp,Ti,Td);text2.Format("K1=%4.1f, T1=%3.2f, T=%3.2f, r0=%3.1f",K1,T1,T,r0);pDC->TextOut(80,320,text1);pDC->TextOut(120,340,text2);pDC->MoveTo(50,300);for(t=52;t<=480;t+=unitt){if(Beta==0||e2<Beta)L=1;else L=0;a=Kp*(1+T/Ti*L+Td/T);delta_u=a*e2+b*e1+c*e0;u2=u1+delta_u;pDC->LineTo(t,u-unitu*u2);y2=a0*y1+b0*y0+c0*u2;e0=e1;e1=e2;e2=r0-y2;u1=u2;y0=y1;y1=y2;}}}用工程整定法整定PID参数:令T=1,r0=1,K1=1,T1=10取消积分部分作用(取极小Beta值),令Td=0,试得Kp=5时为临界状态,输出曲线:由图知此时周期Tu约为29推算出PID调节时的整定参数Kp=3.125,Ti=14.5,Td=3.625整定后的输出曲线:采用具有积分分离的数字PID算法:对象及PID控制参数均不变,以便与以上无积分分离曲线进行比较β适中(0.8)情况下得曲线β过小(0.2)时得曲线:取Ti=14.5, Td=3.625,改变Kp观察y(t)变化:Kp=10观察图中曲线研Kp=3.125 Kp=1究Kp对调节品质的影响:随着Kp增大,超调量增加,响应速度加快。
PID仿真实验报告

PID仿真实验报告PID控制算法是一种重要的控制算法,被广泛应用于工业控制系统中。
本文通过仿真实验的方式,对PID控制算法进行了验证和分析。
一、实验目的1.了解PID控制算法的基本原理和调节方法;2. 掌握MATLAB/Simulink软件的使用,进行PID控制实验仿真;3.验证PID控制算法的稳定性和性能。
二、实验内容本次实验选择一个常见的控制系统模型,以电感驱动的直流电机控制系统为例。
通过PID控制算法对该系统进行控制,观察系统的响应特性。
三、实验步骤1.搭建电感驱动的直流电机控制系统模型,包括电感、直流电机、PID控制器等组成部分;2.设置PID控制器的参数,包括比例增益Kp、积分时间Ti、微分时间Td等;3.进行仿真实验,输入适当的控制信号,观察系统的响应曲线;4.调节PID控制器的参数,尝试不同的调节方法,观察响应曲线的变化,寻找合适的参数。
四、实验结果与分析1.首先,设置PID控制器的参数为Kp=1,Ti=1,Td=0,进行仿真实验。
观察到系统的响应曲线,并记录与分析曲线的特点;2.其次,调整PID控制器的参数,如增大比例增益Kp,观察系统的响应曲线的变化;3.最后,调整积分时间Ti和微分时间Td,观察系统的响应曲线的变化。
通过实验结果与分析,可以得到以下结论:1.PID控制算法能够有效地控制系统,并实现稳定的控制;2.比例增益Kp对系统的超调量有较大的影响,增大Kp可以减小超调量,但也会增加系统的稳定时间;3.积分时间Ti对系统的稳态误差有较大的影响,增大Ti可以减小稳态误差,但也会增加系统的超调量;4.微分时间Td对系统的响应速度有较大的影响,增大Td可以增加系统的响应速度,但可能会引起系统的振荡。
五、实验总结通过本次实验,我深入理解了PID控制算法的原理和调节方法。
同时,通过对实验结果的分析,我也了解了PID控制算法的稳定性和性能。
在实际工程应用中,需要根据具体的控制对象,合理选择PID控制器的参数,并进行调节优化,以获得理想的控制效果。
pid课程设计

pid 课程设计一、教学目标本节课的教学目标是让学生掌握PID控制器的原理、结构和应用,能够运用PID控制器解决实际工程问题。
具体来说,知识目标包括:了解PID控制器的组成部分,掌握PID控制器的工作原理,理解PID控制器在工业控制系统中的应用。
技能目标包括:能够根据系统特性设计和调整PID控制器参数,能够使用PID控制器进行系统控制。
情感态度价值观目标包括:培养学生对自动化技术的兴趣和认识,使学生意识到PID控制器在现代工业中的重要作用。
二、教学内容本节课的教学内容主要包括PID控制器的原理、结构和应用。
首先,介绍PID控制器的组成部分,包括比例环节、积分环节和微分环节。
然后,讲解PID控制器的工作原理,包括控制器输入输出关系、控制律和参数调整方法。
接着,介绍PID控制器在工业控制系统中的应用,包括过程控制系统、运动控制系统和温度控制系统等。
最后,通过实例分析,让学生学会使用PID控制器解决实际工程问题。
三、教学方法为了实现本节课的教学目标,采用多种教学方法相结合的方式进行教学。
首先,采用讲授法,系统地讲解PID控制器的原理、结构和应用。
其次,采用讨论法,让学生在小组内讨论PID控制器参数调整的方法和技巧。
再次,采用案例分析法,通过分析实际工程案例,让学生学会运用PID控制器解决实际问题。
最后,采用实验法,让学生在实验室进行PID控制器的设计和调试,巩固所学知识。
四、教学资源为了支持本节课的教学内容和教学方法的实施,准备了一系列教学资源。
教材方面,选用《自动控制原理》作为主教材,辅助以《PID控制器应用手册》等参考书籍。
多媒体资料方面,制作了PPT课件,展示了PID控制器的原理图、结构图和工程应用案例。
实验设备方面,准备了PID控制器实验装置,让学生能够亲自动手进行实验操作。
此外,还提供了在线教程、视频讲座等网络资源,供学生课后自学。
五、教学评估本节课的教学评估主要包括平时表现、作业和考试三个部分。
《计算机控制技术》数字PID控制器设计与仿真实验报告

《计算机控制技术》数字PID控制器设计与仿真实验报告课程名称:计算机控制技术实验实验类型:设计型实验项目名称:数字PID控制器设计与仿真一、实验目的和要求1. 学习并掌握数字PID以及积分分离PID控制算法的设计原理及应用。
2. 学习并掌握数字PID控制算法参数整定方法。
二、实验内容和原理图3-1图3-1是一个典型的 PID 闭环控制系统方框图,其硬件电路原理及接线图可设计如图1-2所示。
图3-2中画“○”的线需用户在实验中自行接好,对象需用户在模拟实验平台上的运放单元搭接。
图3-2上图中,ADC1为模拟输入,DAC1为模拟输出,“DIN0”是C8051F管脚 P1.4,在这里作为输入管脚用来检测信号是否同步。
这里,系统误差信号E通过模数转换“ADC1”端输入,控制机的定时器作为基准时钟(初始化为10ms),定时采集“ADC1”端的信号,得到信号E的数字量,并进行PID计算,得到相应的控制量,再把控制量送到控制计算机及其接口单元,由“DAC1”端输出相应的模拟信号,来控制对象系统。
本实验中,采用位置式PID算式。
在一般的PID控制中,当有较大的扰动或大幅度改变给定值时,会有较大的误差,以及系统有惯性和滞后,因此在积分项的作用下,往往会使系统超调变大、过渡时间变长。
为此,可采用积分分离法PID控制算法,即:当误差e(k)较大时,取消积分作用;当误差e(k)较小时才将积分作用加入。
图3-3是积分分离法PID控制实验的参考程序流程图。
图3-3三、主要仪器设备计算机、模拟电气实验箱四、操作方法与实验步骤1.按照图3-2搭建实验仿真平台。
2.确定系统的采样周期以及积分分离值。
3.参考给出的流程图编写实验程序,将积分分离值设为最大值0x7F,编译、链接。
4.点击,使系统进入调试模式,点击,使系统开始运行,用示波器分别观测输入端R以及输出端C。
5.如果系统性能不满意,用凑试法修改PID参数,再重复步骤3和4,直到响应曲线满意,并记录响应曲线的超调量和过渡时间。
单闭环直流调速系统PID控制器参数设计仿真

单闭环直流调速系统PID控制器参数设计仿真一、引言PID控制器是一种经典的控制方法,广泛应用于各种调节系统中。
在单闭环直流调速系统中,PID控制器可以根据给定的转速和实际测量的转速之间的误差,通过计算控制输出来实现对转速的控制。
本文将通过仿真的方式,进行PID控制器参数设计。
二、系统建模G(s)=k/(T*s+1)其中k为增益,T为时间常数。
三、PID控制器参数设计在设计PID控制器参数之前,需要首先选择合适的性能指标,常用的性能指标有超调量、调整时间和稳态误差。
本文选择超调量和调整时间作为性能指标,通过这两个指标可以综合评估系统的动态响应。
1.超调量的计算超调量是指实际过程响应曲线峰值与稳态值之间的差值的百分比。
超调量可以通过以下公式来计算:PO=(M-1)*100%其中PO为超调量,M为峰值与稳态值之间的差值与稳态值的比值。
2.调整时间的计算调整时间是指实际过程从初始值达到稳态值所需的时间。
调整时间可以通过以下方法来计算:标定点到极值点的时间为t1,稳定范围(0.9M,1.1M)的时间为t2,调整时间可定义为t1+t23.参数选择根据超调量和调整时间的要求,可以选择合适的PID控制器参数。
一般情况下,P参数用于控制系统的超调量,I参数用于控制系统的调整时间,D参数用于控制系统的稳定性。
四、仿真结果分析通过Matlab/Simulink进行仿真,得到了PID控制器的参数设计结果。
根据系统传递函数G(s) = k / (T * s + 1),设置k = 1,T = 11.超调量为5%,调整时间为2s的情况下,选取合适的PID控制器参数为:P=1.2I=1.4D=0.12.超调量为10%,调整时间为1.5s的情况下,选取合适的PID控制器参数为:P=1.2I=1.6D=0.153.超调量为15%,调整时间为2.5s的情况下P=1.4I=1.8D=0.2根据上述参数进行仿真,通过绘制转速曲线,可以观察到系统的动态响应。
pid控制系统课程设计

pid控制系统课程设计一、教学目标本节课的教学目标是让学生掌握PID控制系统的原理、结构和应用,具备分析和设计PID控制系统的能力。
具体目标如下:1.知识目标:–了解PID控制系统的概念、原理和组成部分;–掌握PID控制器的参数调整方法;–了解PID控制系统在实际应用中的优缺点。
2.技能目标:–能够运用PID控制原理分析和解决实际问题;–能够使用仿真软件进行PID控制系统的模拟和优化;–能够设计简单的PID控制系统并进行实际操作。
3.情感态度价值观目标:–培养学生对自动化技术的兴趣和认识,认识到PID控制系统在现代工业中的重要作用;–培养学生勇于探索、善于合作的科学精神;–培养学生关注社会、关心他人的责任感。
二、教学内容本节课的教学内容主要包括以下几个部分:1.PID控制系统的概念和原理:介绍PID控制系统的定义、作用和基本原理,让学生了解PID控制系统在工业控制中的应用。
2.PID控制器的参数调整:讲解PID控制器的参数(比例系数、积分系数、微分系数)的作用和调整方法,引导学生掌握参数调整的技巧。
3.PID控制系统的应用:分析PID控制系统在实际应用中的优缺点,让学生了解PID控制系统在不同领域的应用实例。
4.PID控制系统的仿真与实际操作:利用仿真软件,让学生亲自模拟和优化PID控制系统,提高学生运用所学知识解决实际问题的能力。
三、教学方法本节课采用多种教学方法相结合,以提高学生的学习兴趣和主动性:1.讲授法:讲解PID控制系统的原理、结构和参数调整方法,为学生提供系统的知识结构。
2.案例分析法:分析实际应用中的PID控制系统案例,让学生了解PID控制系统的应用场景和优缺点。
3.实验法:让学生利用仿真软件进行PID控制系统的模拟和优化,培养学生的实际操作能力。
4.讨论法:学生进行小组讨论,分享学习心得和体会,提高学生的沟通能力和团队协作精神。
四、教学资源本节课的教学资源包括以下几个方面:1.教材:选用国内权威的PID控制系统教材,为学生提供系统的理论知识。
控制系统课程设计报告--- 控制系统设计与仿真

本科课程设计报告目录控制系统课程设计报告 (1)课程设计题目 (3)实验设备 (3)实验目的 (3)实验背景 (3)实验内容 (3)任务一: (3)了解MATLAB的使用环境,掌握基本的MATLAB编程语法和语句 (3)任务二: (5)了解Simulink的使用环境,掌握Simulink的模块化编程步骤 (5)任务三: (5)对所有过程控制系统对象进行分析,分析所有参数的变化情况 (5)1.一阶系统 (6)2.二阶系统 (7)3.多阶系统 (9)任务四-六: (10)单回路控制系统仿真,PID控制原理,PID参数对控制系统性能的影响 (10)1.被控对象特性在系统中的仿真分析研究 (10)2.执行器在系统中的仿真分析研究 (12)3.控制器特性在系统中的仿真分析研究 (13)4.变送器特性在系统中的仿真分析研究 (15)任务七-八: (17)根轨迹法的基本原理;根轨迹的绘制方法、增益的选择、稳态误差的消除措施 (17)1.根轨迹理论的仿真分析 (17)2.减小消除稳态误差的措施 (18)任务九-十一: (21)频域响应法的基本原理;Bode图的绘制、带宽频率的选择;频率法校正 (21)1.利用伯德图观察幅频与相频特性 (21)2.基于bode图对系统相关指标分析 (22)任务十二-十四: (25)串级控制系统、前馈控制系统、比值控制系统设计,与单回路比较 (25)1.串级控制系统 (25)2.前馈控制系统 (26)3.比值控制系统 (28)任务十五: (29)数字PID控制算法的实验研究 (29)实验总结 (29)参考文献 (29)课程设计题目: 控制系统设计与仿真实验设备:含有MATLAB R2008a 的HP计算机一台.实验目的:通过实验,深入了解MATLAB矩阵实验室的操作,simulink仿真的使用以及各种控制系统的特性,从而为接下来的实体实验打下坚实的基础.有利于学习通过仿真对不能很轻易实现的实验进行分析研究,理解仿真与实际实验的密切关系.实验背景:一学期的自动控制原理课程修习;一学期的过程控制课程修习;一学期的控制系统设计与仿真课程修习;简单的MA TLAB程序应用.实验内容:任务一:了解MATLAB的使用环境,掌握基本的MATLAB编程语法和语句;MATLAB简介:MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
ddc控制系统课程设计

ddc控制系统课程设计一、课程目标知识目标:1. 学生能理解DDC控制系统的基本原理和组成,掌握其工作流程。
2. 学生能掌握DDC控制系统的编程与调试方法,了解其在智能建筑中的应用。
3. 学生能了解DDC控制系统在我国的发展现状及趋势。
技能目标:1. 学生能运用所学知识对DDC控制系统进行简单编程与调试。
2. 学生具备分析DDC控制系统故障并进行排查的能力。
3. 学生能运用DDC控制系统进行简单的自动化控制项目设计。
情感态度价值观目标:1. 培养学生对DDC控制系统及智能建筑领域的兴趣,激发学习热情。
2. 培养学生团队合作精神,提高沟通协调能力。
3. 增强学生环保意识,认识到DDC控制系统在节能减排方面的重要性。
课程性质:本课程为专业选修课,旨在让学生了解并掌握DDC控制系统的基础知识,提高实际操作能力。
学生特点:学生为高年级本科生,具备一定的电子、电气和控制理论基础,对实际操作有较高的兴趣。
教学要求:注重理论与实践相结合,强调实际操作能力的培养,结合案例分析,提高学生的应用能力。
通过本课程的学习,使学生能够具备从事DDC控制系统相关领域工作的基本技能。
二、教学内容1. DDC控制系统概述:介绍DDC控制系统的基本概念、发展历程、应用领域及发展趋势。
教材章节:第一章2. DDC控制系统组成与原理:讲解DDC控制系统的硬件组成、软件结构、工作原理及性能指标。
教材章节:第二章3. DDC控制系统的编程与调试:学习DDC控制系统的编程方法、调试技巧及在实际项目中的应用。
教材章节:第三章4. DDC控制系统在智能建筑中的应用:分析DDC控制系统在建筑自动化、能源管理等方面的应用案例。
教材章节:第四章5. DDC控制系统故障分析与排查:介绍DDC控制系统常见故障现象、原因及排查方法。
教材章节:第五章6. DDC控制系统项目实践:设计实际项目,让学生动手操作,提高实践能力。
教材章节:第六章教学内容安排与进度:第1周:DDC控制系统概述第2周:DDC控制系统组成与原理第3-4周:DDC控制系统的编程与调试第5周:DDC控制系统在智能建筑中的应用第6周:DDC控制系统故障分析与排查第7-8周:DDC控制系统项目实践三、教学方法针对DDC控制系统课程的特点,采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:用于讲解DDC控制系统的基本概念、原理和组成等理论知识。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计(综合实验)报告( 2011-- 2012 年度第二学期)名称:过程计算机控制系统题目:DDC单回路PID闭环控制系统的设计及实时仿真院系:控制与计算机工程学院班级:学号:学生:指导教师:朱耀春设计周数:一周成绩:日期:2012 年 6 月20 日一、 课程设计的目的与要求1.设计目的在计算机控制系统课程学习的基础上,加强学生的实际动手能力,通过对DDC 直接数字闭环控制的仿真加深对课程容的理解。
2.设计要求本次课程设计通过多人合作完成DDC 直接数字闭环控制的仿真设计,学会A/D 、D/A 转换模块的使用。
通过手动编写PID 运算式掌握数字PID 控制器的设计与整定的方法,并做出模拟计算机对象飞升特性曲线,熟练掌握DDC 单回路控制程序编制及调试方法。
二、 设计正文1.设计思想本课程设计利用Turboc2.1开发环境,通过手动编写C 语言程序完成PID 控制器的设计,A/D 、D/A 转换,绘出PID 阶跃响应曲线与被控对象动态特性曲线。
整个设计程序模块包含了PID 配置模块,PLCD-780定时采样、定时输出模块,PID 手/自动切换模块(按键控制)及绘图显示模块。
设计中,通过设定合理的PID 参数,控制PLCD-780完成模拟计算机所搭接二阶惯性环节数据的采集,并通过绘图程序获得对象阶跃响应曲线。
2. 设计步骤(1)前期准备工作(1.1)配备微型计算机一台,系统软件Windows 98或DOS (不使用无直接I/O 能力的NT 或XP 系统), 装Turbo C 2.0/3.0集成开发环境软件;(1.2)配备模拟计算机一台(XMN-1型), 通用数据采集控制板一块(PLCD-780型);(1.3)复习Turboc2.0并参照说明书学习PLCD-780的使用(2) PID 的设计(2.1)PID 的离散化理想微分PID 算法的传递函数形式为:⎪⎪⎭⎫⎝⎛++=s T s T K s G d i p 11)(采用向后差分法对上式进行离散,得出其差分方程形式为: u[k]=u[k-1]+q0*e[2]+q1*e[1]+q2*e[0];其中各项系数为:q0=kp*(1+T/Ti+Td/T);q1=-kp*(1+2*Td/T);q2=kp*Td/T;实际微分PID 算法的传递函数形式为:⎪⎪⎭⎫ ⎝⎛+++=s T s T s T K s G d i f p 111)( 采用向后差分法对上式进行离散化,写成差分方程的形式为:u[k]=c0*(Δu[k-1])+c1*e[k]+c2*e[k-1]+c3*e[k-2]+u[k-1];其中各项系数为:c0=Tf/(T+Tf);c1=kp*T/(T+Tf)*(1+T/Ti+Td/T);c2=-kp*T/(T+Tf)*(1+2*Td/T);c3=kp*Td/(T+Tf);(2.2)数字PID 算法的改进○1积分分离算法 积分分离算法通过控制PID 输入偏差e 达到优化目的,当偏差较大时停止积分作用,只有当偏差较小时才投入积分,算法如下表示:当|e(k)|>β时,采用PD 控制;当|e(k)|<β时, 采用PID 控制;β的值根据具体对象及要求确定。
○2抗积分饱和算法 抗积分饱和算法依据控制系统最终的控制输出量u 达到优化目的,当控制量u 较大且超出执行机构与A/D 转换围时,控制器停止积分作用,保证输出超限时不积分;○3带死区的数字PID 算法 在实际控制系统中,计算机控制为了避免控制动作过于频繁,以消除系统振荡,就会采用带死区的PID 算法。
该算法是在原PID 算法前加一个不灵敏区来实现,即当|e(k)|>C 时,|e(k)|=|e(k)|;当|e(k)|<C 时,|e(k)|=0其中C 代表不灵敏区值;(2.3) 手动/自动双向无扰切换自动切手动:系统处于自动时,手操器实时跟踪自动PID 调节器的输出,切换瞬间由于手操器部电路起保持作用,使得切换没有扰动产生,此时对象处于手操器的开环控制,调节器跟踪手操器的输出。
手动切自动:手动到自动的切换过程主要由计算机软件实现,一方面PID 调节器获得手操器输出,同时软件使得算法中的Δu[k-1])、e[k]、e[k-1]、e[k-2]等历史状态清零。
程序过设置键盘,使的按下手动键H 时,系统处于手动状态,按下自动键A 时,系统处于自动状态。
(3)硬件二阶惯性环节搭建利用模拟计算机中的电容电阻及运算放大器,搭接二阶惯性环节,仿真一个被控对象。
其传递函数为2)1()(+=Ts K s G ,硬件电路如下:图中各元件参数如下:R3=R2=510K ;R1=R4=R5=R6=R7=1M ;C1=C2=C=4.7uF ;则可得:K=(R5/R1)*(R6/R4)=1T1=T2=R5*C1=R6*C2=1000000*0.0000047=4.7s所以G (s )=1/(4.7s+1)*(4.7s+1)搭建好硬件电路后,将PLCD-780插入IPC 机箱插槽,用导线将PLCD-780中的A/D 、D/A 、电源的接线端子与所搭二阶惯性环节的输出、输入端口及机箱上的电源连接,组成一个完整的PID 闭环控制系统,为通信做好准备。
(4)PID 参数的整定8.75,6.6*1.2,6.6*04运用过程控制中PID 参数的工程整定方法,运用衰减曲线法对PID 参数进行整定。
在matlab 中,设置PID 参数为Td=0,Ti=∞,设置合适的比例带使得对象闭环阶跃响应曲线衰减率为0.9,从而确定PID 的整定参数为:P=0.8δ,Ti=1.2t r , Td=0.4t r ;matlab 中对象响应曲线为:0.70.60.50.40.30.20.1由曲线可得PID参数为:P=0.8 =0.8×5=4,Ti=1.2t r=1.2×10=12,Td=0.4t r=0.4×10=4(5)实验结果输出通过在程序中编写相应的绘图模块子程序,在需要画图时调用相应的子程序实现曲线的绘制。
同时在程序中,本小组采用按键实现了PID手自动切换,理想PID与实际PID的切换,以及在手自动状态下由按键改变PID参数,使得调节方式更加的灵活。
3.设计结果(1)PID阶跃响应曲线调用程序,向PID模块输入一个阶跃信号,绘出PID阶跃响应曲线如下:(1.1)理想PID阶跃响应图:(1.2)实际PID阶跃响应图:(2)被控对象(惯性环节)阶跃响应曲线上图通过D/A输出一个1伏左右的信号输入模拟的被控对象(惯性环节),A/D采集对象的输入信号及其响应,再使D/A输出一个幅度为2伏左右的阶跃信号,同时采集输入输出信号。
然后,D/A再反向在输出一个幅度为2伏左右负的阶跃信号,同时采集输入输出信号,得出仿真对象飞升特性曲线。
程序中,通过按键实现模拟对象输入信号的加减。
当按下H按键时,且按下U键时,D/A输出一个1伏阶跃信号,再次按下按键时阶跃信号累加。
每次按下D键时,D/A输出的阶跃信号递减1。
(3)设定值r、控制量u和被控对象输出y的响应曲线:4.程序清单/*---------------头文件定义---------------*/#include<conio.h>#include<graphics.h>#include <stdio.h>#include <dos.h>/*---------------定义绘图坐标---------------*/#define ox 8 /*-----原点横坐标-------*/ #define oy 440 /*------原点纵坐标------*/#define xx 620 /*------x轴顶点横坐标--*/#define xy 440 /*-----x轴顶点纵坐标---*/#define lenx 580#define leny 400#define yx 8 /*-----y轴顶点横坐标----*/#define yy 15 /*------y轴顶点纵坐标----*//*-----------------定义绘图区域----------------*/#define left 20#define top 20#define right 620#define bottom 460/*----------------坐标轴注释---------------------*/#define xtext1x 450#define xtext1y 450#define ytext1x 10#define ytext1y 60#define xtext2x 610#define xtext2y 450#define ytext2x 10#define ytext2y 20/*-------------------------理想PID运算式--------------------------*/ float lxpid(float kp,float td,float ti,float e[3],float u1){int t=1;float u;float q0=kp*(1+t/ti+td/t);float q1=-kp*(1+2*td/t);float q2=kp*td/t;u=q0*e[0]+q1*e[1]+q2*e[2]+u1;return u;}/*-------------------------实际PID运算式--------------------------*/ float sjpid(float kp,float tf,float td,float ti,float e[3],float du1,float u1){int t=1,k=1000;float u2;float c1=tf/(t+tf);float c2=kp*t*(1+t/ti+td/t)/(t+tf);float c3=-kp*t*(1+2*td/t)/(t+tf);float c4=kp*td/(t+tf);u2=c1*du1+c2*e[0]+c3*e[1]+c4*e[2]+u1;return u2;}/*-------------------------绘图初始化--------------------------*/ void Initial_Sys(void){int GraphDriver;int GraphMode;detectgraph(&GraphDriver,&GraphMode);initgraph(&GraphDriver,&GraphMode,"C:\\TC201E\\BGI");cleardevice();}/*-------------------------绘制坐标系------------------*/void DrawAxis(void){int i;setbkcolor(15);setcolor(5);line(ox,oy,xx,xy); /*x_axis*/line(xx-5,xy-5,xx,xy);line(xx,xy,xx-5,xy+5);line(ox,oy,yx,yy); /*y_axis*/line(yx-5,yy+10,yx,yy);line(yx+5,yy+10,yx,yy);for(i=0;i<51;i++){line(ox+10*i,oy,ox+10*i,oy-10);line(ox+10*i+5,oy,ox+10*i+5,oy-5); }for(i=1;i<=8;i++)line(ox,oy-50*i,ox+10,oy-50*i);outtextxy(ox+50*0-7,oy+20,"0");outtextxy(ox+50*1-7,oy+20,"5");outtextxy(ox+50*2-7,oy+20,"10");outtextxy(ox+50*3-7,oy+20,"15");outtextxy(ox+50*4-7,oy+20,"20");outtextxy(ox+50*5-7,oy+20,"25");outtextxy(ox+50*6-7,oy+20,"30");outtextxy(ox+50*7-7,oy+20,"35");outtextxy(ox+50*8-7,oy+20,"40");outtextxy(ox+50*9-7,oy+20,"45");outtextxy(ox+50*10-7,oy+20,"50");outtextxy(ox-10,oy-50*1,"1");outtextxy(ox-10,oy-50*2,"2");outtextxy(ox-10,oy-50*3,"3");outtextxy(ox-10,oy-50*4,"4");outtextxy(ox-10,oy-50*5,"5");outtextxy(ox-10,oy-50*6,"6");outtextxy(ox-10,oy-50*7,"7");outtextxy(ox-10,oy-50*8,"8");settextstyle(SMALL_FONT,HORIZ_DIR,5); outtextxy(xtext1x,xtext1y,"Time");settextstyle(SMALL_FONT,VERT_DIR,5);outtextxy(ytext1x,ytext1y,"The output (Response)");outtextxy(ytext2x,ytext2y,"U(t)\/V");}main(){float kp,ti,td,tf,e[3]={0},ee[3]={0},u[6]={0},au1=0;int r=1,k=1;Initial_Sys();DrawAxis();while(k<100){u[0]=lxpid(1,3.0,10,e,u[1]);e[0]=r;/*printf("%f\n",u[0]);*/u[3]=sjpid(1,5,3.0,10,ee,au1,u[4]);setcolor(5);line((k-1)*10,130-u[1]*100,k*10,130-u[1]*100);line(k*10,130-u[1]*100,k*10,130-u[0]*100);delay(10000);u[2]=u[1];u[1]=u[0];e[2]=e[1];e[1]=e[0];ee[0]=r;setcolor(3);line((k-1)*10,150-u[4]*100,k*10,150-u[4]*100);line(k*10,150-u[4]*100,k*10,150-u[3]*100);u[5]=u[4];u[4]=u[3];ee[2]=ee[1];ee[1]=ee[0];au1=u[4]-u[5];k++;}}/*---------------头文件定义---------------*/#include "stdio.h"#include "math.h"#include "graphics.h" /*for graph driver installing,only can be called in Turbo C*/#include "string.h"#include "dos.h"#include "bios.h"#include "conio.h" /*for interrupt program 头文件定义* /#include "stdlib.h"#include "io.h"/*--------------按键地址区定义--------------------*//*statements*/double key_ESC=0x011b; /*define can not suit the length of bioskey 键盘存定义*/ double key_E=0x1265;double key_A=0x1e61;double key_H=0x2368;double key_U=0x1675;double key_D=0x2064;double key_I=0x1769;double key_P=0x1970;double key_down=0x5000;double key_left=0x4b00;double key_right=0x4d00;double key_pgup=0x4900;double key_pgdown=0x5100;/*--------------PLCD780基址定义--------------------*/#define BASE 0x220 /*------------PCL812G need 16 addresses in a row,from 220H to 3F0H*/ #define REG 0/*---------------定义绘图坐标---------------*/#define ox 40 /*------------原点横坐标-------------*/#define oy 440 /*------------原点纵坐标------------*/#define xx 600 /*------------x轴顶点横坐标--------*/#define xy 440 /*------------x轴顶点纵坐标--------*/#define yx 40 /*------------y轴顶点横坐标--------*/#define yy 40 /*------------y轴顶点纵坐标---------*//*---------------PID参数定义---------------*/float Kp=1.0;float Ti=10.0;float Td=3.0;float Tf0=15.0;float Tf=0;float T=0.1; /*---------------采样时间------------*/float ad,e,pv0;float u=0.0;float pv=0.0;float sp=0.0;char A_H='H';int key=0;int time_counter=0; /*times of interrupt*/int cj_counter=0; /*sampling counter*/int Q_counter=800; /* 采集步长赋初始值*/int stepdata[800];int slopedata[800];int error[800];/*--------------函数声明-----------------*/void interrupt (*fadd1C)(void);void loop();float AD(unsigned char channal); /*A/D*/void DA(float pv1); /*D/A*/void interrupt INT_1C(void); /*8259,reset interrupt controller*/int scankey();float DelayAction(float y0);void PIDset(void);float PID(float sp1,float pv1,float Kp1,float Ti1,float Td1,float Tf1,char A_H1,float T1); float Object(float u1,float T1);void Initial_Sys(void); /*Initiate graph display*/void axis(void);void Drawline(int cj,float pv1,float sp1,float u1,float e1);/*主函数*/void main(void){for(i=0;i<500;i++){stepdata[i]=10;slopedata[i]=i;error[i]=0;}/* Set new INT_1C and save old */disable();fadd1C=getvect(0x1C);/*1C为定时器控制的软中断,平均一秒发生18.2次,即周期为55ms 中断程序*//* 开启中断服务*/setvect(0x1C,INT_1C);enable();axis();loop();}/*主函数结束下面为定时采值输出程序*/void loop(){ do{if((cj_counter*T)<(time_counter/18.2)){PIDset(); /*Introduction:Exit-E/ESC,A_H-A/H,Ideal/Parallel PID,sp-U/D*/u=PID(sp,pv,Kp,Ti,Td,Tf,A_H,T);/*DA(u); */pv=Object(u,T);/*ad=AD(O);*//*pv=DelayAction(u);*/e=error[cj_counter];Drawline(cj_counter,pv,sp,u,e);manu=0;if(Tf==0)printf("IdealPID,Mode:%c,sp=%.1f,pv=%2.1f,u=%.1f,error=%.1f,Kp=%.1f,Ti=%.1f,Td=%.1f\t\r",A_H,sp,pv,u,e, Kp,Ti,Td);else if(Tf>0)printf("Parallal,Mode:%c,sp=%.1f,pv=%2.1f,u=%.1f,error=%.1f,Kp=%.1f,Ti=%.1f,Td=%.1f\t\r",A_H,sp,pv,u,e,K p,Ti,Td);else printf("\t\tTf got a wrong value! Please exit and restart this program.\r");cj_counter++;}}while(cj_counter<500);disable();/* 恢复中断*/setvect(0x1C,fadd1C);enable();}/*D/A conversion program,0 to 4095 -- 0to +5*/float AD(unsigned char channal){float result=0;int i;unsigned char hb=0,lb=0,ok=0x10;/*12bit AD/high 4 bits and low 8 bits*/outportb(BASE+11,REG); /*软件程序触发*/delay(10); /*here,'delay(int ms)' is used long before,and we just need some time for hardware working*/outportb(BASE+10,channal); /*进行通道设置.选择通道0*/delay(10);outportb(BASE+12,0); /*触发A/D转换*/delay(10);do{ok=inportb(BASE+5);}while(ok&0x10);hb=inportb(BASE+5);delay(10);lb=inportb(BASE+4);result = lb + ((hb&0x0F)<<8); /*0 to 4095*/result=result*5/4096; /*0 V to +5V*/return result;}/*A/D conversion program,0 to +5 -- 0 to 4095*/void DA(float pv1){int temp,i;unsigned char hb,lb;if (pv1>5) /* make the output real */pv1=5;else if (pv1<0)pv1=0;temp=(int)(4095*pv1/5.0);hb=temp<<8;lb=temp-(hb<<8);outportb(BASE+4,lb); /* low 8 */delay(10);outportb(BASE+5,hb); /* high 4 */}void interrupt INT_1C(void){time_counter++;outportb(0x20,0x20);}/*键盘控制*/int scankey(void){int key0;key0=bioskey(1); /* function 1 returns 0 until a key is pressed */ if(key0!=0)key0=bioskey(0); /* function 0 returns the key that is waiting */ return key0;}/*DelayAction*//*tao=(int)(18.2*2) Delay action=2 seconds*/float DelayAction(float y0){float y_out;int cyc;y_out=y_old[36-1];for(cyc=1;cyc<36;cyc++)y_old[36-cyc]=y_old[36-cyc-1];y_old[0]=y0;return y_out;}/*PID 主程序*/void PIDset(void){key=scankey();if(A_H=='H'){if(key==key_up)Kp+=0.2;else if(key==key_down)Kp-=0.2;else if(key==key_left)Ti-=0.2;else if(key==key_right)Ti+=0.2;else if(key==key_pgup)Td+=0.2;else if(key==key_pgdown)Td-=0.2;else if(key==key_U)manu='+';else if(key==key_D)if(A_H=='A'){if(key==key_U)sp+=10;if(key==key_D)sp-=10;}if(key==key_E||key==key_ESC)exit(1);if(key==key_A)A_H='A';if(key==key_H)A_H='H';if(key==key_I)Tf=0;if(key==key_P)Tf=Tf0;}/*PID-default:IdealPID*/float PID(float sp1,float pv1,float Kp1,float Ti1,float Td1,float Tf1,char A_H1,float T1){float delta_u,u0,e,C1,C2,C3,C4;static float e1,e2,u1,delta_u1; /*here,u1 stands for the previous value of u*/if(Kp1<0) p rintf("Kp becomes a negative number,please restart.");else if(Ti1<0) printf("Ti becomes a negative number,please press restart.");else if(Td1<0) printf("Td becomes a negative number,please press restart.");.{C1=Tf1/(T1+Tf1);C2=Kp1*T1*(1+T1/Ti1+Td1/T1)/(T1+Tf1);C3=-Kp1*T1*(1+2*Td1/T1)/(T1+Tf1);C4=Kp1*Td1/(T1+Tf1);/*自动控制*/if(A_H1=='A'){e=sp1-pv1;delta_u=C1*delta_u1+C2*e+C3*e1+C4*e2; /*here,delta_u1 stands for the previous value of delta_u*/u0=u1+delta_u;e2=e1;e1=e;delta_u1=delta_u;u1=u0;error[cj_counter]=sp1-pv1;return u0;}/*手动控制*/else if(A_H1=='H'){if(manu=='+')u+=10;if(manu=='-')u-=10;sp1=pv1;u1=u;sp=pv1;e1=0;.e2=0;delta_u1=0;error[cj_counter]=sp1-pv1;return u;}}}/*object:二阶惯性环节*/float Object(float u1,float T1){/*G(s)=1/(4.7s+1)^2,K=1,Tp1=Tp2=4.7*/static float y1,y2;float y;y=1/(31.49+T1)*(-22.09*y2+53.58*y1+T1*u1);y2=y1;y1=y;return y;}/*显示与画图*//*初始化CRT*/void Initial_Sys(void){int GraphDriver;int GraphMode;detectgraph(&GraphDriver,&GraphMode);initgraph(&GraphDriver,&GraphMode,"C:\\TC201E\\BGI"); }/*draw basic coordinate axis*/void axis(void){int i;Initial_Sys();.setbkcolor(15); /*white0/black15*/setcolor(9); /*linght blue*/rectangle(10,20,630,470); /*zone of drawing*/line(ox,oy,xx,xy); /*axis and arrow*/line(xx-5,xy-5,xx,xy);line(xx,xy,xx-5,xy+5);line(ox,oy,yx,yy);line(yx-5,yy+5,yx,yy);line(yx+5,yy+5,yx,yy);settextstyle(2,1,5); /*Small font,vert,5 times bigger*/outtextxy(20,100,"The Output (Response)");outtextxy(20,40,"U(t)");settextstyle(2,0,5); /*Small font,horiz,5 times bigger*/outtextxy(300,455,"Time");outtextxy(590,455,"t/sec");setlinestyle(1,0,1); /*dot line,none,width*/for(i=1;i<4;i++) /*each inport starting position*/ line(ox,oy-100*i,ox+500,oy-100*i);outtextxy(ox-16,oy-100*0,"0");outtextxy(ox-16,oy-100*1,"1");outtextxy(ox-16,oy-100*2,"2");outtextxy(ox-16,oy-100*3,"3");for(i=1;i<=500/50;i++) /*scale*/{line(ox+50*i,oy,ox+50*i,oy-400); /*1/T=10,that is 10px=1sec*/line(ox+50*i-25,oy,ox+50*i-25,oy-10);}setlinestyle(0,0,1); /*real line,none,width*/outtextxy(ox-4+50,oy+2,"5");outtextxy(ox-8+100,oy+2,"10");.outtextxy(ox-8+150,oy+2,"15");outtextxy(ox-8+200,oy+2,"20");outtextxy(ox-8+250,oy+2,"25");outtextxy(ox-8+300,oy+2,"30");outtextxy(ox-8+350,oy+2,"35");outtextxy(ox-8+400,oy+2,"40");outtextxy(ox-8+450,oy+2,"45");outtextxy(ox-8+500,oy+2,"50");}/*line-drawing and notes*/void Drawline(int cj1,float pv1,float sp1,float u1,float e1){static int cj_0=0,cj_1=0,pv_0=0.0,pv_1=0.0,sp_0=0.0,sp_1=0.0,u_0=0.0,u_1=0.0,e_0=0.0,e_1=0.0;cj_1=cj1; /*X coordinate*/pv_1=(int)(pv1*10);sp_1=(int)(sp1*10);u_1=(int)(u1*10);e_1=(int)(e1*10);setcolor(2); /*green*/line(ox+cj_0,oy-pv_0,ox+cj_1,oy-pv_1);outtextxy(590,30,"pv");setcolor(8); /*dark gray*/line(ox+cj_0,oy-sp_0,ox+cj_1,oy-sp_1);outtextxy(590,45,"sp");setcolor(3); /*cyan*/line(ox+cj_0,oy-u_0,ox+cj_1,oy-u_1);outtextxy(590,60,"u");setcolor(4); /*red*/line(ox+cj_0,oy-e_0,ox+cj_1,oy-e_1);outtextxy(590,75,"error");cj_0=cj_1;.pv_0=pv_1;sp_0=sp_1;u_0=u_1;e_0=e_1;}三、课程设计(综合实验)总结或结论1.正文为宋体,五号字行间距为211.1------------1.2------------四、参考文献[1] 作者1, 作者2 书名. 出版单位, 版本. 出版日期附录(设计流程图、程序、表格、数据等)注:根据课程设计、综合实验的容将标题任选其一。