毕业设计(论文)基于单片机数控系统插补控制设计.doc
广州汽车学院课程设计说明书 基于单片机数控系统插补控制设计 院(系) 机电工程系 专 业 机械工程及其自动化 班 级 学生姓名 指导老师 李冬冬 2010年 12 月 18 日 课 程 设 计 任 务 书兹发给 班学生 课程设计任务书,内容如下:1 设计题目: 基于单片机数控系统插补控制设计 2 应完成的项目:(1)调研、搜集整理课题的相关资料,确定设计整体方案。 (2)理解并熟悉数控系统插补原理。 (3) 根据插补原理,用Visual C+实现其模拟仿真。 (4) 单片机开发环境(Vision )下,编程实现插补。(5) 完成设计说明书,准备答辩。 3 参考资料以及说明:(1) 数控技术。 (2) 单片机原理及应用。 (3) Visual C+编程相关资料。 (4) 4 本设计任务书于2010 年11月29日发出,应于2010 年 12月22 日前完成,然后进行答辩。指导教师 签发 2010 年 11 月 29 日课程设计评语:课程设计总评成绩:指导教师签字:年 月 日目 录摘 要4第一章 概 述51插补的基本概念52对插补器的基本要求53. 插补器的的分类54. 基准脉冲插补5第二章 逐点比较法71逐点比较法直线插补72逐点比较法圆弧插补83象限处理10第三章 数字积分分析法(DDA)111DDA直线插补112DDA圆弧插补12第四章 Visual C+插补仿真141. MFC应用软件的建立142. 设置工具栏153. 利用GDI绘图仿真插补16第5章 利用Vision单片机编程23参考文献25附 件25 摘 要 本书是对“基于单片机数控系统插补控制设计”的课程设计进行说明,基准脉冲插补方法有:逐点比较法;最小偏差法;数字积分法;目标点跟踪法;单步追综法等。本次设计主要设计逐点比较和DDA法的直线和圆弧编程。在设计的过程中首先要对数控机床的插补有所了解,然后写出流程图,接着在VC的MFC工程中,进行仿真插补运动,最后完成单片机编程。 本书深入浅出的介绍了设计的过程,简单的讲解了逐点比较和DDA法的直线和圆弧算法。还介绍了VC+软件的MFC工程的新建方法,和一些简单的使用方法。最后还介绍了Vision软件进行单片机编程。关键词:插补,逐点比较法,DDA,VC+,应用程序,Vision软件,单片机第一章 概 述 1插补的基本概念 “插补”(Interpolation):根据给定进给速度和给定轮廓线形的要求,在运动轨迹的起始点坐标和轮廓轨迹之间,由数控系统计算出各个中间点的坐标,“插入”、“补上”运动轨迹中间点的坐标值。 无论是普通数控(NC)系统,还是计算机数控(CNC)系统,都必须有完成“插补”功能的部分,它是轮廓控制系统的本质特征。能完成插补工作的装置叫插补器。NC系统中插补器由数字电路组成,称为硬件插补,而在CNC系统中,插补器功能由软件来实现,称为软件插补。2对插补器的基本要求 插补是数控系统的主要功能,它直接影响数控机床加工的质量和效率。对插补器的基本要求是:插补所需的原始数据较少;有较高的插补精度,插补结果没有累计误差,局部偏差不能超过允许的误差(一般应保证小于规定的分辨率);沿进给路线的进给速度恒定且符合加工要求;硬件线路简单可靠,软件插补算法简洁,计算速度快。3. 插补器的的分类l 插补工作可以由硬件电路或软件程序完成,从而分为硬件插补器和软件插补器。l 从产生的数学模型来分有一次(直线)插补器,二次(圆,抛物线等)插补器及高次曲线插补器等。l 目前应用的插补方法分为基准脉冲插补和数据采样插补两大类。4. 基准脉冲插补基准脉冲插补又称为行程标量插补或脉冲增量插补。此算法的特点是每次插补结束时数控装置向每个运动坐标输出基准脉冲序列,每个脉冲代表了最小位移,脉冲序列的频率代表了坐标运动速度,而脉冲的数量表示位移量。其特点有:l 每次插补的结果仅产生一个单位的行程增量。以一个一个脉冲的方式输出给步进电机。其基本思想是:用折线来逼近曲线(包括直线)。l 插补速度与进给速度密切相关。因而进给速度指标难以提高,当脉冲当量为10m时,采用该插补算法所能获得的最高进给速度是34m/min。l 脉冲增量插补的实现方法比较简单。基准脉冲插补方法有:逐点比较法;最小偏差法;数字积分法;目标点跟踪法;单步追综法等。它们主要用早期的采用步进电机驱动的数控系统。由于此算法难以满足零件加工的要求,现在的数控系统已很少采用这类算法了。(1)逐点比较法控制工件与刀具之间每相对走一步完成四个工作节拍:l 第一,偏差判别。判别加工点对规定几何轨迹的偏离位置,然后决定运动的走向。l 第二,进给。控制某坐标轴进给一步,向规定的轨迹逼近,缩小偏差。l 第三,偏差计算。计算新的加工点对规定轨迹的偏差,作为下一步判别走向的依据。l 第四,终点判断。判断是否到达程序规定的加工终点?若到达终点,则停止插补,否则再回到第一拍。如此不断地重复上述循环过程,直到终点,就能加工出所要求的轮廓形状。(2)数字积分插补法 数字积分插补法又称为数字积分分析法(DDA),是利用数字积分的方法,计算刀具沿各坐标轴的位移,使刀具沿着所加工的轨迹运动。第二章 逐点比较法1逐点比较法直线插补 直线插补时,以直线起点为原点,给出终点坐(xe,ye),直线方程为: ; 直线插补时插补偏差可能有三种情况 :以第一象限为例,插补点位于直线上方,下方和直线上。对位于直线上方的点A,则有:;对位于直线上的点B,则有:;对位于直线下方的点C,则有:因此,可以取判别函数为: F>0时,应向+x方向走一步,才能接近直线;F<0时,应向+y方向走一步,才能接近直线;F=0时,为了继续运动,可归入F>0的情况。整个插补工作,从原点开始,走一步算一步,判别一次F,再趋向直线,步步前进。设第一象限中的点(xi , yi)的F值为Fi,j。若沿+x方向走一步,即若沿+y方向走一步,即直线插补的终点判别方法:l 每走一步判断最大坐标的终点坐标值(绝对值)与该坐标累计步数坐标值之差是否为零,若等于零,插补结束。l 把每个程序段中的总步数求出来,即n=xe+ye ,每走一步,进行n-1,直到n=0时为止。当F0时,沿+x方向走一步,然后计算新的偏差和终点判别计算当F<0时,沿+y方向走一步,则计算2逐点比较法圆弧插补 逐点比较法进行圆弧加工时(以第一象限逆圆加工为例),一般以圆心为原点,给出圆弧起点坐标(xo,yo)和终点坐标(xe,ye),如图所示。设圆弧上任一点坐标为(x,y),则下式成立:选择判别函数为: 其中为第一象限内任一点坐标。根据动点所在区域不同,有三种情况F>0时,动点在圆弧外;F<0时,动点在圆弧内;F=0时,动点在圆弧上。把F>0和F=0的情况合并在一起考虑,就可以实现第一象限逆时针方向的圆弧插补。当F0时,向-x走一步;当F<0时,向+y走一步。每走一步后,计算一次判别函数,作为下一步进给的判别标准,同时进行一次终点判断。F值可用递推计算方法由加、减运算逐点得到。设已知动点的F值为Fi,j ,则:动点在-x方向走一步后:动点在+ y方向走一步后:终点判断可采用与直线插补相同的方法。 归纳起来,F0时,向-x 方向走一步。其偏差计算,坐标值计算和终点判别计算用下面公式:F<0时,向+y走一步。其偏差计算,坐标值计算和终点判别计算公式如下:3象限处理1)直线插补的象限处理 上述直线插补运算公式只适用于第一象限,不能适用其它象限的直线插补。对于第二、三、四象限,取|x|和|y|代替x、y即可,把第二、三、四象限的直线就可以变换到第一象限2)圆弧插补的象限处理 在圆弧插补中,仅讨论了第一象限的插补,实际上圆弧所在的象限不同,顺逆不同,则插补公式和运动点的走向均不同,因而圆弧插补有八种情况,表示在图中。第三章 数字积分分析法(DDA) 数字积分插补法又称为数字积分分析法(DDA),是利用数字积分的方法,计算刀具沿各坐标轴的位移,使刀具沿着所加工的轨迹运动。1DDA直线插补1) 基本原理 如图,OE为第一象限直线,起点在原点,终点为E(Xe,Ye),设进给速度是均匀的,则下式成立式中k为比例系数。在t时间内,X轴和Y轴方向上的微小位移增量X和Y 应为若取t=1,则坐标轴的位移增量为平面数字积分法直线插补框图,如图设积分累加器为n位,则累加器的容量为2n位,当计数至2n时,必须发生溢出。两个坐标轴同步插补时,用溢出脉冲控制机床的进给,就可走出所需的直线轨迹。设经过m次累计后,X和Y 分别到达终点e (Xe,Ye),则由此可见,比例系数k和累加次数m之间的关系为 km =1 即 m =1/kk的数值与累加器容量有关。累加器的容量应大于各坐标轴的最大坐标值,一般二者的位数相同,以保证每次累加最多只溢出一个脉冲。设累加器有n位,则 k =1/ 故累加次数 m =1/k= 上述关系表明,若累加器的位数为n,则整个插补过程要进行次累加才能到达直线的终点,用于逐点比较法相同的处理方法,便可对不同象限的直线进行插补。2) 终点判别 数字积分法直线插补的终点判别条件应是m =2n。 直线插补完成m = 次累加运算,即可达到直线的终点。所以,只要设置一个位数为n位的终点计数器,用以记录累加次数,当计数器记满数时,插补停止。2DDA圆弧插补1) 基本原理 圆弧的起点A(XA,YA),终点为B(XB,YB),半径为R,加工时保证沿圆弧切线方向的进给速度v给定。P(Xi,Yi)为动点,则下式成立:即:设在t时间间隔内,X、Y坐标轴方向的位移增量分别为X和Y,并考虑到对于第一象限逆圆弧,X 坐标轴的位移量为负值,Y坐标轴的位移量为正值,因此: 若取t=1,则坐标轴的位移量为:圆弧插补与直线插补的区别在于:A. 圆弧插补坐标值X、Y存入寄存器JVX和JVY的对应关系与直线插补时正好相反,即在JVX中存入Y值,在JVY中存入X值;B. 存入的坐标值不同,直线插补时积存的是终点坐标,是常数;而圆弧插补时寄存的是动点坐标,是变量。 其它象限圆弧插补可用同样方法推导。2) 终点判断 可以采用两个终点判别计数器,各轴分别判别终点,进给一步减1,计数器减为0时该轴停止进给。两轴都到达终点后,停止插补。第四章 Visual C+插补仿真1. MFC应用软件的建立 打开“Visual C+6.0”,选择“文件”“新建”菜单,在弹出的“新建”对话框中选择“工程”标签,这时显示出一系列的应用程序项目类型。选择MFC AppWizard(exe)的项目类型(该类型用于创建可执行的Windows应用程序),将项目工作文件夹定位在“E:”,并在“工程名称”框中输入项目名称“CBFZ”,结果如图,点击“确认”然后,出现下图对话框,点击“完成”。2. 设置工具栏 新建了一个MFC应用程序后,在菜单栏上面选择“查看”“资源符号”标签,然后在弹出的对话框中选择“IDR_MAINFRAME”,使用者选择“Toolbar IDR_MAINFRAME”,点击“查看使用”,如图:然后会出现工具栏编辑器,在工具栏上的最右端总有一个空按钮,点击该按钮就可以绘制该按钮图案。按需要绘制所需按钮,如图“LINE”,“CIRCLE”,“逐点”,“DDA”,“CLR”。然后双击新建的按钮弹出其属性对话框,输入ID名称如图:把工具栏按钮设置好后,就可以创建类。在菜单栏中,选择“查看”“建立类向导”,然后弹出对话框,在“Message Maps”中,类名称选着“CCBFZView”,在“Object IDs”选择自己新建的按钮的ID名称,“Message”中选择COMMAND,在“Member functions”中双击“Online”。如图:3. 利用GDI绘图仿真插补第一步:要在MFC程序中创建鼠标左键按下就可以画图的类。 跟创建工具栏按钮类相同,在菜单栏中,选择“查看”“建立类向导”,然后弹出对话框,在“Message Maps”中,类名称选着“CCBFZView”, 在“Object IDs”选择“CCBFZView”,“Message”中选择“WM_LBUTTONDOWN”,在“Member functions”中双击“WM_LBUTTONDOWN”。如图:第二步:创建画笔1. 申请设备环境CDC是Windows绘图设备的基类,主要有CClientDC、CpaintDC、CwindowDC。CClientDC: (1)(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC,这次插补仿真我们只用CClientDC类。CPaintDC:(1)用于响应窗口重绘消息(WM_PAINT)是的绘图输出。(2)CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。(3)CPaintDC也只能用在WM_PAINT消息处理之中。CWindowDC:(1)可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。(2)坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。(3)关联一特定窗口,允许开发者在目标窗口的任何一部分进行绘图,包含边界与标题,这种DC同WM_NCPAINT消息一起发送这次插补仿真我们只用CClientDC类。2. 创建画笔及设置画笔属性:CPen(Int style,int width ,COLORREF color); style:画笔的样式 width:画笔的宽度 color:画笔的颜色(颜色用RGB值来描述)CClientDC dc(this); CPen pen(PS_SOLID,1,RGB(0,0,255); dc.SelectObject(&pen); /以上定义后就可以用实心,宽度1,颜色RGB(0,0,255)的画笔了参数值 注释 :PS_SOLID 创建一个实线画笔 。PS_DASH 创建一个虚线画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效 。PS_DOT 创建一个点线画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效 。PS_DASHDOT 创建一个点和虚线交替画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效 。PS_DASHDOTDOT 创建一个双点线画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效 。PS_NULL 创建一个空线画笔。第三步:编写插补算法及实现绘图1. 绘制函数;A 当前点坐标:point.x;point.y。B 移动到当前点坐标:dc.MoveTo(int x,int y)C 画直线到当前点:dc.LineTo(int x,int y)D 画圆:dc.Elllipse(int a,int a,int b,int b,)2.插补算法:void CCBFZView:OnLButtonDown(UINT nFlags, CPoint point) /idm与idn属于工具栏控制的全局变量,1,1为直线逐点;1,2为DDA直线;2,1为圆弧逐点;2,2为DDA圆弧if(idm=1)&&(idn=1)/直线逐点比较法 int F,X,Y,i,j; int x,y; CClientDC dc(this);/申请设备环境 dc.MoveTo(0,0); dc.LineTo(point);/画出理论直线 x=0; y=0;/定义起点 X=point.x; Y=point.y;/终点赋值 F=X*y-Y*x;/判别式 if (X-x)>(Y-y)/判断直线倾斜角度是否小于45度 i=0; else i=1; do /以下是进行插补运算 CClientDC dc(this); CPen pen(PS_SOLID,1,RGB(0,0,255); dc.SelectObject(&pen);/定义画笔 if(i=0) if(F>=0) x+;/进给 point.x=x; point.y=y; dc.LineTo(point); else x+; y+;/同时进给 point.x=x; point.y=y; dc.LineTo(point); if(i=1) if(F>=0) x+; y+;/同时进给 point.x=x; point.y=y; dc.LineTo(point); else y+;/进给 point.x=x; point.y=y; dc.LineTo(point); F=X*y-Y*x; dc.MoveTo(point); for(long int w=0;w<=999999;w+) ;/延时语句 while(X!=x)|(Y!=y); /直线逐点比较法/ if(idm=2)&&(idn=1) /圆弧逐点比较法 CClientDC dc(this); dc.Ellipse(0,0,point.x,point.x);/理论圆弧 CPen pen(PS_SOLID,1,RGB(0,0,255); dc.SelectObject(&pen);/定义画笔 int F,X,Y,a,b,c,d; X=point.x; Y=point.x/2;/起点 a=point.x/2; b=point.x;/终点 c=point.x/2; d=point.x/2;/圆心 F=(X-c)*(X-c)+(Y-d)*(Y-d)-(a-c)*(a-c)+(b-d)*(b-d);/判别式 while(X!=a)|(Y!=b) /插补算法 dc.MoveTo(X,Y); if(F>0) X-;/进给 F=(X-c)*(X-c)+(Y-d)*(Y-d)-(a-c)*(a-c)+(b-d)*(b-d); else Y+;/进给 F=(X-c)*(X-c)+(Y-d)*(Y-d)-(a-c)*(a-c)+(b-d)*(b-d); for(long int w=0;w<=99999;w+) ; /延时语句 dc.LineTo(X,Y); /圆弧逐点第1象限 if(idm=1)&&(idn=2)/DDA直线 CClientDC dc(this); dc.LineTo(point); CPen pen(PS_SOLID,1,RGB(255,0,0); dc.SelectObject(&pen); double m,n; double x,y; double e,f; double X,Y; X=0;Y=0;/起点 m=pow(2,16);/运算总次数 n=0;x=0;y=0; e=point.x; f=point.y;/获取终点坐标 while(n<m)/直线DDA算法 dc.MoveTo(X,Y); x=x+e; y=y+f; n+; if(x>m)/修正 x=x-m;X+;/x方向进给 else ; if(y>m)/修正 y=y-m;Y+;/y方向进给 else ; dc.LineTo(X,Y); long int k; for(k=0;k<=9999;k+);/延时 /直线DDA if(idm=2)&&(idn=2)/DDA圆弧 CClientDC dc(this);dc.Ellipse(0,0,point.x,point.x); CPen pen(PS_SOLID,1,RGB(255,0,0); dc.SelectObject(&pen); double Jrx,Jry;Jrx=0;Jry=0;double nx,ny;nx=point.x/2;ny=point.x/2;/运算次数double Jvx,Jvy; Jvx=0;Jvy=point.x/2;double m;m=(pow(2,16);int X,Y;X=point.x;Y=point.x/2;while(nx>0)|(ny>0) dc.MoveTo(X,Y);Jrx=Jrx+Jvx;/积分运算 Jry=Jry+Jvy;if(Jrx>m)Jrx=Jrx-m;/修正Jvy-;nx-;X-;/进给else ;if(Jry>m)Jry=Jry-m;/修正Jvx+;ny-; Y+;/进给else ;dc.LineTo(X,Y);/DDA圆弧第1象限 / TODO: Add your message handler code here and/or call defaultCView:OnLButtonDown(nFlags, point);void CCBFZView:Online() idm=1;/直线按钮值/ TODO: Add your command handler code herevoid CCBFZView:Oncircle() idm=2;/圆弧按钮值/ TODO: Add your command handler code herevoid CCBFZView:Onzhudian() idn=1;/逐点按钮值/ TODO: Add your command handler code herevoid CCBFZView:OnDDA() idn=2;/DDA按钮值/ TODO: Add your command handler code herevoid CCBFZView:OnCLR() idn=0; idm=0;CClientDC dc(this);dc.Rectangle(-1,-1,1600,1000);/矩形框,用于清屏 / TODO: Add your command handler code here仿真如图,详细请看附件CBFZ文件夹的vc程序。第5章 利用Vision单片机编程1. 新建工程打开“Keli Version”软件,在菜单栏中,选择“工程”“新建工程”选择“AT89s51”单片机。新建一个文件夹,命名为“AT89x51”。然后在菜单中选择“文件”“新建”,命名为“Text1.c”。然后在目录框中选择“源代码组1”,右键点击,选择“添加文件到源代码组1”,如图:由于,“Keli Version”软件可以用vc语言来编写,所以与vc程序很相似。所以以直线逐点比较为例,只需把画直线的部分改为p1.0和p2.0 I/O接口,程序如图:#include <AT89X51.h>#include<math.h> #include<intrins.h> void delay001s(unsigned int t) t=100000000; while(t-)_nop_();void main()signed int F,X,Y,i;signed int x,y;x=0;y=0;X=100;Y=80;F=X*y-Y*x;/方向判定 if (X-x)>(Y-y) /判断是否大于45度i=0;else i=1;do if(i=0)if(F>=0) x+; / x正方向走一步 delay001s(100); P1_0=1; delay001s(100); P1_0=0; else x+; y+; delay001s(100); / x正方向走一步 P1_0=1; P2_0=1; delay001s(100);/ y正方向走一步 P1_0=0; P2_0=0; if(i=1)if(F>=0) x+; y+; delay001s(100); / x正方向走一步 P1_0=1; P2_0=1; delay001s(100);/ y正方向走一步 P1_0=0; P2_0=0; else y+;/y正方向走一步 delay001s(100); P2_0=1; delay001s(100); P2_0=0; F=X*y-Y*x; while(X!=x)|(Y!=y);/终点判别详细请看“AT89X51”文件。编程后在编译没错的情况下,在菜单栏上选择“调试”“启动/停止调试”,进入调试界面,在菜单栏中选择“外围设备”,调出I/O接口p1,p2。如图所示,可以仿真I/O接口的输出。参考文献 1 李勇,李伟光机械设备数控技术北京:国防出版社,20101 2 张荣梅,梁晓林Visual C+实用教程北京:冶金工业出版社20042 3 周蔼如,林伟健C+程序设计基础北京:电子工业出版社20068 4 李全利,仲伟峰,徐军单片机原理及应用北京:清华大学出版社20062附 件“CBFZ”文件夹: Visual C+插补仿真“AT89S51”文件夹:Vision单片机编程