華北電力大學(xué)過程計算機控制課設(shè)DDC串級回路PID閉環(huán)._第1頁
華北電力大學(xué)過程計算機控制課設(shè)DDC串級回路PID閉環(huán)._第2頁
華北電力大學(xué)過程計算機控制課設(shè)DDC串級回路PID閉環(huán)._第3頁
華北電力大學(xué)過程計算機控制課設(shè)DDC串級回路PID閉環(huán)._第4頁
華北電力大學(xué)過程計算機控制課設(shè)DDC串級回路PID閉環(huán)._第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、課程設(shè)計報告名稱:過程計算機控制題目: DDC串級回路PID閉環(huán)控制系統(tǒng)的設(shè)計及實時仿真院系:控計班級: 學(xué)號: 學(xué)生姓名: 同組人: 指導(dǎo)教師:李明揚設(shè)計周數(shù):一周一、設(shè)計目的1. 學(xué)習(xí)并了解用高級語言(C語言)實現(xiàn)數(shù)字PID控制算法模塊程序的方法;2. 比較驗證理想微分PID和實際微分PID控制算法階躍響應(yīng),加深對上述兩種算法各自特點的認(rèn)識;3. 學(xué)習(xí)了解用模擬計算機使用方法;4. 學(xué)習(xí)掌握A/D、D/A轉(zhuǎn)換接口板的使用方法;5. 了解一種微機中斷定時的方法;6. 學(xué)習(xí)掌握通過A/D、D/A轉(zhuǎn)換用計算機獲取被控對象動態(tài)特性的方法;7 通過實時仿真實驗掌握DDC單回路控制程序編制及調(diào)試方法。

2、二、實驗儀器(1)微型計算機一臺,系統(tǒng)軟件Windows 98或DOS (不能使用無直接I/O能力的NT或XP系統(tǒng)), 內(nèi)裝Turbo C 2.0/3.0集成開發(fā)環(huán)境軟件;(2)模擬計算機一臺(XMN-1型);(3)通用數(shù)據(jù)采集控制板一塊(PCL-812PG型)。三、PID的離散化理想微分PID算法的傳遞函數(shù)形式為:采用向后差分法對上式進行離散,得出其差分方程形式為:uk=uk-1+q0*e2+q1*e1+q2*e0;其中各項系數(shù)為:q0=kp*(1+T/Ti+Td/T); q1=-kp*(1+2*Td/T); q2=kp*Td/T;實際微分PID算法的傳遞函數(shù)形式為:采用向后差分法對上式進行

3、離散化,寫成差分方程的形式為: uk=c0*(uk-1)+c1*ek+c2*ek-1+c3*ek-2+uk-1;其中各項系數(shù)為: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);四、硬件二階慣性環(huán)節(jié)搭建利用模擬計算機中的電容電阻及運算放大器,搭接二階慣性環(huán)節(jié),仿真一個被控對象。其傳遞函數(shù)為,硬件電路如下:圖中各元件參數(shù)如下:R3=R2=510K;R1=R4=R5=R6=R7=1M ;C1=C2=C=4.7uF;則可得:K=(R5/R1)*(R6/R4)=1 T1=T2=R

4、5*C1=R6*C2=1000000*0.0000047=4.7s所以G(s)=1/(4.7s+1)*(4.7s+1)搭建好硬件電路后,將PLCD-780插入IPC機箱插槽,用導(dǎo)線將PLCD-780中的A/D、D/A、電源的接線端子與所搭二階慣性環(huán)節(jié)的輸出、輸入端口及機箱上的電源連接,組成一個完整的PID閉環(huán)控制系統(tǒng),為通信做好準(zhǔn)備。五、實驗結(jié)果(1)理想和實際PID階躍響應(yīng)曲線(2)被控對象(實物搭建二階慣性環(huán)節(jié))階躍響應(yīng)曲線上圖通過D/A輸出一個1伏左右的信號輸入模擬的被控對象(慣性環(huán)節(jié)),A/D采集對象的輸入信號及其響應(yīng),再使D/A輸出一個幅度為2伏左右的階躍信號,同時采集輸入輸出信號。

5、然后,D/A再反向在輸出一個幅度為2伏左右負(fù)的階躍信號,同時采集輸入輸出信號,得出仿真對象飛升特性曲線。程序中,通過按鍵實現(xiàn)模擬對象輸入信號的加減。當(dāng)按下H按鍵時,且按下U鍵時,D/A輸出一個1伏階躍信號,再次按下按鍵時階躍信號累加。每次按下D鍵時,D/A輸出的階躍信號遞減1。(3)根據(jù)對象單位階躍響應(yīng)曲線求增益和慣性時間:利用切線法求對象的增益和用一階等效的慣性時間:如上圖所示做拐點切線,得對象增益和一階等效慣性時間分別為: Ti13s(4)手自動切換:(5)設(shè)定值r、控制量u和被控對象輸出的階躍響應(yīng)曲線:程序清單 /*-頭文件定義-*/   

6、0;  #include<conio.h>      #include<graphics.h>      #include <stdio.h>      #include <dos.h>/*-定義繪圖坐標(biāo)-*/       #define ox

7、0;8       /*-原點橫坐標(biāo)-*/          #define oy 440                /*-原點縱坐標(biāo)-*/       #define

8、0;xx 620                /*-x軸頂點橫坐標(biāo)-*/       #define xy 440                /*-x軸頂點縱坐標(biāo)-*/

9、60;      #define lenx 580       #define leny 400       #define yx 8                 &

10、#160; /*-y軸頂點橫坐標(biāo)-*/       #define yy 15                 /*-y軸頂點縱坐標(biāo)-*/*-定義繪圖區(qū)域-*/       #define left 20   

11、    #define top 20       #define right 620       #define bottom 460 /*-坐標(biāo)軸注釋-*/       #define xtext1x 450    &

12、#160;  #define xtext1y 450       #define ytext1x 10       #define ytext1y 60       #define xtext2x 610       #

13、define xtext2y 450       #define ytext2x 10       #define ytext2y 20/*-理想PID運算式-*/ float lxpid(float kp,float td,float ti,float e3,float u1)    i

14、nt t=1;       float u;       float q0=kp*(1+t/ti+td/t);       float q1=-kp*(1+2*td/t);       float q2=kp*td/t;     

15、  u=q0*e0+q1*e1+q2*e2+u1;       return u;  /*-實際PID運算式-*/ float sjpid(float kp,float tf,float td,float ti,float e3,float du1,float u1)  int t=1;       

16、; 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);     

17、60;  float c4=kp*td/(t+tf);        u2=c1*du1+c2*e0+c3*e1+c4*e2+u1;        return u2; /*-繪圖初始化-*/ void Initial_Sys(void)      int GraphDriver; 

18、60;      int GraphMode;        detectgraph(&GraphDriver,&GraphMode);        initgraph(&GraphDriver,&GraphMode,"C:TC201EBGI");     

19、0;cleardevice();  /*-繪制坐標(biāo)系-*/ void DrawAxis(void)       int i;      setbkcolor(15);      setcolor(5);      line(ox,oy,xx,xy);     

20、    /*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,y

21、y);line(yx+5,yy+10,yx,yy);    for(i=0;i<51;i+)       /*-x軸刻度-*/          line(ox+10*i,oy,ox+10*i,oy-10);          line(ox+10*i+5,oy,ox+10*i+5,oy-5)

22、;             for(i=1;i<=8;i+)  /*-y軸刻度-*/      line(ox,oy-50*i,ox+10,oy-50*i);       outtextxy(ox+50*0-7,oy+20,"0");      

23、; 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

24、+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&q

25、uot;);  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-

26、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");     &

