基于PCI总线的数字随动系统的开发(7)

2019-05-17 16:50

附录C语言主控程序清单

if((fp=fopen(“wjd.txt”,”w+”))==NULL) /* 打开系统数据文件 */ exit();

fprintf(fp,” %s\\n”,”数字随动系统演示过程参数列表”); fprintf(fp,” %s\\n”,”============================”);

fprintf(fp,”%s %s %s %s %s %s %s %s %s \\n”,”kp”,”ki”,”kd”,”yn”,”pn”,”en”,”en1”,”cn”,”un”); /* 打印参数列表 */

if((fq=fopen(“shjh.txt”,”w+”))==NULL) exit();

kp=1.5; /* 初始化 */ kd=6; en=0; en1=0; cn=0x7f; dac();

a1=*argv[1];a1=a1-48; /* 参数对应 */ a2=*argv[2];a2=a2-48; a3=*argv[3];a3=a3-48; a4=*argv[4];a4=a4-48;

kp=a1+a2*0.1+a3*0.01+a4*0.001; d1=*argv[5];d1=d1-48; d2=*argv[6];d2=d2-48; d3=*argv[7];d3=d3-48; d4=*argv[8];d4=d4-48;

ki=d1-d2*0.1+d3*0.01+d4*0.001; b1=*argv[9];b1=b1-48; b2=*argv[10];b2=b2-48; b3=*argv[11];b3=b3-48; b4=*argv[12];b4=b4-48; b5=*argv[13];b5=b5-48;

kd=b1*10+b2+b3*0.1+b4*0.01+b5*0.001; c1=*argv[14];c1=c1-48; c2=*argv[15];c2=c2-48; c3=*argv[16];c3=c3-48; pn=c1*100+c2*10+c3;

if((pn=512)&&(pn<999)) /* 给定大于511时 */ pn=pn-pn(pn/512)*512;

else

exit();

io(); /* 数据采集(反馈量) */ delay(); /* 延时 */

en=pn-yn; /* 本次偏差 */ t[0]=en; /* 偏差数组 */ follow(); /* 捷径跟随 */

- -

28

附录C语言主控程序清单

en1=en; /* 当前误差变成前一时刻误差 */ io(); delay(); en=pn-yn; t[1]=en; follow();

pid(); /* 计算控制输出电压 */ display(); /* 打印当前所有变量值 */ dac(); /* 控制电压输出 */

first=time(NULL); /* 第一次取系统时间 */ c=2;

11:io(); /* 数据采集子程序(二次反馈量) */

dalay(); en=pn-yn; t[c]=en; c=c+1; follow();

pid(); /* 计算二次控制输出量 */ display(); /* 打印 */ dac(); /* 输出控制 */

second=time(NULL); /* 第二次取时间 */

diff=difftime(second,first); /* 两次系统时间之差 */ if(diff<3.0) /* 判断满足跳转至标号11 */ goto 11;

else /* 否则执行下列语句 */ { show(); /* 计算超调 */ plot_line() /* 描绘波形 */ run=0 /* 假定标志位 */

fprintf(fq,”%d\\n”,run); /* 标志输出 */ goto t1; /* 系统停止 */}} t1:cn=0x7f; /* 零控制电压 */

dac(); /* 端口输出子程序 */

fclose(fp); /* 关闭系统数据文件 */ fclose(fq); fclose(ft); }

void dac() /* 输出控制子函数 */ { int an; an=cn;

outportb(0xC401,an); /* 对地址000C401输出字节量an */ return; }

void pid() /* PID算法计算子函数 */ { int u;

u=(int)(kp*(en-en1)/2+ki*en/2+kd*(en-2*en1+en2)/2);

- -

29

附录C语言主控程序清单

u=u; u+=128; if(u>255) u=255; else

if(u<0) u=0; en=u;

en2=en1; /* 偏差赋值 */ en1=en; return; }

void plot_line() /* 波形描绘子函数 */ { float factor,dx; int i;

int gdriver=9,gmode=2; /* 定义显示模式 */ initgraph(&gdriver,&gmode,”c:\\\\tc”); clearviewport(); /* 清屏 */ printf(“dx=?”); scanf(“%f”,&dx);

setlinestyle(0,0,3); /* 线形,背景色,线条色 */ setbkcolor(0); setcolor(4);

for (b=0;b<600;b++) /* 转换 */ { if(s[b]>=256 s[b]=s[b]-512;)} if(pn>=256) pn=pn-512;

rectangle(20,40,620,440); /* 构建绘图区,坐标系 */ moveto(20,XIAS); lineto(620,XIAS);

moveto(20,XIAS-(int)(pn*200.0/256.0)); /* 画给定量直线 */ lineto(620,XIAS-(int)(pn*200.0/256.0)); outtextxy(25,50,”β”); /* 输出标志 */ outtextxy(600,230,”T”);

outtextxy(600,XIAS-(int)(200.0/256.0),”pn”);

outtextxy(20+50*dx,XIAS-(int)(200.0/256.0*s[60]),”yn”); moveto(20,XIAS-(int)(200.0/256.0*s[0])); /* 定义起点 */ for(i=1;iMAXP) break;

lineto(20+i*dx,XIAS-(int)(200.0/256.0*s[i])); /* 定义起点 */ getch(); } getch();

closegraph(); /* 恢复 */}

void delay() /* 延时子函数 */ { int i,j;

for(i=0;i<2000;i++)

- -

30

附录C语言主控程序清单

{ for(j=0;j<1000;j++) { ; }}

void follow() /* 系统跟随子函数,偏差计算 */

{ if((en>=0)&&(en<=256)) en=en; /* 度数 0<=en<=180 */

if((en>256)&&(en<=512) en=en-512; /* 180-256)) en=en; /* -180-512)&&(en<=256)) en=512+en;/* -180<=en<=-360 en=en+360 */ return; }

void show() /* 超调计算子函数 */ { int u;

if((ft=fopen(“shen.txt”,”w+”))==NULL) exit();

for(b=0;b<600;b++) /* 判断第一个返回量与给定量相等点位置 */ { if(abs(t[b])==0) {u=b; break;}

if(abs(t[b])==1) { u=b;

break; }}

for(c=u;c<600;c++) /* 从此点开始求取震荡峰值 */ { v=abs(t[c]); w=abs(t[c+1]); if(w

delta=max*100.0/abs(pn-s[0]); /* 超调量计算 */ break;}}

fprintf(ft,”%f%%\\n”,delta); /* 超调量输出 */ fclose(ft);

void io() /* 数据采集子函数 */ { int a;

a=inportb(0xC402)&0x0c0; /* 从口地址000C402采数据取其高两位 */

yn=a;

a=inportb(0xC403)&0x7f; /* 从口地址000C403 采数据取其低七位 */

yn=a*256+yn; /* 合成9位数据 */ yn=yn/64;

s[b]=yn; /* 每一次数据送数组s[b] */ b=b+1; return; }

void display() /* 打印子函数 */ { float vn;

vn=(float)(3.92157*cn/100.0-5.0); /* vn即 un=10*(pn-512)/255-5,

cn=10*cn,cn=pn-512<360>*/

- -

31

附录C语言主控程序清单

fprintf(fp,”%5.3f,%5.3f,%6.3,%-5d,%-5d,”,kp,ki,kd,yn,pn); fprintf(fp,”%-5d,%-5d,%-5d,%1.2fv\\n”,en,en1,cn,vn); return; }

- - 32


基于PCI总线的数字随动系统的开发(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:六十四卦配世应六亲全图

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: