桥式吊车专业实验任务书终稿(共26页).docx
精选优质文档-倾情为你奉上北 京 航 空 航 天 大 学专 业 实 验 报 告专业名称 自动化 专业方向 飞行控制系统 班 级 学生姓名 吴崇珂 指导教师 袁少强 2014年 10月 11 日专心-专注-专业目 录1系统设计任务及技术指标专业实验任务书题目:数控式桥式吊车控制系统一 技术指标:1 摆角稳定时间小于5秒,摆动次数小于3次2 吊车启动时最大摆角小于±10°3 吊车最大速度为0.5米/秒4 D/A输出 100mv电机起动,D/A输出5 v时对应电机最大速度二 实验任务1 桥式吊车实验系统方案和主要部选择2 桥式吊车系统元部件测试与建模3 数字控制器硬件实现4 数字控制器软件实现5 闭环系统的组成和实验调试6 实验结果分析7 编写专业实验报告2系统的组成和工作原理2.1 系统的组成图 1 数字式桥式吊车系统的结构原理数字式桥式吊车系统的结构原理如图所示,计算机作为数字控制器实现对系统的实时控制,同时也为操作者提供人机界面,完成对系统的监督管理功能,如实时画图、采集数据等。A/D、D/A接口板插在计算机内,完成模数、数模转换。小功率随动系统用于电压和功率的放大。电机、测速机是系统的执行元件和速度反馈元件,电位计1和2分别是车位置反馈元件和摆角度反馈元件。吊车系统的整套机械部件安装在一块底板上。底板上固定着导轨、皮带轮、电机、测速机、车位置反馈电位计,底板开槽,使吊摆垂下去。吊车轨道的有效长度约为0.7米,吊车组件包围在轨道外,四个车轮在导轨上方运动,吊车板下面连着小车板支架和角位置电位计支架,两支架之间安装吊摆,在角位置电位计支架上装有测量吊摆角度的单圈电位计。计算机、A/D、D/A板,小功率随动系统、电机、测速机、桥式吊车装置通过机械或电气手段连接成一个整体。其中电气连接通过控制盒实现。2.2 工作原理 图 2 Digital Crane数字式桥式吊车控制系统框图吊车(下装吊摆)在电机的拖动下沿固定的直线导轨进行运动,相应地,产生了吊车的直线位移和吊摆的转角。线速度、线位移由与皮带轮同轴安装的多圈电位计测得,角位移由安装在吊摆轴上的单圈电位计测得,这三个物理量通过A/D转换送入计算机,经过机内的实时控制程序运算产生控制指令,该指令经D/A变换送入小功率随动系统,经过功率放大再输出给电机,产生相应的控制作用,从而实现对吊车线位移和吊摆角位移的控制。3计算机控制系统的设计与实现3.1 计算机控制系统的设计方案(硬件、软件)硬件部分:软件部分:编程环境为TC.定时器初始化.开机动画.A/D转换,数字量处理.吊车运动状态实时显示.D/A转换3.2 实时控制软件框图3.3 数据采集(吴崇珂负责)、数据处理(赵友铖负责)与模拟量输出(赵子豪负责)首先是A/D函数的调用,具体内容:使计数器8253工作在方式4;给A/D转换器发送转换的通道;延时25微秒;启动A/D转换;延时25微秒;读取高四位和低八位;合成12位浮点数;返回;程序如下:float adc(int n) int adh=0,adl=0,adint=0; int i=0; float ad=0; outportb(0x31b,0x18); /* 8253工作与方式4 */ outportb(0x310,n); /* 发送通道号(0-15) */ for(i=0;i<5000;i+); /* 延时25us */ outportb(0x311,0x0); /* 启动A/D转换 */ for(i=0;i<5000;i+); adh=inportb(0x312)%16; /* 读高4位(屏蔽高4位) */ adl=inportb(0x313); /* 读低8位 */ adint=adh*256+adl; /* 合成12位 */ ad=(float)adint/0x800-1; /* 转换成浮点数(-1-+1) */ return (ad);A/D通道0为小车位置通道;A/D通道1为小车速度通道;A/D通道2为小车摆角通道;在进行模拟量采样的时候,由于测速机,多圈电位计,单圈电位计对速度、摆角、位置等物理量到电量的转换需要一定的时间,因此在调用A/D转换的时候进行了3次调用,每次50微秒,这样就得到了较为准确的物理量测量值。速度的采集由于本身的噪声比较大,我们进行了滤波处理。具体是每次采集进来一个数就将最前面的数除去,将数组里的数进行平均,从而得到较为平滑的速度,吊车的运动更为平稳。void interrupt newint() /*控制率算法*/ disable(); if(k=0) s0=adc(0); /* 小车位置通道0 */ s0=adc(0); s0=adc(0); r=r-s0*10; o0=adc(2); /* 小车摆角通道2 */ o0=adc(2); o0=adc(2); /* 采样*/ k+; sk=adc(0); /* 小车位置通道0 */ sk=adc(0); sk=adc(0); sk=-1.1249*(sk-s0); /* m */ vk=adc(1); /* 小车速度通道1 */ vk=adc(1); vk=adc(1); vk=-1.0987*vk; /* m/s */ vv2=vv1; /*速度通道滤波*/ vv1=vv0; vv0=vk; summ=vv2+vv1+vv0; vk=summ/3; ok=adc(2); /* 小车摆角通道2 */ ok=adc(2); ok=adc(2); ok=2.7635*(ok-o0); /*+0.0284+0.16; */ /* 反馈极性 */ /* 开环估计 */ /*控制率r/(11.249)算法*/ ek=r-K1*sk-K2*vk-K3*ok; /*-K1*sk*/ ek=ek/5; if(ek>=0.9) ek=0.9; else if(ek<=-0.9) ek=-0.9; ek=-1*ek; if(ek>=0.005)&&(ek<=0.02)&&(k>100)&&(r+0.1>sk*10/1.1249)&&(r-0.1<sk*10/1.1249) ek=0.02; else if(ek>=-0.02)&&(ek<=-0.005)&&(k>100)&&(r+0.1>sk*10/1.1249)&&(r-0.1<sk*10/1.1249) ek=-0.02; dac(ek); ek=-5*ek; outportb(0x20,0x20); sk=100*sk; /* cm */ vk=100*vk; /* cm/s */ ok=180*ok/3.14; /* sk=sk*10/(1.1249); m */ if (k<500) enable();void dac(float x1) unsigned int lo=0,hi=0,newhi=0,newlo=0,x; x=(x1+1)/2*0xfff0; /* 转换为16进制偏移码 */ lo=x%256;hi=(x-lo)/256; /* 分为高8位和低8位 */ newhi=hi%16*16+(int)hi/16; /* 高4位和低4位互换 */ outportb(0x316,newhi); /* 写入高8位 */ newlo=lo%16*16+(int)lo/16; /* 高4位和低4位互换 */ outportb(0x317,newlo); /* 写入低8位 */ inportb(0x317); /* 启动D/A转换 */正如上面所说,A/D通道0为小车位置通道;A/D通道1为小车速度通道;A/D通道2为小车摆角通道;一开始对小车这三个参数的初值进行了读取,然后每过一个采样周期,读取一组新的值。因为参数读取有延迟,所以要读取两次以上,才能读取到正确的参数值。读取到参数值之后,与初值算出相对的差。因为测速抖动较大,所以采用了均值滤波,改善了抖动。取到相对值之后,经过通过由最优算法的控制律得到e(k).因为要满足最大电压5v,启动电压100mv,所以对e(k)进行了饱和特性处理,符合了设计的要求。然后是D/A函数的调用,具体内容:先将输入的数字信号转换成十六进制偏移码;由于使用DAC1213芯片,分别为D/A1和D/A2,I/O接口是8位的,因此必须写入两次才能完成12位数据的传递,同时由于实验设备的特殊,需要将这八位中的高低四位互换后再写入,最后通过起动信号使D/A转换开始;3.4 采样周期的实现(赵子豪负责)使用的是8253,并使其工作在方式3,通道2选通,先读低字节后读高字节,二进制计数的方式构成计数器;同时采样周期的实现需要用到中断向量,在每一次关中断时给8253写入控制字,然后再开中断。程序:void init_int() oldint=getvect(0xb); /* 获得旧的中断向量*/ setvect(0xb,newint); /* 建立新的中断向量*/ disable(); /* 关闭中断 */ outportb(0x31b,0xb6); /* 初始化编程,写入控制字,定时时间25ms */ outportb(0x31a,0x40); /* 低位 80 */ outportb(0x31a,0x9c); /* 高位 195 */ outportb(0x21,inportb(0x21)&0xf7); enable(); /* 开中断 */3.5 界面设计与实现(张娱负责)界面设计主要实现功能:(1)在界面上可以输入小车的期望位置,实现对小车任意位置的控制,可以比较在不同位置时控制系统的性能(2)界面上实时显示小车的位置,速度和摆角变化曲线. 在曲线幅值标注的过程中,根据技术指标,分别在在小车速度达到0.5m/s和摆角达到±10°处绘制出最大速度标准和最大摆角限制,由此根据曲线能清晰地看出小车的运动过程是否达到了技术指标,方便了调试过程。.主要调用了setcolor:设定当前颜色;settextstyle:图形屏幕文字显示风格setlinestyle:设置线型outtextxy:图形屏幕文字的显示等主要绘图函数实现了界面的设计。程序:void init_background() /* 图形背景初始化 */ int i=0,j=0; /* 显示系统参数 setcolor(WHITE);*/ /*for(i=0;i<7;i+) sprintf(buf,"k%d=%f",i+1,_ki); outtextxy(X4,Y4+i*D,buf); */ /* 绘制坐标网格*/ /* 小车位置坐标*/ cleardevice(); /* 清屏 */ setcolor(WHITE); settextstyle(DEFAULT_FONT,HORIZ_DIR,0); setlinestyle(1,0,NORM_WIDTH); for(i=0,j=-1*B/2;i<9;i=i+2) /* if(i=0|i=4|i=8) */ if(i=4) setlinestyle(SOLID_LINE,0,NORM_WIDTH); line(X1,Y1+j,X1+A,Y1+j); setlinestyle(1,0,NORM_WIDTH); else line(X1,Y1+j,X1+A,Y1+j); /*幅值标注*/ switch (i) case 0: outtextxy(X1-X1,Y1+j-5," 60"); outtextxy(X1-X1+45,Y1+j+5,"S(cm)"); break; case 1: outtextxy(X1-X1,Y1+j-5," 60"); break; case 2: outtextxy(X1-X1,Y1+j-5," 30"); break; case 3: outtextxy(X1-X1,Y1+j-5," 20"); break; case 4: outtextxy(X1-X1,Y1+j-5," 0 "); break; case 5: outtextxy(X1-X1,Y1+j-5," -20"); break; case 6: outtextxy(X1-X1,Y1+j-5," -30"); break; case 7: outtextxy(X1-X1,Y1+j-5," -60"); break; case 8: outtextxy(X1-X1,Y1+j-5," -60"); break; j=j+B/4; setlinestyle(1,0,NORM_WIDTH); for(i=0,j=0;i<7;i+) line(X1+j,Y1-B/2,X1+j,Y1+B/2); /*时间标注*/ switch (i) case 0: break; case 1: outtextxy(X1+j-15,Y1+5,"100T"); break; case 2: outtextxy(X1+j-15,Y1+5,"200T"); break; case 3: outtextxy(X1+j-15,Y1+5,"300T"); break; case 4: outtextxy(X1+j-15,Y1+5,"400T"); break; case 5: outtextxy(X1+j-15,Y1+5,"500T"); break; case 6: outtextxy(X1+j-35,Y1+5,"600T"); break; j=j+A /6; setlinestyle(SOLID_LINE,0,NORM_WIDTH); line(X1,Y1-B/2,X1,Y1+B/2); /* line(X1+A,Y1-B/2,X1+A,Y1+B/2); */ /* 绘制期望位置输入R?*/ setcolor(RED); setlinestyle(SOLID_LINE,0,NORM_WIDTH); line(X1,Y1-r*11.249/K4*B/(2*80),X1+A,Y1-r*11.249/K4*B/(2*80); /* 小车速度坐标*/ setcolor(WHITE); settextstyle(DEFAULT_FONT,HORIZ_DIR,0); setlinestyle(1,0,NORM_WIDTH); for(i=0,j=-1*B/2;i<9;i=i+2) /* if(i=0|i=4|i=8) */ if(i=4) setlinestyle(SOLID_LINE,0,NORM_WIDTH); line(X2,Y2+j,X2+A,Y2+j); setlinestyle(1,0,NORM_WIDTH); else line(X2,Y2+j,X2+A,Y2+j); /*幅值标注*/ switch (i) case 0: outtextxy(X2-X1,Y2+j-5," 60"); outtextxy(X2-X1+45,Y2+j+5,"V(cm/s)"); break; case 1: outtextxy(X2-X1,Y2+j-5," 45"); break; case 2: outtextxy(X2-X1,Y2+j-5," 30"); break; case 3: outtextxy(X2-X1,Y2+j-5," 15"); break; case 4: outtextxy(X2-X1,Y2+j-5," 0"); break; case 5: outtextxy(X2-X1,Y2+j-5," -15"); break; case 6: outtextxy(X2-X1,Y2+j-5," -30"); break; case 7: outtextxy(X2-X1,Y2+j-5," -45"); break; case 8: outtextxy(X2-X1,Y2+j-5," -60"); break; j=j+B/4; setlinestyle(1,0,NORM_WIDTH); for(i=0,j=0;i<7;i+) line(X2+j,Y2-B/2,X2+j,Y2+B/2); /*时间标注*/ switch (i) case 0: break; case 1: outtextxy(X2+j-15,Y2+5,"100T"); break; case 2: outtextxy(X2+j-15,Y2+5,"200T"); break; case 3: outtextxy(X2+j-15,Y2+5,"300T"); break; case 4: outtextxy(X2+j-15,Y2+5,"400T"); break; case 5: outtextxy(X2+j-15,Y2+5,"500T"); break; case 6: outtextxy(X2+j-35,Y2+5,"600T"); break; j=j+A /6; setlinestyle(SOLID_LINE,0,NORM_WIDTH); line(X2,Y2-B/2,X2,Y2+B/2); /* line(X2+A,Y2-B/2,X2+A,Y2+B/2); */ /* 绘制最大速度标准 */ setcolor(RED); setlinestyle(SOLID_LINE,0,NORM_WIDTH); line(X2,Y2-55*B/(2*60),X2+A,Y2-55*B/(2*60); line(X2,Y2+55*B/(2*60),X2+A,Y2+55*B/(2*60); /* 小车摆角坐标*/ setcolor(WHITE); settextstyle(DEFAULT_FONT,HORIZ_DIR,0); setlinestyle(1,0,NORM_WIDTH); for(i=0,j=-1*B/2;i<9;i=i+2) /* if(i=0|i=4|i=8) */ if(i=4) setlinestyle(SOLID_LINE,0,NORM_WIDTH); line(X3,Y3+j,X3+A,Y3+j); setlinestyle(1,0,NORM_WIDTH); else line(X3,Y3+j,X3+A,Y3+j); /*幅值标注*/ switch (i) case 0: outtextxy(X3-X1,Y3+j-5," 12"); outtextxy(X3-X1+45,Y3+j+5,"O(degree)"); break; case 1: outtextxy(X3-X1,Y3+j-5," 9"); break; case 2: outtextxy(X3-X1,Y3+j-5," 6"); break; case 3: outtextxy(X3-X1,Y3+j-5," 3"); break; case 4: outtextxy(X3-X1,Y3+j-5," 0"); break; case 5: outtextxy(X3-X1,Y3+j-5," -3"); break; case 6: outtextxy(X3-X1,Y3+j-5," -6"); break; case 7: outtextxy(X3-X1,Y3+j-5," -9"); break; case 8: outtextxy(X3-X1,Y3+j-5," -12"); break; j=j+B/4; setlinestyle(1,0,NORM_WIDTH); for(i=0,j=0;i<7;i+) line(X3+j,Y3-B/2,X3+j,Y3+B/2); /*时间标注*/ switch (i) case 0: break; case 1: outtextxy(X3+j-15,Y3+5,"100T"); break; case 2: outtextxy(X3+j-15,Y3+5,"200T"); break; case 3: outtextxy(X3+j-15,Y3+5,"300T"); break; case 4: outtextxy(X3+j-15,Y3+5,"400T"); break; case 5: outtextxy(X3+j-15,Y3+5,"500T"); break; case 6: outtextxy(X3+j-35,Y3+5,"600T"); break; j=j+A /6; setlinestyle(SOLID_LINE,0,NORM_WIDTH); line(X3,Y3-B/2,X3,Y3+B/2); /* line(X3+A,Y3-B/2,X3+A,Y3+B/2); */ /* 最大摆角限制 */ setcolor(RED); setlinestyle(SOLID_LINE,0,NORM_WIDTH); line(X3,Y3-10*B/(2*12),X3+A,Y3-10*B/(2*12); line(X3,Y3+10*B/(2*12),X3+A,Y3+10*B/(2*12);3.6 动画的设计与实现(李昆鹏负责) 1、基本思路利用c语言中graphics.h头文件实现动画,通过使用该文件中提供的,例如bar,bar3d, fillellipse,line等函数绘制出基本图形,用于表示试验中的小车,吊摆及车轮。而动画的实现方法是高频率的重复画图达到动画的效果。2、相关程序解释 (1)、开机动画部分 void open() int i=0,j=200,k=0; for(i=0,j=639;i<400;i+) setfillstyle(SOLID_FILL,BLACK); /设置填充风格,该语句作用为清屏 /* 小车 */ bar(j-a,50-2*R-b,j+2,50); /画出当前位置下的二维边框,长宽分别为a,b+2*R ,(各个参数分别为长条的左上及右下坐标) setcolor(BLUE); setlinestyle(SOLID_LINE,0,NORM_WIDTH); setfillstyle(SOLID_FILL,RED); bar3d(j-a,50-2*R-b,j,50-2*R,0,1); /利用bar3d画出小车的图形,长宽分别为ab /* 车轮 */ setcolor(BLUE); setfillstyle(SOLID_FILL,RED); fillellipse(j-a/4,50-R,R,R); /利用椭圆函数画出小车车轮的图形 前轮位于小车长度的1/4处 fillellipse(j-a*3/4,50-R,R,R); /画出后轮图像与前轮对称分布 /* 吊摆*/ setcolor(BLACK); line(j+2-a/2,50-2*R,j+2-a/2+L*sin(float)30*3.14/180)/K,60-2*R+L*cos(float)30*3.14/180); /首先清除上一次绘制出的吊摆的图形(利用颜色相同覆盖black) setcolor(RED); line(j-a/2,50-2*R,j-a/2+L*sin(float)30*3.14/180)/K,60-2*R+L*cos(float)30*3.14/180); /分别给出吊摆两端点的横纵坐标,用line函数画出吊摆(长度为L) /* 小车导轨 */ setcolor(WHITE); line(0,51,640,51); /* 题目 */ if(j>100) setfillstyle(SOLID_FILL,BLACK); bar(j-5,95,640,120); setcolor(WHITE); setfillstyle(SOLID_FILL,BLUE); bar(j-5,95,j+450,120); settextstyle(DEFAULT_FONT,HORIZ_DIR,2); outtextxy(j,100,"Digital Crane Control System"); /画出小车的过程中,通过对变量j进行判断 利用outtextxy写出“Digital Crane Control System” setfillstyle(SOLID_FILL,BLACK); /*for(k=0;k<3;k+) bar(0,0,100,100);*/ j=j-2; /擦去小车导轨 setcolor(BLACK); line(0,51,640,51); setcolor(WHITE); settextstyle(DEFAULT_FONT,HORIZ_DIR,0); setlinestyle(SOLID_LINE,0,THICK_WIDTH); j=250; k=250; setfillstyle(SOLID_FILL,BLACK); outtextxy(j,k,""); j=j+8; cursor(j,k); outtextxy(j,k,""); j=j+8; cursor(j,k); outtextxy(j,k,""); j=j+8; cursor(j,k); outtextxy(j,k,""); j=j+8; cursor(j,k); outtextxy(j,k,""); j=j+8; cursor(j,k); outtextx