27、#160; outtextxy(ox-10,oy-50*8,"8");   /*坐標(biāo)軸刻度標(biāo)識*/   settextstyle(SMALL_FONT,HORIZ_DIR,5);     /*坐標(biāo)軸標(biāo)示字體 方向 大小*/outtextxy(xtext1x,xtext1y,"Time");outtextxy(xtext2x,xtext2y,"t/s");     settextstyle

28、(SMALL_FONT,VERT_DIR,5);    outtextxy(ytext1x,ytext1y,"The output (Response)");    outtextxy(ytext2x,ytext2y,"U(t)/V"); main()       float kp,ti,td,tf,e3=0,ee3=0,u6=0,au1=0;  

29、    int r=1,k=1;      Initial_Sys();      DrawAxis();      while(k<100)                  u0=

30、lxpid(1,3.0,10,e,u1);            e0=r;             u3=sjpid(1,5,3.0,10,ee,au1,u4); setcolor(5);            line(k-1

31、)*10,130-u1*100,k*10,130-u1*100);            line(k*10,130-u1*100,k*10,130-u0*100);            delay(10000);            

32、        u1=u0;            e2=e1;            e1=e0;            ee0=r;  

33、          setcolor(3);   line(k-1)*10,150-u4*100,k*10,150-u4*100);            line(k*10,150-u4*100,k*10,150-u3*100); delay(10000);      

34、0;     u5=u4;            u4=u3;            ee2=ee1;            ee1=ee0;    

35、        au1=u4-u5;            k+;  /*-頭文件定義-*/ #include "stdio.h"  #include "math.h" #include "graphics.h"  #include

36、0;"string.h" #include "dos.h" #include "bios.h" #include "conio.h"    /*中斷程序頭文件定義*/#include "stdlib.h" #include "io.h"/*-按鍵地址區(qū)定義-*/ /*statements*/ double key_ESC=0x0

37、11b;   /*退出*/double key_E=0x1265;  double key_A=0x1e61;  /*自動*/double key_H=0x2368;  /*手動*/double key_U=0x1675;  /*自動時增SP,手動時增手操器輸出*/double key_D=0x2064;  /*自動時減SP,手動時增手操器輸出*/double key_I=0x1769;  /*理想PID*/double key_P=0x1970

38、; /*實際PID*/ double key_up=0x4800;  /*手動時,增Kp*/double key_down=0x5000;  /*手動時,減Kp*/double key_left=0x4b00; /*手動時,減Ti*/ double key_right=0x4d00;  /*手動時,增Ti*/double key_pgup=0x4900; /*手動時,增Td*/ double key_pgdown=0x5100; /*手動時,減Td*/*-PLCD780基址定義-*/&

39、#160;#define BASE 0x220   /*-PCL812G need 16 addresses in a row,from  220H to 3F0H*/ #define REG 0/*-定義繪圖坐標(biāo)-*/ #define ox 40     /*-原點橫坐標(biāo)-*/ #define oy 440 

40、;      /*-原點縱坐標(biāo)-*/ #define xx 600   /*-x軸頂點橫坐標(biāo)-*/ #define xy 440   /*-x軸頂點縱坐標(biāo)-*/ #define yx 40     /*-y軸頂點橫坐標(biāo)-*/ #define yy 40   /*-y軸頂點縱坐標(biāo)-

41、*/*-PID參數(shù)定義-*/float Kp=1.0; float Ti=10.0; float Td=3.0; float Tf0=15.0; float Tf=0;                            

42、60; float T=0.1;                     /*-采樣時間-*/ float ad,e,pv0; float u=0.0; float pv=0.0; /*反饋值*/ float sp=0.0;  /*設(shè)定值*/char A_H='

43、H' /*手動-自動,開始為手動*/char manu; /*用于調(diào)節(jié)u_m的增減*/  int key=0; /*存鍵盤掃描結(jié)果*/ int time_counter=0;   /*中斷計數(shù)*/ int cj_counter=0;   /*采樣計數(shù)器*/ int Q_counter=800;  /* 采集步長   賦初始值*/ int stepdata800;

