DDC串级回路PID闭环控制系统的设计及实时仿真_第1页
DDC串级回路PID闭环控制系统的设计及实时仿真_第2页
DDC串级回路PID闭环控制系统的设计及实时仿真_第3页
DDC串级回路PID闭环控制系统的设计及实时仿真_第4页
DDC串级回路PID闭环控制系统的设计及实时仿真_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 课程设计报告( 2012 - 2013 年度第 2 学期)名 称: 过程计算机控制 题 目: DDC串级回路PID闭环控制系统的设计及实时仿真院 系:自动化 班 级:实验自10 学 号:1101290120 学生姓名:张超群 指导教师: 田 涛 设计周数: 一 周 成 绩: 日期:2013 年 7 月 6 日PID参数的整定1)利用Matlab中Simulink工具搭建理想PIDPID模块内部结构:整定理想PID参数为:Kp=3 Ti=15s Td=2s对象响应曲线为:该组整定参数能够实现快速稳定效果,整定结果较为理想。2)利用Matlab中Simulink工具搭建实际PID: PID模块内

2、部结构:整定实际PID参数为:Kp=2 Ti=15s Td=4 Tf=10s对象响应曲线为:同样满足快速性要求,保证系统稳定。(5)实验结果输出曲线绘制由程序中编写的绘图模块子程序完成,同时采用按键实现了PID手自动切换、理想PID与实际PID的切换,以及在手自动状态下由按键改变PID参数,使得调节方式更加的灵活。 3.设计结果(1)PID阶跃响应曲线调用程序,向PID模块输入一个阶跃信号,绘出PID阶跃响应曲线如下:理想PID阶跃响应图: 实际PID阶跃响应图:由理想与实际PID阶跃响应对比,可知,理想微分PID算法的微分作用仅局限于一个采样周期有一个大幅度的输出。这样在大的干扰作用情况下,

3、一方面会使算法中的微分不能充分发挥作用。另一方面也会对执行机构产生很大的冲击作用。相反的,实际微分PID算法由于惯性滤波的存在,使微分作用可持续多个采样周期,有效地避免了上述问题的产生,因而具有更好的控制性能。(2)被控对象(实物搭建二阶惯性环节)阶跃响应曲线上图通过D/A输出一个1伏左右的信号输入模拟的被控对象(惯性环节),A/D采集对象的输入信号及其响应,再使D/A输出一个幅度为2伏左右的阶跃信号,同时采集输入输出信号。然后,D/A再反向在输出一个幅度为2伏左右负的阶跃信号,同时采集输入输出信号,得出仿真对象飞升特性曲线。程序中,通过按键实现模拟对象输入信号的加减。当按下H按键时,且按下U

4、键时,D/A输出一个1伏阶跃信号,再次按下按键时阶跃信号累加。每次按下D键时,D/A输出的阶跃信号递减1。(3)根据对象单位阶跃响应曲线求增益和惯性时间:利用切线法求对象的增益和用一阶等效的惯性时间:如上图所示做拐点切线,得对象增益和一阶等效惯性时间分别为: Ti(4)手自动切换:为实现手动到自动的勿扰切换,计算机需要跟踪手操器的阀位值,使u(k-1)能够跟踪阀位值,此外,控制算法中的e(k-1)、e(k-2)、u(k-1)等历史状态清零,使切换时偏差e(k)也为0。为使e(k)=0,就要求手动状态时的设定值跟踪过程的反馈量(即SP跟踪PV)。这样处理后,就能保证u(k)=0,实现手动到自动的

5、无扰切换。(5)设定值r、控制量u和被控对象输出的阶跃响应曲线:理想PID自动状态下,闭环系统阶跃响应曲线:实际PID自动状态下,闭环系统阶跃响应曲线:由于微分对高频信号具有放大作用,采用理想PID容易在系统引入高频的干扰,因此在理想PID自动状态下,响应曲线有非常明显的毛刺。而实际微分PID算法中包含有一阶惯性环节,具有低通滤波的性能,抗干扰能力较强。 4.程序清单/*-理想PID-*/*-头文件定义-*/#include#include#include#include#include/*-截图-*/#define IMAGEX 0 unsigned char CLOR163=0XFF,0X

