




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计报告(2013--2014年度第2学期)名称:计算机控制技术与系统题目:DDC单回路PID闭环控制系统的设计及实时仿真PID飞升曲线绘制程序#include<graphics.h>#include<stdio.h>#include<dos.h>#include<conio.h>/*理想PID参数定义*/#defineKp11.0 /*比例增益1.0*/#defineT11 /*采样周期1.0s*/#defineTi110.0 /*积分时间10.0s*/#defineTd15.0 /*微分时间5.0s*/#defineTf10 /*惯性时间0.0s*/#defineC11(Tf1/(T1+Tf1)) /*增量型PID运算系数*/#defineC21(Kp1*T1*(1+T1/Ti1+Td1/T1)/(T1+Tf1))#defineC31(0-Kp1*T1*(1+2*Td1/T1)/(T1+Tf1))#defineC41(Kp1*Td1/(T1+Tf1))/*实际PID参数定义*/#defineKp21.0 /*比例增益1.0*/#defineT21.0 /*采样周期1.0s*/#defineTi210.0 /*积分时间10.0s*/#defineTd25.0 /*微分时间5.0s*/#defineTf22 /*惯性时间2.0s*/#defineC12(Tf2/(T2+Tf2)) /*增量型PID运算系数*/#defineC22(Kp2*T2*(1+T2/Ti2+Td2/T2)/(T2+Tf2))#defineC32(0-Kp2*T2*(1+2*Td2/T2)/(T2+Tf2))#defineC42(Kp2*Td2/(T2+Tf2))/*坐标轴定义*/#defineox40 /*原点横坐标*/#defineoy440 /*原点纵坐标*/#definexx620 /*x轴顶点横坐标*/#definexy440 /*x轴顶点纵坐标*/#definelenx580/*横轴长*/#defineleny400/*纵轴长*/#defineyx40 /*y轴顶点横坐标*/#defineyy20 /*y轴顶点纵坐标*//*定义作图区域*/#defineleft20#definetop20#defineright620#definebottom460/*坐标轴注释*/#definextext1x450#definextext1y450#defineytext1x10#defineytext1y65#definextext2x610#definextext2y450#defineytext2x10#defineytext2y20/*坐标子程序*/voidDrawAxis(void){inti;setbkcolor(7);/*背景颜色*/setcolor(5);/*线条颜色*/line(ox,oy,xx,xy); /*x_axis*/line(xx-5,xy-5,xx,xy); /*画x轴箭头*/line(xx,xy,xx-5,xy+5);line(ox,oy,yx,yy); /*y_axis*/line(yx-5,yy+10,yx,yy); /*画y轴箭头*/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<=10;i++) line(ox,oy-40*i,ox+10,oy-40*i);/*标x轴刻度值*/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");/*标y轴刻度值*/ outtextxy(ox-20,oy-40*1,"1"); outtextxy(ox-20,oy-40*2,"2"); outtextxy(ox-20,oy-40*3,"3"); outtextxy(ox-20,oy-40*4,"4"); outtextxy(ox-20,oy-40*5,"5"); outtextxy(ox-20,oy-40*6,"6"); outtextxy(ox-20,oy-40*7,"7"); outtextxy(ox-20,oy-40*8,"8"); outtextxy(ox-20,oy-40*9,"9"); outtextxy(ox-20,oy-40*10,"10");settextstyle(SMALL_FONT,HORIZ_DIR,5); /*坐标轴坐标量注释*/outtextxy(xtext1x,xtext1y,"Time");outtextxy(xtext2x,xtext2y,"t/s");settextstyle(SMALL_FONT,VERT_DIR,5);outtextxy(ytext1x,ytext1y,"Theoutput(Response)");outtextxy(ytext2x,ytext2y,"U/V");}voidInitial_Sys(void)/*初始化*/{intgdriver=DETECT,gmode;initgraph(&gdriver,&gmode,"C:\TC20H\tc\BGI");}/**********************PID运算***********************/floatPID1(floatNew,floatSp)/*理想*/{staticfloate1[3]={0.0,0.0,0.0},u1=0.0,du1=0.0;e1[2]=e1[1]; /*数据更新*/e1[1]=e1[0];e1[0]=Sp-New;du1=C11*du1+C21*e1[0]+C31*e1[1]+C41*e1[2]; /*PID运算*/u1=u1+du1;returnu1;}floatPID2(floatNew,floatSp)/*实际*/{staticfloate2[3]={0.0,0.0,0.0},u2=0.0,du2=0.0;e2[2]=e2[1]; /*数据更新*/e2[1]=e2[0];e2[0]=Sp-New;du2=C12*du2+C22*e2[0]+C32*e2[1]+C42*e2[2];u2=u2+du2;returnu2;}/*********************绘图**************/voiddraw(floata[]){intk=5; /*x轴间距*/intx1,y1,x0,y0;inti;x0=0;y0=(int)(a[0]*25);/*规整*/for(i=1;i<100;i++){x1=x0+k;y1=(int)(a[i]*25);delay(100);setcolor(14);/*标注*/settextstyle(SMALL_FONT,HORIZ_DIR,5);outtextxy(600,20,"U");line(ox+x0,oy-y0,ox+x1,oy-y0);line(ox+x1,oy-y0,ox+x1,oy-y1);setcolor(14);outtextxy(620,20,"Sp");line(ox+x0,oy-25,ox+x1,oy-25);x0=x1; /*数据更新*/y0=y1;}}voiddraw2(floatb[]){intk=5; /*x轴间距*/intx1,y1,x0,y0;inti;x0=0;y0=(int)(b[0]*25);for(i=1;i<100;i++){x1=x0+k;y1=(int)(b[i]*25);delay(100);setcolor(6);outtextxy(600,40,"U'");line(ox+x0,oy-y0,ox+x1,oy-y0);line(ox+x1,oy-y0,ox+x1,oy-y1);setcolor(6);outtextxy(620,40,"Sp'");line(ox+x0,oy-25,ox+x1,oy-25);x0=x1; /*数据更新*/y0=y1;}}/*******************主程序********************/voidmain(void){floata[100];floatb[100];inti;for(i=0;i<100;i++){a[i]=PID1(0.0,1.0);}Initial_Sys();DrawAxis();draw(a);for(i=0;i<100;i++){b[i]=PID2(0.0,1.0);}draw2(b);}getch();实际采样显示控制程序/*------------头文件定义----------------*/#include"stdio.h"#include"math.h"#include"graphics.h" /*forgraphdriverinstalling,onlycanbecalledinTurboC*/#include"string.h"#include"dos.h"#include"bios.h"#include"conio.h" /*-------中断程序头文件--------------*/#include"stdlib.h"#include"io.h"#include"math.h"/*---------------按键地址定义-------------------*/doublekey_ESC=0x011b; /*definecannotsuitthelengthofbioskey*/doublekey_E=0x1265;doublekey_A=0x1e61;doublekey_H=0x2368;doublekey_U=0x1675;doublekey_D=0x2064;doublekey_I=0x1769;doublekey_P=0x1970;doublekey_up=0x4800;doublekey_down=0x5000;doublekey_left=0x4b00;doublekey_right=0x4d00;doublekey_pgup=0x4900;doublekey_pgdown=0x5100;/*---------------PLCD780基地址定义-------------*/#defineBASE0x220 /*pleaselookupinPCL812PGdocument*/#defineREG1/*---------------定义绘图坐标---------------*/#defineox40/*-----原点横坐标--------*/#defineoy240/*------原点纵坐标-------*/#definexx600/*------x轴顶点横坐标---*/#definexy240/*-----x轴顶点纵坐标---*/#defineyx40/*-----y轴顶点横坐标-----*/#defineyy40/*------y轴顶点纵坐标----*//*-------------PID参数定义-----------------*/floatKp=1.2;floatTi=30.0;/*9,0.6*/floatTd=4.5;floatTf0=5;floatTf=5;/*---------理想PID参数--------------*/floatT=0.2; /*---------采样时间间隔-------------*/floatad,e;floatu=0.0;floatpv=0.0;floatsp=0.0;charA_H='H'; /*-------------PID手自动状态标志------------*/charmanu;intkey=0;inttime_counter=0; /*----------------中断次数-------------*/intspt=0; /*----------------采样计数--------------*/intst_time=500; /*----------------采样次数总和(x轴范围)------------------*/intround=0;/*------------------函数声明----------------------*/voidinterrupt(*fadd1C)(void);/*-----------申明中断向量fadd1C-----------*/voidinterruptINT_1C(void); /*-----------8259中断控制函数-------------*/intscankey();/*-----------------绘图初始化----------------*/voidInitial_Sys(void);voidaxis(intround1);voidDrawline(intround1,intcj,floatpv1,floatsp1,floatu1,floate1);/*-----------PID设置及运算------------*/voidPIDset(void);floatPID(floatsp1,floatpv1,floatKp1,floatTi1,floatTd1,floatTf1,charA_H1,floatT1);/*-----------程序实现负增益三阶惯性环节------------*/floatObject(floatu1,floatT1);floatAD_convert(unsignedcharchannal); /*----------------A/D采样子函数-------------*/voidDA_convert(floatu); /*----------------D/A采样子函数-------------*/floatDelayAction(floaty0);/*displayanddrawing*//*initiategraphdisplay*/voidInitial_Sys(void){ intGraphDriver; intGraphMode; detectgraph(&GraphDriver,&GraphMode);/*----------------------确定图形驱动程序和模式----------------*/ initgraph(&GraphDriver,&GraphMode,"C:\\TC201E\\BGI");/*-----------初始化图形系统(前两项为指针,后一项为路径)------------*/}/*drawbasiccoordinateaxis*/voidaxis(intround1){ inti; chars[3];/*-----------注意刻度位置*/ Initial_Sys(); setbkcolor(15); /*white0/black15*/ setcolor(9); /*linghtblue*/ printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); printf("-----NOTE:PID-P/I,Mode-A/H,sp/u-U/D,Kp-up/dn,Ti-left/right,Td-pgup/pgdn-----"); rectangle(10,35,630,465); /*-------------绘制矩形,对角顶点坐标(10,35),(630,465)------------*/ line(ox,oy,xx,xy); /*---------------画y轴,始点坐标(ox,oy),终点坐标(xx,xy)---------------*/ line(xx-5,xy-5,xx,xy); line(xx,xy,xx-5,xy+5); line(ox,oy+200,yx,yy); line(yx-5,yy+5,yx,yy); line(yx+5,yy+5,yx,yy); settextstyle(2,1,5); /*------------设置文本属性:字体Smallfont,横排,大小5----------------*/ outtextxy(20,150,"TheOutput(Response)"); outtextxy(20,40,"U(t)/V");/*------------输出文本----------------*/ settextstyle(2,0,5); outtextxy(300,455,"Time"); outtextxy(590,455,"t/sec"); setlinestyle(1,0,1); /*-------------------设置画线类型(dotline,none,width)-------------*/ for(i=-5;i<=5;i++) /*----eachinportstartingposition*/ line(ox,oy-40*i,ox+500,oy-40*i); for(i=-5;i<=5;i++) { sprintf(s,"%d",i); outtextxy(ox-8,oy-40*i,s); } for(i=1;i<=500/50;i++) /*scale*/ line(ox+50*i,oy+200,ox+50*i,oy-200); /*1/T=10,thatis10px=1sec*/ for(i=1;i<=500/10;i++) line(ox+10*i,oy,ox+10*i,oy-10); setlinestyle(0,0,1); /*realline,none,width*/ for(i=0;i<=10;i++) { sprintf(s,"%d",10*i+100*round1); if(round1==0) outtextxy(ox-8+i*50,oy+2,s); elseif(round1>0) outtextxy(ox-12+i*50,oy+2,s); }}/*line-drawingandnotes*/voidDrawline(intround1,intcj1,floatpv1,floatsp1,floatu1,floate1){ staticintcj_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-500*round1; /*Xcoordinate*/ if(cj_1==0) cj_0=0; pv_1=(int)(pv1*40); sp_1=(int)(sp1*40); u_1=(int)(u1*40); e_1=(int)(e1*40); setcolor(2); /*green*/ line(ox+cj_0,oy-pv_0,ox+cj_1,oy-pv_1); outtextxy(590,40,"pv"); setcolor(8); /*darkgray*/ line(ox+cj_0,oy-sp_0,ox+cj_1,oy-sp_1); outtextxy(590,55,"sp"); setcolor(3); /*cyan*/ line(ox+cj_0,oy-u_0,ox+cj_1,oy-u_1); outtextxy(590,70,"u"); setcolor(4); /*red*/ line(ox+cj_0,oy-e_0,ox+cj_1,oy-e_1); outtextxy(590,85,"e"); cj_0=cj_1; pv_0=pv_1; sp_0=sp_1; u_0=u_1; e_0=e_1;}/*resetinterruptcontroller*/voidinterruptINT_1C(void){ time_counter++; outportb(0x20,0x20);/*--------重置8259中断控制器,表明中断结束----------*/}/*keyboardinputdetection*/intscankey(void){ intkey0; key0=bioskey(1); /*----------查询是否按下按键,按下则返回非零值-----------*/ if(key0!=0) key0=bioskey(0); /*---------返回按键键值--------*/ returnkey0;}/*------------------按键控制PID子程序--------------------*/voidPIDset(void){ key=scankey();/*------------------按键扫描----------------*/ if(A_H=='H') { if(key==key_up)/*--------手动状态通过按键↑↓改变比例增益kp----------*/ Kp+=0.2; elseif(key==key_down) Kp-=0.2; elseif(key==key_left)/*-------手动状态通过按键→←改变积分时间Ti-----------*/ Ti-=0.2; elseif(key==key_right) Ti+=0.2; elseif(key==key_pgup)/*------手动状态通过按键pguppgdn改变微分时间Td-----*/ Td+=0.2; elseif(key==key_pgdown) Td-=0.2; elseif(key==key_U) /*-------手动状态通过按键UD改变阶跃输出-------*/ manu='+'; elseif(key==key_D) manu='-'; } if(A_H=='A') { if(key==key_U)/*-----------自动状态按键UD改变设定值sp----------*/ sp+=1; if(key==key_D) sp-=1; } if(key==key_E||key==key_ESC)/*-----------按键ESCE控制程序退出----------*/ {closegraph();exit(1);} if(key==key_A) A_H='A';/*-----------手自动标志----------*/ if(key==key_H) A_H='H'; if(key==key_I) Tf=0;/*---------理想,实际PID标志----------*/ if(key==key_P) Tf=Tf0;}/*---------------------配置PID模块子程序--------------------*/floatPID(floatsp1,floatpv1,floatKp1,floatTi1,floatTd1,floatTf1,charA_H1,floatT1){intdeath=0.001,A=5,k=0; floatdelta_u,u0,C1,C2,C3,C4; staticfloate1,e2,u1,delta_u1; if(Kp1<0||Ti1<0||Td1<0) printf("error."); else { 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') /*--------------按下按键A,PID处于自动状态---------------*/ { e=pv1-sp1; if(abs(e)<death)return;/*----------死区---------------*/ if(fabs(e)>A) k=10000;/*----------------积分分离算法(偏差较大不积分)---------------*/ else k=1; delta_u=C1*delta_u1+C2*e+C3*e1+C4*e2; u0=u1+delta_u; if(abs(u0)>5)/*------------抗积分饱和-------------*/ k=1;Ti=Ti*k; e2=e1; e1=e; delta_u1=delta_u; u1=u0; returnu0; } elseif(A_H1=='H') /*--------------按下按键H,PID处于手动状态---------------*/ { if(manu=='+') u+=1; if(manu=='-') u-=1; u1=u; e=0; sp1=pv1; /*PID处于手动状态,设定值跟踪PV*/sp=pv1; e1=0; e2=0; delta_u1=0; returnu; } }}/*三阶负增益对象*/floatObject(floatu1,floatT1){/*G(s)=-3/(4.7s+1)^3,K=-3,Tp1=Tp2=Tp3=4.7*/ staticfloaty1,y2,y3; floaty;y=(103.82*y3-(311.469+66.27*T1)*y2+(311.469+132.54*T1+14.1*T1*T1)*y1-3*T1*T1*T1*u1)/(103.82+66.27*T1+14.1*T1*T1+T1*T1*T1); y3=y2; y2=y1;y1=y; returny;}/*mainprogram*/voidmain(void){ disable();/*----------------关闭中断------------*/ fadd1C=getvect(0x1C);/*------取得中断向量入口地址------------*/ setvect(0x1C,INT_1C);/*----------设置中断向量入口------------*/ enable();/*----------------开启中断------------*/drawcycle: axis(round); while(spt<st_time*(round+1)) { if((spt*T)<(time_counter/18.2))/*----------------定时输出,定时采样------------*/ { ad=AD_convert(0); /*----------------对二阶惯性环节输出进行采样-------*/ pv=DelayAction(ad);/*----------------采样值进行延时--------------*/ PIDset(); u=PID(sp,pv,Kp,Ti,Td,Tf,A_H,T); DA_convert(u); /*pv=Object(u,T);*/ /*pv=DelayAction(pv);*/ Drawline(round,spt,pv,sp,u,e);/*--------------绘制过度过程曲线----------*/ manu=0; /*statusbar,atthetopofthescreen*/ gotoxy(1,1);/*-------------设置光标位置(1,1)------------------*/ if(Tf==0) printf("IdealPID,Mode:%c\t\tKp=%.2f,Ti=%.2f,Td=%.2f\t\n",A_H,Kp,Ti,Td); elseif(Tf>0) printf("ParallalPID,Mode:%c\tKp=%.2f,Ti=%.2f,Td=%.2f\t\n",A_H,Kp,Ti,Td); elseprintf("
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年纳他霉素食品防腐剂合作协议书
- 民间到课堂-土家族“耍耍”舞蹈教材构建
- 河流沉积物重金属形态的分布特征及其影响因素
- 2025年大型工程基础稳定性勘探及检测设备合作协议书
- 针对酒店住宿的2025年度旅客权益保护与免责合同
- 二零二五年度自愿离职员工权益保护与解约协议
- 二零二五年度创新型企业员工激励劳动合同
- 二零二五年度高速公路车辆运输站运营管理协议
- 二零二五年度森林资源调查测绘安全保密协议
- 2025年度综艺导演聘用合同样本
- JT-T-1094-2016营运客车安全技术条件
- 击鼓传花惩罚游戏20题(课堂)
- 2024 smart社区运营全案服务项目
- QB/T 8020-2024 冷冻饮品 冰棍(正式版)
- 2024年专四阅读理解练习题
- 神经外科颅内动脉瘤血管内介入栓塞治疗手术知情同意书
- 小学数学主题活动设计一年级《欢乐购物街》
- 2024年广州市高三一模高考物理试卷试题答案(精校打印)
- 2024届江苏省苏州吴中区五校联考八年级物理第二学期期末统考试题含解析
- 二手房买卖合同无中介(标准版)2024版
- 2024年河北沧州交通发展集团有限责任公司招聘笔试参考题库附带答案详解
评论
0/150
提交评论