44、0;int slopedata800; int error800;/*-函數(shù)聲明 -*/ void interrupt (*fadd1C)(void);  /*中斷*/void loop();  /*主程序循環(huán)*/float AD(unsigned char channal);  /*A/D*/ void DA(float pv1); /*D/A*/ void interrupt

45、0;INT_1C(void);   /*8259,reset interrupt controller*/ int scankey();  /*掃描鍵盤,判斷是否有建按下*/float DelayAction(float y0); /*軟件延遲*/void PIDset(void);  /*PID設(shè)置*/float PID(float sp1,float pv1,float Kp1,float Ti1,float T

46、d1,float Tf1,char A_H1,float T1); float Object(float u1,float T1);   /*仿真對象*/void Initial_Sys(void);     /*初始化為圖形模式*/void axis(void);  /*畫坐標(biāo)軸*/void Drawline(int cj,float pv1,float sp1,float 

47、u1,float e1); /*畫線*/*主函數(shù)*/ void main(void)int i;  for(i=0;i<500;i+)  stepdatai=10; slopedatai=i; errori=0; /* Set new INT_1C  and save old   */   disable();  /*保存舊中斷,設(shè)置新中斷*/fadd1C=getvect

48、(0x1C);/*1C為定時器控制的軟中斷,平均一秒發(fā)生18.2次,即周期為55ms    中斷程序*/  /* 開啟中斷服務(wù)*/  setvect(0x1C,INT_1C);  enable();  axis();  loop();  /*主函數(shù)結(jié)束  下面為定時采值輸出程序*/void loop()  do     if(cj_cou

49、nter*T)<(time_counter/18.2)     ad=AD(0);  PIDset();     u=PID(sp,pv,Kp,Ti,Td,Tf,A_H,T);    DA(u);       pv=DelayAction(u); /*pv=Object(u,T);    */  e=errorcj_cou

50、nter;     Drawline(cj_counter,pv,sp,u,e);    manu=0; /*復(fù)位*/*status bar,at the top of the screen-how to express %.2f*/    if(Tf=0)printf("IdealPID,Mode:%c,sp=%.1f,pv=%2.1f,u=%.1f,error=%.1f,K

51、p=%.1f,Ti=%.1f,Td=%.1ftr",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=%.1ftr",A_H,sp,pv,u,e,Kp,Ti,Td);    else printf("ttTf got a 

52、wrong value! Please exit and restart this program.r");cj_counter+;   while(cj_counter<500);  /* 恢復(fù)中斷*/  disable();  setvect(0x1C,fadd1C);  enable();  /*D/A conversion program,0&

53、#160;to 4095 - 0to +5*/ float AD(unsigned char channal)  float result=0;  int i;  unsigned char hb=0,lb=0,poll=0x10; outportb(BASE+11,REG);  /*軟件程序觸發(fā)*/ for(i=0;i<10000;i+);outportb(BASE+10,channal)

54、; /*進行通道設(shè)置.選擇通道0*/  for(i=0;i<10000;i+);outportb(BASE+9,0);         /*設(shè)置增益通道增益*/  for(i=0;i<10000;i+); outportb(BASE+12,0);  /*觸發(fā)A/D轉(zhuǎn)換*/ for(i=0;i<10000;i+);  do   /*查詢法讀PV*/poll=in

55、portb(BASE+5);  while(poll&0x10);  hb=inportb(BASE+5); for(i=0;i<10000;i+);lb=inportb(BASE+4);  result = lb + (hb&0x0F)<<8);  /*0 to 4095*/  result=result*5/4096;  /*0 V to 

56、+5V*/  return result;    /*A/D conversion program,0 to +5 - 0 to 4095*/ void DA(float pv1)      int temp,i;     unsigned char hb,lb;  /

57、*限幅 */if (pv1>5)                    /* make the output real */                 pv1

58、=5;     else if (pv1<0)                 pv1=0;     temp=(int)(4095*pv1/5.0);     hb=temp<<8;     