6、FF,0XFF,0XAA,0X00,0X00,0X00,0XAA,0X00,0XAA,0XAA,0X00,0X00,0X00,0XAA,0XAA,0X00,0XAA,0X00,0X55,0XAA,0XAA,0XAA,0XAA,0X55,0X55,0X55,0XFF,0X55,0X55,0X55,0XFF,0X55,0XFF,0XFF,0X55,0X55,0X55,0XFF,0XFF,0X55,0XFF,0X55,0XFF,0XFF,0X00,0X00,0X00,;/*-定义绘图坐标(640,480)-*/#define xo 40 /*-x轴-*/ #define xf 630 #define

7、 xy 440 #define yx 40 /*-y轴-*/#define yo 440#define yf 10 /*-理想PID运算式-*/float ipid(float kp,float td,float ti,float e3,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*e0+q1*e1+q2*e2+u1;return u; /*-绘图初始化-*/void Initial_Sys(void)int GraphDriver;int Gra

8、phMode;detectgraph(&GraphDriver,&GraphMode);initgraph(&GraphDriver,&GraphMode,);cleardevice(); /*-绘制坐标系-*/void DrawAxis(void)int i;setbkcolor(15);setcolor(5);line(xo,xy,xf,xy); /*-x轴-*/line(xf,xy,xf-5,xy+5);line(xf,xy,xf-5,xy-5);line(yx,yo,yx,yf); /*-y轴-*/line(yx,yf,yx-5,yf+5);line(yx,yf,yx+5,yf+5);

9、for(i=1;i=50;i+) /*-x轴刻度-*/if(i%5=0)line(xo+10*i,yo,xo+10*i,yo-10);elseline(xo+10*i,yo,xo+10*i,yo-5);for(i=1;i=8;i+) /*-y轴刻度-*/line(xo,yo-50*i,xo+10,yo-50*i);outtextxy(xo+50*0-7,yo+20,0);outtextxy(xo+50*1-7,yo+20,5);outtextxy(xo+50*2-7,yo+20,10);outtextxy(xo+50*3-7,yo+20,15);outtextxy(xo+50*4-7,yo+2

10、0,20);outtextxy(xo+50*5-7,yo+20,25);outtextxy(xo+50*6-7,yo+20,30);outtextxy(xo+50*7-7,yo+20,35);outtextxy(xo+50*8-7,yo+20,40);outtextxy(xo+50*9-7,yo+20,45);outtextxy(xo+50*10-7,yo+20,50);outtextxy(xo-10,yo-50*1,1);outtextxy(xo-10,yo-50*2,2);outtextxy(xo-10,yo-50*3,3);outtextxy(xo-10,yo-50*4,4);outte

11、xtxy(xo-10,yo-50*5,5);outtextxy(xo-10,yo-50*6,6);outtextxy(xo-10,yo-50*7,7);outtextxy(xo-10,yo-50*8,8);rectangle(1,5,635,470); /*画外层大框*/ settextstyle(2,0,5);/*Small font,horiz,5 times bigger*/outtextxy(300,450,Time);outtextxy(590,450,t/sec); settextstyle(2,0,5);/*Small font,vert,5 times bigger*/outt

