计算机控制PID编程实现.docx
- 文档编号:9571151
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:19
- 大小:87.64KB
计算机控制PID编程实现.docx
《计算机控制PID编程实现.docx》由会员分享,可在线阅读,更多相关《计算机控制PID编程实现.docx(19页珍藏版)》请在冰豆网上搜索。
计算机控制PID编程实现
实验一DDC单回路PID控制实验指导书
一实验目的
通过实验掌握DDC单回路PID控制程序编制及调试方法。
二实验内容
1.控制系统如图所示,
G(S)=K1/(1+T1S)2
D(Z)采用数字PID控制规律,T为采样周期。
2.对象动态特性实验
(1)将G(S)离散化,写出输入/输出差分方程。
(不必考虑零阶保持器)
(2)用C语言编制程序。
(3)取三个不同采样周期,绘制当输入U1为阶跃给定值时,输出的响应曲线,并打印。
3.单回路PID控制实验
(1)根据上述动态特性曲线,采用工程整定方法整定PID参数。
(2)采用具有积分分离的数字PID算法,并进行以下三个实验:
a.无积分分离或阀值β过大;
b.β适中
c.β过小
(3)用C或C++语言编制程序。
(4)按以上3种情况,绘制当r(t)=1时,y(t)和u(t)的阶跃响应曲线,并打印。
(5)分别改变Kp,Ti,Td,并观察它们对调节品质的影响。
三实验步骤
1.对象动态特性实验
(1)差分方程见附录:
(2)编制程序如下:
#include"iostream.h"
#include"fstream.h"
voidmain()
{
fstreamoutfile("data1.xls",ios:
:
out);
inti,j;
intt;
for(j=0;j<3;j++)
{
cout<<"输入采样周期:
";
cin>>t;
doubleu[100];
doubley[100];
for(i=0;i<100;i++)
{
u[i]=1.0;
y[i]=0.0;
}
for(i=2;(i-2)*t<100;i++)
{
y[i]=u[i]/(1.0+100.0/t/t+20.0/t)-(100.0/t/t)*y[i-2]/(1.0+100.0/t/t+20.0/t)+(200.0/t/t+20.0/t)*y[i-1]/(1.0+100.0/t/t+20.0/t);
}
for(i=1;(i-1)*t<100;i++)
cout< for(i=2;(i-2)*t<100;i++) { outfile<<(i-2)*t<<'\t'; } outfile<<'\n'; for(i=1;(i-1)*t<100;i++) { outfile< } outfile<<'\n'; } outfile.close(); } (3)输出结果如下: 周期T=1: 00.008264460.02329080.04378120.0686180.09684170.1276310.1602870.1942150.2289130.2639630.2990120.3337720.3680050.401520.4341640.4658190.4963950.5258270.5540690.5810950.6068930.6314620.6548130.6769640.697940.7177730.7364950.7541460.7707660.7863950.8010780.8148560.8277730.8398720.8511940.8617810.8716730.8809080.8895250.897560.9050470.9120190.9185080.9245440.9301570.9353720.9402170.9447150.9488890.9527610.9563510.9596790.9627630.9656190.9682640.9707120.9729770.9750720.977010.9788020.9804570.9819870.98340.9847050.985910.9870230.9880490.9889960.989870.9906760.9914190.9921040.9927350.9933170.9938530.9943470.9948020.9952210.9956060.9959610.9962880.9965890.9968660.997120.9973550.997570.9977680.997950.9981180.9982720.9984130.9985430.9986630.9987730.9988740.9989670.9990520.999130.990937 周期T=2: 00.02777780.07407410.1319440.1962450.2632240.3302040.3953230.4573410.5154830.5693180.6186670.663530.7040310.7403780.7728310.8016780.8272190.8497560.869580.8869690.9021850.9154680.9270410.9371040.945840.9534110.9599620.9656240.9705110.9747240.9783510.9814720.9841540.9864560.9884310.9901240.9915740.9928150.9938770.9947840.9955590.996220.9967840.9972660.9976760.9980250.9983230.9985760.998791 周期T=3: 00.05325440.1351840.2297190.3266770.4199070.5059640.5831960.6510910.7098470.7600660.8025590.8382170.8679320.8925490.9128370.9294830.9430890.954170.9631680.9704530.9763380.981080.9848930.9879540.9904070.9923690.9939370.9951870.9961830.9969760.9976060.9981060.998503 阶跃曲线图如下: 周期T分别1,2,3。 2.单回路PID控制实验 (1)工程整定程序如下: #include"iostream.h" voidmain() { inti,k; doublet,k1; doublem,n,x,l,c,p,f,d; doublej=0; cout<<"输入采样周期: "; cin>>t; doubleu[100]; doublee[100]; doubley[100]; for(i=0;i<100;i++) { u[i]=1.0; y[i]=0.0; } for(i=2;i<100;i++) { y[i]=u[i]/(1.0+100.0/t/t+20.0/t)-(100.0/t/t)*y[i-2]/(1.0+100.0/t/t+20.0/t)+(200.0/t/t+20.0/t)*y[i-1]/(1.0+100.0/t/t+20.0/t); } for(i=1;i<100;i++) { if(j<=(y[i+1]-y[i])) { j=y[i+1]-y[i]; k=i; k1=(k-1)*t; } } m=(y[k]+y[k+1])/2.0; n=(2.0*k1+t)/2.0; x=(y[k+1]-y[k])/t; l=n-m/x; c=(1.0-m)/x+n-l; cout<<"最大值k1的取值及对应的输出值: "< cout<<"斜率"< cout<<"延迟为"<<(l+t/2.0)<<'\n'<<"时间常数为"< cout<<"延迟/时间常数为"<<((l+t/2.0)/c)< if(((l+t/2.0)/c)>=0.2) { p=0.38*(((l+t/2.0)/c)+0.88)/(((l+t/2.0)/c)-0.15); f=0.81*c+0.19*(l+t/2.0); d=0.25*c; } else { p=1.2*c/(l+t/2.0); f=2*(l+t/2.0); d=0.5*(l+t/2.0); } cout<<"整定参数为: "< cout<<"Kp="< cout<<"Ti="< cout<<"Td="< } (2)输出结果: Kp=11.5323Ti=5.93767Td=1.48442 注: 以上整定的参数是在采样周期T=1时候的结果,为简化处理,采用该参数作为PID调节器的参数。 3.具有积分分离的控制系统 (1)差分方程见附录: (2)编制程序如下: #include"iostream.h" #include"math.h" #include"fstream.h" voidmain() { fstreamoutfile("data1.xls",ios: : out); inti,k,i1; doublet,k1; doublem,n,x,l,c,p,f,d; doublesx,aa,bb,cc,dd1,dd2,ee,ff; doublej=0.0; cout<<"输入采样周期: "; cin>>t; doubleu[100]; doublee[100]; doubley[100]; doubleu1[100]; doubley1[100]; doubler[100]; for(i=0;i<100;i++) { u[i]=1.0; y[i]=0.0; } for(i=2;i<100;i++) { y[i]=u[i]/(1.0+100.0/t/t+20.0/t)-(100.0/t/t)*y[i-2]/(1.0+100.0/t/t+20.0/t)+(200.0/t/t+20.0/t)*y[i-1]/(1.0+100.0/t/t+20.0/t); } for(i=1;i<100;i++) { if(j<=(y[i+1]-y[i])) { j=y[i+1]-y[i]; k=i; k1=(k-1)*t; } } m=(y[k]+y[k+1])/2.0; n=(2.0*k1+t)/2.0; x=(y[k+1]-y[k])/t; l=n-m/x; c=(1.0-m)/x+n-l; cout<<"最大值k1的取值及对应的输出值: "< cout<<"斜率"< cout<<"延迟为"<<(l+t/2.0)<<'\n'<<"时间常数为"< cout<<"延迟/时间常数为"<<((l+t/2.0)/c)< if(((l+t/2.0)/c)>=0.2) { p=0.38*(((l+t/2.0)/c)+0.88)/(((l+t/2.0)/c)-0.15); f=0.81*c+0.19*(l+t/2.0); d=0.25*c; } else { p=1.2*c/(l+t/2.0); f=2*(l+t/2.0); d=0.5*(l+t/2.0); } cout<<"整定参数为: "< cout<<"Kp="< cout<<"Ti="< cout<<"Td="< //以上为PID整定程序。 //以下为给定值阶跃程序。 aa=(1.0+10.0/t)*(1.0+10.0/t); bb=20.0*(1.0+10.0/t)/t; cc=100.0/t/t; dd1=(1.0+t/f+d/t); dd2=(1.0+d/t); ee=(1.0+2.0*d/t); ff=d/t; cout<<"相关参数: "; cout< for(i1=0;i1<3;i1++) { cout<<"输入积分限: "; cin>>sx; for(i=0;i<100;i++) { r[i]=1.0; e[i]=0.0; u1[i]=0.0; y1[i]=0.0; } u1[1]=p*aa*dd1*r[1]/(aa+p*dd1); y1[1]=0.0; e[1]=1.0; if(sx { u1[2]=u1[1]*(aa+bb+p*ee)/(aa+p*dd2)+p/(aa+p*dd2)*(aa*dd2*r[2]-(bb*dd2+aa*ee)*r[1]); } else { u1[2]=u1[1]*(aa+bb+p*ee)/(aa+p*dd1)+p/(aa+p*dd1)*(aa*dd1*r[2]-(bb*dd1+aa*ee)*r[1]); } y1[2]=u1[2]/(1.0+100.0/t/t+20.0/t); e[2]=r[2]-y1[2]; if(sx { u1[3]=u1[2]*(aa+bb+p*ee)/(aa+p*dd2)-(bb+cc+p*ff)/(aa+p*dd2)*u1[1]+p/(aa+p*dd2)*(aa*dd2*r[3]-(bb*dd2+aa*ee)*r[2]+(dd2*cc+bb*ee+aa*ff)*r[1]); } else { u1[3]=u1[2]*(aa+bb+p*ee)/(aa+p*dd1)-(bb+cc+p*ff)/(aa+p*dd1)*u1[1]+p/(aa+p*dd1)*(aa*dd1*r[3]-(bb*dd1+aa*ee)*r[2]+(dd1*cc+bb*ee+aa*ff)*r[1]); } y1[3]=u1[3]/(1.0+100.0/t/t+20.0/t)-(100.0/t/t)*y[1]/(1.0+100.0/t/t+20.0/t)+(200.0/t/t+20.0/t)*y[2]/(1.0+100.0/t/t+20.0/t); e[3]=r[3]-y1[3]; if(sx { u1[4]=u1[3]*(aa+bb+p*ee)/(aa+p*dd2)-(bb+cc+p*ff)/(aa+p*dd2)*u1[2]+(cc)/(aa+p*dd2)*u1[1]+p/(aa+p*dd2)*(aa*dd2*r[4]-(bb*dd2+aa*ee)*r[3]+(dd2*cc+bb*ee+aa*ff)*r[2]-(cc*ee+bb*ff)*r[1]); } else { u1[4]=u1[3]*(aa+bb+p*ee)/(aa+p*dd1)-(bb+cc+p*ff)/(aa+p*dd1)*u1[2]+(cc)/(aa+p*dd1)*u1[1]+p/(aa+p*dd1)*(aa*dd1*r[4]-(bb*dd1+aa*ee)*r[3]+(dd1*cc+bb*ee+aa*ff)*r[2]-(cc*ee+bb*ff)*r[1]); } y1[4]=u1[4]/(1.0+100.0/t/t+20.0/t)-(100.0/t/t)*y[2]/(1.0+100.0/t/t+20.0/t)+(200.0/t/t+20.0/t)*y[3]/(1.0+100.0/t/t+20.0/t); e[4]=r[4]-y1[4]; if(sx { u1[5]=u1[4]*(aa+bb+p*ee)/(aa+p*dd2)-(bb+cc+p*ff)/(aa+p*dd2)*u1[3]+(cc)/(aa+p*dd2)*u1[2]+p/(aa+p*dd2)*(aa*dd2*r[5]-(bb*dd2+aa*ee)*r[4]+(dd2*cc+bb*ee+aa*ff)*r[3]-(cc*ee+bb*ff)*r[2]+ff*cc*r[1]); } else { u1[5]=u1[4]*(aa+bb+p*ee)/(aa+p*dd1)-(bb+cc+p*ff)/(aa+p*dd1)*u1[3]+(cc)/(aa+p*dd1)*u1[2]+p/(aa+p*dd1)*(aa*dd1*r[5]-(bb*dd1+aa*ee)*r[4]+(dd1*cc+bb*ee+aa*ff)*r[3]-(cc*ee+bb*ff)*r[2]+ff*cc*r[1]); } y1[5]=u1[5]/(1.0+100.0/t/t+20.0/t)-(100.0/t/t)*y[3]/(1.0+100.0/t/t+20.0/t)+(200.0/t/t+20.0/t)*y[4]/(1.0+100.0/t/t+20.0/t); for(i=6;i<100;i++) { if(sx { u1[i]=u1[i-1]*(aa+bb+p*ee)/(aa+p*dd2)-(bb+cc+p*ff)/(aa+p*dd2)*u1[i-2]+(cc)/(aa+p*dd2)*u1[i-3]+p/(aa+p*dd2)*(aa*dd2*r[i]-(bb*dd2+aa*ee)*r[i-1]+(dd2*cc+bb*ee+aa*ff)*r[i-2]-(cc*ee+bb*ff)*r[i-3]+ff*cc*r[i-4]); } else { u1[i]=u1[i-1]*(aa+bb+p*ee)/(aa+p*dd1)-(bb+cc+p*ff)/(aa+p*dd1)*u1[i-2]+(cc)/(aa+p*dd1)*u1[i-3]+p/(aa+p*dd1)*(aa*dd1*r[i]-(bb*dd1+aa*ee)*r[i-1]+(dd1*cc+bb*ee+aa*ff)*r[i-2]-(cc*ee+bb*ff)*r[i-3]+ff*cc*r[i-4]); } y1[i]=u1[i]/(1.0+100.0/t/t+20.0/t)-(100.0/t/t)*y[i-2]/(1.0+100.0/t/t+20.0/t)+(200.0/t/t+20.0/t)*y[i-1]/(1.0+100.0/t/t+20.0/t); e[i]=r[i]-y1[i]; } cout<<"U1的曲线为"< for(i=1;i<100;i++) { cout< } cout<<"Y1的曲线为"< for(i=1;i<100;i++) { cout< } for(i=1;i<99;i++) { outfile<<(i-1)*t<<'\t'; } outfile< for(i=1;i<99;i++) { outfile< } outfile< for(i=1;i<99;i++) { outfile< } outfile< } outfile.close(); } (3)输出结果如下: 积分限较小时: U(t)的阶跃数据: 24.41927.150037.781288.8819810.204211.428412.484513.3413.989614.447414.738614.894114.945914.924114.854914.759814.655414.553614.461914.384814.323814.278614.247914.229414.220614.21914.05313.627112.908611.913310.69049.31017.851266.392125.003043.74152.649431.75231.059780.5675970.2600960.1132660.09780470.1820370.3344710.5258670.7307630.9284521.103431.245381.348871.412611.438781.432031.398681.345861.280811.21031.140231.075341.019110.9737010.9401120.9182920.9073670.9058580.9119110.9235030.9386220.955410.9722680.9879181.001431.012231.020041.024891.026991.026741.024621.021151.016861.012211.007611.003390.9997850.9969250.9948710.993610.9930760.993160.9937310.9946510.995780.9969930.9981860.9992731.00021.00092 Y(t)的阶跃数据: 00.05909120.07933440.1089210.1446860.1830270.2225450.262270.3015670.3400490.3775050.4138390.4490270.483080.5160230.5478820.5786740.6084080.6370820.6646870.6912090.7166340.7409490.7641470.7862250.8071890.8256490.8408510.8525650.8609580.866481
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机控制 PID 编程 实现