版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年城市綠地養(yǎng)護保潔服務(wù)合同3篇
- 溫州肯恩大學(xué)《AM技術(shù)及應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度跨境電商供應(yīng)鏈融資擔(dān)保協(xié)議書3篇
- 二零二五版廢鐵貿(mào)易結(jié)算與倉儲服務(wù)合同3篇
- 二零二五年金融租賃擔(dān)保協(xié)議與保證合同規(guī)范2篇
- 2025年度特色小吃街加盟經(jīng)營合同范本3篇
- 2025年度電影項目投資與回報分成協(xié)議3篇
- 2024文化藝術(shù)品交易平臺建設(shè)與運營協(xié)議
- 2024版保安勞動合同書范本
- 2025年度化學(xué)原料藥廢棄物處理與資源化利用合同3篇
- 2024年計算機二級WPS考試題庫(共380題含答案)
- 《湖南省房屋建筑和市政工程消防質(zhì)量控制技術(shù)標(biāo)準(zhǔn)》
- 中建集團面試自我介紹
- 《工業(yè)園區(qū)節(jié)水管理規(guī)范》
- 警校生職業(yè)生涯規(guī)劃
- 意識障礙患者的護理診斷及措施
- 2024版《53天天練單元歸類復(fù)習(xí)》3年級語文下冊(統(tǒng)編RJ)附參考答案
- 2025企業(yè)年會盛典
- 215kWh工商業(yè)液冷儲能電池一體柜用戶手冊
- 場地平整施工組織設(shè)計-(3)模板
- 交通設(shè)施設(shè)備供貨及技術(shù)支持方案
評論
0/150
提交評論