12、extxy(5,15,The Output (Response);outtextxy(5,40,U(t); setlinestyle(1,0,1); /*虚线*/for(i=1;i=8;i+)/*横向虚线-y380*/line(xo,yo-50*i,xo+520,yo-50*i);for(i=1;i=0;m-) for(n=0;n640;n+) pix = getpixel(n,m); fwrite(CLORpix,3,1,fp); fclose(fp); return 1;/*-主函数-*/main()float e3=0,u2=0;int k;Initial_Sys();DrawAxis(

13、);e0=1; /*第0步*/e1=0;e2=0;u0=ipid(1,3.0,10,e,u1);setcolor(3);setlinestyle(0,0,1); line(xo,yo-u0*50,xo+10,yo-u0*50);delay(500);u1=u0;e0=1; /*第1步*/e1=1;e2=0;u0=ipid(1,3.0,10,e,u1);setcolor(3);line(xo+10,yo-u1*50,xo+10,yo-u0*50);line(xo+10,yo-u0*50,xo+20,yo-u0*50);delay(500);u1=u0;e0=1; /*第2步以后*/e1=1;e2

14、=1;for(k=2;k=50;k+)u0=ipid(1,3.0,10,e,u1);setcolor(3);line(xo+10*k,yo-u1*50,xo+10*k,yo-u0*50);line(xo+10*k,yo-u0*50,xo+10*(k+1),yo-u0*50);delay(500);u1=u0;get_img(); /*截图*/*/*-实际PID-*/*-头文件定义-*/#include#include#include#include#include/*-截图-*/#define IMAGEX 0 unsigned char CLOR163=0XFF,0XFF,0XFF,0XAA

15、,0X00,0X00,0X00,0XAA,0X00,0XAA,0XAA,0X00,0X00,0X00,0XAA,0XAA,0X00,0XAA,0X00,0X55,0XAA,0XAA,0XAA,0XAA,0X55,0X55,0X55,0XFF,0X55,0X55,0X55,0XFF,0X55,0XFF,0XFF,0X55,0X55,0X55,0XFF,0XFF,0X55,0XFF,0X55,0XFF,0XFF,0X00,0X00,0X00,;/*-定义绘图坐标(640,480)-*/#define xo 40 /*-x轴-*/ #define xf 630 #define xy 440 #def

16、ine yx 40 /*-y轴-*/#define yo 440#define yf 10 /*-实际PID运算式-*/float ppid(float kp,float ti,float td,float tf,float e3,float du1) int t=1; float du; 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); du=c1*du1+c2*e0+c3*e1+c4*e2; return du; /

17、*-绘图初始化-*/void Initial_Sys(void)int GraphDriver;int GraphMode;detectgraph(&GraphDriver,&GraphMode);initgraph(&GraphDriver,&GraphMode,);cleardevice(); /*-绘制坐标系-*/void DrawAxis(void)int i;setbkcolor(15);setcolor(5);line(xo,xy,xf,xy); /*-x轴-*/line(xf,xy,xf-5,xy+5);line(xf,xy,xf-5,xy-5);line(yx,yo,yx,yf

18、); /*-y轴-*/line(yx,yf,yx-5,yf+5);line(yx,yf,yx+5,yf+5);for(i=1;i=50;i+) /*-x轴刻度-*/if(i%5=0)line(xo+10*i,yo,xo+10*i,yo-10);elseline(xo+10*i,yo,xo+10*i,yo-5);for(i=1;i=8;i+) /*-y轴刻度-*/line(xo,yo-50*i,xo+10,yo-50*i);outtextxy(xo+50*0-7,yo+20,0);outtextxy(xo+50*1-7,yo+20,5);outtextxy(xo+50*2-7,yo+20,10)

19、;outtextxy(xo+50*3-7,yo+20,15);outtextxy(xo+50*4-7,yo+20,20);outtextxy(xo+50*5-7,yo+20,25);outtextxy(xo+50*6-7,yo+20,30);outtextxy(xo+50*7-7,yo+20,35);outtextxy(xo+50*8-7,yo+20,40);outtextxy(xo+50*9-7,yo+20,45);outtextxy(xo+50*10-7,yo+20,50);outtextxy(xo-10,yo-50*1,1);outtextxy(xo-10,yo-50*2,2);outt

20、extxy(xo-10,yo-50*3,3);outtextxy(xo-10,yo-50*4,4);outtextxy(xo-10,yo-50*5,5);outtextxy(xo-10,yo-50*6,6);outtextxy(xo-10,yo-50*7,7);outtextxy(xo-10,yo-50*8,8);rectangle(1,5,635,470); /*画外层大框*/ settextstyle(2,0,5);/*Small font,horiz,5 times bigger*/outtextxy(300,450,Time);outtextxy(590,450,t/sec); set

21、textstyle(2,0,5);/*Small font,vert,5 times bigger*/outtextxy(5,15,The Output (Response);outtextxy(5,40,U(t); setlinestyle(1,0,1); /*虚线*/for(i=1;i=8;i+)/*横向虚线-y380*/line(xo,yo-50*i,xo+520,yo-50*i);for(i=1;i=0;m-) for(n=0;n640;n+) pix = getpixel(n,m); fwrite(CLORpix,3,1,fp); fclose(fp); return 1;/*-主函

22、数-*/main()float e3=0,u2=0,du2=0;int k;Initial_Sys();DrawAxis();e0=1; /*第0步*/e1=0;e2=0;du0=ppid(1,10,30,10,e,du1);u0=u1+du0;setcolor(3);setlinestyle(0,0,1); line(xo,yo-u0*50,xo+10,yo-u0*50);delay(500);u1=u0;du1=du0;e0=1; /*第1步*/e1=1;e2=0;du0=ppid(1,10,30,10,e,du1);u0=u1+du0;setcolor(3);line(xo+10,yo-

23、u1*50,xo+10,yo-u0*50);line(xo+10,yo-u0*50,xo+20,yo-u0*50);delay(500);u1=u0;du1=du0;e0=1; /*第2步以后*/e1=1;e2=1;for(k=2;k=50;k+)du0=ppid(1,10,30,10,e,du1);u0=u1+du0;setcolor(3);line(xo+10*k,yo-u1*50,xo+10*k,yo-u0*50);line(xo+10*k,yo-u0*50,xo+10*(k+1),yo-u0*50);delay(500);u1=u0;du1=du0;get_img(); /*截图*/*

24、/*00-头文件定义-*/#include stdio.h#include math.h#include graphics.h#include string.h#include dos.h#include bios.h#include conio.h /*中断程序头文件定义*/#include stdlib.h#include io.h/*00-按键地址区定义-*/ /* 键盘定义*/double key_ESC=0 x011b; /*退出*/ double key_E=0 x1265;double key_A=0 x1e61; /*自动*/double key_H=0 x2368; /*手动

25、*/double key_U=0 x1675; /*自动时增SP,手动时增手操器输出*/double key_D=0 x2064; /*自动时增SP,手动时增手操器输出*/double key_I=0 x1769; /*理想PID*/double key_P=0 x1970; /*实际PID*/double key_up=0 x4800; /*手动时,增Kp*/double key_down=0 x5000; /*手动时,减Kp*/double key_left=0 x4b00; /*手动时,减Ti*/double key_right=0 x4d00; /*手动时,增Ti*/double ke

26、y_pgup=0 x4900; /*手动时,增Td*/double key_pgdown=0 x5100; /*手动时,减Td*/*-PLCD780基址定义-*/#define BASE 0 x220/*-基址-*/*-截图-*/*#define IMAGEX 0 unsigned char CLOR163=0XFF,0XFF,0XFF,0XAA,0X00,0X00,0X00,0XAA,0X00,0XAA,0XAA,0X00,0X00,0X00,0XAA,0XAA,0X00,0XAA,0X00,0X55,0XAA,0XAA,0XAA,0XAA,0X55,0X55,0X55,0XFF,0X55,

27、0X55,0X55,0XFF,0X55,0XFF,0XFF,0X55,0X55,0X55,0XFF,0XFF,0X55,0XFF,0X55,0XFF,0XFF,0X00,0X00,0X00,; */*00-定义绘图坐标(640,480)-*/#define ox 40/*原点横坐标*/#define oy 440 /*原点纵坐标*/#define xx 600 /*x轴顶点横坐标*/#define xy 440 /*x轴顶点纵坐标*/#define yx 40/*y轴顶点横坐标*/#define yy 40/*y轴顶点纵坐标*/*-xx-ox=600-40=560(500)-oy-yy=440

28、-40=400(380)-*/*-PID参数定义(全局变量)-*/float Kp=3; /*全局变量*/float Ti=15;float Td=2;float Tf0=10; /*实际PID*/float Tf=0; /*理想PID*/float dead_band=0.5; /*积分分离*/float u_max=4.9; /*抗积分饱和*/float u_min=0.1; float T=0.2; /*采样时间ms*/float pv=0; /*反馈值*/float sp=0; /*设定值*/float ad; /*A/D的读数*/float e; /*偏差*/float u=0; /

29、*控制作用,控制器的输出*/float u_m=0; /*手操器输出*/char A_H=H; /*手动-自动,开始为手动*/char manu=0; /*用于调节u_m的增减*/int key=0; /*存键盘扫描结果*/int time_counter=0; /*中断计数*/int cj_counter=0; /*采样计数器*/int Q_counter=500; /* 采集步长*/*00-函数声明 -*/void interrupt (*fadd1C)(void); /*中断*/void interrupt INT_1C(void);/*8259,reset interrupt cont

30、roller*/void loop(); /*主程序循环*/float AD(unsigned char channal);/*A/D*/void DA(); /*D/A*/int scankey(); /*扫描键盘,判断是否有建按下*/float DelayAction(); /*软件延迟*/void PIDset(void); /*PID设置*/float PID(void);float Object(void); /*仿真对象*/void Initial_Sys(void);/*初始化为图形模式*/void axis(void); /*画坐标轴*/void Drawline(void);

31、 /*画线*/*int get_img(void);*/*00-主函数-*/void main(void) disable(); /*保存旧中断,设置新中断*/fadd1C=getvect(0 x1C);/*1C为定时器控制的软中断,平均一秒发生18.2次,即周期为55ms 中断程序*/ setvect(0 x1C,INT_1C); /* 开启中断服务*/enable();axis(); /*画坐标轴*/loop();/*-loop-*/void loop() doif(cj_counter*T)0)printf(Parallal,Mode:%c,sp=%.1f,pv=%2.1f,u=%.1f

32、,error=%.1f,Kp=%.1f,Ti=%.1f,Td=%.1ftr,A_H,sp,pv,u,e,Kp,Ti,Td);else printf(ttTf got a wrong value! Please exit and restart this program.r);cj_counter+; /*计数器加1*/while(cj_counter04095-*/void DA() int temp,i; unsigned char hb,lb; /*限幅 */ if (u5) u=5; else if (u0)u=0; temp=(int)(4095*u/5.0); /*转换为0-4095

33、的数字量*/hb=temp/256; /*高4位*/lb=temp%256; /*低8位*/outportb(BASE,1); /*启动DA转换*/ for(i=0;i10000;i+); outportb(BASE+4,lb); /* 低8位输出 */ for(i=0;i05-*/float AD(unsigned char channal)float result=0;int num,i;unsigned char hb=0,lb=0,poll=0 x10;/*12bit AD/high 4 bits and low 8 bits*/outportb(BASE+11,1);/*软件程序触发

34、*/for(i=0;i10000;i+); outportb(BASE+10,channal);/*进行通道设置.选择通道0*/for(i=0;i10000;i+); outportb(BASE+9,0); /*设置增益通道增益*/for(i=0;i10000;i+); outportb(BASE+12,0);/*触发A/D转换*/for(i=0;i10000;i+); do /*查询法读PV*/poll=inportb(BASE+5);while(poll&0 x10);hb=inportb(BASE+5);for(i=0;i10000;i+); lb=inportb(BASE+4);hb=

35、hb&0 x0f; /*高4位清0*/num=lb+hb*256; /*hb左移8位加lb*/result=(num*5.0/4096-2.5)*2;/*0 V to +5V*/return result;/*00-中断子程序-*/void interrupt INT_1C(void)time_counter+;outportb(0 x20,0 x20); /*00-扫描键盘-*/int scankey(void)int key0;key0=bioskey(1);/*1:无键按下则返回0 */if(key0!=0)key0=bioskey(0);/*0:返回按下的键*/return key0;

36、/*00-DelayAction-*/*将ad延迟2s作为PV,T=0.2s,于是延迟11步*/float DelayAction()float y_out;static float y_old11=0;int i;y_out=y_old10;for(i=1;i10)Kp=10; else if(key=key_down)Kp-=0.2;if(Kp0.2)Kp=0.2; else if(key=key_left)Ti-=0.2;if(Ti20)Ti=20; else if(key=key_pgup)Td+=0.2;if(Td10)Td=10; else if(key=key_pgdown)Td

37、-=0.2;if(Tddead_band) /*积分分离*/Ti=10000;elseTi=15;delta_u=C1*delta_u1+C2*e+C3*e1+C4*e2;/*delta_u1是delta_u前一时刻的值*/u0=u1+delta_u; /*当前时刻控制器输出*/if(uu_max) /*抗积分饱和*/Ti=10000;elseTi=15; e2=e1;e1=e;delta_u1=delta_u;u1=u0;u_m=u0; /*自动时,手操器输出跟踪自动输出*/return u0; /*返回自动输出*/*手动状态*/else if(A_H=H)if(manu=+) /*调节手操器输出*/u_m+=1;if(u_m5)u_m=5;if(manu=-)u_m-=1;if(u_m5)u=5;else if(u0)u=0;y1=exp(-T/4.7)*y1_1+(1-exp(-T/4.7)*u;y=exp(-T/4.7)*y_1+(1-exp(-T/4.7)*y1;y1_1=y1;y_1=y;return y;/*00-初始化为图形模式-*/void In

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论