59、;lb=temp-(hb<<8);outportb(BASE,1);    /*啟動DA轉(zhuǎn)換*/  for(i=0;i<10000;i+);    outportb(BASE+4,lb);        /* low 8 */     for(i=0;i<10000;i+);    o

60、utportb(BASE+5,hb);        /* high 4 */ /*00-中斷子程序-*/void interrupt INT_1C(void)   time_counter+;  outportb(0x20,0x20);   /*鍵盤控制*/ int scankey(void)    int key0

61、;   /*掃描鍵盤,判斷是否有建按下*/ key0=bioskey(1);  /*1:無鍵按下則返回0 */ if(key0!=0)   key0=bioskey(0); /*0:返回按下的鍵*/  return key0; /*DelayAction*/ /*tao=(int)(18.2*2) Delay action=2 seconds*/ float DelayAction(fl

62、oat y0) /*軟件延遲*/   float y_out;static float y_old36=0;  /*將ad延遲2s作為PV,T=0.2s,于是延遲36步*/int cyc;  y_out=y_old36-1;  for(cyc=1;cyc<36;cyc+)   y_old36-cyc=y_old36-cyc-1;  y_old0=y0;  return y

63、_out; /*PID 主程序*/ void PIDset(void)  /*PID設(shè)置*/   key=scankey();  /*掃描鍵盤,并將按鍵存為key*/ if(A_H='H')  /*手動狀態(tài)*/   if(key=key_up)    Kp+=0.2;   else if(key=key_down)   &

64、#160;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.

65、2;else if(key=key_U)    /*控制u_m增減*/manu='+'  else if(key=key_D)   manu='-'    if(A_H='A')   /*自動狀態(tài)*/    if(key=key_U)     /*設(shè)定值增減*/sp+=10;  &

66、#160;if(key=key_D)    sp-=10;    if(key=key_E|key=key_ESC)   /*退出*/ exit(1); if(key=key_A)   /*設(shè)為手動*/ A_H='A'  if(key=key_H)   /*設(shè)為自動*/A_H='H'  if(key=key_I) &

67、#160; /*理想PID*/Tf=0;  if(key=key_P)   /*實際PID*/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

68、_u,u0,e,C1,C2,C3,C4;   /*離散化后PID參數(shù) 當(dāng)前時刻,u0為返回值*/static float e1,e2,u1,delta_u1;  /*前一時刻的值*/  if(Kp1<0) printf("Kp becomes a negative number,please restart."); else if(Ti1<0)  printf("Ti bec

69、omes a negative number,please press restart."); else if(Td1<0)  printf("Td becomes a negative number,please press restart.");  else    C1=Tf1/(T1+Tf1);  C2=Kp1*T1*(1+T1/Ti1

70、+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;  /*delta_u1是delta_u前一時刻的值*/ u0=u1+delta_u;  /*當(dāng)前時刻控制器輸出*/ &#

71、160;    e2=e1;   e1=e;   delta_u1=delta_u;   u1=u0;  /*自動時,手操器輸出跟蹤自動輸出*/  errorcj_counter=sp1-pv1;   return u0;/*手動控制*/  else if(A_H1='H')      

72、60;if(manu='+')     /*調(diào)節(jié)手操器輸出*/u+=10;   if(manu='-')    u-=10;   sp1=pv1;   u1=u;  sp=pv1; /*sp跟蹤pv保證偏差e為0*/  e1=0; e2=0;   delta_u1=0;     /*將前

73、兩時刻的偏差賦值為0*/   errorcj_counter=sp1-pv1;   return u;      /*顯示與畫圖*/*初始化 CRT*/ void Initial_Sys(void)   int GraphDriver;     int GraphMode;     det

74、ectgraph(&GraphDriver,&GraphMode);     initgraph(&GraphDriver,&GraphMode,"C:TC201EBGI");  /*draw basic coordinate axis*/ void axis(void)   int i;Initial_Sys();  setbkcolor(15); &#

75、160;  /*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);

76、  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)");  

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論